diff --git a/docs/src/pages/components/DataTable.svx b/docs/src/pages/components/DataTable.svx index acf72e59..a21c4b7c 100644 --- a/docs/src/pages/components/DataTable.svx +++ b/docs/src/pages/components/DataTable.svx @@ -388,6 +388,128 @@ ]}" /> +### Expandable + + + + + {JSON.stringify(row, null, 2)} + + + + +### Batch expansion + + + + + {JSON.stringify(row, null, 2)} + + + + ### Skeleton diff --git a/src/DataTable/DataTable.svelte b/src/DataTable/DataTable.svelte index 7e60959a..781762b9 100644 --- a/src/DataTable/DataTable.svelte +++ b/src/DataTable/DataTable.svelte @@ -42,6 +42,25 @@ */ export let sortable = false; + /** + * Set to `true` for the expandable variant + * Automatically set to `true` if `batchExpansion` is `true` + * @type {boolean} [expandable=false] + */ + export let expandable = false; + + /** + * Set to `true` to enable batch expansion + * @type {boolean} [batchExpansion=false] + */ + export let batchExpansion = false; + + /** + * Specify the row ids to be expanded + * @type {boolean} [expandedRowIds=[]] + */ + export let expandedRowIds = []; + /** * Set to `true` to enable a sticky header * @type {boolean} [stickyHeader=false] @@ -50,6 +69,7 @@ import { createEventDispatcher, setContext } from "svelte"; import { writable, derived } from "svelte/store"; + import ChevronRight16 from "carbon-icons-svelte/lib/ChevronRight16"; import Table from "./Table.svelte"; import TableBody from "./TableBody.svelte"; import TableCell from "./TableCell.svelte"; @@ -81,6 +101,14 @@ }, }); + let expanded = false; + let parentRowId = null; + + $: expandedRows = expandedRowIds.reduce( + (a, id) => ({ ...a, [id]: true }), + {} + ); + $: if (batchExpansion) expandable = true; $: tableSortable.set(sortable); $: headerKeys = headers.map(({ key }) => key); $: rows = rows.map((row) => ({ @@ -109,63 +137,124 @@ }); } } - $: props = { - headers, - rows, - }; - - - - - - {#each headers as header, i (header.key)} - - {header.value} - - {/each} - - - - {#each sorting ? sortedRows : rows as row, i (row.id)} - + + + + {#if expandable} + - {#each row.cells as cell, j (cell.key)} - - {cell.value} - - {/each} - + + + {/if} + + {/if} + {#each headers as header, i (header.key)} + + {header.value} + {/each} - - - - + + + + {#each sorting ? sortedRows : rows as row, i (row.id)} + + {#if expandable} + + + + + + {/if} + {#each row.cells as cell, j (cell.key)} + + {cell.value} + + {/each} + + + {#if expandable && expandedRows[row.id]} + + + + + + + + {/if} + {/each} + + + diff --git a/src/DataTable/TableRow.svelte b/src/DataTable/TableRow.svelte index de6ad017..b33d8c10 100644 --- a/src/DataTable/TableRow.svelte +++ b/src/DataTable/TableRow.svelte @@ -5,7 +5,7 @@ */ export let isSelected = false; - // TODO: include ariaLabel, onExpand, isExpanded, isSelected + // TODO: include ariaLabel, isSelected
+ {JSON.stringify(row, null, 2)} +