@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.
Files changed (49) hide show
  1. package/dist/Components/Table/ARCHITECTURE.md +22 -22
  2. package/dist/Components/Table/Misc/ColumnPanel.svelte +1 -61
  3. package/dist/Components/Table/Misc/ColumnPanel.svelte.d.ts +2 -24
  4. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +3 -92
  5. package/dist/Components/Table/Misc/ColumnPanelModal.svelte.d.ts +2 -24
  6. package/dist/Components/Table/Misc/ColumnPanelModalProps.d.ts +2 -2
  7. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +644 -0
  8. package/dist/Components/Table/Misc/TableConfigurationModal.svelte.d.ts +26 -0
  9. package/dist/Components/Table/Misc/TableConfigurationModalProps.d.ts +13 -0
  10. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +27 -0
  11. package/dist/Components/Table/Misc/TableSidebar.svelte +45 -2
  12. package/dist/Components/Table/Misc/TableViewDropdown.svelte +175 -0
  13. package/dist/Components/Table/Misc/TableViewDropdown.svelte.d.ts +25 -0
  14. package/dist/Components/Table/SubApis.svelte.js +0 -41
  15. package/dist/Components/Table/Types/Columns/JSONTableLayout.d.ts +5 -5
  16. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.d.ts +5 -5
  17. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.js +5 -5
  18. package/dist/Components/Table/Types/Context/PreferencesState.svelte.d.ts +106 -147
  19. package/dist/Components/Table/Types/Context/PreferencesState.svelte.js +156 -203
  20. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +323 -44
  21. package/dist/Components/Table/Types/Context/TableContext.svelte.js +687 -187
  22. package/dist/Components/Table/Types/Context/TableInitOptions.d.ts +9 -0
  23. package/dist/Components/Table/Types/Context/ViewState.svelte.d.ts +152 -0
  24. package/dist/Components/Table/Types/Context/ViewState.svelte.js +223 -0
  25. package/dist/Components/Table/Types/ExpandedPanel.d.ts +9 -5
  26. package/dist/Components/Table/Types/ExpandedPanel.js +9 -5
  27. package/dist/Components/Table/Types/Persistence/DatatableView.d.ts +95 -0
  28. package/dist/Components/Table/Types/Persistence/DatatableViewEnvelope.d.ts +21 -0
  29. package/dist/Components/Table/Types/Persistence/DatatableViewEnvelope.js +1 -0
  30. package/dist/Components/Table/Types/Persistence/DatatableViewKind.d.ts +10 -0
  31. package/dist/Components/Table/Types/Persistence/DatatableViewKind.js +1 -0
  32. package/dist/Components/Table/Types/Persistence/JSONActiveView.d.ts +58 -0
  33. package/dist/Components/Table/Types/Persistence/JSONActiveView.js +41 -0
  34. package/dist/Components/Table/Types/Persistence/JSONTableFilter.d.ts +53 -0
  35. package/dist/Components/Table/Types/Persistence/JSONTableFilter.js +42 -0
  36. package/dist/Components/Table/Types/Persistence/RemoteTableLayoutAdapter.d.ts +47 -0
  37. package/dist/Components/Table/Types/Persistence/RemoteTableLayoutAdapter.js +1 -0
  38. package/dist/Components/Table/Types/Public/CreateTableOptions.d.ts +10 -0
  39. package/dist/Components/Table/Types/Public/TablePersistence.d.ts +1 -4
  40. package/dist/Components/Table/Types/Public/TableSubApis.d.ts +0 -18
  41. package/dist/Components/Table/Types/Public/index.d.ts +1 -1
  42. package/dist/Components/Table/createTable.svelte.js +2 -0
  43. package/dist/index.d.ts +8 -1
  44. package/dist/index.js +9 -0
  45. package/package.json +1 -1
  46. package/dist/Components/Table/Types/Columns/Definitions/ColumnDefSet.d.ts +0 -20
  47. package/dist/Components/Table/Types/Columns/Definitions/JSONColumnDefSet.d.ts +0 -25
  48. /package/dist/Components/Table/{Types/Columns/Definitions/ColumnDefSet.js → Misc/TableConfigurationModalProps.js} +0 -0
  49. /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
- createTable,
20
- localRows,
21
- remoteRows,
22
- customRows,
23
- Table,
24
- type CreateTableOptions,
25
- type DisplayModalProps,
26
- // …per-kind option types: TextColumnOptions, NumberColumnOptions, …
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 | 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` | Saved column-presets + 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 |
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 | 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. |
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 type { Primitive } from '../Types/Context/TableInitOptions.js';
2
- declare function $$render<T extends object, IdType extends Primitive>(): {
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
- function savePreset(e: MouseEvent) {
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 presets-and-filter">
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 function $$render<T extends object, IdType extends Primitive>(): {
4
- props: ColumnPanelModalProps;
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-presets and
3
- * column-list management panel).
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. */