@ui-organized/svelte-table 0.0.0-stage → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +99 -2
- package/dist/DataTable/DataTable.svelte +62 -0
- package/dist/DataTable/DataTable.svelte.d.ts +29 -0
- package/dist/DataTable/DataTable.svelte.d.ts.map +1 -0
- package/dist/DataTable/DataTable.test.svelte.d.ts +2 -0
- package/dist/DataTable/DataTable.test.svelte.d.ts.map +1 -0
- package/dist/DataTable/DataTable.test.svelte.js +360 -0
- package/dist/DataTable/index.d.ts +2 -0
- package/dist/DataTable/index.d.ts.map +1 -0
- package/dist/DataTable/index.js +1 -0
- package/dist/components/Table/CellEditor.svelte +29 -0
- package/dist/components/Table/CellEditor.svelte.d.ts +8 -0
- package/dist/components/Table/CellEditor.svelte.d.ts.map +1 -0
- package/dist/components/Table/MoveButtons.svelte +60 -0
- package/dist/components/Table/MoveButtons.svelte.d.ts +8 -0
- package/dist/components/Table/MoveButtons.svelte.d.ts.map +1 -0
- package/dist/components/Table/ResizeHandle.svelte +82 -0
- package/dist/components/Table/ResizeHandle.svelte.d.ts +28 -0
- package/dist/components/Table/ResizeHandle.svelte.d.ts.map +1 -0
- package/dist/components/Table/Table.svelte +17 -0
- package/dist/components/Table/Table.svelte.d.ts +9 -0
- package/dist/components/Table/Table.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableBody.svelte +78 -0
- package/dist/components/Table/TableBody.svelte.d.ts +30 -0
- package/dist/components/Table/TableBody.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableCell.svelte +106 -0
- package/dist/components/Table/TableCell.svelte.d.ts +34 -0
- package/dist/components/Table/TableCell.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableFooter.svelte +34 -0
- package/dist/components/Table/TableFooter.svelte.d.ts +9 -0
- package/dist/components/Table/TableFooter.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableHeadCell.svelte +157 -0
- package/dist/components/Table/TableHeadCell.svelte.d.ts +29 -0
- package/dist/components/Table/TableHeadCell.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableHeader.svelte +22 -0
- package/dist/components/Table/TableHeader.svelte.d.ts +7 -0
- package/dist/components/Table/TableHeader.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableRow.svelte +84 -0
- package/dist/components/Table/TableRow.svelte.d.ts +32 -0
- package/dist/components/Table/TableRow.svelte.d.ts.map +1 -0
- package/dist/components/Table/TableViewport.svelte +69 -0
- package/dist/components/Table/TableViewport.svelte.d.ts +10 -0
- package/dist/components/Table/TableViewport.svelte.d.ts.map +1 -0
- package/dist/components/Table/index.d.ts +23 -0
- package/dist/components/Table/index.d.ts.map +1 -0
- package/dist/components/Table/index.js +22 -0
- package/dist/components/TableCards/TableCard.svelte +96 -0
- package/dist/components/TableCards/TableCard.svelte.d.ts +31 -0
- package/dist/components/TableCards/TableCard.svelte.d.ts.map +1 -0
- package/dist/components/TableCards/TableCards.svelte +61 -0
- package/dist/components/TableCards/TableCards.svelte.d.ts +7 -0
- package/dist/components/TableCards/TableCards.svelte.d.ts.map +1 -0
- package/dist/components/TableCards/index.d.ts +3 -0
- package/dist/components/TableCards/index.d.ts.map +1 -0
- package/dist/components/TableCards/index.js +2 -0
- package/dist/components/TableDetailSheet/TableDetailSheet.svelte +130 -0
- package/dist/components/TableDetailSheet/TableDetailSheet.svelte.d.ts +8 -0
- package/dist/components/TableDetailSheet/TableDetailSheet.svelte.d.ts.map +1 -0
- package/dist/components/TableDetailSheet/index.d.ts +2 -0
- package/dist/components/TableDetailSheet/index.d.ts.map +1 -0
- package/dist/components/TableDetailSheet/index.js +1 -0
- package/dist/components/TableFilters/TableFilterAdd.svelte +89 -0
- package/dist/components/TableFilters/TableFilterAdd.svelte.d.ts +15 -0
- package/dist/components/TableFilters/TableFilterAdd.svelte.d.ts.map +1 -0
- package/dist/components/TableFilters/TableFilterChip.svelte +164 -0
- package/dist/components/TableFilters/TableFilterChip.svelte.d.ts +9 -0
- package/dist/components/TableFilters/TableFilterChip.svelte.d.ts.map +1 -0
- package/dist/components/TableFilters/TableFilterEditor.svelte +40 -0
- package/dist/components/TableFilters/TableFilterEditor.svelte.d.ts +9 -0
- package/dist/components/TableFilters/TableFilterEditor.svelte.d.ts.map +1 -0
- package/dist/components/TableFilters/TableFilterValueEditor.svelte +209 -0
- package/dist/components/TableFilters/TableFilterValueEditor.svelte.d.ts +10 -0
- package/dist/components/TableFilters/TableFilterValueEditor.svelte.d.ts.map +1 -0
- package/dist/components/TableFilters/TableFilters.svelte +51 -0
- package/dist/components/TableFilters/TableFilters.svelte.d.ts +7 -0
- package/dist/components/TableFilters/TableFilters.svelte.d.ts.map +1 -0
- package/dist/components/TableFilters/index.d.ts +7 -0
- package/dist/components/TableFilters/index.d.ts.map +1 -0
- package/dist/components/TableFilters/index.js +6 -0
- package/dist/components/TableFilters/useAutoFocusField.d.ts +30 -0
- package/dist/components/TableFilters/useAutoFocusField.d.ts.map +1 -0
- package/dist/components/TableFilters/useAutoFocusField.js +59 -0
- package/dist/components/TablePagination/TablePagination.svelte +61 -0
- package/dist/components/TablePagination/TablePagination.svelte.d.ts +9 -0
- package/dist/components/TablePagination/TablePagination.svelte.d.ts.map +1 -0
- package/dist/components/TablePagination/index.d.ts +2 -0
- package/dist/components/TablePagination/index.d.ts.map +1 -0
- package/dist/components/TablePagination/index.js +1 -0
- package/dist/components/TableRowActions/TableRowActions.svelte +68 -0
- package/dist/components/TableRowActions/TableRowActions.svelte.d.ts +37 -0
- package/dist/components/TableRowActions/TableRowActions.svelte.d.ts.map +1 -0
- package/dist/components/TableRowActions/index.d.ts +2 -0
- package/dist/components/TableRowActions/index.d.ts.map +1 -0
- package/dist/components/TableRowActions/index.js +1 -0
- package/dist/components/TableSelectionBar/TableSelectionBar.svelte +88 -0
- package/dist/components/TableSelectionBar/TableSelectionBar.svelte.d.ts +30 -0
- package/dist/components/TableSelectionBar/TableSelectionBar.svelte.d.ts.map +1 -0
- package/dist/components/TableSelectionBar/index.d.ts +2 -0
- package/dist/components/TableSelectionBar/index.d.ts.map +1 -0
- package/dist/components/TableSelectionBar/index.js +1 -0
- package/dist/components/TableSelectionFooter/TableSelectionFooter.svelte +38 -0
- package/dist/components/TableSelectionFooter/TableSelectionFooter.svelte.d.ts +7 -0
- package/dist/components/TableSelectionFooter/TableSelectionFooter.svelte.d.ts.map +1 -0
- package/dist/components/TableSelectionFooter/index.d.ts +2 -0
- package/dist/components/TableSelectionFooter/index.d.ts.map +1 -0
- package/dist/components/TableSelectionFooter/index.js +1 -0
- package/dist/components/TableSheets/TableFilterSheet.svelte +150 -0
- package/dist/components/TableSheets/TableFilterSheet.svelte.d.ts +8 -0
- package/dist/components/TableSheets/TableFilterSheet.svelte.d.ts.map +1 -0
- package/dist/components/TableSheets/TableFilterSheetCondition.svelte +53 -0
- package/dist/components/TableSheets/TableFilterSheetCondition.svelte.d.ts +9 -0
- package/dist/components/TableSheets/TableFilterSheetCondition.svelte.d.ts.map +1 -0
- package/dist/components/TableSheets/TableSheetButton.svelte +44 -0
- package/dist/components/TableSheets/TableSheetButton.svelte.d.ts +15 -0
- package/dist/components/TableSheets/TableSheetButton.svelte.d.ts.map +1 -0
- package/dist/components/TableSheets/TableSortSheet.svelte +100 -0
- package/dist/components/TableSheets/TableSortSheet.svelte.d.ts +8 -0
- package/dist/components/TableSheets/TableSortSheet.svelte.d.ts.map +1 -0
- package/dist/components/TableSheets/index.d.ts +4 -0
- package/dist/components/TableSheets/index.d.ts.map +1 -0
- package/dist/components/TableSheets/index.js +3 -0
- package/dist/components/TableStates/TableEmpty.svelte +35 -0
- package/dist/components/TableStates/TableEmpty.svelte.d.ts +11 -0
- package/dist/components/TableStates/TableEmpty.svelte.d.ts.map +1 -0
- package/dist/components/TableStates/TableError.svelte +26 -0
- package/dist/components/TableStates/TableError.svelte.d.ts +10 -0
- package/dist/components/TableStates/TableError.svelte.d.ts.map +1 -0
- package/dist/components/TableStates/TableLoading.svelte +33 -0
- package/dist/components/TableStates/TableLoading.svelte.d.ts +8 -0
- package/dist/components/TableStates/TableLoading.svelte.d.ts.map +1 -0
- package/dist/components/TableStates/index.d.ts +4 -0
- package/dist/components/TableStates/index.d.ts.map +1 -0
- package/dist/components/TableStates/index.js +3 -0
- package/dist/components/TableSubBar/TableSubBar.svelte +34 -0
- package/dist/components/TableSubBar/TableSubBar.svelte.d.ts +7 -0
- package/dist/components/TableSubBar/TableSubBar.svelte.d.ts.map +1 -0
- package/dist/components/TableSubBar/index.d.ts +2 -0
- package/dist/components/TableSubBar/index.d.ts.map +1 -0
- package/dist/components/TableSubBar/index.js +1 -0
- package/dist/components/TableToolbar/TableActions.svelte +40 -0
- package/dist/components/TableToolbar/TableActions.svelte.d.ts +9 -0
- package/dist/components/TableToolbar/TableActions.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableExportMenu.svelte +60 -0
- package/dist/components/TableToolbar/TableExportMenu.svelte.d.ts +8 -0
- package/dist/components/TableToolbar/TableExportMenu.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableReorderToggle.svelte +27 -0
- package/dist/components/TableToolbar/TableReorderToggle.svelte.d.ts +7 -0
- package/dist/components/TableToolbar/TableReorderToggle.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableScrollButtons.svelte +54 -0
- package/dist/components/TableToolbar/TableScrollButtons.svelte.d.ts +9 -0
- package/dist/components/TableToolbar/TableScrollButtons.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableSearch.svelte +24 -0
- package/dist/components/TableToolbar/TableSearch.svelte.d.ts +9 -0
- package/dist/components/TableToolbar/TableSearch.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableSortMenu.svelte +97 -0
- package/dist/components/TableToolbar/TableSortMenu.svelte.d.ts +8 -0
- package/dist/components/TableToolbar/TableSortMenu.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableToolbar.svelte +113 -0
- package/dist/components/TableToolbar/TableToolbar.svelte.d.ts +9 -0
- package/dist/components/TableToolbar/TableToolbar.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/TableViewOptions.svelte +69 -0
- package/dist/components/TableToolbar/TableViewOptions.svelte.d.ts +8 -0
- package/dist/components/TableToolbar/TableViewOptions.svelte.d.ts.map +1 -0
- package/dist/components/TableToolbar/index.d.ts +9 -0
- package/dist/components/TableToolbar/index.d.ts.map +1 -0
- package/dist/components/TableToolbar/index.js +8 -0
- package/dist/core/ActionsHeader.svelte +8 -0
- package/dist/core/ActionsHeader.svelte.d.ts +27 -0
- package/dist/core/ActionsHeader.svelte.d.ts.map +1 -0
- package/dist/core/SelectAllCell.svelte +21 -0
- package/dist/core/SelectAllCell.svelte.d.ts +19 -0
- package/dist/core/SelectAllCell.svelte.d.ts.map +1 -0
- package/dist/core/SelectCell.svelte +37 -0
- package/dist/core/SelectCell.svelte.d.ts +8 -0
- package/dist/core/SelectCell.svelte.d.ts.map +1 -0
- package/dist/core/createDataTable.svelte.d.ts +4 -0
- package/dist/core/createDataTable.svelte.d.ts.map +1 -0
- package/dist/core/createDataTable.svelte.js +1152 -0
- package/dist/core/createDataTable.test.svelte.d.ts +2 -0
- package/dist/core/createDataTable.test.svelte.d.ts.map +1 -0
- package/dist/core/createDataTable.test.svelte.js +156 -0
- package/dist/core/createDeferred.svelte.d.ts +38 -0
- package/dist/core/createDeferred.svelte.d.ts.map +1 -0
- package/dist/core/createDeferred.svelte.js +81 -0
- package/dist/core/elementRef.d.ts +17 -0
- package/dist/core/elementRef.d.ts.map +1 -0
- package/dist/core/elementRef.js +20 -0
- package/dist/core/props.d.ts +3 -0
- package/dist/core/props.d.ts.map +1 -0
- package/dist/core/props.js +46 -0
- package/dist/core/systemColumns.d.ts +16 -0
- package/dist/core/systemColumns.d.ts.map +1 -0
- package/dist/core/systemColumns.js +53 -0
- package/dist/core/tableContext.d.ts +7 -0
- package/dist/core/tableContext.d.ts.map +1 -0
- package/dist/core/tableContext.js +30 -0
- package/dist/core/trackStore.svelte.d.ts +24 -0
- package/dist/core/trackStore.svelte.d.ts.map +1 -0
- package/dist/core/trackStore.svelte.js +28 -0
- package/dist/core/types.d.ts +397 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/styles.css +895 -0
- package/package.json +77 -3
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
The scroll container and the `<table>` element, which are inseparable: a
|
|
3
|
+
viewport with two tables in it means nothing, and `<caption>` and `<colgroup>`
|
|
4
|
+
have to be emitted between them.
|
|
5
|
+
-->
|
|
6
|
+
<script lang="ts">
|
|
7
|
+
import { TableSelectionFooter } from "../TableSelectionFooter/index.js";
|
|
8
|
+
import type { Snippet } from "svelte";
|
|
9
|
+
import { clsx } from "clsx";
|
|
10
|
+
import {
|
|
11
|
+
getCaptionProps,
|
|
12
|
+
getColProps,
|
|
13
|
+
getTableProps,
|
|
14
|
+
getViewportProps,
|
|
15
|
+
} from "@ui-organized/table-core";
|
|
16
|
+
import { getTable } from "../../core/tableContext.js";
|
|
17
|
+
import { elementRef } from "../../core/elementRef.js";
|
|
18
|
+
import { svelteProps } from "../../core/props.js";
|
|
19
|
+
|
|
20
|
+
let {
|
|
21
|
+
class: className,
|
|
22
|
+
maxHeight,
|
|
23
|
+
children,
|
|
24
|
+
}: { class?: string; maxHeight?: number | string; children?: Snippet } = $props();
|
|
25
|
+
|
|
26
|
+
const table = getTable();
|
|
27
|
+
const viewport = $derived(getViewportProps(table.chrome));
|
|
28
|
+
const tableProps = $derived(getTableProps(table.chrome));
|
|
29
|
+
const caption = $derived(getCaptionProps(table.captionVisible));
|
|
30
|
+
const columns = $derived(table.table.getVisibleLeafColumns());
|
|
31
|
+
|
|
32
|
+
const lengthOf = (value: number | string) => (typeof value === "number" ? `${value}px` : value);
|
|
33
|
+
const cap = $derived(maxHeight ?? table.options.maxHeight);
|
|
34
|
+
const style = $derived(
|
|
35
|
+
cap === undefined ? undefined : `--data-table-max-height: ${lengthOf(cap)}`,
|
|
36
|
+
);
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div
|
|
40
|
+
{...svelteProps(viewport)}
|
|
41
|
+
class={clsx(viewport.className, className)}
|
|
42
|
+
{style}
|
|
43
|
+
use:elementRef={table.viewportRef}
|
|
44
|
+
>
|
|
45
|
+
<!--
|
|
46
|
+
One key handler for the whole grid rather than one per cell: the cursor is
|
|
47
|
+
table state, so the key only has to reach the table. It sits on the element
|
|
48
|
+
that carries `role="grid"`, not on the scroll container — which is also what
|
|
49
|
+
stops it being a keyboard handler on a div with no role at all.
|
|
50
|
+
-->
|
|
51
|
+
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
52
|
+
<table
|
|
53
|
+
{...svelteProps(tableProps)}
|
|
54
|
+
onkeydown={(event) => (table.interactive ? table.onGridKeyDown(event) : undefined)}
|
|
55
|
+
>
|
|
56
|
+
<!-- First child of <table>, per the content model. -->
|
|
57
|
+
<caption {...svelteProps(caption)}>{table.label}</caption>
|
|
58
|
+
<colgroup>
|
|
59
|
+
{#each columns as column (column.id)}
|
|
60
|
+
<col {...svelteProps(getColProps(table.columnWidths[column.id]))} />
|
|
61
|
+
{/each}
|
|
62
|
+
</colgroup>
|
|
63
|
+
{@render children?.()}
|
|
64
|
+
</table>
|
|
65
|
+
<!-- After the table, inside the scroll container: it sticks to the
|
|
66
|
+
viewport's bottom edge, so it costs a capped table scroll length rather
|
|
67
|
+
than page height. -->
|
|
68
|
+
<TableSelectionFooter />
|
|
69
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
class?: string;
|
|
4
|
+
maxHeight?: number | string;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
};
|
|
7
|
+
declare const TableViewport: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
8
|
+
type TableViewport = ReturnType<typeof TableViewport>;
|
|
9
|
+
export default TableViewport;
|
|
10
|
+
//# sourceMappingURL=TableViewport.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableViewport.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Table/TableViewport.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAYrC,KAAK,gBAAgB,GAAI;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAiD9F,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The parts, flat-exported — `TableHeader`, not `Table.Header`. That is the
|
|
3
|
+
* repo's convention everywhere else (`DialogContent`, `MenuItem`) and there is
|
|
4
|
+
* no reason for the table to be the exception.
|
|
5
|
+
*
|
|
6
|
+
* The DOM they compose to:
|
|
7
|
+
*
|
|
8
|
+
* <Table> <div class="data-table"> root, size + variant
|
|
9
|
+
* <TableToolbar> …
|
|
10
|
+
* <TableViewport> <div class="data-table__viewport"><table>
|
|
11
|
+
* <TableHeader> <thead>
|
|
12
|
+
* <TableBody> <tbody> spacer / rows / spacer
|
|
13
|
+
* <TablePagination>
|
|
14
|
+
*/
|
|
15
|
+
export { default as Table } from "./Table.svelte";
|
|
16
|
+
export { default as TableViewport } from "./TableViewport.svelte";
|
|
17
|
+
export { default as TableHeader } from "./TableHeader.svelte";
|
|
18
|
+
export { default as TableHeadCell } from "./TableHeadCell.svelte";
|
|
19
|
+
export { default as TableBody } from "./TableBody.svelte";
|
|
20
|
+
export { default as TableRow } from "./TableRow.svelte";
|
|
21
|
+
export { default as TableCell } from "./TableCell.svelte";
|
|
22
|
+
export { default as TableFooter } from "./TableFooter.svelte";
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Table/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The parts, flat-exported — `TableHeader`, not `Table.Header`. That is the
|
|
3
|
+
* repo's convention everywhere else (`DialogContent`, `MenuItem`) and there is
|
|
4
|
+
* no reason for the table to be the exception.
|
|
5
|
+
*
|
|
6
|
+
* The DOM they compose to:
|
|
7
|
+
*
|
|
8
|
+
* <Table> <div class="data-table"> root, size + variant
|
|
9
|
+
* <TableToolbar> …
|
|
10
|
+
* <TableViewport> <div class="data-table__viewport"><table>
|
|
11
|
+
* <TableHeader> <thead>
|
|
12
|
+
* <TableBody> <tbody> spacer / rows / spacer
|
|
13
|
+
* <TablePagination>
|
|
14
|
+
*/
|
|
15
|
+
export { default as Table } from "./Table.svelte";
|
|
16
|
+
export { default as TableViewport } from "./TableViewport.svelte";
|
|
17
|
+
export { default as TableHeader } from "./TableHeader.svelte";
|
|
18
|
+
export { default as TableHeadCell } from "./TableHeadCell.svelte";
|
|
19
|
+
export { default as TableBody } from "./TableBody.svelte";
|
|
20
|
+
export { default as TableRow } from "./TableRow.svelte";
|
|
21
|
+
export { default as TableCell } from "./TableCell.svelte";
|
|
22
|
+
export { default as TableFooter } from "./TableFooter.svelte";
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import { clsx } from "clsx";
|
|
3
|
+
import { FlexRender } from "@tanstack/svelte-table";
|
|
4
|
+
import { Checkbox } from "@ui-organized/svelte";
|
|
5
|
+
import type { RowData, TableRowModel } from "@ui-organized/table-core";
|
|
6
|
+
import { getTable } from "../../core/tableContext.js";
|
|
7
|
+
import { elementRef } from "../../core/elementRef.js";
|
|
8
|
+
import { TableRowActions } from "../TableRowActions/index.js";
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
row,
|
|
12
|
+
index,
|
|
13
|
+
fields,
|
|
14
|
+
class: className,
|
|
15
|
+
}: { row: TableRowModel<T>; index: number; fields: string[]; class?: string } = $props();
|
|
16
|
+
|
|
17
|
+
const table = getTable<T>();
|
|
18
|
+
const selected = $derived(table.selection.isSelected(row.id));
|
|
19
|
+
const cells = $derived(row.getVisibleCells());
|
|
20
|
+
const primaryCell = $derived(
|
|
21
|
+
table.primaryColumnId
|
|
22
|
+
? cells.find((cell) => cell.column.id === table.primaryColumnId)
|
|
23
|
+
: undefined,
|
|
24
|
+
);
|
|
25
|
+
const clickable = $derived(
|
|
26
|
+
Boolean(table.options.detail) || Boolean(table.options.onRowClick),
|
|
27
|
+
);
|
|
28
|
+
const titleText = $derived(
|
|
29
|
+
primaryCell ? String(primaryCell.getValue() ?? row.id) : row.id,
|
|
30
|
+
);
|
|
31
|
+
const cellFor = (columnId: string) => cells.find((cell) => cell.column.id === columnId);
|
|
32
|
+
const headerFor = (columnId: string) => {
|
|
33
|
+
const header = table.table.getColumn(columnId)?.columnDef.header;
|
|
34
|
+
return typeof header === "string" ? header : columnId;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const measure = (element: HTMLElement | null) => {
|
|
38
|
+
if (table.virtual.enabled && element) table.virtual.virtualizer.measureElement(element);
|
|
39
|
+
};
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<li
|
|
43
|
+
class={clsx("data-table__card", selected && "data-table__card--selected", className)}
|
|
44
|
+
data-index={index}
|
|
45
|
+
data-row-id={row.id}
|
|
46
|
+
use:elementRef={measure}
|
|
47
|
+
>
|
|
48
|
+
<!--
|
|
49
|
+
Title first, then the row's controls at the top-right corner: the actions
|
|
50
|
+
menu, and the checkbox last, in the corner a thumb reaches and where a
|
|
51
|
+
ticked card is easiest to scan for down a list.
|
|
52
|
+
-->
|
|
53
|
+
<div class="data-table__card-header">
|
|
54
|
+
<!--
|
|
55
|
+
A button rather than a clickable card: a card is not an interactive
|
|
56
|
+
element, and making one is how a keyboard user loses the row.
|
|
57
|
+
-->
|
|
58
|
+
{#if clickable}
|
|
59
|
+
<button
|
|
60
|
+
type="button"
|
|
61
|
+
class="data-table__card-title data-table__sort-button"
|
|
62
|
+
onclick={() => table.activate(row)}
|
|
63
|
+
>
|
|
64
|
+
{#if primaryCell}<FlexRender cell={primaryCell} />{:else}{row.id}{/if}
|
|
65
|
+
</button>
|
|
66
|
+
{:else}
|
|
67
|
+
<span class="data-table__card-title">
|
|
68
|
+
{#if primaryCell}<FlexRender cell={primaryCell} />{:else}{row.id}{/if}
|
|
69
|
+
</span>
|
|
70
|
+
{/if}
|
|
71
|
+
{#if table.options.rowActions?.length || table.selection.mode !== "none"}
|
|
72
|
+
<span class="data-table__card-controls">
|
|
73
|
+
{#if table.options.rowActions?.length}
|
|
74
|
+
<TableRowActions row={row.original} label={`Actions for ${titleText}`} />
|
|
75
|
+
{/if}
|
|
76
|
+
{#if table.selection.mode !== "none"}
|
|
77
|
+
<Checkbox
|
|
78
|
+
checked={selected}
|
|
79
|
+
aria-label={`Select ${titleText}`}
|
|
80
|
+
onCheckedChange={(checked) => table.selection.toggle(row.id, checked)}
|
|
81
|
+
/>
|
|
82
|
+
{/if}
|
|
83
|
+
</span>
|
|
84
|
+
{/if}
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<dl class="data-table__card-fields">
|
|
88
|
+
{#each fields as columnId (columnId)}
|
|
89
|
+
{@const cell = cellFor(columnId)}
|
|
90
|
+
{#if cell}
|
|
91
|
+
<dt class="data-table__card-label">{headerFor(columnId)}</dt>
|
|
92
|
+
<dd class="data-table__card-value"><FlexRender {cell} /></dd>
|
|
93
|
+
{/if}
|
|
94
|
+
{/each}
|
|
95
|
+
</dl>
|
|
96
|
+
</li>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RowData, TableRowModel } from "@ui-organized/table-core";
|
|
2
|
+
declare function $$render<T extends RowData>(): {
|
|
3
|
+
props: {
|
|
4
|
+
row: TableRowModel<T>;
|
|
5
|
+
index: number;
|
|
6
|
+
fields: string[];
|
|
7
|
+
class?: string;
|
|
8
|
+
};
|
|
9
|
+
exports: {};
|
|
10
|
+
bindings: "";
|
|
11
|
+
slots: {};
|
|
12
|
+
events: {};
|
|
13
|
+
};
|
|
14
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
15
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
16
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
+
bindings(): "";
|
|
19
|
+
exports(): {};
|
|
20
|
+
}
|
|
21
|
+
interface $$IsomorphicComponent {
|
|
22
|
+
new <T extends RowData>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
+
}
|
|
28
|
+
declare const TableCard: $$IsomorphicComponent;
|
|
29
|
+
type TableCard<T extends RowData> = InstanceType<typeof TableCard<T>>;
|
|
30
|
+
export default TableCard;
|
|
31
|
+
//# sourceMappingURL=TableCard.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableCard.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableCards/TableCard.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIvE,iBAAS,QAAQ,CAAC,CAAC,SAAS,OAAO;;aAQA,aAAa,CAAC,CAAC,CAAC;eAAS,MAAM;gBAAU,MAAM,EAAE;gBAAU,MAAM;;;;;;EAuEqB;AACzH,cAAM,iBAAiB,CAAC,CAAC,SAAS,OAAO;IACrC,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,MAAM,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClD,KAAK,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAChD,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5Y,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3I,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD,QAAA,MAAM,SAAS,EAAE,qBAAmC,CAAC;AACnC,KAAK,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Card mode: one card per row, below the breakpoint.
|
|
3
|
+
|
|
4
|
+
The table is *replaced*, not hidden — rendering both trees and hiding one with
|
|
5
|
+
a container query would double the DOM and defeat virtualization on exactly the
|
|
6
|
+
devices that can least afford it. Selection, row actions and the detail sheet
|
|
7
|
+
all keep working, because they are table state rather than table markup.
|
|
8
|
+
-->
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
import { clsx } from "clsx";
|
|
11
|
+
import { cardFieldOrder } from "@ui-organized/table-core";
|
|
12
|
+
import { getTable } from "../../core/tableContext.js";
|
|
13
|
+
import { elementRef } from "../../core/elementRef.js";
|
|
14
|
+
import { TableEmpty } from "../TableStates/index.js";
|
|
15
|
+
import TableCard from "./TableCard.svelte";
|
|
16
|
+
|
|
17
|
+
let { class: className }: { class?: string } = $props();
|
|
18
|
+
const table = getTable();
|
|
19
|
+
|
|
20
|
+
const fields = $derived(cardFieldOrder(table.options.columns));
|
|
21
|
+
const renderRows = $derived(table.renderRows);
|
|
22
|
+
const spacers = $derived(
|
|
23
|
+
table.virtual.enabled ? table.virtual.spacers : { top: 0, bottom: 0 },
|
|
24
|
+
);
|
|
25
|
+
const cap = $derived(table.options.maxHeight);
|
|
26
|
+
const style = $derived(
|
|
27
|
+
cap === undefined
|
|
28
|
+
? undefined
|
|
29
|
+
: `--data-table-max-height: ${typeof cap === "number" ? `${cap}px` : cap}`,
|
|
30
|
+
);
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
{#if renderRows.length === 0}
|
|
34
|
+
<div class={clsx("data-table__cards", className)}>
|
|
35
|
+
<table class="data-table__table">
|
|
36
|
+
<caption class="data-table__sr-only">{table.label}</caption>
|
|
37
|
+
<tbody><TableEmpty /></tbody>
|
|
38
|
+
</table>
|
|
39
|
+
</div>
|
|
40
|
+
{:else}
|
|
41
|
+
<ul
|
|
42
|
+
class={clsx("data-table__cards", className)}
|
|
43
|
+
aria-label={table.label}
|
|
44
|
+
{style}
|
|
45
|
+
use:elementRef={table.viewportRef}
|
|
46
|
+
>
|
|
47
|
+
{#if spacers.top > 0}
|
|
48
|
+
<li class="data-table__card-spacer" aria-hidden="true" style={`height: ${spacers.top}px`}></li>
|
|
49
|
+
{/if}
|
|
50
|
+
{#each renderRows as entry (entry.row.id)}
|
|
51
|
+
<TableCard row={entry.row} index={entry.index} {fields} />
|
|
52
|
+
{/each}
|
|
53
|
+
{#if spacers.bottom > 0}
|
|
54
|
+
<li
|
|
55
|
+
class="data-table__card-spacer"
|
|
56
|
+
aria-hidden="true"
|
|
57
|
+
style={`height: ${spacers.bottom}px`}
|
|
58
|
+
></li>
|
|
59
|
+
{/if}
|
|
60
|
+
</ul>
|
|
61
|
+
{/if}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableCards.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableCards/TableCards.svelte.ts"],"names":[],"mappings":"AAUC,KAAK,gBAAgB,GAAI;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAiD7C,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableCards/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
The row detail panel.
|
|
3
|
+
|
|
4
|
+
Core owns prev/next navigation and the dirty guard; this owns the two things
|
|
5
|
+
that are genuinely the adapter's: returning focus to the row the panel was
|
|
6
|
+
opened from, and rendering the confirmation as a real `AlertDialog`.
|
|
7
|
+
-->
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import { clsx } from "clsx";
|
|
10
|
+
import {
|
|
11
|
+
AlertDialog,
|
|
12
|
+
AlertDialogCancel,
|
|
13
|
+
AlertDialogConfirm,
|
|
14
|
+
AlertDialogContent,
|
|
15
|
+
AlertDialogDescription,
|
|
16
|
+
AlertDialogFooter,
|
|
17
|
+
AlertDialogTitle,
|
|
18
|
+
Button,
|
|
19
|
+
Sheet,
|
|
20
|
+
SheetContent,
|
|
21
|
+
SheetDescription,
|
|
22
|
+
SheetFooter,
|
|
23
|
+
SheetTitle,
|
|
24
|
+
} from "@ui-organized/svelte";
|
|
25
|
+
import { getTable } from "../../core/tableContext.js";
|
|
26
|
+
import { internalGlyph as glyph } from "@ui-organized/svelte";
|
|
27
|
+
|
|
28
|
+
let { size = "md", class: className }: { size?: "sm" | "md" | "lg"; class?: string } = $props();
|
|
29
|
+
|
|
30
|
+
const table = getTable();
|
|
31
|
+
const config = $derived(table.options.detail);
|
|
32
|
+
const detail = table.detail;
|
|
33
|
+
const open = $derived(detail.state.rowId !== null);
|
|
34
|
+
const row = $derived(detail.row);
|
|
35
|
+
const position = $derived(detail.state.index >= 0 ? detail.state.index + 1 : 0);
|
|
36
|
+
const total = $derived(table.rows.length);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Focus came from a cell; the Sheet moves it into the panel and, on close,
|
|
40
|
+
* hands it back to `document.body` unless we remember where it was.
|
|
41
|
+
*/
|
|
42
|
+
let openedFrom = $state<HTMLElement | null>(null);
|
|
43
|
+
$effect(() => {
|
|
44
|
+
if (open && !openedFrom) {
|
|
45
|
+
openedFrom = (document.activeElement as HTMLElement | null) ?? null;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (!open && openedFrom) {
|
|
49
|
+
const previous = openedFrom;
|
|
50
|
+
openedFrom = null;
|
|
51
|
+
// After the Sheet's own close transition has released the focus trap.
|
|
52
|
+
requestAnimationFrame(() => previous.isConnected && previous.focus());
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const render = (value: unknown) => (typeof value === "function" ? undefined : value);
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
{#if config}
|
|
60
|
+
<Sheet {open} onOpenChange={(next) => !next && detail.close()}>
|
|
61
|
+
<SheetContent side="right" {size} class={clsx("data-table__detail", className)}>
|
|
62
|
+
<!--
|
|
63
|
+
The title clears the Sheet's own close control, which sits in the same
|
|
64
|
+
top-right corner; the row pager gets its own line rather than competing
|
|
65
|
+
with it for that space.
|
|
66
|
+
-->
|
|
67
|
+
<div class="data-table__detail-header">
|
|
68
|
+
<SheetTitle>{row ? (config.title?.(row) ?? table.label) : table.label}</SheetTitle>
|
|
69
|
+
{#if row && config.description}
|
|
70
|
+
<SheetDescription>{config.description(row)}</SheetDescription>
|
|
71
|
+
{/if}
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div class="data-table__detail-nav">
|
|
75
|
+
<span class="data-table__detail-position">{position} of {total}</span>
|
|
76
|
+
<Button
|
|
77
|
+
intent="ghost"
|
|
78
|
+
size="sm"
|
|
79
|
+
icon={glyph("chevron-up")}
|
|
80
|
+
aria-label="Previous row"
|
|
81
|
+
disabled={!detail.canStep(-1)}
|
|
82
|
+
onclick={() => detail.step(-1)}
|
|
83
|
+
/>
|
|
84
|
+
<Button
|
|
85
|
+
intent="ghost"
|
|
86
|
+
size="sm"
|
|
87
|
+
icon={glyph("chevron-down")}
|
|
88
|
+
aria-label="Next row"
|
|
89
|
+
disabled={!detail.canStep(1)}
|
|
90
|
+
onclick={() => detail.step(1)}
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div class="data-table__detail-body">
|
|
95
|
+
{#if row}
|
|
96
|
+
{@const body = config.render(row)}
|
|
97
|
+
{#if typeof body === "function"}{@render body()}{:else}{render(body)}{/if}
|
|
98
|
+
{/if}
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
{#if row && config.footer}
|
|
102
|
+
<SheetFooter>
|
|
103
|
+
{@const footer = config.footer(row)}
|
|
104
|
+
{#if typeof footer === "function"}{@render footer()}{:else}{render(footer)}{/if}
|
|
105
|
+
</SheetFooter>
|
|
106
|
+
{/if}
|
|
107
|
+
</SheetContent>
|
|
108
|
+
</Sheet>
|
|
109
|
+
|
|
110
|
+
<!-- The dirty guard. Core decided it was needed; this only asks. -->
|
|
111
|
+
<AlertDialog
|
|
112
|
+
open={detail.state.confirming !== null}
|
|
113
|
+
onOpenChange={(next) => !next && detail.resolveConfirm(false)}
|
|
114
|
+
>
|
|
115
|
+
<AlertDialogContent>
|
|
116
|
+
<AlertDialogTitle>Discard unsaved changes?</AlertDialogTitle>
|
|
117
|
+
<AlertDialogDescription>
|
|
118
|
+
This row has edits that have not been saved. Leaving now loses them.
|
|
119
|
+
</AlertDialogDescription>
|
|
120
|
+
<AlertDialogFooter>
|
|
121
|
+
<AlertDialogCancel onclick={() => detail.resolveConfirm(false)}>
|
|
122
|
+
Keep editing
|
|
123
|
+
</AlertDialogCancel>
|
|
124
|
+
<AlertDialogConfirm intent="destructive" onclick={() => detail.resolveConfirm(true)}>
|
|
125
|
+
Discard
|
|
126
|
+
</AlertDialogConfirm>
|
|
127
|
+
</AlertDialogFooter>
|
|
128
|
+
</AlertDialogContent>
|
|
129
|
+
</AlertDialog>
|
|
130
|
+
{/if}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
size?: "sm" | "md" | "lg";
|
|
3
|
+
class?: string;
|
|
4
|
+
};
|
|
5
|
+
declare const TableDetailSheet: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
6
|
+
type TableDetailSheet = ReturnType<typeof TableDetailSheet>;
|
|
7
|
+
export default TableDetailSheet;
|
|
8
|
+
//# sourceMappingURL=TableDetailSheet.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableDetailSheet.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableDetailSheet/TableDetailSheet.svelte.ts"],"names":[],"mappings":"AAsBC,KAAK,gBAAgB,GAAI;IAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA6FxE,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableDetailSheet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as TableDetailSheet } from "./TableDetailSheet.svelte";
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
The field picker, in both the shapes the design uses it: the header's icon-only
|
|
3
|
+
button (Figma 2298:336) and the filter bar's "+ Add" (2298:531).
|
|
4
|
+
|
|
5
|
+
A `Menu`, like every other menu the table puts in its chrome
|
|
6
|
+
(`TableViewOptions`, `TableExportMenu`, `TableRowActions`). Picking a field
|
|
7
|
+
*does* something — it adds a filter and opens that filter's editor — so
|
|
8
|
+
`role="menu"` with `menuitem` children is the honest semantic.
|
|
9
|
+
|
|
10
|
+
No search box: a text input inside `role="menu"` breaks the menu's own keyboard
|
|
11
|
+
contract, and zag's menu already does typeahead, which is the same affordance
|
|
12
|
+
without the semantic damage.
|
|
13
|
+
-->
|
|
14
|
+
<script lang="ts">
|
|
15
|
+
import { Button, Menu, MenuContent, MenuItem, MenuTrigger } from "@ui-organized/svelte";
|
|
16
|
+
import { getTable } from "../../core/tableContext.js";
|
|
17
|
+
import { internalGlyph as glyph } from "@ui-organized/svelte";
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
label = "Add filter",
|
|
21
|
+
iconOnly = false,
|
|
22
|
+
container,
|
|
23
|
+
class: className,
|
|
24
|
+
}: {
|
|
25
|
+
label?: string;
|
|
26
|
+
iconOnly?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Where the field menu portals. Inside a modal sheet it has to be the
|
|
29
|
+
* sheet: a modal hides everything outside itself from assistive tech, and a
|
|
30
|
+
* menu portalled to <body> is outside it — painted, but unreachable.
|
|
31
|
+
*/
|
|
32
|
+
container?: HTMLElement | null;
|
|
33
|
+
class?: string;
|
|
34
|
+
} = $props();
|
|
35
|
+
|
|
36
|
+
const table = getTable();
|
|
37
|
+
const fields = $derived(table.filters.fields);
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
{#if fields.length > 0}
|
|
41
|
+
<Menu>
|
|
42
|
+
<!--
|
|
43
|
+
The two presentations are the two places this appears, not a free choice:
|
|
44
|
+
the header's is the funnel that *starts* filtering, the bar's is the plus
|
|
45
|
+
that adds another to a list that already exists.
|
|
46
|
+
|
|
47
|
+
`aria-label` on the trigger also names the menu it opens: zag points the
|
|
48
|
+
menu's `aria-labelledby` at its trigger, which wins over any `aria-label`
|
|
49
|
+
set on the content. So the button's name has to be the *menu's* name too —
|
|
50
|
+
"Add filter", not "Filter".
|
|
51
|
+
-->
|
|
52
|
+
<MenuTrigger>
|
|
53
|
+
{#snippet asChild(props)}
|
|
54
|
+
{#if iconOnly}
|
|
55
|
+
<Button
|
|
56
|
+
{...(props() as Record<string, never>)}
|
|
57
|
+
intent="secondary"
|
|
58
|
+
size={table.size}
|
|
59
|
+
icon={glyph("filter")}
|
|
60
|
+
aria-label={label}
|
|
61
|
+
class={className}
|
|
62
|
+
/>
|
|
63
|
+
{:else}
|
|
64
|
+
<Button
|
|
65
|
+
{...(props() as Record<string, never>)}
|
|
66
|
+
intent="ghost"
|
|
67
|
+
size="sm"
|
|
68
|
+
icon={glyph("plus")}
|
|
69
|
+
class={className}
|
|
70
|
+
>
|
|
71
|
+
{label}
|
|
72
|
+
</Button>
|
|
73
|
+
{/if}
|
|
74
|
+
{/snippet}
|
|
75
|
+
</MenuTrigger>
|
|
76
|
+
<MenuContent align="end" class="data-table__filter-picker" {container}>
|
|
77
|
+
<!--
|
|
78
|
+
A field that already carries conditions stays in the list — several
|
|
79
|
+
conditions on one column is the point — with a count so it is obvious
|
|
80
|
+
this adds another rather than replacing.
|
|
81
|
+
-->
|
|
82
|
+
{#each fields as field (field.columnId)}
|
|
83
|
+
<MenuItem value={field.columnId} onSelect={() => table.filters.add(field.columnId)}>
|
|
84
|
+
{field.count > 0 ? `${field.label} (${field.count})` : field.label}
|
|
85
|
+
</MenuItem>
|
|
86
|
+
{/each}
|
|
87
|
+
</MenuContent>
|
|
88
|
+
</Menu>
|
|
89
|
+
{/if}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type $$ComponentProps = {
|
|
2
|
+
label?: string;
|
|
3
|
+
iconOnly?: boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Where the field menu portals. Inside a modal sheet it has to be the
|
|
6
|
+
* sheet: a modal hides everything outside itself from assistive tech, and a
|
|
7
|
+
* menu portalled to <body> is outside it — painted, but unreachable.
|
|
8
|
+
*/
|
|
9
|
+
container?: HTMLElement | null;
|
|
10
|
+
class?: string;
|
|
11
|
+
};
|
|
12
|
+
declare const TableFilterAdd: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
13
|
+
type TableFilterAdd = ReturnType<typeof TableFilterAdd>;
|
|
14
|
+
export default TableFilterAdd;
|
|
15
|
+
//# sourceMappingURL=TableFilterAdd.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableFilterAdd.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/TableFilters/TableFilterAdd.svelte.ts"],"names":[],"mappings":"AAOC,KAAK,gBAAgB,GAAI;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AA6CJ,QAAA,MAAM,cAAc,sDAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|