Skip to content

Commit ee10e91

Browse files
committed
fix: use watched URL filters to update table filters
1 parent 5e9197b commit ee10e91

File tree

2 files changed

+57
-15
lines changed

2 files changed

+57
-15
lines changed

packages/core/src/definitions/table/index.ts

+36
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,39 @@ export const getDefaultFilter = (
186186

187187
return undefined;
188188
};
189+
190+
export const mergeFilters = (
191+
currentUrlFilters: CrudFilter[],
192+
currentFilters: CrudFilter[],
193+
): CrudFilter[] => {
194+
const mergedFilters = currentFilters.map((tableFilter) => {
195+
const matchingURLFilter = currentUrlFilters.find(
196+
(urlFilter) =>
197+
"field" in tableFilter &&
198+
"field" in urlFilter &&
199+
tableFilter.field === urlFilter.field &&
200+
tableFilter.operator === urlFilter.operator,
201+
);
202+
203+
// override current filter wih url filter
204+
if (matchingURLFilter) {
205+
return { ...tableFilter, ...matchingURLFilter };
206+
}
207+
208+
return tableFilter;
209+
});
210+
211+
// add any other URL filters not in the current filters
212+
const additionalURLFilters = currentUrlFilters.filter(
213+
(urlFilter) =>
214+
!currentFilters.some(
215+
(tableFilter) =>
216+
"field" in tableFilter &&
217+
"field" in urlFilter &&
218+
tableFilter.field === urlFilter.field &&
219+
tableFilter.operator === urlFilter.operator,
220+
),
221+
);
222+
223+
return [...mergedFilters, ...additionalURLFilters];
224+
};

packages/core/src/hooks/useTable/index.ts

+21-15
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import warnOnce from "warn-once";
1111

1212
import { pickNotDeprecated } from "@definitions/helpers";
1313
import {
14+
mergeFilters,
1415
parseTableParams,
1516
setInitialFilters,
1617
setInitialSorters,
@@ -439,27 +440,32 @@ export function useTable<
439440
return `${pathname ?? ""}?${stringifyParams ?? ""}`;
440441
};
441442

443+
// watch URL filters to update internal filters
442444
useEffect(() => {
443-
if (!parsedParams?.params?.filters && !parsedParams?.params?.sorters) {
444-
const resetFilters = setInitialFilters(
445+
if (syncWithLocation) {
446+
const current_filters = filters;
447+
const current_URL_filters = parsedParams?.params?.filters;
448+
const initial_filters = setInitialFilters(
445449
preferredPermanentFilters,
446450
defaultFilter ?? [],
447451
);
448-
const resetSorters = setInitialSorters(
449-
preferredPermanentSorters,
450-
defaultSorter ?? [],
451-
);
452452

453-
setFilters(resetFilters);
454-
setSorters(resetSorters);
453+
let new_filters: CrudFilter[] = [];
454+
const urlsAreEqual = isEqual(current_URL_filters, current_filters);
455+
456+
if (!urlsAreEqual) {
457+
// fallback to initial filters
458+
if (!current_URL_filters || current_URL_filters.length === 0) {
459+
new_filters = initial_filters;
460+
} else {
461+
// since they aren't equal, merge the two
462+
new_filters = mergeFilters(current_URL_filters, current_filters);
463+
}
464+
465+
setFilters(new_filters);
466+
}
455467
}
456-
}, [
457-
parsedParams,
458-
preferredPermanentFilters,
459-
defaultFilter,
460-
preferredPermanentSorters,
461-
defaultSorter,
462-
]);
468+
}, [parsedParams, filters, preferredPermanentFilters]);
463469

464470
useEffect(() => {
465471
if (search === "") {

0 commit comments

Comments
 (0)