diff --git a/src/components/Table/Table.stories.svelte b/src/components/Table/Table.stories.svelte index 6539ea26..c15b6d4a 100644 --- a/src/components/Table/Table.stories.svelte +++ b/src/components/Table/Table.stories.svelte @@ -7,6 +7,8 @@ // @ts-ignore import metadataDocs from './stories/docs/metadata.md?raw'; // @ts-ignore + import truncateDocs from './stories/docs/truncate.md?raw'; + // @ts-ignore import searchDocs from './stories/docs/search.md?raw'; // @ts-ignore import filterDocs from './stories/docs/filter.md?raw'; @@ -68,11 +70,22 @@ }}" /> + + Reporters Without Borders", @@ -110,12 +125,13 @@ {...withStoryDocs(sortDocs)} args="{{ data: pressFreedom, - title: 'Press Freedom Index', - notes: - "Source: Reporters Without Borders", sortable: true, sortField: 'Score', sortDirection: 'descending', + paginated: true, + title: 'Press Freedom Index', + notes: + "Source: Reporters Without Borders", }}" /> diff --git a/src/components/Table/Table.svelte b/src/components/Table/Table.svelte index 83d3153b..b61440a1 100644 --- a/src/components/Table/Table.svelte +++ b/src/components/Table/Table.svelte @@ -41,6 +41,24 @@ (f) => f !== 'searchStr' ); + /** + * Whether or not the table is cutoff after a set number of rows. + * @type {boolean} + */ + export let truncated: boolean = false; + + /** + * If the table is truncated, how many rows to allow before the cutoff. + * @type {number} + */ + export let truncateLength: number = 5; + + /** + * Whether or not the table is paginated after a set number of rows. + * @type {boolean} + */ + export let paginated: boolean = false; + /** * The default page size. * @type {number} @@ -122,7 +140,8 @@ isNumeric, } from './utils.js'; - /** Set filtering and pagination configuration */ + /** Set truncate, filtering and pagination configuration */ + let showAll = false; let pageNumber = 1; let searchText = ''; const filterList = filterField @@ -131,7 +150,15 @@ let filterValue = ''; $: filteredData = filterArray(data, searchText, filterField, filterValue); $: sortedData = sortArray(filteredData, sortField, sortDirection); - $: currentPageData = paginateArray(sortedData, pageSize, pageNumber); + $: currentPageData = () => { + if (truncated) { + return showAll ? sortedData : sortedData.slice(0, truncateLength + 1); + } else if (paginated) { + return paginateArray(sortedData, pageSize, pageNumber); + } else { + return sortedData; + } + }; // Estimate the text alignment of our fields. Strings go left. Numbers go right. function getAlignment(value) { @@ -142,7 +169,11 @@ return acc; }, {}); - //* * Handle search, filter, sort and pagination events */ + //* * Handle show all, search, filter, sort and pagination events */ + function toggleTruncate(event) { + showAll = !showAll; + } + function handleSearchInput(event) { searchText = event.target.value; pageNumber = 1; @@ -249,7 +280,12 @@ {/if}
- +
{#if title || dek} - {#each currentPageData as item, idx} + {#each currentPageData() as item, idx} {#each includedFields as field} + {#if notes} @@ -313,7 +349,15 @@ {/if}
{#if title} @@ -282,7 +318,7 @@
{#if notes || source} -
{@html notes}
- {#if filteredData.length > pageSize} + {#if truncated && data.length > truncateLength} + + {/if} + {#if paginated}