Skip to content

Commit

Permalink
DIGG-465: Fixing active filters for custom checkboxes
Browse files Browse the repository at this point in the history
  • Loading branch information
Kopin1 committed Nov 22, 2024
1 parent c8fa261 commit 49b3638
Show file tree
Hide file tree
Showing 2 changed files with 211 additions and 90 deletions.
141 changes: 141 additions & 0 deletions components/content/Search/SearchFilters/SearchActiveFilters/index.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<div className="mt-lg flex min-h-xl flex-col gap-md md:flex-row md:items-center">
<div className="flex flex-col flex-wrap gap-sm md:flex-row md:items-center md:gap-md">
<span className="text-textSecondary">
{t("common|active-filters")}:
</span>

{search.request.facetValues?.map(
(facetValue: SearchFacetValue, index: number) =>
facetValue.facet !==
"http://data.europa.eu/r5r/applicableLegislation" &&
facetValue.facet !== "http://purl.org/dc/terms/subject" && (
<Button
variant="filter"
size="xs"
key={index}
label={facetValue.title || facetValue.resource}
aria-label={`${t("common|clear-filters")} ${
facetValue.title || facetValue.resource
}`}
icon={CloseIcon}
iconPosition="right"
className="w-full justify-between py-md text-left font-strong md:w-auto md:py-[2px]"
onClick={() => {
clearCurrentScrollPos();
search.toggleFacet(facetValue).then(() => {
search.doSearch();
});
}}
/>
),
)}

{activeCheckboxFilters.map((filter) => (
<Button
key={filter.id}
variant="filter"
size="xs"
label={filter.label}
aria-label={`${t("common|clear-filters")} ${filter.label}`}
icon={CloseIcon}
iconPosition="right"
className="w-full justify-between py-md text-left font-strong md:w-auto md:py-[2px]"
onClick={() => {
clearCurrentScrollPos();
if (filter.isApiFilter) {
search
.set({
esRdfTypes: [
ESRdfType.dataset,
ESRdfType.esterms_IndependentDataService,
ESRdfType.esterms_ServedByDataService,
],
query: query,
})
.then(() => search.doSearch());
} else if (filter.facetValue) {
search.toggleFacet(filter.facetValue).then(() => {
search.doSearch();
});
}
}}
/>
))}
</div>

{((search.request.facetValues &&
search.request.facetValues.length >= 2) ||
activeCheckboxFilters.length > 2) && (
<div className="block whitespace-nowrap">
<Button
variant="plain"
size="sm"
icon={TrashIcon}
iconPosition="left"
onClick={() => {
clearCurrentScrollPos();
search
.set({
facetValues: [],
esRdfTypes:
searchMode === "datasets"
? [
ESRdfType.dataset,
ESRdfType.esterms_IndependentDataService,
ESRdfType.esterms_ServedByDataService,
]
: search.request.esRdfTypes,
})
.then(() => search.doSearch());
}}
label={t("common|clear-filters")}
/>
</div>
)}
</div>
);
}
160 changes: 70 additions & 90 deletions components/content/Search/SearchFilters/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -14,6 +12,7 @@ import {
SearchCheckboxFilter,
SearchCheckboxFilterIcon,
} from "./SearchCheckboxFilter/SearchCheckboxFilter";
import { SearchActiveFilters } from "./SearchActiveFilters";

interface SearchFilterProps {
showFilter: boolean;
Expand Down Expand Up @@ -161,14 +160,6 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
const { t } = useTranslation();
const { iconSize } = useContext(SettingsContext);
const [inputFilter, setInputFilter] = useState<InputFilter>({});
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") {
Expand Down Expand Up @@ -226,6 +217,60 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
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 (
<div id="SearchFilters" role="region" aria-label={t("common|filter")}>
<Button
Expand Down Expand Up @@ -387,8 +432,8 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
key={key}
id="hvd_only"
name="API"
checked={search.request.facetValues?.some(
(t) => t.title == ESRdfType.hvd,
checked={activeCheckboxFilters.some(
(filter) => filter.id === "hvd_only",
)}
onChange={() => doSearch(key, facetValues[0])}
label={t(`resources|${key}`)}
Expand All @@ -401,8 +446,8 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
key={key}
id="national_only"
name="National"
checked={search.request.facetValues?.some(
(t) => t.facet == ESRdfType.national_data,
checked={activeCheckboxFilters.some(
(filter) => filter.id === "national_only",
)}
onChange={() => doSearch(key, facetValues[0])}
label={t(`resources|${key}`)}
Expand All @@ -417,28 +462,14 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
key="api_only"
id="api_only"
name="API"
checked={
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,
)
}
checked={activeCheckboxFilters.some(
(filter) => filter.id === "api_only",
)}
onChange={() => {
clearCurrentScrollPos();
if (
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,
activeCheckboxFilters.some(
(filter) => filter.id === "api_only",
)
) {
search
Expand Down Expand Up @@ -471,64 +502,13 @@ export const SearchFilters: React.FC<SearchFilterProps> = ({
</div>
))}
</div>
{search.request.facetValues && search.request.facetValues.length > 0 && (
<div className="mt-lg flex flex-col justify-between gap-md md:flex-row md:items-baseline">
<div className="flex flex-col flex-wrap gap-sm md:flex-row md:items-center md:gap-md">
{(containHVD || containNational) && (
<span className="text-textSecondary">
{t("common|active-filters")}:
</span>
)}

{search.request &&
search.request.facetValues &&
(search.request.facetValues as SearchFacetValue[]).map(
(facetValue: SearchFacetValue, index: number) =>
facetValue.facet !== hvd &&
facetValue.facet !== national && (
<Button
variant="filter"
size="xs"
key={index}
label={facetValue.title || facetValue.resource}
aria-label={`${t("common|clear-filters")} ${
facetValue.title || facetValue.resource
}`}
icon={CloseIcon}
iconPosition="right"
className="w-full justify-between py-md text-left font-strong md:w-auto md:py-[2px]"
onClick={() => {
clearCurrentScrollPos();
search.toggleFacet(facetValue).then(() => {
search.doSearch();
});
}}
/>
),
)}
</div>
<div
className={
search.request?.facetValues &&
search.request.facetValues.length >= 2
? "block whitespace-nowrap"
: "hidden"
}
>
<Button
variant="plain"
size="sm"
icon={TrashIcon}
iconPosition="left"
onClick={() => {
clearCurrentScrollPos();
search.set({ facetValues: [] }).then(() => search.doSearch());
}}
label={t("common|clear-filters")}
/>
</div>
</div>
)}
<SearchActiveFilters
search={search}
query={query}
searchMode={searchMode}
activeCheckboxFilters={activeCheckboxFilters}
/>
</div>
);
};
Expand Down

0 comments on commit 49b3638

Please sign in to comment.