diff --git a/src/docs/navigation_link.ts b/src/docs/navigation_link.ts index 57a43abc..09f2eb14 100644 --- a/src/docs/navigation_link.ts +++ b/src/docs/navigation_link.ts @@ -34,8 +34,9 @@ export const menuNavLinks: any = [ { href: base + '/components/form', label: 'Form', keywords: '' }, { href: base + '/components/table', label: 'Table', keywords: '' }, { href: base + '/components/codeEditor', label: 'Code Editor', keywords: '' }, - { href: base + '/components/fileupload', label: 'File Upload', keywords: '' } - // { href: base + '/components/toggle', label: 'Toggle', keywords: '' } + { href: base + '/components/fileupload', label: 'File Upload', keywords: '' }, + { href: base + '/components/facets', label: 'Facets', keywords: '' } + // { href: base + '/components/toggle', label: 'Toggle', keywords: '' } ] }, { diff --git a/src/lib/components/Facets/Facets.svelte b/src/lib/components/Facets/Facets.svelte new file mode 100644 index 00000000..cbfb4992 --- /dev/null +++ b/src/lib/components/Facets/Facets.svelte @@ -0,0 +1,120 @@ + + + + {#each Object.keys(groups) as group} + +

{group}

+ + + + {#if !showAll} + {#each groups[group].slice(0, 5) as item} + +

{item.value} ({item.count})

+
+ {/each} + + {#if groups[group].length > 5} + + + {/if} + {:else} + {#each groups[group] as item} + +

{item.value} ({item.count})

+
+ {/each} + {/if} +
+
+ {/each} +
+ + diff --git a/src/lib/components/Facets/ShowMore.svelte b/src/lib/components/Facets/ShowMore.svelte new file mode 100644 index 00000000..5c489d27 --- /dev/null +++ b/src/lib/components/Facets/ShowMore.svelte @@ -0,0 +1,87 @@ + + +
+ +

{group}

+ + +
+ {#each items as item, index} + + {/each} +
+ + +
+
+ + +
+
+ + +
+
+
diff --git a/src/lib/components/Table/ColumnsMenu.svelte b/src/lib/components/Table/ColumnsMenu.svelte new file mode 100644 index 00000000..f30ecdc2 --- /dev/null +++ b/src/lib/components/Table/ColumnsMenu.svelte @@ -0,0 +1,37 @@ + + + + +
+ {#each columns as column} +
+ c.visible).length === 1 && column.visible} + /> + {column.label} +
+ {/each} + +
+
diff --git a/src/lib/components/Table/TableContent.svelte b/src/lib/components/Table/TableContent.svelte index 6aa0528e..02ed847c 100644 --- a/src/lib/components/Table/TableContent.svelte +++ b/src/lib/components/Table/TableContent.svelte @@ -11,7 +11,8 @@ addExpandedRows, addColumnFilters, addTableFilter, - addDataExport + addDataExport, + addHiddenColumns } from 'svelte-headless-table/plugins'; import { computePosition, autoUpdate, offset, shift, flip, arrow } from '@floating-ui/dom'; import { SlideToggle, storePopup } from '@skeletonlabs/skeleton'; @@ -24,6 +25,7 @@ import TableFilterServer from './TableFilterServer.svelte'; import TablePagination from './TablePagination.svelte'; import TablePaginationServer from './TablePaginationServer.svelte'; + import ColumnsMenu from './ColumnsMenu.svelte'; import { columnFilter, searchFilter } from './filter'; import { cellStyle, @@ -51,19 +53,16 @@ defaultPageSize = 10, // Default page size - number of rows to display per page toggle = false, // Whether to display the fitToScreen toggle search = true, // Whether to display the search input - pageSizes = [5, 10, 15, 20], // Page sizes to display in the pagination component + pageSizes = [5, 10, 20, 50, 100], // Page sizes to display in the pagination component fitToScreen = true, // Whether to fit the table to the screen, exportable = false, // Whether to display the export button and enable export functionality - serverSide = false, // Whether the table is client or server-side - URL = '', // URL to fetch data from - token = '', // Bearer token to authenticate the request - sendModel = new Send(), // Model to send requests - entityId = 0, // Entity ID to send with the request - versionId = 0 // Version ID to send with the request, + server } = config; let searchValue = ''; let isFetching = false; + const serverSide = server !== undefined; + const { baseUrl, sendModel, entityId, versionId } = server ?? {}; const filters = writable<{ [key: string]: { [key in FilterOptionsEnum]?: number | string | Date }; @@ -90,6 +89,7 @@ fn: searchFilter, serverSide }), + hideColumns: addHiddenColumns(), sort: addSortBy({ disableMultiSort: true, serverSide @@ -121,137 +121,149 @@ // Creating an array of all the keys const accessors: AccessorType[] = Object.keys(allCols) as AccessorType[]; + // Filtering out the excluded columns + const unexcludedColumns = accessors.filter((accessor) => { + // Filtering only unexcluded columns + const key = accessor as string; + if (columns !== undefined && key in columns && columns[key].exclude === true) { + return false; + } + return true; + }); + + // To control the visibility of columns in menu + let shownColumns = unexcludedColumns.map((c) => { + const key = c as string; + const label = key.charAt(0).toUpperCase() + key.slice(1); + return { + id: c as string, + label: columns && columns[key] && columns[key].header ? columns[key].header : label, + visible: true + }; + }); + // Configuring every table column with the provided options const tableColumns = [ - ...accessors - .filter((accessor) => { - // Filtering only unexcluded columns - const key = accessor as string; - if (columns !== undefined && key in columns && columns[key].exclude === true) { - return false; - } - return true; - }) - .map((accessor) => { - const key = accessor as string; - // Applying configuration options for configured columns - if (columns !== undefined && key in columns) { - const { - header, // Custom header to display - colFilterFn, // Custom column filter function - colFilterComponent, // Custom column filter component - instructions, // Custom instructions for the column cells (sorting, filtering, searching, rendering) - disableFiltering = false, // Whether to disable filtering for the column - disableSorting = false // Whether to disable sorting for the column - } = columns[key]; - - const { toSortableValueFn, toFilterableValueFn, toStringFn, renderComponent } = - instructions ?? {}; - - return table.column({ - // If header is not provided, use the key as the header - header: header ?? key, - accessor: accessor, - // Render the cell with the provided component, or use the toStringFn if provided, or just use the value - cell: ({ value, row }) => { - return renderComponent - ? createRender(renderComponent, { value, row, dispatchFn: actionDispatcher }) - : toStringFn - ? toStringFn(value) - : value; + ...unexcludedColumns.map((accessor) => { + const key = accessor as string; + // Applying configuration options for configured columns + if (columns !== undefined && key in columns) { + const { + header, // Custom header to display + colFilterFn, // Custom column filter function + colFilterComponent, // Custom column filter component + instructions, // Custom instructions for the column cells (sorting, filtering, searching, rendering) + disableFiltering = false, // Whether to disable filtering for the column + disableSorting = false // Whether to disable sorting for the column + } = columns[key]; + + const { toSortableValueFn, toFilterableValueFn, toStringFn, renderComponent } = + instructions ?? {}; + + return table.column({ + // If header is not provided, use the key as the header + header: header ?? key, + accessor: accessor, + // Render the cell with the provided component, or use the toStringFn if provided, or just use the value + cell: ({ value, row }) => { + return renderComponent + ? createRender(renderComponent, { value, row, dispatchFn: actionDispatcher }) + : toStringFn + ? toStringFn(value) + : value; + }, + plugins: { + // Sorting config + sort: { + disable: disableSorting, + getSortValue: (row) => { + // If provided, use the custom sorting function toSortableValueFn(), or just use the value + return toSortableValueFn ? toSortableValueFn(row) : row; + } }, - plugins: { - // Sorting config - sort: { - disable: disableSorting, - getSortValue: (row) => { - // If provided, use the custom sorting function toSortableValueFn(), or just use the value - return toSortableValueFn ? toSortableValueFn(row) : row; - } - }, - colFilter: !disableFiltering - ? { - fn: ({ filterValue, value }) => { - // If provided, use the custom filtering function toFilterableValueFn(), or just use the value - const val = toFilterableValueFn ? toFilterableValueFn(value) : value; - // If provided, use the custom filtering function colFilterFn(), or just use the default columnFilter() - return colFilterFn - ? colFilterFn({ filterValue, value: val }) - : columnFilter({ filterValue, value: val }); - }, - render: ({ filterValue, values, id }) => { - filterValue.set($filters[key]); - return serverSide - ? createRender(TableFilterServer, { - id, - tableId, - values, - updateTable, - pageIndex, - toFilterableValueFn, - filters, - toStringFn - }) - : createRender(colFilterComponent ?? TableFilter, { - filterValue, - id, - tableId, - values, - toFilterableValueFn, - filters, - toStringFn, - pageIndex - }); - } - } - : undefined, - tableFilter: { - // Search filter config - getFilterValue: (row) => { - // If provided, use the custom toString function toStringFn(), or just use the value - return toStringFn ? toStringFn(row) : row; - } + colFilter: !disableFiltering + ? { + fn: ({ filterValue, value }) => { + // If provided, use the custom filtering function toFilterableValueFn(), or just use the value + const val = toFilterableValueFn ? toFilterableValueFn(value) : value; + // If provided, use the custom filtering function colFilterFn(), or just use the default columnFilter() + return colFilterFn + ? colFilterFn({ filterValue, value: val }) + : columnFilter({ filterValue, value: val }); + }, + render: ({ filterValue, values, id }) => { + filterValue.set($filters[key]); + return serverSide + ? createRender(TableFilterServer, { + id, + tableId, + values, + updateTable, + pageIndex, + toFilterableValueFn, + filters, + toStringFn + }) + : createRender(colFilterComponent ?? TableFilter, { + filterValue, + id, + tableId, + values, + toFilterableValueFn, + filters, + toStringFn, + pageIndex + }); + } + } + : undefined, + tableFilter: { + // Search filter config + getFilterValue: (row) => { + // If provided, use the custom toString function toStringFn(), or just use the value + return toStringFn ? toStringFn(row) : row; } } - }); - } else { - return table.column({ - header: key, - accessor: accessor, - cell: ({ value }) => { - // If null or undefined, return an empty string - return value ? value : ''; - }, - plugins: { - // Sorting enabled by default - sort: {}, - // Filtering enabled by default - colFilter: { - fn: columnFilter, - render: ({ filterValue, values, id }) => { - return serverSide - ? createRender(TableFilterServer, { - id, - tableId, - values, - updateTable, - pageIndex, - filters - }) - : createRender(TableFilter, { - filterValue, - id, - tableId, - values, - filters, - pageIndex - }); - } + } + }); + } else { + return table.column({ + header: key, + accessor: accessor, + cell: ({ value }) => { + // If null or undefined, return an empty string + return value ? value : ''; + }, + plugins: { + // Sorting enabled by default + sort: {}, + // Filtering enabled by default + colFilter: { + fn: columnFilter, + render: ({ filterValue, values, id }) => { + return serverSide + ? createRender(TableFilterServer, { + id, + tableId, + values, + updateTable, + pageIndex, + filters + }) + : createRender(TableFilter, { + filterValue, + id, + tableId, + values, + filters, + pageIndex + }); } } - }); - } - }) + } + }); + } + }) ]; // If optionsComponent is provided, add a column for it at the end @@ -286,22 +298,25 @@ const { exportedData } = pluginStates.export; // Page configuration const { pageIndex, pageSize } = pluginStates.page; + // Column visibility configuration + const { hiddenColumnIds } = pluginStates.hideColumns; const updateTable = async () => { + if (!sendModel) throw new Error('Server-side configuration is missing'); + sendModel.limit = $pageSize; sendModel.offset = $pageSize * $pageIndex; - sendModel.version = versionId; - sendModel.id = entityId; + sendModel.version = versionId || -1; + sendModel.id = entityId || -1; sendModel.filter = normalizeFilters($filters); let fetchData; try { isFetching = true; - fetchData = await fetch(URL, { + fetchData = await fetch(baseUrl || '', { headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}` + 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify(sendModel) @@ -346,6 +361,7 @@ }; const sortServer = (order: 'asc' | 'desc' | undefined, id: string) => { + if (!sendModel) throw new Error('Server-side configuration is missing'); // Set parameter for sorting if (order === undefined) { sendModel.order = []; @@ -362,16 +378,19 @@ $: sortKeys = pluginStates.sort.sortKeys; $: serverSide && updateTable(); $: serverSide && sortServer($sortKeys[0]?.order, $sortKeys[0]?.id); + $: $hiddenColumnIds = shownColumns.filter((col) => !col.visible).map((col) => col.id);
{#if $data.length > 0 || (columns && Object.keys(columns).length > 0)}
- {#if !serverSide && search} + {#if search}
{ + if (!sendModel) throw new Error('Server-side configuration is missing'); + sendModel.q = searchValue; $filterValue = searchValue; }} @@ -388,6 +407,8 @@ id="{tableId}-searchReset" class="absolute right-3 items-center" on:click|preventDefault={() => { + if (!sendModel) throw new Error('Server-side configuration is missing'); + searchValue = ''; sendModel.q = ''; $filterValue = ''; @@ -399,6 +420,8 @@ id="{tableId}-searchSubmit" class="btn variant-filled-primary" on:click|preventDefault={() => { + if (!sendModel) throw new Error('Server-side configuration is missing'); + $filterValue = searchValue; sendModel.q = searchValue; }}>SearchExport as CSV {/if} + {#if shownColumns.length > 0} + + {/if}
@@ -491,9 +517,7 @@ {#if cell.isData()} {#if props.colFilter?.render} -
- -
+ {/if} {/if}
@@ -564,3 +588,5 @@ {/if} {/if} + +
diff --git a/src/lib/components/Table/TableFilter.svelte b/src/lib/components/Table/TableFilter.svelte index 91192069..e1d1c689 100644 --- a/src/lib/components/Table/TableFilter.svelte +++ b/src/lib/components/Table/TableFilter.svelte @@ -1,5 +1,6 @@ - +
-
+
@@ -326,4 +336,4 @@ >
- +
diff --git a/src/lib/components/Table/TableFilterServer.svelte b/src/lib/components/Table/TableFilterServer.svelte index 16270b68..19d3bb5d 100644 --- a/src/lib/components/Table/TableFilterServer.svelte +++ b/src/lib/components/Table/TableFilterServer.svelte @@ -22,6 +22,7 @@ let dropdowns: { option: FilterOptionsEnum; value: string | number | Date | undefined; + formValue: string | number | undefined; }[] = []; // Check the type of the column @@ -111,7 +112,7 @@ { value: FilterOptionsEnum.b, label: 'Is before' - }, + } // TODO: 'Not on' filter should be fixed on the server side // { // value: FilterOptionsEnum.no, @@ -159,7 +160,8 @@ const valueChangeHandler = (e, index) => { dropdowns[index] = { ...dropdowns[index], - value: type === 'date' ? new Date(e.target.value) : e.target.value + value: type === 'date' ? new Date(e.target.value) : e.target.value, + formValue: e.target.value }; $filters = { @@ -181,7 +183,8 @@ ...dropdowns, { option: option, - value: undefined + value: undefined, + formValue: undefined } ]; }; diff --git a/src/lib/components/Table/TablePagination.svelte b/src/lib/components/Table/TablePagination.svelte index 60a63d89..977f69f3 100644 --- a/src/lib/components/Table/TablePagination.svelte +++ b/src/lib/components/Table/TablePagination.svelte @@ -4,8 +4,10 @@ faAnglesRight, faAngleRight, faAnglesLeft, - faAngleLeft + faAngleLeft, + faChevronDown } from '@fortawesome/free-solid-svg-icons'; + import { ListBox, ListBoxItem, popup, type PopupSettings } from '@skeletonlabs/skeleton'; export let pageConfig; export let pageSizes; @@ -31,24 +33,50 @@ } }; + let pageSizeDropdownValue: string = $pageSize; + + const pageSizePopup: PopupSettings = { + event: 'click', + target: `#${id}-pageSizeDropdown`, + placement: 'bottom', + closeQuery: '.listbox-item' + }; + $: goToFirstPageDisabled = !$pageIndex; $: goToLastPageDisabled = $pageIndex == $pageCount - 1; $: goToNextPageDisabled = !$hasNextPage; $: goToPreviousPageDisabled = !$hasPreviousPage; + $: $pageSize = pageSizeDropdownValue; -
+
- + --> + + + +
+ + {#each pageSizes as size} + {size} + {/each} + +
+
diff --git a/src/lib/models/Models.ts b/src/lib/models/Models.ts index 8791c4c2..d04a2287 100644 --- a/src/lib/models/Models.ts +++ b/src/lib/models/Models.ts @@ -104,6 +104,14 @@ export interface Columns { [key: string]: Column; } +// Server config type for the table +export type ServerConfig = { + baseUrl?: string; // Base URL for server-side table + sendModel: Send; // Send model for server-side table + entityId?: number; // Entity ID for server-side table + versionId?: number; // Version ID for server-side table +}; + // Table config type export interface TableConfig { id: string; @@ -120,12 +128,7 @@ export interface TableConfig { defaultPageSize?: number; // 10 by default optionsComponent?: typeof SvelteComponent; - serverSide?: boolean; // false by default - URL?: string; // Base URL for server-side table - token?: string; // Authorization token for server-side table - sendModel?: Send; // Send model for server-side table - entityId?: number; // Entity ID for server-side table - versionId?: number; // Version ID for server-side table + server?: ServerConfig; } // lists @@ -188,6 +191,15 @@ export type Filter = { value: string | number | Date | boolean; }; +export type FacetOption = { + value: string; + count?: number; +}; + +export type FacetGroup = { + [key: string]: FacetOption[]; +}; + export class Send { id: number; limit: number; @@ -222,7 +234,6 @@ export class Receive { } } - export class errorType { statusText: string; status: number; diff --git a/src/routes/components/facets/+layout.svelte b/src/routes/components/facets/+layout.svelte new file mode 100644 index 00000000..c8ec36db --- /dev/null +++ b/src/routes/components/facets/+layout.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/src/routes/components/facets/+page.svelte b/src/routes/components/facets/+page.svelte new file mode 100644 index 00000000..d8fd739a --- /dev/null +++ b/src/routes/components/facets/+page.svelte @@ -0,0 +1,22 @@ + + +
+
+

Facets

+

Props

+ +
+
+

Types

+ +
+
+ + +
+
diff --git a/src/routes/components/facets/data/codeBlocks.ts b/src/routes/components/facets/data/codeBlocks.ts new file mode 100644 index 00000000..141ed618 --- /dev/null +++ b/src/routes/components/facets/data/codeBlocks.ts @@ -0,0 +1,78 @@ +export const facetsNoGroupSelectionSvelte = ` + + + +`; + +export const facetsGroupSelectionSvelte = ` + + + +`; + +export const facetsNoGroupSelectionData = ` +export const groups = { + Mediums: [ + { value: 'books', count: 1 }, + { value: 'movies', count: 2 }, + { value: 'music', count: 3 }, + { value: 'podcasts', count: 4 }, + { value: 'articles', count: 5 }, + { value: 'blogs', count: 6 } + ], + Genres: [ + { value: 'fiction', count: 0 }, + { value: 'non-fiction', count: 1 }, + { value: 'comedy', count: 2 }, + { value: 'drama', count: 3 }, + { value: 'action', count: 4 }, + { value: 'romance', count: 5 }, + ... + ], + Authors: [ + { value: 'Stephen King', count: 10 }, + { value: 'J.K. Rowling', count: 3 }, + { value: 'Agatha Christie', count: 4 }, + { value: 'Dan Brown', count: 7 } + ] +}; +`; + +export const facetGroupType = ` +export type FacetGroup = { + [key: string]: FacetOption[]; +}; +`; + +export const facetOptionType = ` +export type FacetOption = { + value: string; + count?: number; +}; +`; diff --git a/src/routes/components/facets/data/data.ts b/src/routes/components/facets/data/data.ts new file mode 100644 index 00000000..97b33825 --- /dev/null +++ b/src/routes/components/facets/data/data.ts @@ -0,0 +1,58 @@ +export const groups = { + Mediums: [ + { value: 'books', count: 1 }, + { value: 'movies', count: 2 }, + { value: 'music', count: 3 }, + { value: 'podcasts', count: 4 }, + { value: 'articles', count: 5 }, + { value: 'blogs', count: 6 } + ], + Genres: [ + { value: 'fiction', count: 0 }, + { value: 'non-fiction', count: 1 }, + { value: 'comedy', count: 2 }, + { value: 'drama', count: 3 }, + { value: 'action', count: 4 }, + { value: 'romance', count: 5 }, + { value: 'thriller', count: 6 }, + { value: 'horror', count: 7 }, + { value: 'sci-fi', count: 8 }, + { value: 'fantasy', count: 9 }, + { value: 'adventure', count: 10 }, + { value: 'animation', count: 20 }, + { value: 'biography', count: 30 }, + { value: 'crime', count: 10 }, + { value: 'documentary', count: 0 }, + { value: 'family', count: 1 }, + { value: 'history', count: 2 }, + { value: 'musical', count: 3 }, + { value: 'mystery', count: 4 }, + { value: 'war', count: 5 }, + { value: 'western', count: 6 }, + { value: 'sport', count: 7 }, + { value: 'superhero', count: 8 }, + { value: 'noir', count: 9 }, + { value: 'disaster', count: 10 }, + { value: 'spy', count: 82 }, + { value: 'martial arts', count: 2 }, + { value: 'satire', count: 5 }, + { value: 'black comedy', count: 7 }, + { value: 'psychological thriller', count: 9 }, + { value: 'erotica', count: 3 }, + { value: 'experimental', count: 20 }, + { value: 'political thriller', count: 10 }, + { value: 'coming-of-age', count: 30 }, + { value: 'silent film', count: 40 }, + { value: 'mockumentary', count: 50 }, + { value: 'holiday', count: 10 }, + { value: 'music', count: 10 }, + { value: 'dance', count: 5 }, + { value: 'teen', count: 12 }, + ], + Authors: [ + { value: 'Stephen King', count: 10 }, + { value: 'J.K. Rowling', count: 3 }, + { value: 'Agatha Christie', count: 4 }, + { value: 'Dan Brown', count: 7 } + ] +}; diff --git a/src/routes/components/facets/docs/FacetsProps.svelte b/src/routes/components/facets/docs/FacetsProps.svelte new file mode 100644 index 00000000..65024cbc --- /dev/null +++ b/src/routes/components/facets/docs/FacetsProps.svelte @@ -0,0 +1,89 @@ +
+
+
Underlined attributes are required.
+
+ +
+
+
groups:
+
FacetGroup
+
+ +

+ Key value pairs where the key is the group name and the value is an array of possible choices. +

+
+ +
+
+
selected:
+
FacetGroup
+
+ +

+ An object with keys matching the keys in the groups object with selected options for each key. +

+

+ Binding to this parameters allows the parent component to control the selected items in the + facets. +

+
+ +
+
+
selectedGroups:
+
{`{[key: string]: boolean}`}
+
+ +

+ An object with keys matching the keys in the groups object with a boolean value indicated if + that group was selected or not. +

+

+ Binding to this parameters allows the parent component to control the selected groups in the + facets. +

+
+ +
+
+
open:
+
boolean
+
+ +

+ Control whether the facets are open or closed. false by default. +

+
+ +
+
+
showAll:
+
boolean
+
+ +

+ Control whether all the facet options are displayed in UI. false + by default. If set to + false and the number of options is greater than 5, the remaining options will be displayed in a modal. +

+
+ +
+
+
groupSelection:
+
boolean
+
+ +

+ Control whether the facet groups can be selected. false by default. +

+
+
diff --git a/src/routes/components/facets/docs/FacetsTypes.svelte b/src/routes/components/facets/docs/FacetsTypes.svelte new file mode 100644 index 00000000..6cf7dc17 --- /dev/null +++ b/src/routes/components/facets/docs/FacetsTypes.svelte @@ -0,0 +1,79 @@ + + +
+
+
+

FacetGroup

+ +
+ +
+
+ +
+
+
[key: string]:
+
FacetOption [ ]
+
+ +

+ Each key of this object represents an array of possible options where the key will be used + as the name of that group. +

+
+
+ +
+
+

FacetOption

+ +
+ +
+
+ +
+
Underlined attributes are required.
+
+ +
+
+
value:
+
string
+
+ +

Name of the filter.

+
+ +
+
+
count:
+
number
+
+ +

Number of items available for this specific filter.

+
+
+
diff --git a/src/routes/components/facets/examples/FacetsGroupSelection.svelte b/src/routes/components/facets/examples/FacetsGroupSelection.svelte new file mode 100644 index 00000000..6307a563 --- /dev/null +++ b/src/routes/components/facets/examples/FacetsGroupSelection.svelte @@ -0,0 +1,28 @@ + + +
+ + + +
diff --git a/src/routes/components/facets/examples/FacetsNoGroupSelection.svelte b/src/routes/components/facets/examples/FacetsNoGroupSelection.svelte new file mode 100644 index 00000000..755beab4 --- /dev/null +++ b/src/routes/components/facets/examples/FacetsNoGroupSelection.svelte @@ -0,0 +1,18 @@ + + +
+ + + +
diff --git a/src/routes/components/table/+page.svelte b/src/routes/components/table/+page.svelte index 48d2414a..9a06a390 100644 --- a/src/routes/components/table/+page.svelte +++ b/src/routes/components/table/+page.svelte @@ -1,5 +1,6 @@