Skip to content

Commit 05dd124

Browse files
author
Julian Roeland
committed
#635 - feat: method to clear filters
1 parent 93ff844 commit 05dd124

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# fmt: off
2+
from django.test import tag
3+
4+
from openarchiefbeheer.destruction.constants import (
5+
DestructionListItemAction,
6+
InternalStatus,
7+
ListStatus,
8+
)
9+
from openarchiefbeheer.utils.tests.e2e import browser_page
10+
from openarchiefbeheer.utils.tests.gherkin import GherkinLikeTestCase
11+
12+
13+
@tag("e2e")
14+
@tag("gh-635")
15+
class Issue635FiltersReset(GherkinLikeTestCase):
16+
async def test_scenario_reset_button_works(self):
17+
async with browser_page() as page:
18+
zaken = await self.given.zaken_are_indexed(amount=6)
19+
record_manager = await self.given.record_manager_exists()
20+
21+
await self.given.list_exists(
22+
name="Destruction list to reset filters for",
23+
status=ListStatus.ready_to_review,
24+
zaken=zaken,
25+
)
26+
27+
await self.when.user_logs_in(page, record_manager)
28+
await self.then.path_should_be(page, "/destruction-lists")
29+
await self.when.user_clicks_button(page, "Destruction list to reset filters for")
30+
await self.when.user_filters_zaken(page, "omschrijving", "some text")
31+
await self.then.url_should_contain_text(page, "omschrijving__icontains=")
32+
await self.when.user_clicks_button(page, "Filters wissen")
33+
await self.then.input_field_should_be_empty(page, "Omschrijving")

backend/src/openarchiefbeheer/utils/tests/gherkin.py

+4
Original file line numberDiff line numberDiff line change
@@ -771,3 +771,7 @@ async def this_number_of_zaken_should_be_visible(self, page, number):
771771
rows = await locator.locator("tbody").locator("tr").all()
772772

773773
self.testcase.assertEqual(len(rows), number)
774+
775+
async def input_field_should_be_empty(self, page, placeholder):
776+
locator = page.get_by_placeholder(placeholder)
777+
await expect(locator).to_have_value("")

frontend/src/hooks/useFields.ts

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export function useFields<T extends Zaak = Zaak>(
9696
{
9797
name: "startdatum",
9898
type: "daterange",
99+
filterLookup: "startdatum__gte,startdatum__lte",
99100
filterValue:
100101
searchParams.get("startdatum__gte") &&
101102
searchParams.get("startdatum__lte")
@@ -108,6 +109,7 @@ export function useFields<T extends Zaak = Zaak>(
108109
{
109110
name: "einddatum",
110111
type: "daterange",
112+
filterLookup: "startdatum__gte,startdatum__lte",
111113
filterValue:
112114
searchParams.get("einddatum__gte") && searchParams.get("einddatum__lte")
113115
? `${searchParams.get("einddatum__gte")}/${searchParams.get("einddatum__lte")}`

frontend/src/pages/destructionlist/abstract/BaseListView.tsx

+28-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
formatMessage,
99
} from "@maykin-ui/admin-ui";
1010
import React, { useCallback, useMemo } from "react";
11-
import { useNavigation } from "react-router-dom";
11+
import { useNavigation, useSearchParams } from "react-router-dom";
1212

1313
import { DestructionListToolbar } from "../../../components";
1414
import {
@@ -90,6 +90,7 @@ export function BaseListView<T extends Zaak = Zaak>({
9090
onSelectionChange,
9191
}: BaseListViewProps<T>) {
9292
const { state } = useNavigation();
93+
const [searchParams, setSearchParams] = useSearchParams();
9394
const [page, setPage] = usePage();
9495
const [sort, setSort] = useSort();
9596

@@ -108,7 +109,7 @@ export function BaseListView<T extends Zaak = Zaak>({
108109
type FilterTransformData = ReturnType<typeof filterTransform>;
109110

110111
// Filter.
111-
const [, setFilterField] = useFilter<FilterTransformData>();
112+
const [setFilterField] = useFilter<FilterTransformData>();
112113

113114
// Selection.
114115
const [
@@ -153,6 +154,19 @@ export function BaseListView<T extends Zaak = Zaak>({
153154
onClearZaakSelection?.();
154155
};
155156

157+
const resetFilters = () => {
158+
const filterLookupValues = fields
159+
.filter((field) => field.filterLookup)
160+
.map((field) => field.filterLookup)
161+
// We perform a `flatMap` to handle multiple filter lookups within one field
162+
.flatMap((filterLookup) => filterLookup?.split(","));
163+
const newSearchParams = new URLSearchParams(searchParams);
164+
filterLookupValues.forEach((filterLookup) => {
165+
if (!filterLookup) return;
166+
newSearchParams.delete(filterLookup);
167+
});
168+
setSearchParams(newSearchParams);
169+
};
156170
// Selection actions.
157171
const getSelectionActions = useCallback(() => {
158172
const disabled = selectable && hasSelection;
@@ -176,7 +190,18 @@ export function BaseListView<T extends Zaak = Zaak>({
176190
},
177191
] as ButtonProps[])
178192
: [];
179-
return [...dynamicItems, ...fixedItems];
193+
const clearFiltersItem = {
194+
children: (
195+
<>
196+
<Solid.XCircleIcon />
197+
Filters wissen
198+
</>
199+
),
200+
variant: "warning",
201+
wrap: false,
202+
onClick: resetFilters,
203+
};
204+
return [...dynamicItems, ...fixedItems, clearFiltersItem];
180205
}, [selectable, hasSelection, selectedZakenOnPage, selectionActions]);
181206

182207
return (

0 commit comments

Comments
 (0)