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}