diff --git a/src/app/api/datasets/route.ts b/src/app/api/datasets/route.ts index ddf170ba..04a77e21 100644 --- a/src/app/api/datasets/route.ts +++ b/src/app/api/datasets/route.ts @@ -17,7 +17,7 @@ export async function POST(request: Request) { const response = await datasetList(options, session); const result = { - datasets: response.data.results, + results: response.data.results, count: response.data.count, }; diff --git a/src/app/datasets/FilterList/ClearFilterButton.tsx b/src/app/datasets/FilterList/ClearFilterButton.tsx index e16c886f..ce82e883 100644 --- a/src/app/datasets/FilterList/ClearFilterButton.tsx +++ b/src/app/datasets/FilterList/ClearFilterButton.tsx @@ -5,49 +5,18 @@ "use client"; import Button from "@/components/Button"; -import { useSearchParams } from "next/navigation"; -import { useEffect } from "react"; +import { useFilters } from "@/providers/FilterProvider"; -type ClearFilterButtonProps = { - facetGroups: string[]; -}; - -export default function ClearFilterButton({ - facetGroups, -}: ClearFilterButtonProps) { - const queryParams = useSearchParams(); - - useEffect(() => {}, [queryParams]); - - function isAnyGroupFilterApplied() { - if (!queryParams) return false; - - return Array.from(queryParams.keys()).some( - (key) => - key !== "page" && - key !== "q" && - facetGroups.some((group) => key.includes(group)) - ); - } - function getQueryStringWithoutGroupFilter() { - if (!queryParams) return ""; - return Array.from(queryParams.keys()) - .filter( - (x) => facetGroups.every((group) => !x.includes(group)) && x !== "page" - ) - .map((x) => `&${x}=${queryParams.get(x)}`) - .join(""); - } +export default function ClearFilterButton() { + const { clearActiveFilters } = useFilters(); return (
- {isAnyGroupFilterApplied() && ( -
); } diff --git a/src/app/datasets/FilterList/DropdownFilterItem.tsx b/src/app/datasets/FilterList/DropdownFilterItem.tsx index e993c5c1..7343bed9 100644 --- a/src/app/datasets/FilterList/DropdownFilterItem.tsx +++ b/src/app/datasets/FilterList/DropdownFilterItem.tsx @@ -3,51 +3,63 @@ // SPDX-License-Identifier: Apache-2.0 import { Disclosure } from "@headlessui/react"; -import { useRouter, useSearchParams } from "next/navigation"; -import { useEffect, useState } from "react"; import { FilterItemProps } from "./FilterItem"; +import { useFilters } from "@/providers/FilterProvider"; type DropdownFilterContentProps = FilterItemProps; export default function DropdownFilterContent({ filter, }: DropdownFilterContentProps) { - const router = useRouter(); - const searchParams = useSearchParams(); - const [options, setOptions] = useState([]); + const { activeFilters, addActiveFilter, removeActiveFilter } = useFilters(); - useEffect(() => { - const paramValue = - searchParams?.get(`${filter.source}-${filter.key}`) || ""; - if (paramValue) { - setOptions(paramValue.split(",")); - } else { - setOptions([]); - } - }, [searchParams, filter.key, filter.source]); + const correspondingActiveFilter = activeFilters.find( + (f) => f.key === filter.key + ); - const handleCheckboxChange = (value: string, checked: boolean) => { - const newOptions = checked - ? [...options, value] - : options.filter((v) => v !== value); + const handleCheckboxChange = ( + value: string, + label: string, + checked: boolean + ) => { + const isFilterAlreadyActive = correspondingActiveFilter !== undefined; - setOptions(newOptions); - updateUrl(newOptions); - }; + if (isFilterAlreadyActive) { + const currentValues = correspondingActiveFilter.values as { + value: string; + }[]; + const newValues = checked + ? [...currentValues, { value }] + : currentValues.filter((v) => v.value !== value); - const updateUrl = (newOptions: string[]) => { - const params = new URLSearchParams(searchParams?.toString() || ""); + if (!newValues.length) { + removeActiveFilter(filter.key, filter.source); + return; + } - if (newOptions.length > 0) { - params.set(`${filter.source}-${filter.key}`, newOptions.join(",")); + const newActiveFilter = { + ...correspondingActiveFilter, + values: newValues, + }; + addActiveFilter(newActiveFilter); } else { - params.delete(`${filter.source}-${filter.key}`); + const newActiveFilter = { + source: filter.source, + type: filter.type, + key: filter.key, + label: filter.label, + values: [{ value, label }], + }; + addActiveFilter(newActiveFilter); } + }; - params.set("page", "1"); - - const newUrl = `${window.location.pathname}?${params.toString()}`; - router.push(newUrl); + const isChecked = (item: { value: string }) => { + return correspondingActiveFilter + ? correspondingActiveFilter + ?.values!.map((v) => v.value) + .includes(item.value) + : false; }; return ( @@ -63,9 +75,9 @@ export default function DropdownFilterContent({ className="h-4 w-4 border rounded-md checked:accent-warning flex-none" id={`${filter.source}-${item.value}`} value={item.value} - checked={options.includes(item.value)} + checked={isChecked(item)} onChange={(e) => - handleCheckboxChange(item.value, e.target.checked) + handleCheckboxChange(item.value, item.label, e.target.checked) } />