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

This commit is contained in:
Eric Liu 2025-04-19 10:04:48 -07:00
commit 6e6f4858af
2 changed files with 27 additions and 4 deletions

View file

@ -46,15 +46,39 @@
*/ */
export let ref = null; export let ref = null;
import { tick, getContext } from "svelte"; import { tick, getContext, afterUpdate, onMount } from "svelte";
import Search from "../Search/Search.svelte"; import Search from "../Search/Search.svelte";
const ctx = getContext("DataTable") ?? {}; const ctx = getContext("DataTable") ?? {};
let rows = null;
let unsubscribe = null;
$: if (shouldFilterRows) { $: if (shouldFilterRows) {
filteredRowIds = ctx?.filterRows(value, 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() { async function expandSearch() {
await tick(); await tick();
if (disabled || persistent || expanded) return; if (disabled || persistent || expanded) return;

View file

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