From 4a84757d6067ec9ceb3af8744b94048991d84acc Mon Sep 17 00:00:00 2001 From: Tiberiu Ichim Date: Mon, 6 Feb 2023 16:02:01 +0200 Subject: [PATCH] Customize addFilter to merge values --- searchlib/components/Facets/ActiveFilters.jsx | 2 + .../Facets/Wrappers/AccordionFacetWrapper.jsx | 4 +- .../FilterList/ActiveFilterValue.jsx | 1 + searchlib/components/SearchApp/request.js | 40 ++++++++++++++++++- .../components/SearchApp/useSearchApp.js | 21 ++++------ 5 files changed, 51 insertions(+), 17 deletions(-) diff --git a/searchlib/components/Facets/ActiveFilters.jsx b/searchlib/components/Facets/ActiveFilters.jsx index eca488700..1b4fdeb9f 100644 --- a/searchlib/components/Facets/ActiveFilters.jsx +++ b/searchlib/components/Facets/ActiveFilters.jsx @@ -1,3 +1,5 @@ +// This component is used by the dropdown facets to show the selected active filters for that facet + import React from 'react'; import { Button, Card } from 'semantic-ui-react'; import { Icon, Term } from '@eeacms/search/components'; diff --git a/searchlib/components/Facets/Wrappers/AccordionFacetWrapper.jsx b/searchlib/components/Facets/Wrappers/AccordionFacetWrapper.jsx index 7b195d61c..e01bac99e 100644 --- a/searchlib/components/Facets/Wrappers/AccordionFacetWrapper.jsx +++ b/searchlib/components/Facets/Wrappers/AccordionFacetWrapper.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Accordion, Icon } from 'semantic-ui-react'; import { useAtom } from 'jotai'; import { openFacetsAtom } from '../state'; -import { useUpdateAtom } from 'jotai/utils'; +import { useSetAtom } from 'jotai'; import { useAppConfig, useSearchContext } from '@eeacms/search/lib/hocs'; import Facet from '../Facet'; @@ -13,7 +13,7 @@ const AccordionFacetWrapper = (props) => { const hasFilter = !!filters.find((filter) => field === filter.field); const [openFacets] = useAtom(openFacetsAtom); - const updateOpenFacets = useUpdateAtom(openFacetsAtom); + const updateOpenFacets = useSetAtom(openFacetsAtom); const { appConfig } = useAppConfig(); const facet = appConfig.facets?.find((f) => f.field === field); diff --git a/searchlib/components/FilterList/ActiveFilterValue.jsx b/searchlib/components/FilterList/ActiveFilterValue.jsx index 3380aa34f..89750ecd1 100644 --- a/searchlib/components/FilterList/ActiveFilterValue.jsx +++ b/searchlib/components/FilterList/ActiveFilterValue.jsx @@ -34,6 +34,7 @@ const ActiveFilterValue = (props) => { ) : ( )} + {` (${type}) `} } onRemove={() => { diff --git a/searchlib/components/SearchApp/request.js b/searchlib/components/SearchApp/request.js index 3409e8b24..26226f68a 100644 --- a/searchlib/components/SearchApp/request.js +++ b/searchlib/components/SearchApp/request.js @@ -1,4 +1,7 @@ -import { resetFiltersToDefault } from '@eeacms/search/lib/search/helpers'; +import { + resetFiltersToDefault, + doFilterValuesMatch, +} from '@eeacms/search/lib/search/helpers'; import { getDefaultFilters } from '@eeacms/search/lib/utils'; export function resetFilters() { @@ -33,3 +36,38 @@ export function clearFilters(except = []) { ); }); } + +export function addFilter() { + const [field, value, type] = arguments; + const name = field; + + // a customized version of addFilter that converts existing filters to the + // new type, starting from the idea that each field name is unique + + if (this.driver.debug) + // eslint-disable-next-line no-console + console.log('Search UI: Action', 'addFilter', ...arguments); + + const { driver } = this; + const { filters } = driver.state; + + const existingFilter = filters.find((f) => f.field === name) || {}; // && f.type === type + const allOtherFilters = filters.filter((f) => f.field !== name) || []; // || f.type !== type + const existingFilterValues = existingFilter.values || []; + + const newFilterValues = existingFilterValues.find((existing) => + doFilterValuesMatch(existing, value), + ) + ? existingFilterValues + : existingFilterValues.concat(value); + + driver._updateSearchResults({ + current: 1, + filters: [ + ...allOtherFilters, + { field: name, values: newFilterValues, type }, + ], + }); + + // return addFilter.apply(null, arguments); +} diff --git a/searchlib/components/SearchApp/useSearchApp.js b/searchlib/components/SearchApp/useSearchApp.js index 19dea9818..b8b9cc26c 100644 --- a/searchlib/components/SearchApp/useSearchApp.js +++ b/searchlib/components/SearchApp/useSearchApp.js @@ -14,7 +14,7 @@ import { onAutocompleteResultClick, } from '@eeacms/search/lib/request'; -import { clearFilters, resetFilters, resetSearch } from './request'; +import { clearFilters, resetFilters, resetSearch, addFilter } from './request'; import useFacetsWithAllOptions from './useFacetsWithAllOptions'; import { useLoadingState } from './state'; import { SearchDriver } from '@elastic/search-ui'; @@ -126,20 +126,13 @@ export default function useSearchApp(props) { driver, facetOptions, }; - searchContext.resetFilters = resetFilters.bind({ - appConfig, - searchContext, - }); - searchContext.resetSearch = resetSearch.bind({ - appConfig, - searchContext, - driver, - }); - searchContext.clearFilters = clearFilters.bind({ - appConfig, - searchContext, - driver, + [resetFilters, resetSearch, clearFilters, addFilter].forEach((func) => { + searchContext[func.name] = func.bind({ + appConfig, + searchContext, + driver, + }); }); return searchContext; },