fix(toolbar-search): re-filter rows if DataTable rows change (#2154)

Fixes #2143

Make `ToolbarSearch` filtering reactive to `DataTable` rows.

Previously, `ToolbarSearch` did not update when `DataTable` rows
changed. Now it subscribes to the context rows and re-runs
`filterRows` in `afterUpdate` to prevent infinite loops.
This commit is contained in:
Eric Liu 2025-04-19 13:33:07 -07:00 committed by GitHub
commit f09c2e2c31
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 4 deletions

View file

@ -46,14 +46,38 @@
*/
export let ref = null;
import { tick, getContext } from "svelte";
import { tick, getContext, afterUpdate, onMount } from "svelte";
import Search from "../Search/Search.svelte";
const ctx = getContext("DataTable") ?? {};
let rows = null;
let unsubscribe = null;
$: if (shouldFilterRows) {
unsubscribe = ctx?.tableRows.subscribe((tableRows) => {
// Only update if the rows have actually changed.
// This approach works in both Svelte 4 and Svelte 5.
if (JSON.stringify(tableRows) !== JSON.stringify(rows)) {
rows = tableRows;
}
});
} else {
rows = null;
}
onMount(() => {
return () => {
unsubscribe?.();
};
});
afterUpdate(() => {
// Only filter rows in a callback to avoid an infinite update loop.
if (rows !== null) {
filteredRowIds = ctx?.filterRows(value, shouldFilterRows);
}
});
async function expandSearch() {
await tick();

View file

@ -182,8 +182,7 @@ describe("DataTableSearch", () => {
});
});
// TODO: fix reactivity
it.skip("re-filters rows when toggled", async () => {
it("re-filters rows when toggled", async () => {
render(DataTableSearch);
allRowsRendered();