diff --git a/components/content/Search/SearchFilters/SearchActiveFilters/index.tsx b/components/content/Search/SearchFilters/SearchActiveFilters/index.tsx new file mode 100644 index 00000000..83967fc1 --- /dev/null +++ b/components/content/Search/SearchFilters/SearchActiveFilters/index.tsx @@ -0,0 +1,141 @@ +import { Button } from "@/components/global/Button"; +import { ESRdfType } from "@/utilities/entryScape"; +import useTranslation from "next-translate/useTranslation"; +import CloseIcon from "@/assets/icons/closeCross.svg"; +import TrashIcon from "@/assets/icons/trash.svg"; +import { SearchContextData } from "@/providers/SearchProvider"; +import { SearchMode } from "../index"; + +interface SearchActiveFiltersProps { + search: SearchContextData; + query: string; + searchMode: SearchMode; + activeCheckboxFilters: Array<{ + id: string; + label: string; + facetValue?: SearchFacetValue; + isApiFilter?: boolean; + }>; +} + +export function SearchActiveFilters({ + search, + query, + searchMode, + activeCheckboxFilters, +}: SearchActiveFiltersProps) { + const { t } = useTranslation(); + + const clearCurrentScrollPos = () => { + if (typeof localStorage != "undefined" && typeof location != "undefined") { + localStorage.setItem(`ScrollposY_${location.search}`, "0"); + } + }; + + const hasActiveFilters = () => { + return ( + (search.request.facetValues && search.request.facetValues.length > 0) || + activeCheckboxFilters.length > 0 + ); + }; + + if (!hasActiveFilters()) return null; + + return ( +
+
+ + {t("common|active-filters")}: + + + {search.request.facetValues?.map( + (facetValue: SearchFacetValue, index: number) => + facetValue.facet !== + "http://data.europa.eu/r5r/applicableLegislation" && + facetValue.facet !== "http://purl.org/dc/terms/subject" && ( +
+ + {((search.request.facetValues && + search.request.facetValues.length >= 2) || + activeCheckboxFilters.length > 2) && ( +
+
+ )} +
+ ); +} diff --git a/components/content/Search/SearchFilters/index.tsx b/components/content/Search/SearchFilters/index.tsx index 5e21b7e8..67c09795 100644 --- a/components/content/Search/SearchFilters/index.tsx +++ b/components/content/Search/SearchFilters/index.tsx @@ -4,8 +4,6 @@ import useTranslation from "next-translate/useTranslation"; import { SearchContextData } from "@/providers/SearchProvider"; import { SearchFilter } from "@/components/content/Search/SearchFilters/SearchFilter"; import FilterIcon from "@/assets/icons/filter.svg"; -import CloseIcon from "@/assets/icons/closeCross.svg"; -import TrashIcon from "@/assets/icons/trash.svg"; import SearchIcon from "@/assets/icons/search.svg"; import { Button } from "@/components/global/Button"; import { TextInput } from "@/components/global/Form/TextInput"; @@ -14,6 +12,7 @@ import { SearchCheckboxFilter, SearchCheckboxFilterIcon, } from "./SearchCheckboxFilter/SearchCheckboxFilter"; +import { SearchActiveFilters } from "./SearchActiveFilters"; interface SearchFilterProps { showFilter: boolean; @@ -161,14 +160,6 @@ export const SearchFilters: React.FC = ({ const { t } = useTranslation(); const { iconSize } = useContext(SettingsContext); const [inputFilter, setInputFilter] = useState({}); - const hvd = "http://data.europa.eu/r5r/applicableLegislation"; - const containHVD = !search.request.facetValues?.find( - (d) => d.facet === hvd && search.request.facetValues?.length === 1, - ); - const national = "http://purl.org/dc/terms/subject"; - const containNational = !search.request.facetValues?.find( - (d) => d.facet === national && search.request.facetValues?.length === 1, - ); const clearCurrentScrollPos = () => { if (typeof localStorage != "undefined" && typeof location != "undefined") { @@ -226,6 +217,60 @@ export const SearchFilters: React.FC = ({ return grouped; }, [search.allFacets]); + const hvd = "http://data.europa.eu/r5r/applicableLegislation"; + const national = "http://purl.org/dc/terms/subject"; + + const activeCheckboxFilters = useMemo(() => { + const filters = []; + + // HVD filter + if (search.request.facetValues?.some((t) => t.title === ESRdfType.hvd)) { + filters.push({ + id: "hvd_only", + label: t(`resources|${hvd}`), + facetValue: search.request.facetValues.find( + (t) => t.title === ESRdfType.hvd, + ), + }); + } + + // National filter + if ( + search.request.facetValues?.some( + (t) => t.facet === ESRdfType.national_data, + ) + ) { + filters.push({ + id: "national_only", + label: t(`resources|${national}`), + facetValue: search.request.facetValues.find( + (t) => t.facet === ESRdfType.national_data, + ), + }); + } + + // API only filter + if ( + searchMode === "datasets" && + search.request.esRdfTypes?.some( + (t) => t === ESRdfType.esterms_ServedByDataService, + ) && + search.request.esRdfTypes?.some( + (t) => t === ESRdfType.esterms_IndependentDataService, + ) && + !search.request.esRdfTypes?.some((t) => t === ESRdfType.dataset) + ) { + filters.push({ + id: "api_only", + label: "API", + // Special handling for API filter since it uses esRdfTypes + isApiFilter: true, + }); + } + + return filters; + }, [search.request.facetValues, search.request.esRdfTypes, searchMode]); + return (
))} - {search.request.facetValues && search.request.facetValues.length > 0 && ( -
-
- {(containHVD || containNational) && ( - - {t("common|active-filters")}: - - )} - {search.request && - search.request.facetValues && - (search.request.facetValues as SearchFacetValue[]).map( - (facetValue: SearchFacetValue, index: number) => - facetValue.facet !== hvd && - facetValue.facet !== national && ( -
-
= 2 - ? "block whitespace-nowrap" - : "hidden" - } - > -
-
- )} + ); };