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)
}
/>