@lavalogic/scoria 0.37.55 → 0.38.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/dist/Components/Table/ARCHITECTURE.md +22 -22
- package/dist/Components/Table/Misc/ColumnPanel.svelte +1 -61
- package/dist/Components/Table/Misc/ColumnPanel.svelte.d.ts +2 -24
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +3 -92
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte.d.ts +2 -24
- package/dist/Components/Table/Misc/ColumnPanelModalProps.d.ts +2 -2
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte +644 -0
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte.d.ts +26 -0
- package/dist/Components/Table/Misc/TableConfigurationModalProps.d.ts +13 -0
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +27 -0
- package/dist/Components/Table/Misc/TableSidebar.svelte +45 -2
- package/dist/Components/Table/Misc/TableViewDropdown.svelte +175 -0
- package/dist/Components/Table/Misc/TableViewDropdown.svelte.d.ts +25 -0
- package/dist/Components/Table/SubApis.svelte.js +0 -41
- package/dist/Components/Table/Types/Columns/JSONTableLayout.d.ts +5 -5
- package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.js +5 -5
- package/dist/Components/Table/Types/Context/PreferencesState.svelte.d.ts +106 -147
- package/dist/Components/Table/Types/Context/PreferencesState.svelte.js +156 -203
- package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +323 -44
- package/dist/Components/Table/Types/Context/TableContext.svelte.js +687 -187
- package/dist/Components/Table/Types/Context/TableInitOptions.d.ts +9 -0
- package/dist/Components/Table/Types/Context/ViewState.svelte.d.ts +152 -0
- package/dist/Components/Table/Types/Context/ViewState.svelte.js +223 -0
- package/dist/Components/Table/Types/ExpandedPanel.d.ts +9 -5
- package/dist/Components/Table/Types/ExpandedPanel.js +9 -5
- package/dist/Components/Table/Types/Persistence/DatatableView.d.ts +95 -0
- package/dist/Components/Table/Types/Persistence/DatatableViewEnvelope.d.ts +21 -0
- package/dist/Components/Table/Types/Persistence/DatatableViewEnvelope.js +1 -0
- package/dist/Components/Table/Types/Persistence/DatatableViewKind.d.ts +10 -0
- package/dist/Components/Table/Types/Persistence/DatatableViewKind.js +1 -0
- package/dist/Components/Table/Types/Persistence/JSONActiveView.d.ts +58 -0
- package/dist/Components/Table/Types/Persistence/JSONActiveView.js +41 -0
- package/dist/Components/Table/Types/Persistence/JSONTableFilter.d.ts +53 -0
- package/dist/Components/Table/Types/Persistence/JSONTableFilter.js +42 -0
- package/dist/Components/Table/Types/Persistence/RemoteTableLayoutAdapter.d.ts +47 -0
- package/dist/Components/Table/Types/Persistence/RemoteTableLayoutAdapter.js +1 -0
- package/dist/Components/Table/Types/Public/CreateTableOptions.d.ts +10 -0
- package/dist/Components/Table/Types/Public/TablePersistence.d.ts +1 -4
- package/dist/Components/Table/Types/Public/TableSubApis.d.ts +0 -18
- package/dist/Components/Table/Types/Public/index.d.ts +1 -1
- package/dist/Components/Table/createTable.svelte.js +2 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +9 -0
- package/package.json +1 -1
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDefSet.d.ts +0 -20
- package/dist/Components/Table/Types/Columns/Definitions/JSONColumnDefSet.d.ts +0 -25
- /package/dist/Components/Table/{Types/Columns/Definitions/ColumnDefSet.js → Misc/TableConfigurationModalProps.js} +0 -0
- /package/dist/Components/Table/Types/{Columns/Definitions/JSONColumnDefSet.js → Persistence/DatatableView.js} +0 -0
|
@@ -16,14 +16,14 @@ Everything in the public surface is re-exported from
|
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
18
|
import {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
createTable,
|
|
20
|
+
localRows,
|
|
21
|
+
remoteRows,
|
|
22
|
+
customRows,
|
|
23
|
+
Table,
|
|
24
|
+
type CreateTableOptions,
|
|
25
|
+
type DisplayModalProps,
|
|
26
|
+
// …per-kind option types: TextColumnOptions, NumberColumnOptions, …
|
|
27
27
|
} from '@lavalogic/scoria';
|
|
28
28
|
```
|
|
29
29
|
|
|
@@ -96,16 +96,16 @@ Table/
|
|
|
96
96
|
`TableContext` is the root state object. It owns the data repo and seven
|
|
97
97
|
sub-contexts:
|
|
98
98
|
|
|
99
|
-
| Sub-context
|
|
100
|
-
|
|
|
101
|
-
| `_sorting`
|
|
102
|
-
| `_filtering`
|
|
103
|
-
| `_columnLayout`
|
|
104
|
-
| `_selection`
|
|
105
|
-
| `_preferences`
|
|
106
|
-
| `_focus`
|
|
107
|
-
| `_virtualisation`
|
|
108
|
-
| `_queryValues`
|
|
99
|
+
| Sub-context | Owns |
|
|
100
|
+
| ----------------- | ------------------------------------------------------------------------- |
|
|
101
|
+
| `_sorting` | Sort comparators + the `sortedData` derived chain |
|
|
102
|
+
| `_filtering` | Filter-fn relays + the `filteredData` derived chain + quick-filter toggle |
|
|
103
|
+
| `_columnLayout` | Column widths / pinning / visibility / id-index maps |
|
|
104
|
+
| `_selection` | Selected & highlighted maps, key cache, page-wide select helpers |
|
|
105
|
+
| `_preferences` | Table settings + layout / filter / view localStorage round-trip |
|
|
106
|
+
| `_focus` | Focus-coordinate state + multi-cell selection |
|
|
107
|
+
| `_virtualisation` | Row virtualisation window |
|
|
108
|
+
| `_queryValues` | Typeahead-echo cache for QuerySelect filter inputs |
|
|
109
109
|
|
|
110
110
|
Each sub-context is a class under `Types/Context/<Name>State.svelte.ts`
|
|
111
111
|
that takes a `deps` object of thunk-returning fields the parent reads
|
|
@@ -261,10 +261,10 @@ for the canonical pattern.
|
|
|
261
261
|
|
|
262
262
|
## Testing model
|
|
263
263
|
|
|
264
|
-
| File pattern
|
|
265
|
-
|
|
|
266
|
-
| `*.test.ts` (no `.svelte.`)
|
|
267
|
-
| `*.svelte.test.ts`
|
|
264
|
+
| File pattern | Project | What it covers |
|
|
265
|
+
| --------------------------- | -------- | ------------------------------------------------------------------------------------- |
|
|
266
|
+
| `*.test.ts` (no `.svelte.`) | `server` | Pure-node unit tests (helpers, type contracts). Runs via `pnpm test`. |
|
|
267
|
+
| `*.svelte.test.ts` | `client` | Tests using `$state` / `$effect` from Svelte 5. Browser mode via Vitest + Playwright. |
|
|
268
268
|
|
|
269
269
|
The browser-mode runner has a Windows-specific chromium launch issue;
|
|
270
270
|
set `SCORIA_CHROMIUM_EXECUTABLE` to the headless-shell binary to work
|
|
@@ -1,31 +1,11 @@
|
|
|
1
1
|
<svelte:options runes />
|
|
2
2
|
|
|
3
|
-
<script
|
|
4
|
-
lang="ts"
|
|
5
|
-
generics="T extends object, IdType extends Primitive"
|
|
6
|
-
>
|
|
7
|
-
import Button from '../../Button.svelte';
|
|
8
|
-
import SingleSelect from '../../SingleSelect.svelte';
|
|
3
|
+
<script lang="ts">
|
|
9
4
|
import ColumnList from '../Body/Rows/ColumnList.svelte';
|
|
10
5
|
import TextInput from '../../TextInput.svelte';
|
|
11
|
-
import type { SelectOption } from '../../../Types/Internal/SelectOption.js';
|
|
12
6
|
import { Size } from '../../../Types/Internal/Size.js';
|
|
13
|
-
import { Variant } from '../../../Types/Internal/Variant.js';
|
|
14
|
-
import { getContext } from 'svelte';
|
|
15
|
-
import { TableContext } from '../Types/Context/TableContext.svelte.js';
|
|
16
|
-
import type { Primitive } from '../Types/Context/TableInitOptions.js';
|
|
17
7
|
|
|
18
|
-
const tableContext = getContext<TableContext<T, IdType>>(TableContext.identifier);
|
|
19
|
-
|
|
20
|
-
const labelledPresets: Array<SelectOption<string>> = $derived(
|
|
21
|
-
tableContext.columnPresets.map((pr) => ({ label: pr.name, value: pr.name }))
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
const selectedValue = $derived(
|
|
25
|
-
labelledPresets.find((it) => it.value === tableContext.selectedPreset?.name) ?? null
|
|
26
|
-
);
|
|
27
8
|
let searchValue = $state('');
|
|
28
|
-
let pendingPresetName = $state('');
|
|
29
9
|
</script>
|
|
30
10
|
|
|
31
11
|
<section class="side-panel-section">
|
|
@@ -34,22 +14,6 @@
|
|
|
34
14
|
</header>
|
|
35
15
|
|
|
36
16
|
<div class="toolbar">
|
|
37
|
-
<SingleSelect
|
|
38
|
-
label="Selected Preset"
|
|
39
|
-
name="Preset"
|
|
40
|
-
options={labelledPresets}
|
|
41
|
-
labelProp="label"
|
|
42
|
-
valueProp="value"
|
|
43
|
-
value={selectedValue}
|
|
44
|
-
valueAsObject
|
|
45
|
-
onchange={(newSelection: SelectOption<string> | null) => {
|
|
46
|
-
const preset =
|
|
47
|
-
newSelection && tableContext.columnPresets.find((p) => p.name === newSelection.value);
|
|
48
|
-
if (preset) {
|
|
49
|
-
tableContext.setSelectedPreset(preset);
|
|
50
|
-
}
|
|
51
|
-
}}
|
|
52
|
-
/>
|
|
53
17
|
<TextInput
|
|
54
18
|
bind:value={searchValue}
|
|
55
19
|
leftIcon={{ name: 'search', size: Size.Medium }}
|
|
@@ -65,30 +29,6 @@
|
|
|
65
29
|
<div class="column-list-wrapper">
|
|
66
30
|
<ColumnList {searchValue} />
|
|
67
31
|
</div>
|
|
68
|
-
|
|
69
|
-
<form
|
|
70
|
-
class="side-panel-footer"
|
|
71
|
-
onsubmit={(e) => {
|
|
72
|
-
e.preventDefault();
|
|
73
|
-
const trimmed = pendingPresetName.trim();
|
|
74
|
-
if (!trimmed) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
tableContext.saveColumnPreset(trimmed);
|
|
78
|
-
pendingPresetName = '';
|
|
79
|
-
}}
|
|
80
|
-
>
|
|
81
|
-
<TextInput
|
|
82
|
-
placeholder="Preset name"
|
|
83
|
-
bind:value={pendingPresetName}
|
|
84
|
-
/>
|
|
85
|
-
<Button
|
|
86
|
-
type="submit"
|
|
87
|
-
variant={Variant.Secondary}
|
|
88
|
-
nowrap
|
|
89
|
-
size={Size.MediumSmall}>Save Layout</Button
|
|
90
|
-
>
|
|
91
|
-
</form>
|
|
92
32
|
</section>
|
|
93
33
|
|
|
94
34
|
<style>.side-panel-section {
|
|
@@ -1,25 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
props: Record<string, never>;
|
|
4
|
-
exports: {};
|
|
5
|
-
bindings: "";
|
|
6
|
-
slots: {};
|
|
7
|
-
events: {};
|
|
8
|
-
};
|
|
9
|
-
declare class __sveltets_Render<T extends object, IdType extends Primitive> {
|
|
10
|
-
props(): ReturnType<typeof $$render<T, IdType>>['props'];
|
|
11
|
-
events(): ReturnType<typeof $$render<T, IdType>>['events'];
|
|
12
|
-
slots(): ReturnType<typeof $$render<T, IdType>>['slots'];
|
|
13
|
-
bindings(): "";
|
|
14
|
-
exports(): {};
|
|
15
|
-
}
|
|
16
|
-
interface $$IsomorphicComponent {
|
|
17
|
-
new <T extends object, IdType extends Primitive>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T, IdType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T, IdType>['props']>, ReturnType<__sveltets_Render<T, IdType>['events']>, ReturnType<__sveltets_Render<T, IdType>['slots']>> & {
|
|
18
|
-
$$bindings?: ReturnType<__sveltets_Render<T, IdType>['bindings']>;
|
|
19
|
-
} & ReturnType<__sveltets_Render<T, IdType>['exports']>;
|
|
20
|
-
<T extends object, IdType extends Primitive>(internal: unknown, props: {}): ReturnType<__sveltets_Render<T, IdType>['exports']>;
|
|
21
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
|
|
22
|
-
}
|
|
23
|
-
declare const ColumnPanel: $$IsomorphicComponent;
|
|
24
|
-
type ColumnPanel<T extends object, IdType extends Primitive> = InstanceType<typeof ColumnPanel<T, IdType>>;
|
|
1
|
+
declare const ColumnPanel: import("svelte").Component<Record<string, never>, {}, "">;
|
|
2
|
+
type ColumnPanel = ReturnType<typeof ColumnPanel>;
|
|
25
3
|
export default ColumnPanel;
|
|
@@ -1,56 +1,15 @@
|
|
|
1
1
|
<svelte:options runes />
|
|
2
2
|
|
|
3
|
-
<script
|
|
4
|
-
lang="ts"
|
|
5
|
-
generics="T extends object, IdType extends Primitive"
|
|
6
|
-
>
|
|
7
|
-
import Button from '../../Button.svelte';
|
|
3
|
+
<script lang="ts">
|
|
8
4
|
import DesktopModal from '../../DesktopModal.svelte';
|
|
9
|
-
import SingleSelect from '../../SingleSelect.svelte';
|
|
10
5
|
import ColumnList from '../Body/Rows/ColumnList.svelte';
|
|
11
6
|
import TextInput from '../../TextInput.svelte';
|
|
12
|
-
import type { SelectOption } from '../../../Types/Internal/SelectOption.js';
|
|
13
7
|
import { Size } from '../../../Types/Internal/Size.js';
|
|
14
|
-
import { Variant } from '../../../Types/Internal/Variant.js';
|
|
15
|
-
import { getContext } from 'svelte';
|
|
16
|
-
import { TableContext } from '../Types/Context/TableContext.svelte.js';
|
|
17
|
-
import type { Primitive } from '../Types/Context/TableInitOptions.js';
|
|
18
8
|
import type { ColumnPanelModalProps } from './ColumnPanelModalProps.js';
|
|
19
9
|
|
|
20
|
-
const tableContext = getContext<TableContext<T, IdType>>(TableContext.identifier);
|
|
21
|
-
|
|
22
10
|
const { onclose }: ColumnPanelModalProps = $props();
|
|
23
|
-
const labelledPresets: Array<SelectOption<string>> = $derived(
|
|
24
|
-
tableContext.columnPresets.map((pr) => ({ label: pr.name, value: pr.name }))
|
|
25
|
-
);
|
|
26
|
-
let searchValue = $state('');
|
|
27
|
-
let pendingPresetName = $state('');
|
|
28
|
-
|
|
29
|
-
const selectedValue = $derived(
|
|
30
|
-
labelledPresets.find((it) => it.value === tableContext.selectedPreset?.name) ?? null
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
function trySavePreset(e: KeyboardEvent) {
|
|
34
|
-
if (e.key === 'Enter') {
|
|
35
|
-
e.preventDefault();
|
|
36
|
-
const trimmed = pendingPresetName.trim();
|
|
37
|
-
if (!trimmed) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
tableContext.saveColumnPreset(trimmed);
|
|
41
|
-
pendingPresetName = '';
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
11
|
|
|
45
|
-
|
|
46
|
-
e.preventDefault();
|
|
47
|
-
const trimmed = pendingPresetName.trim();
|
|
48
|
-
if (!trimmed) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
tableContext.saveColumnPreset(trimmed);
|
|
52
|
-
pendingPresetName = '';
|
|
53
|
-
}
|
|
12
|
+
let searchValue = $state('');
|
|
54
13
|
</script>
|
|
55
14
|
|
|
56
15
|
<DesktopModal
|
|
@@ -59,25 +18,7 @@
|
|
|
59
18
|
buttons={[{ label: 'Close', callback: () => onclose?.() }]}
|
|
60
19
|
>
|
|
61
20
|
<div class="flex">
|
|
62
|
-
<div class="column-panel top
|
|
63
|
-
<div class="select">
|
|
64
|
-
<SingleSelect
|
|
65
|
-
label="Selected Preset"
|
|
66
|
-
name="Preset"
|
|
67
|
-
options={labelledPresets}
|
|
68
|
-
labelProp="label"
|
|
69
|
-
valueProp="value"
|
|
70
|
-
value={selectedValue}
|
|
71
|
-
valueAsObject
|
|
72
|
-
onchange={(newSelection: SelectOption<string> | null) => {
|
|
73
|
-
const preset =
|
|
74
|
-
newSelection && tableContext.columnPresets.find((p) => p.name === newSelection.value);
|
|
75
|
-
if (preset) {
|
|
76
|
-
tableContext.setSelectedPreset(preset);
|
|
77
|
-
}
|
|
78
|
-
}}
|
|
79
|
-
/>
|
|
80
|
-
</div>
|
|
21
|
+
<div class="column-panel top">
|
|
81
22
|
<TextInput
|
|
82
23
|
bind:value={searchValue}
|
|
83
24
|
leftIcon={{ name: 'search', size: Size.Medium }}
|
|
@@ -92,20 +33,6 @@
|
|
|
92
33
|
<div class="scrollable">
|
|
93
34
|
<ColumnList {searchValue} />
|
|
94
35
|
</div>
|
|
95
|
-
<div class="column-panel bottom save-preset-wrapper">
|
|
96
|
-
<TextInput
|
|
97
|
-
placeholder="Preset name"
|
|
98
|
-
bind:value={pendingPresetName}
|
|
99
|
-
onkeydown={trySavePreset}
|
|
100
|
-
/>
|
|
101
|
-
<Button
|
|
102
|
-
type="submit"
|
|
103
|
-
variant={Variant.Secondary}
|
|
104
|
-
nowrap
|
|
105
|
-
size={Size.MediumSmall}
|
|
106
|
-
onclick={savePreset}>Save Layout</Button
|
|
107
|
-
>
|
|
108
|
-
</div>
|
|
109
36
|
</div>
|
|
110
37
|
</DesktopModal>
|
|
111
38
|
|
|
@@ -128,25 +55,9 @@
|
|
|
128
55
|
}
|
|
129
56
|
.column-panel.top {
|
|
130
57
|
border-bottom: solid 2px #cbd4da;
|
|
131
|
-
}
|
|
132
|
-
.column-panel.bottom {
|
|
133
|
-
border-top: solid 2px #cbd4da;
|
|
134
|
-
}
|
|
135
|
-
.column-panel.presets-and-filter {
|
|
136
58
|
display: flex;
|
|
137
59
|
flex-flow: column;
|
|
138
60
|
row-gap: 0.5rem;
|
|
139
61
|
padding: 0.5rem;
|
|
140
62
|
flex-basis: min-content;
|
|
141
|
-
}
|
|
142
|
-
.column-panel.save-preset-wrapper {
|
|
143
|
-
display: flex;
|
|
144
|
-
flex-flow: row nowrap;
|
|
145
|
-
justify-content: space-between;
|
|
146
|
-
gap: 0.5rem;
|
|
147
|
-
padding: 0.5rem;
|
|
148
|
-
flex-basis: min-content;
|
|
149
|
-
}
|
|
150
|
-
.column-panel .select {
|
|
151
|
-
width: 100%;
|
|
152
63
|
}</style>
|
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
import type { Primitive } from '../Types/Context/TableInitOptions.js';
|
|
2
1
|
import type { ColumnPanelModalProps } from './ColumnPanelModalProps.js';
|
|
3
|
-
declare
|
|
4
|
-
|
|
5
|
-
exports: {};
|
|
6
|
-
bindings: "";
|
|
7
|
-
slots: {};
|
|
8
|
-
events: {};
|
|
9
|
-
};
|
|
10
|
-
declare class __sveltets_Render<T extends object, IdType extends Primitive> {
|
|
11
|
-
props(): ReturnType<typeof $$render<T, IdType>>['props'];
|
|
12
|
-
events(): ReturnType<typeof $$render<T, IdType>>['events'];
|
|
13
|
-
slots(): ReturnType<typeof $$render<T, IdType>>['slots'];
|
|
14
|
-
bindings(): "";
|
|
15
|
-
exports(): {};
|
|
16
|
-
}
|
|
17
|
-
interface $$IsomorphicComponent {
|
|
18
|
-
new <T extends object, IdType extends Primitive>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T, IdType>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T, IdType>['props']>, ReturnType<__sveltets_Render<T, IdType>['events']>, ReturnType<__sveltets_Render<T, IdType>['slots']>> & {
|
|
19
|
-
$$bindings?: ReturnType<__sveltets_Render<T, IdType>['bindings']>;
|
|
20
|
-
} & ReturnType<__sveltets_Render<T, IdType>['exports']>;
|
|
21
|
-
<T extends object, IdType extends Primitive>(internal: unknown, props: ReturnType<__sveltets_Render<T, IdType>['props']> & {}): ReturnType<__sveltets_Render<T, IdType>['exports']>;
|
|
22
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
|
|
23
|
-
}
|
|
24
|
-
declare const ColumnPanelModal: $$IsomorphicComponent;
|
|
25
|
-
type ColumnPanelModal<T extends object, IdType extends Primitive> = InstanceType<typeof ColumnPanelModal<T, IdType>>;
|
|
2
|
+
declare const ColumnPanelModal: import("svelte").Component<ColumnPanelModalProps, {}, "">;
|
|
3
|
+
type ColumnPanelModal = ReturnType<typeof ColumnPanelModal>;
|
|
26
4
|
export default ColumnPanelModal;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Props for `ColumnPanelModal` (the touch variant of the column-
|
|
3
|
-
*
|
|
2
|
+
* Props for `ColumnPanelModal` (the touch variant of the column-list
|
|
3
|
+
* visibility / reorder management panel).
|
|
4
4
|
*/
|
|
5
5
|
export interface ColumnPanelModalProps {
|
|
6
6
|
/** Called when the modal requests close. */
|