@happyvertical/smrt-ui 0.42.2 → 0.42.4
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/README.md +121 -0
- package/dist/components/data/DataTable.svelte +391 -105
- package/dist/components/data/DataTable.svelte.d.ts.map +1 -1
- package/dist/components/data/DataTableController.d.ts +195 -0
- package/dist/components/data/DataTableController.d.ts.map +1 -0
- package/dist/components/data/DataTableController.js +650 -0
- package/dist/components/data/DataTableIdentity.d.ts +21 -0
- package/dist/components/data/DataTableIdentity.d.ts.map +1 -0
- package/dist/components/data/DataTableIdentity.js +28 -0
- package/dist/components/data/__tests__/DataTable.test.js +257 -19
- package/dist/components/data/__tests__/DataTableController.test.js +214 -0
- package/dist/components/data/__tests__/DataTableIdentity.test.js +29 -0
- package/dist/components/data/index.d.ts +2 -0
- package/dist/components/data/index.d.ts.map +1 -1
- package/dist/components/data/index.js +2 -0
- package/dist/components/data/types.d.ts +27 -1
- package/dist/components/data/types.d.ts.map +1 -1
- package/dist/i18n/strings.d.ts +1 -0
- package/dist/i18n/strings.d.ts.map +1 -1
- package/dist/i18n/strings.js +1 -0
- package/dist/svelte/playground/DataTablePreview.svelte +34 -13
- package/dist/svelte/playground/DataTablePreview.svelte.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* DataTable types
|
|
3
3
|
*/
|
|
4
4
|
import type { Snippet } from 'svelte';
|
|
5
|
+
import type { DataTableCommand, DataTableController, DataTableFilter, DataTableModes, DataTableViewState, DataTableViewStateInput } from './DataTableController.js';
|
|
6
|
+
import type { DataTableRowKey } from './DataTableIdentity.js';
|
|
5
7
|
/**
|
|
6
8
|
* Column definition for DataTable
|
|
7
9
|
*/
|
|
@@ -36,6 +38,12 @@ export interface DataTableColumn<T> {
|
|
|
36
38
|
hidden?: boolean;
|
|
37
39
|
/** Custom sort function */
|
|
38
40
|
sortFn?: (a: T, b: T, direction: SortDirection) => number;
|
|
41
|
+
/** Local text search is enabled by default; set `false` to opt out. */
|
|
42
|
+
searchable?: boolean;
|
|
43
|
+
/** Declarative local filters are enabled by default; set `false` to opt out. */
|
|
44
|
+
filterable?: boolean;
|
|
45
|
+
/** Optional local-only evaluator for a serializable declarative filter. */
|
|
46
|
+
filterFn?: (row: T, value: unknown, filter: DataTableFilter) => boolean;
|
|
39
47
|
/** Column class name */
|
|
40
48
|
className?: string;
|
|
41
49
|
}
|
|
@@ -59,7 +67,12 @@ export interface DataTableProps<T> {
|
|
|
59
67
|
/** Column definitions */
|
|
60
68
|
columns: DataTableColumn<T>[];
|
|
61
69
|
/** Unique key accessor for rows */
|
|
62
|
-
rowKey?:
|
|
70
|
+
rowKey?: DataTableRowKey<T>;
|
|
71
|
+
/**
|
|
72
|
+
* Declares that a DataSurface or agent will address rows. Such tables must
|
|
73
|
+
* provide `rowKey`, even if they do not render selection controls.
|
|
74
|
+
*/
|
|
75
|
+
agentAddressable?: boolean;
|
|
63
76
|
/** Enable row selection */
|
|
64
77
|
selectable?: boolean;
|
|
65
78
|
/** Selected row keys */
|
|
@@ -107,6 +120,19 @@ export interface DataTableProps<T> {
|
|
|
107
120
|
}]>;
|
|
108
121
|
/** Controlled visible column ids. Column.hidden is still respected. */
|
|
109
122
|
visibleColumnIds?: Set<string>;
|
|
123
|
+
/**
|
|
124
|
+
* Headless controller used by rendered interactions and programmatic commands.
|
|
125
|
+
* When supplied, it takes precedence over `state` and the legacy bindables.
|
|
126
|
+
*/
|
|
127
|
+
controller?: DataTableController;
|
|
128
|
+
/** Explicit controlled serializable state when no external controller is supplied. */
|
|
129
|
+
state?: DataTableViewStateInput;
|
|
130
|
+
/** Initial serializable state for uncontrolled controller-backed tables. */
|
|
131
|
+
initialState?: Partial<DataTableViewState>;
|
|
132
|
+
/** Called after a controller command proposes or applies a new state. */
|
|
133
|
+
onStateChange?: (state: DataTableViewState, command: DataTableCommand) => void;
|
|
134
|
+
/** Explicit ownership for local or caller-supplied filtering, sorting, and paging. */
|
|
135
|
+
modes?: Partial<DataTableModes>;
|
|
110
136
|
/** Loading state */
|
|
111
137
|
loading?: boolean;
|
|
112
138
|
/** Empty state content */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/data/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/data/types.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n/strings.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare const M: {
|
|
2
2
|
readonly 'ui.data_table.select_all': "ui.data_table.select_all";
|
|
3
|
+
readonly 'ui.data_table.select_current_page': "ui.data_table.select_current_page";
|
|
3
4
|
readonly 'ui.data_table.select_row': "ui.data_table.select_row";
|
|
4
5
|
readonly 'ui.data_table.loading': "ui.data_table.loading";
|
|
5
6
|
readonly 'ui.data_table.empty': "ui.data_table.empty";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,CAAC;;;;;;CAMZ,CAAC"}
|
package/dist/i18n/strings.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { defineMessages } from './registry.js';
|
|
14
14
|
export const M = defineMessages({
|
|
15
15
|
'ui.data_table.select_all': 'Select all rows',
|
|
16
|
+
'ui.data_table.select_current_page': 'Select all rows on this page',
|
|
16
17
|
'ui.data_table.select_row': 'Select row',
|
|
17
18
|
'ui.data_table.loading': 'Loading...',
|
|
18
19
|
'ui.data_table.empty': 'No data available',
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
2
3
|
import DataTable from '../../components/data/DataTable.svelte';
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
SortState,
|
|
6
|
-
} from '../../components/data/types.js';
|
|
4
|
+
import { createDataTableController } from '../../components/data/DataTableController.js';
|
|
5
|
+
import type { DataTableColumn } from '../../components/data/types.js';
|
|
7
6
|
import Toggle from '../../components/forms/Toggle.svelte';
|
|
8
7
|
import Badge from '../../components/ui/Badge.svelte';
|
|
9
8
|
import Button from '../../components/ui/Button.svelte';
|
|
@@ -68,13 +67,31 @@ const columns: DataTableColumn<WorkspaceUser>[] = [
|
|
|
68
67
|
{ id: 'lastSeen', label: 'Last seen', sortable: true, align: 'right' },
|
|
69
68
|
];
|
|
70
69
|
|
|
71
|
-
let selected = $state<Set<string | number>>(new Set());
|
|
72
|
-
let sort = $state<SortState>({ columnId: null, direction: null });
|
|
73
70
|
let loading = $state(false);
|
|
74
71
|
let dense = $state(false);
|
|
72
|
+
const tableController = createDataTableController({
|
|
73
|
+
columnIds: columns.map((column) => column.id),
|
|
74
|
+
initialState: { pageSize: 3 },
|
|
75
|
+
});
|
|
76
|
+
let tableState = $state(tableController.getState());
|
|
77
|
+
|
|
78
|
+
onMount(() =>
|
|
79
|
+
tableController.subscribe((transition) => {
|
|
80
|
+
tableState = transition.next.state;
|
|
81
|
+
}),
|
|
82
|
+
);
|
|
75
83
|
|
|
76
84
|
function clearSelection() {
|
|
77
|
-
|
|
85
|
+
tableController.dispatch({ type: 'setSelectedRows', rowIds: [] });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function toggleActiveFilter() {
|
|
89
|
+
tableController.dispatch({
|
|
90
|
+
type: 'setFilters',
|
|
91
|
+
filters: tableState.filters.length
|
|
92
|
+
? []
|
|
93
|
+
: [{ columnId: 'status', operator: 'equals', value: 'Active' }],
|
|
94
|
+
});
|
|
78
95
|
}
|
|
79
96
|
</script>
|
|
80
97
|
|
|
@@ -88,13 +105,13 @@ function clearSelection() {
|
|
|
88
105
|
</p>
|
|
89
106
|
</div>
|
|
90
107
|
<div class="summary" aria-live="polite">
|
|
91
|
-
<Badge variant={
|
|
92
|
-
{
|
|
108
|
+
<Badge variant={tableState.selectedRowIds.length > 0 ? 'primary' : 'default'}>
|
|
109
|
+
{tableState.selectedRowIds.length} selected
|
|
93
110
|
</Badge>
|
|
94
111
|
<Button
|
|
95
112
|
variant="ghost"
|
|
96
113
|
size="sm"
|
|
97
|
-
disabled={
|
|
114
|
+
disabled={tableState.selectedRowIds.length === 0}
|
|
98
115
|
onclick={clearSelection}
|
|
99
116
|
>
|
|
100
117
|
Clear
|
|
@@ -105,8 +122,13 @@ function clearSelection() {
|
|
|
105
122
|
<div class="table-controls" aria-label="Table display controls">
|
|
106
123
|
<Toggle label="Dense rows" size="sm" bind:checked={dense} />
|
|
107
124
|
<Toggle label="Loading state" size="sm" bind:checked={loading} />
|
|
125
|
+
<Button variant="ghost" size="sm" onclick={toggleActiveFilter}>
|
|
126
|
+
{tableState.filters.length ? 'Clear active filter' : 'Show active'}
|
|
127
|
+
</Button>
|
|
108
128
|
<span>
|
|
109
|
-
Sort: {
|
|
129
|
+
Sort: {tableState.sorting.length
|
|
130
|
+
? tableState.sorting.map((rule) => `${rule.columnId} ${rule.direction}`).join(', ')
|
|
131
|
+
: 'none'}
|
|
110
132
|
</span>
|
|
111
133
|
</div>
|
|
112
134
|
|
|
@@ -122,8 +144,7 @@ function clearSelection() {
|
|
|
122
144
|
stickyHeader
|
|
123
145
|
{loading}
|
|
124
146
|
{dense}
|
|
125
|
-
|
|
126
|
-
bind:sort
|
|
147
|
+
controller={tableController}
|
|
127
148
|
caption="Workspace users"
|
|
128
149
|
/>
|
|
129
150
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTablePreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/DataTablePreview.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DataTablePreview.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/playground/DataTablePreview.svelte.ts"],"names":[],"mappings":"AA+JA,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-ui",
|
|
3
|
-
"version": "0.42.
|
|
3
|
+
"version": "0.42.4",
|
|
4
4
|
"description": "Domain-agnostic Svelte 5 UI runtime for SMRT: primitives, i18n client, theme system, and module UI registry",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
},
|
|
125
125
|
"dependencies": {
|
|
126
126
|
"esm-env": "^1.2.2",
|
|
127
|
-
"@happyvertical/smrt-types": "0.42.
|
|
127
|
+
"@happyvertical/smrt-types": "0.42.4"
|
|
128
128
|
},
|
|
129
129
|
"peerDependencies": {
|
|
130
130
|
"svelte": "^5.56.4"
|