diff --git a/src/pages/view/FilterBar/FilterBadge.js b/src/pages/view/FilterBar/FilterBadge.js index e7a896ab6..e3cebd867 100644 --- a/src/pages/view/FilterBar/FilterBadge.js +++ b/src/pages/view/FilterBar/FilterBadge.js @@ -6,66 +6,62 @@ import PropTypes from 'prop-types' import React from 'react' import { connect } from 'react-redux' import { acSetActiveModalDimension } from '../../../actions/activeModalDimension.js' -import { useCacheableSection } from '../../../modules/useCacheableSection.js' import { sGetSelectedId } from '../../../reducers/selected.js' import classes from './styles/FilterBadge.module.css' -const FilterBadge = ({ dashboardId, filter, openFilterModal, onRemove }) => { - const { isConnected: online } = useDhis2ConnectionStatus() - const { isCached } = useCacheableSection(dashboardId) +const getFilterValuesText = (values) => + values.length === 1 + ? values[0].name + : i18n.t('{{count}} selected', { count: values.length }) - const notAllowed = !isCached && !online - - const filterText = `${filter.name}: ${ - filter.values.length > 1 - ? i18n.t('{{count}} selected', { - count: filter.values.length, - }) - : filter.values[0].name - }` +const FilterBadge = ({ filter, openFilterModal, onRemove }) => { + const { isConnected } = useDhis2ConnectionStatus() return ( -
- - - {({ onFocus, onBlur, onMouseOver, onMouseOut, ref }) => ( + + {({ onFocus, onBlur, onMouseOver, onMouseOut, ref }) => ( +
!isConnected && onFocus()} + onBlur={() => !isConnected && onBlur()} + onMouseOver={() => !isConnected && onMouseOver()} + onMouseOut={() => !isConnected && onMouseOut()} + ref={ref} + > + - )} - -
+
+ )} + ) } FilterBadge.propTypes = { - dashboardId: PropTypes.string.isRequired, filter: PropTypes.object.isRequired, openFilterModal: PropTypes.func.isRequired, onRemove: PropTypes.func.isRequired, diff --git a/src/pages/view/FilterBar/__tests__/FilterBadge.spec.js b/src/pages/view/FilterBar/__tests__/FilterBadge.spec.js index 1164dca2d..e0bf348dc 100644 --- a/src/pages/view/FilterBar/__tests__/FilterBadge.spec.js +++ b/src/pages/view/FilterBar/__tests__/FilterBadge.spec.js @@ -1,38 +1,47 @@ +import { useDhis2ConnectionStatus } from '@dhis2/app-runtime' import { render } from '@testing-library/react' import React from 'react' import { Provider } from 'react-redux' -import configureMockStore from 'redux-mock-store' +import { createStore } from 'redux' import FilterBadge from '../FilterBadge.js' -const mockStore = configureMockStore() - -const store = { selected: { id: 'dashboard1' } } - -jest.mock('@dhis2/analytics', () => ({ - useCachedDataQuery: () => ({ - currentUser: { - username: 'rainbowDash', - id: 'r3nb0d5h', - }, - }), -})) - jest.mock('@dhis2/app-runtime', () => ({ - useDhis2ConnectionStatus: () => ({ isConnected: true }), - useCacheableSection: jest.fn(() => ({ - isCached: false, - recordingState: 'default', - })), + useDhis2ConnectionStatus: jest.fn(() => ({ isConnected: true })), })) -test('Filter Badge displays badge containing number of items in filter', () => { +const baseState = { selected: { id: 'dashboard1' } } +const createMockStore = (state) => + createStore(() => Object.assign({}, baseState, state)) + +test('Displays badge containing number of filter items when filtered on multiple', () => { const filter = { id: 'ponies', name: 'Ponies', values: [{ name: 'Rainbow Dash' }, { name: 'Twilight Sparkle' }], } - const { container } = render( - + const { getByTestId } = render( + + + + ) + expect(getByTestId('filter-badge-button')).toHaveTextContent( + 'Ponies: 2 selected' + ) +}) + +test('Displays badge with filter item name when only one filter item is present', () => { + const filter = { + id: 'ponies', + name: 'Ponies', + values: [{ name: 'Twilight Sparkle' }], + } + const { getByTestId } = render( + { /> ) - expect(container).toMatchSnapshot() + expect(getByTestId('filter-badge-button')).toHaveTextContent( + 'Ponies: Twilight Sparkle' + ) }) -test('FilterBadge displays badge with filter item name when only one filter item', () => { +test('Has enabled buttons when online', () => { const filter = { id: 'ponies', name: 'Ponies', values: [{ name: 'Twilight Sparkle' }], } + const { getByTestId } = render( + + + + ) + expect(getByTestId('filter-badge-button')).toBeEnabled() + expect(getByTestId('filter-badge-clear-button')).toBeEnabled() +}) - const { container } = render( - +test('Has disabled buttons when offline', () => { + useDhis2ConnectionStatus.mockImplementation(() => ({ isConnected: false })) + const filter = { + id: 'ponies', + name: 'Ponies', + values: [{ name: 'Twilight Sparkle' }], + } + const { getByTestId } = render( + ) - expect(container).toMatchSnapshot() + expect(getByTestId('filter-badge-button')).toBeDisabled() + expect(getByTestId('filter-badge-clear-button')).toBeDisabled() }) diff --git a/src/pages/view/FilterBar/__tests__/__snapshots__/FilterBadge.spec.js.snap b/src/pages/view/FilterBar/__tests__/__snapshots__/FilterBadge.spec.js.snap deleted file mode 100644 index bdd73e689..000000000 --- a/src/pages/view/FilterBar/__tests__/__snapshots__/FilterBadge.spec.js.snap +++ /dev/null @@ -1,59 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Filter Badge displays badge containing number of items in filter 1`] = ` -
-
- - Ponies: 2 selected - - - Ponies: 2 selected - - - - -
-
-`; - -exports[`FilterBadge displays badge with filter item name when only one filter item 1`] = ` -
-
- - Ponies: Twilight Sparkle - - - Ponies: Twilight Sparkle - - - - -
-
-`; diff --git a/src/pages/view/FilterBar/styles/FilterBadge.module.css b/src/pages/view/FilterBar/styles/FilterBadge.module.css index 76e7045fb..97728cfce 100644 --- a/src/pages/view/FilterBar/styles/FilterBadge.module.css +++ b/src/pages/view/FilterBar/styles/FilterBadge.module.css @@ -14,7 +14,11 @@ cursor: pointer; } -.button:hover:not(.notAllowed) { +.button:disabled { + cursor: not-allowed; +} + +.button:hover:not(:disabled) { background-color: var(--colors-grey800); } @@ -29,7 +33,3 @@ border-start-end-radius: 4px; border-end-end-radius: 4px; } - -.removeButton.notAllowed { - cursor: not-allowed; -}