Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(core): sync url params with internal state for useTable hook #6645

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Prev Previous commit
Next Next commit
fix(core): use watched URL sorters to update table sorters
arndom committed Dec 1, 2024
commit 8dc12dd70b329a777b19ef80f5da0b0dec3b92f1
16 changes: 16 additions & 0 deletions packages/core/src/definitions/table/index.ts
Original file line number Diff line number Diff line change
@@ -222,3 +222,19 @@ export const mergeFilters = (

return [...mergedFilters, ...additionalURLFilters];
};

export const mergeSorters = (
currentUrlSorters: CrudSort[],
currentSorters: CrudSort[],
): CrudSort[] => {
const merged: CrudSort[] = [...currentUrlSorters];

for (const sorter of currentSorters) {
const exists = merged.some((s) => compareSorters(s, sorter));
if (!exists) {
merged.push(sorter);
}
}

return merged;
};
39 changes: 34 additions & 5 deletions packages/core/src/hooks/useTable/index.ts
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@ import warnOnce from "warn-once";
import { pickNotDeprecated } from "@definitions/helpers";
import {
mergeFilters,
mergeSorters,
parseTableParams,
setInitialFilters,
setInitialSorters,
@@ -440,7 +441,7 @@ export function useTable<
return `${pathname ?? ""}?${stringifyParams ?? ""}`;
};

// watch URL filters to update internal filters
// watch URL filters, sorters to update internal filters, sorters
useEffect(() => {
if (syncWithLocation) {
const currentFilters = filters;
@@ -450,11 +451,21 @@ export function useTable<
defaultFilter ?? [],
);

const currentSorters = sorters;
const currentUrlSorters = parsedParams.params?.sorters;
const initialSorters = setInitialSorters(
preferredPermanentSorters,
defaultSorter ?? [],
);

let newFilters: CrudFilter[] = [];
const urlsAreEqual = isEqual(currentUrlFilters, currentFilters);
let newSorters: CrudSort[] = [];

const filtersAreEqual = isEqual(currentUrlFilters, currentFilters);
const sortersAreEqual = isEqual(currentUrlSorters, currentSorters);

if (!urlsAreEqual) {
// fallback to initial filters
if (!filtersAreEqual) {
// fallback to initial
if (!currentUrlFilters || currentUrlFilters.length === 0) {
newFilters = initialFilters;
} else {
@@ -464,8 +475,26 @@ export function useTable<

setFilters(newFilters);
}

if (!sortersAreEqual) {
// fallback to initial
if (!currentUrlSorters || currentUrlSorters.length === 0) {
newSorters = initialSorters;
} else {
// since they aren't equal, merge the two
newSorters = mergeSorters(currentUrlSorters, currentSorters);
}

setSorters(newSorters);
}
}
}, [parsedParams, filters, preferredPermanentFilters]);
}, [
parsedParams,
filters,
preferredPermanentFilters,
sorters,
preferredPermanentSorters,
]);

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