From 8a0370d90dc7964c8b95ea1d3f3653a4d76b7a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cintia=20S=C3=A1nchez=20Garc=C3=ADa?= Date: Fri, 18 Oct 2024 14:00:02 +0200 Subject: [PATCH] Hide filters options that produce no results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Cintia Sánchez García --- .../src/layout/explore/filters/index.tsx | 35 +++++++++++++++---- ui/webapp/src/utils/itemsDataGetter.ts | 1 + ui/webapp/src/utils/prepareFilters.ts | 27 +++++++++++--- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/ui/webapp/src/layout/explore/filters/index.tsx b/ui/webapp/src/layout/explore/filters/index.tsx index 215c7f3a..7a33f76c 100644 --- a/ui/webapp/src/layout/explore/filters/index.tsx +++ b/ui/webapp/src/layout/explore/filters/index.tsx @@ -20,7 +20,7 @@ import { ViewMode, } from '../../../types'; import getFoundationNameLabel from '../../../utils/getFoundationNameLabel'; -import getFiltersPerGroup, { FiltersPerGroup } from '../../../utils/prepareFilters'; +import getFiltersPerGroup, { FiltersOptions, FiltersPerGroup } from '../../../utils/prepareFilters'; import Section from '../../common/Section'; import { useViewMode } from '../../stores/viewMode'; import styles from './Filters.module.css'; @@ -51,6 +51,10 @@ const Filters = (props: Props) => { const [filtersFromData, setFiltersFromData] = createSignal(); const [filters, setFilters] = createSignal([]); const [visibleTitles, setVisibleTitles] = createSignal([]); + const [filtersOptions, setFiltersOptions] = createSignal({ + itemsWithoutMaturity: true, + itemsWithoutLicense: true, + }); // Keep only available filters in selected group filters const cleanInitialActiveFilters = (): ActiveFilters => { @@ -80,7 +84,8 @@ const Filters = (props: Props) => { const f = getFiltersPerGroup(); if (!isEmpty(f)) { setFiltersFromData(f); - setFilters(f[props.initialSelectedGroup() || ALL_OPTION]); + setFilters(f[props.initialSelectedGroup() || ALL_OPTION].filters); + setFiltersOptions(f[props.initialSelectedGroup() || ALL_OPTION].options); } } setTmpActiveFilters(cleanInitialActiveFilters()); @@ -99,7 +104,8 @@ const Filters = (props: Props) => { createEffect( on(props.initialSelectedGroup, () => { if (!isUndefined(filtersFromData())) { - setFilters(filtersFromData()![props.initialSelectedGroup() || ALL_OPTION]); + setFilters(filtersFromData()![props.initialSelectedGroup() || ALL_OPTION].filters); + setFiltersOptions(filtersFromData()![props.initialSelectedGroup() || ALL_OPTION].options); } }) ); @@ -137,8 +143,17 @@ const Filters = (props: Props) => { return; }; - const getSectionInPredefinedFilters = (id: FilterCategory): FilterSection | undefined => { - const section = FILTERS.find((sec: FilterSection) => sec.value === id); + const getSectionInPredefinedFilters = (id: FilterCategory, visibleNonOption?: boolean): FilterSection | undefined => { + const originalSection = FILTERS.find((sec: FilterSection) => sec.value === id); + let section; + if (!isUndefined(originalSection)) { + if (!isUndefined(visibleNonOption) && !visibleNonOption) { + const options = originalSection.options.filter((opt: FilterOption) => !opt.value.startsWith('non-')); + section = { ...originalSection, options: options } as FilterSection; + } else { + section = originalSection; + } + } let availableExtraOptions: boolean = true; if ([FilterCategory.Maturity, FilterCategory.OrgType, FilterCategory.License].includes(id)) { const activeOpts = getSection(id); @@ -318,7 +333,10 @@ const Filters = (props: Props) => {
{
{ }; export interface FiltersPerGroup { - [key: string]: FilterSection[]; + [key: string]: PreparedFilters; +} + +export interface FiltersOptions { + itemsWithoutMaturity: boolean; + itemsWithoutLicense: boolean; +} + +interface PreparedFilters { + filters: FilterSection[]; + options: FiltersOptions; } const getFiltersPerGroup = () => { @@ -18,13 +29,13 @@ const getFiltersPerGroup = () => { const groupedItems = itemsDataGetter.getGroupedData(); Object.keys(groupedItems).forEach((group: string) => { - groups[group] = prepareFilters(groupedItems[group], group); + groups[group] = { ...prepareFilters(groupedItems[group], group) }; }); return groups; }; -const prepareFilters = (items: Item[], group: string): FilterSection[] => { +const prepareFilters = (items: Item[], group: string): PreparedFilters => { const filters: FilterSection[] = []; const maturityTypes: string[] = []; @@ -36,10 +47,14 @@ const prepareFilters = (items: Item[], group: string): FilterSection[] => { const extraTypes: string[] = []; const categories: string[] = []; let industry: string[] = []; + let itemsWithoutMaturity: boolean = false; + let nonOss: boolean = false; items.forEach((i: Item) => { if (i.maturity) { maturityTypes.push(i.maturity); + } else { + itemsWithoutMaturity = true; } if (i.tag) { @@ -91,6 +106,10 @@ const prepareFilters = (items: Item[], group: string): FilterSection[] => { } }); } + + if (isUndefined(i.oss)) { + nonOss = true; + } }); if (maturityTypes.length > 0) { @@ -207,7 +226,7 @@ const prepareFilters = (items: Item[], group: string): FilterSection[] => { } } - return filters; + return { filters: filters, options: { itemsWithoutMaturity: itemsWithoutMaturity, itemsWithoutLicense: nonOss } }; }; export default getFiltersPerGroup;