From 76ff21c2d5c02e34357143a350820b8eb77075a0 Mon Sep 17 00:00:00 2001 From: Askar Date: Wed, 25 Nov 2020 11:06:39 +0100 Subject: [PATCH] fix(search): compile possible filter options from available entities (#3370) * load filters from entities * fix(search): compile possible filter options from available entities * rename filter state and add text in case no filter can be applied --- .../search/src/components/Filters/Filters.tsx | 116 ++++++++++-------- .../components/SearchResult/SearchResult.tsx | 45 +++++-- 2 files changed, 97 insertions(+), 64 deletions(-) diff --git a/plugins/search/src/components/Filters/Filters.tsx b/plugins/search/src/components/Filters/Filters.tsx index 19d4e53d72..7bd344e12e 100644 --- a/plugins/search/src/components/Filters/Filters.tsx +++ b/plugins/search/src/components/Filters/Filters.tsx @@ -49,8 +49,14 @@ export type FiltersState = { checked: Array; }; +export type FilterOptions = { + kind: Array; + lifecycle: Array; +}; + type FiltersProps = { filters: FiltersState; + filterOptions: FilterOptions; resetFilters: () => void; updateSelected: (filter: string) => void; updateChecked: (filter: string) => void; @@ -58,16 +64,13 @@ type FiltersProps = { export const Filters = ({ filters, + filterOptions, resetFilters, updateSelected, updateChecked, }: FiltersProps) => { const classes = useStyles(); - // TODO: move mocked filters out of filters component to make it more generic - const filter1 = ['All', 'API', 'Component', 'Location', 'Template']; - const filter2 = ['deprecated', 'recommended', 'experimental', 'production']; - return ( - - Kind - - - - Lifecycle - - {filter2.map(filter => ( - updateChecked(filter)} - > - + + Filters cannot be applied to available results + + + )} + {filterOptions.kind.length > 0 && ( + + Kind + + + )} + {filterOptions.lifecycle.length > 0 && ( + + Lifecycle + + {filterOptions.lifecycle.map(filter => ( + updateChecked(filter)} + > + + + + ))} + + + )} ); }; diff --git a/plugins/search/src/components/SearchResult/SearchResult.tsx b/plugins/search/src/components/SearchResult/SearchResult.tsx index f1e160e792..9fd54ac06c 100644 --- a/plugins/search/src/components/SearchResult/SearchResult.tsx +++ b/plugins/search/src/components/SearchResult/SearchResult.tsx @@ -126,7 +126,7 @@ export const SearchResult = ({ searchQuery }: SearchResultProps) => { const catalogApi = useApi(catalogApiRef); const [showFilters, toggleFilters] = useState(false); - const [filters, setFilters] = useState({ + const [selectedFilters, setSelectedFilters] = useState({ selected: 'All', checked: [], }); @@ -146,17 +146,18 @@ export const SearchResult = ({ searchQuery }: SearchResultProps) => { // apply filters // filter on selected - if (filters.selected !== 'All') { + if (selectedFilters.selected !== 'All') { withFilters = results.filter((result: Result) => - filters.selected.includes(result.kind), + selectedFilters.selected.includes(result.kind), ); } // filter on checked - if (filters.checked.length > 0) { + if (selectedFilters.checked.length > 0) { withFilters = withFilters.filter( (result: Result) => - result.lifecycle && filters.checked.includes(result.lifecycle), + result.lifecycle && + selectedFilters.checked.includes(result.lifecycle), ); } @@ -174,7 +175,7 @@ export const SearchResult = ({ searchQuery }: SearchResultProps) => { setFilteredResults(withFilters); } - }, [filters, searchQuery, results]); + }, [selectedFilters, searchQuery, results]); if (loading) { return ; } @@ -190,41 +191,58 @@ export const SearchResult = ({ searchQuery }: SearchResultProps) => { } const resetFilters = () => { - setFilters({ + setSelectedFilters({ selected: 'All', checked: [], }); }; const updateSelected = (filter: string) => { - setFilters(prevState => ({ + setSelectedFilters(prevState => ({ ...prevState, selected: filter, })); }; const updateChecked = (filter: string) => { - if (filters.checked.includes(filter)) { - setFilters(prevState => ({ + if (selectedFilters.checked.includes(filter)) { + setSelectedFilters(prevState => ({ ...prevState, checked: prevState.checked.filter(item => item !== filter), })); return; } - setFilters(prevState => ({ + setSelectedFilters(prevState => ({ ...prevState, checked: [...prevState.checked, filter], })); }; + const filterOptions = results.reduce( + (acc, curr) => { + if (curr.kind && acc.kind.indexOf(curr.kind) < 0) { + acc.kind.push(curr.kind); + } + if (curr.lifecycle && acc.lifecycle.indexOf(curr.lifecycle) < 0) { + acc.lifecycle.push(curr.lifecycle); + } + return acc; + }, + { + kind: [] as Array, + lifecycle: [] as Array, + }, + ); + return ( <> {showFilters && ( { searchQuery={searchQuery} numberOfResults={filteredResults.length} numberOfSelectedFilters={ - (filters.selected !== 'All' ? 1 : 0) + filters.checked.length + (selectedFilters.selected !== 'All' ? 1 : 0) + + selectedFilters.checked.length } handleToggleFilters={() => toggleFilters(!showFilters)} />