diff --git a/src/lib/table/Table.svelte b/src/lib/table/Table.svelte
index 790ab7c68..0cbf8f4d9 100644
--- a/src/lib/table/Table.svelte
+++ b/src/lib/table/Table.svelte
@@ -12,6 +12,17 @@
export let color: TableColorType = 'default';
export let customeColor: string = '';
export let items: T[] = [];
+ export let filter: ((t: T, term: string) => boolean) | null = null;
+ export let placeholder: string = 'Search';
+ export let innerDivClass: string = 'p-4';
+ export let searchClass: string = 'relative mt-1';
+ export let svgDivClass: string = 'absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none';
+ export let svgClass: string = 'w-5 h-5 text-gray-500 dark:text-gray-400';
+ export let inputClass: string = 'bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-80 p-2.5 ps-10 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500';
+
+ let searchTerm = '';
+ let inputCls = twMerge(inputClass, $$props.classInput);
+ let svgDivCls = twMerge(svgDivClass, $$props.classSvgDiv);
const colors = {
default: 'text-gray-500 dark:text-gray-400',
@@ -29,13 +40,35 @@
$: setContext('hoverable', hoverable);
$: setContext('noborder', noborder);
$: setContext('color', color);
-
- const sorting = writable({ items, direction: 1, sorter: '' });
- setContext('sorting', sorting);
- $: sorting.update(({direction, sorter}) => ({ items, direction, sorter }));
+ $: setContext('items', items);
+ const searchTermStore = writable(searchTerm);
+ const filterStore = writable(filter);
+ setContext('searchTerm', searchTermStore);
+ setContext('filter', filterStore);
+ $: searchTermStore.set(searchTerm);
+ $: filterStore.set(filter);
+ setContext('sorter', writable(null));
+ {#if filter}
+
+
+
+ {/if}
@@ -53,4 +86,11 @@
@prop export let color: TableColorType = 'default';
@prop export let customeColor: string = '';
@prop export let items: T[] = [];
+@prop export let filter: ((t: T, term: string) => boolean) | null = null;
+@prop export let placeholder: string = 'Search';
+@prop export let innerDivClass: string = 'p-4';
+@prop export let searchClass: string = 'relative mt-1';
+@prop export let svgDivClass: string = 'absolute inset-y-0 start-0 flex items-center ps-3 pointer-events-none';
+@prop export let svgClass: string = 'w-5 h-5 text-gray-500 dark:text-gray-400';
+@prop export let inputClass: string = 'bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-80 p-2.5 ps-10 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500';
-->
diff --git a/src/lib/table/TableBody.svelte b/src/lib/table/TableBody.svelte
index 342fd55d3..a5a254f79 100644
--- a/src/lib/table/TableBody.svelte
+++ b/src/lib/table/TableBody.svelte
@@ -4,13 +4,18 @@
export let tableBodyClass: string | undefined = undefined;
- let sorting = getContext('sorting') as Writable<{ items: T[]; direction: -1 | 1; sorter: string }>;
+ $: items = getContext('items') as T[] || [];
+ let filter = getContext('filter') as Writable<((t: T, term: string) => boolean) | null>;
+ let searchTerm = getContext('searchTerm') as Writable
;
+ $: filtered = $filter ? items.filter(item => $filter(item, $searchTerm)) : items;
+ let sorter = getContext('sorter') as Writable<{id: string, sort: (a: T, b: T) => number, sortDirection: -1 | 1} | null>;
+ $: sorted = $sorter ? filtered.toSorted((a, b) => $sorter.sortDirection * $sorter.sort(a, b)) : filtered;
- {#each $sorting?.items || [] as item}
-
+ {#each sorted as item}
+
{/each}
diff --git a/src/lib/table/TableHeadCell.svelte b/src/lib/table/TableHeadCell.svelte
index 8938f0b4c..2611c9b42 100644
--- a/src/lib/table/TableHeadCell.svelte
+++ b/src/lib/table/TableHeadCell.svelte
@@ -1,39 +1,35 @@
-{#if sort && sorting}
+{#if sort && sorter}
|