@lavalogic/scoria 0.37.44 → 0.37.46
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 +58 -58
- package/dist/Components/AccordionGroup.svelte +46 -46
- package/dist/Components/AccordionGroupButton.svelte +76 -76
- package/dist/Components/Action.svelte +136 -136
- package/dist/Components/ActionProps.d.ts +2 -6
- package/dist/Components/AlertModal.svelte +195 -183
- package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +702 -702
- package/dist/Components/Base/BaseModal.svelte +125 -125
- package/dist/Components/Base/ContextWrapper.svelte +72 -72
- package/dist/Components/Base/Pagination.svelte +198 -198
- package/dist/Components/Base/Snippets.svelte +36 -36
- package/dist/Components/BigRadioSet.svelte +38 -38
- package/dist/Components/Bubble.svelte +101 -101
- package/dist/Components/Button.svelte +209 -209
- package/dist/Components/ButtonProps.d.ts +2 -6
- package/dist/Components/Checkbox.svelte +86 -86
- package/dist/Components/CollapsibleCard.svelte +78 -78
- package/dist/Components/Contexts/ContextMenu.svelte +164 -164
- package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
- package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
- package/dist/Components/Contexts/Toast.svelte +86 -83
- package/dist/Components/Contexts/Toast.svelte.d.ts +8 -5
- package/dist/Components/Contexts/ToastContainer.svelte +65 -65
- package/dist/Components/Contexts/Tooltip.svelte +37 -37
- package/dist/Components/DataMatrixIcon.svelte +112 -112
- package/dist/Components/DataMatrixIconProps.d.ts +3 -13
- package/dist/Components/DateInput.svelte +148 -148
- package/dist/Components/DatePicker.svelte +300 -300
- package/dist/Components/DesktopModal.svelte +90 -90
- package/dist/Components/Dial.svelte +204 -204
- package/dist/Components/DialProps.d.ts +1 -18
- package/dist/Components/DimensionInput.svelte +170 -170
- package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
- package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
- package/dist/Components/FileCard.svelte +24 -24
- package/dist/Components/FileUpload.svelte +236 -236
- package/dist/Components/GridInput.svelte +196 -200
- package/dist/Components/GridInputSet.svelte +29 -29
- package/dist/Components/HorizontalTabGroup.svelte +82 -82
- package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
- package/dist/Components/Icon.svelte +128 -128
- package/dist/Components/IconProps.d.ts +2 -7
- package/dist/Components/Icons.js +357 -357
- package/dist/Components/LoadingAnimation.svelte +29 -29
- package/dist/Components/LoadingModal.svelte +45 -45
- package/dist/Components/LoadingOverlay.svelte +25 -25
- package/dist/Components/LoadingOverlayProps.d.ts +3 -7
- package/dist/Components/Modal.svelte +258 -258
- package/dist/Components/ModalProps.d.ts +0 -3
- package/dist/Components/MultiSelect.svelte +220 -220
- package/dist/Components/MultiSelectCommonProps.d.ts +6 -17
- package/dist/Components/Nav/Nav.svelte +110 -99
- package/dist/Components/Nav/NavProps.d.ts +4 -11
- package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
- package/dist/Components/Nav/NavTab.svelte +62 -62
- package/dist/Components/Nav/ServiceMenuItem.svelte +100 -100
- package/dist/Components/Nav/ServicesNav.svelte +80 -80
- package/dist/Components/NumberInput.svelte +157 -157
- package/dist/Components/PageHeading.svelte +25 -25
- package/dist/Components/PasswordInput.svelte +88 -88
- package/dist/Components/Portal.svelte +36 -36
- package/dist/Components/ProgressBubble.svelte +107 -108
- package/dist/Components/ProgressBubbleProps.d.ts +3 -3
- package/dist/Components/QuerySelect.svelte +366 -366
- package/dist/Components/QuerySelectProps.d.ts +4 -14
- package/dist/Components/SingleSelect.svelte +250 -250
- package/dist/Components/SingleSelectCommonProps.d.ts +3 -19
- package/dist/Components/StepButton.svelte +70 -70
- package/dist/Components/StepForm.svelte +140 -140
- package/dist/Components/Switch.svelte +69 -69
- package/dist/Components/Table/ARCHITECTURE.md +298 -0
- package/dist/Components/Table/Body/QuickSearchCell.svelte +683 -694
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
- package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +456 -478
- package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -188
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +120 -120
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +230 -230
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
- package/dist/Components/Table/Body/Rows/Columns/SelectColumn.d.ts +12 -9
- package/dist/Components/Table/Body/Rows/Columns/SelectTableCell.d.ts +5 -5
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
- package/dist/Components/Table/Body/Rows/Columns/TableDatePickerProps.d.ts +4 -4
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
- package/dist/Components/Table/Body/Rows/Columns/TableQueryCell.d.ts +6 -5
- package/dist/Components/Table/Body/Rows/Columns/TableQueryColumn.d.ts +7 -6
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -257
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -229
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte.d.ts +11 -11
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
- package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
- package/dist/Components/Table/Body/TableBody.svelte +155 -155
- package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDefRepository.svelte.js +2 -3
- package/dist/Components/Table/ColumnFactory.svelte.d.ts +9 -11
- package/dist/Components/Table/ColumnFactory.svelte.js +110 -143
- package/dist/Components/Table/ColumnKindRegistry.d.ts +112 -0
- package/dist/Components/Table/ColumnKindRegistry.js +63 -0
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
- package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
- package/dist/Components/Table/Headers/TableHead.svelte +415 -413
- package/dist/Components/Table/Misc/ColumnPanel.svelte +94 -94
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +112 -112
- package/dist/Components/Table/Misc/FilterInput.svelte +620 -644
- package/dist/Components/Table/Misc/FilterInput.svelte.d.ts +12 -12
- package/dist/Components/Table/Misc/FilterInputProps.d.ts +2 -2
- package/dist/Components/Table/Misc/FilterPanel.svelte +257 -257
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +30 -30
- package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
- package/dist/Components/Table/Misc/TableFooter.svelte +311 -311
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +125 -125
- package/dist/Components/Table/Misc/TableSidebar.svelte +157 -157
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
- package/dist/Components/Table/NestedTable.svelte +130 -133
- package/dist/Components/Table/SubApis.svelte.d.ts +1 -5
- package/dist/Components/Table/SubApis.svelte.js +33 -32
- package/dist/Components/Table/Table.svelte +692 -745
- package/dist/Components/Table/TableHelpers.svelte.d.ts +6 -19
- package/dist/Components/Table/TableHelpers.svelte.js +6 -14
- package/dist/Components/Table/Types/Columns/Column.d.ts +2 -2
- package/dist/Components/Table/Types/Columns/DateColumn.d.ts +3 -3
- package/dist/Components/Table/Types/Columns/DateTableCell.d.ts +7 -7
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.d.ts +7 -8
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.js +4 -5
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.d.ts +11 -14
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.js +3 -4
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.d.ts +7 -11
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.js +3 -3
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.d.ts +13 -18
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.js +4 -5
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.js +2 -2
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.d.ts +15 -12
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.js +4 -5
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.d.ts +8 -12
- package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.js +3 -3
- package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.d.ts +6 -6
- package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +3 -3
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.d.ts +49 -16
- package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.js +27 -5
- package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.d.ts +7 -7
- package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.js +4 -4
- package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.js +2 -2
- package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.js +2 -2
- package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.js +2 -2
- package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.js +2 -2
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +11 -19
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +4 -8
- package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.d.ts +6 -7
- package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.js +3 -4
- package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.d.ts +9 -9
- package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js +4 -4
- package/dist/Components/Table/Types/Columns/ExpandTableCell.d.ts +5 -5
- package/dist/Components/Table/Types/Columns/ProgressBarTableCell.d.ts +6 -6
- package/dist/Components/Table/Types/Columns/TableCell.d.ts +7 -6
- package/dist/Components/Table/Types/Context/ClipboardState.svelte.d.ts +98 -0
- package/dist/Components/Table/Types/Context/ClipboardState.svelte.js +290 -0
- package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.d.ts +17 -45
- package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.js +17 -45
- package/dist/Components/Table/Types/Context/FilteringState.svelte.d.ts +9 -20
- package/dist/Components/Table/Types/Context/FilteringState.svelte.js +9 -20
- package/dist/Components/Table/Types/Context/FocusState.svelte.d.ts +23 -42
- package/dist/Components/Table/Types/Context/FocusState.svelte.js +32 -59
- package/dist/Components/Table/Types/Context/ITable.d.ts +5 -8
- package/dist/Components/Table/Types/Context/PreferencesState.svelte.d.ts +29 -56
- package/dist/Components/Table/Types/Context/PreferencesState.svelte.js +28 -55
- package/dist/Components/Table/Types/Context/QueryValuesState.svelte.d.ts +50 -0
- package/dist/Components/Table/Types/Context/QueryValuesState.svelte.js +62 -0
- package/dist/Components/Table/Types/Context/SelectionState.svelte.d.ts +17 -28
- package/dist/Components/Table/Types/Context/SelectionState.svelte.js +17 -28
- package/dist/Components/Table/Types/Context/SortingState.svelte.d.ts +15 -29
- package/dist/Components/Table/Types/Context/SortingState.svelte.js +17 -31
- package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +212 -325
- package/dist/Components/Table/Types/Context/TableContext.svelte.js +292 -706
- package/dist/Components/Table/Types/Context/VirtualisationState.svelte.d.ts +62 -79
- package/dist/Components/Table/Types/Context/VirtualisationState.svelte.js +54 -73
- package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.d.ts +16 -27
- package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.js +16 -27
- package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +12 -15
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +15 -30
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.js +16 -28
- package/dist/Components/Table/Types/Header.d.ts +4 -4
- package/dist/Components/Table/Types/HeaderGroup.d.ts +5 -5
- package/dist/Components/Table/Types/Public/index.d.ts +2 -4
- package/dist/Components/Table/Types/Public/index.js +2 -4
- package/dist/Components/Table/clipboardEscape.d.ts +32 -0
- package/dist/Components/Table/clipboardEscape.js +45 -0
- package/dist/Components/Table/createTable.svelte.d.ts +8 -18
- package/dist/Components/Table/createTable.svelte.js +19 -47
- package/dist/Components/Test/TestContextConsumer.svelte +13 -13
- package/dist/Components/TextArea.svelte +130 -130
- package/dist/Components/TextInput.svelte +176 -176
- package/dist/Components/ThreeStateRadio.svelte +131 -131
- package/dist/Components/Touch/BoolCard.svelte +45 -45
- package/dist/Components/Touch/DateModal.svelte +209 -209
- package/dist/Components/Touch/EditCard.svelte +59 -59
- package/dist/Components/Touch/InfoCard.svelte +31 -31
- package/dist/Components/Touch/InfoTextCard.svelte +28 -28
- package/dist/Components/Touch/ModalExplanation.svelte +17 -17
- package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
- package/dist/Components/Touch/NumberModal.svelte +79 -79
- package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
- package/dist/Components/Touch/SelectModal.svelte +123 -123
- package/dist/Components/Touch/SummaryCard.svelte +93 -93
- package/dist/Components/Touch/TextAreaModal.svelte +95 -95
- package/dist/Components/Touch/TextModal.svelte +106 -106
- package/dist/Components/Touch/TouchCard.svelte +33 -33
- package/dist/Components/Touch/TouchModal.svelte +274 -274
- package/dist/Components/Touch/UtilityButton.svelte +109 -109
- package/dist/Components/VerticalTabGroup.svelte +79 -79
- package/dist/Components/VerticalTabGroupButton.svelte +58 -58
- package/dist/Contexts/ToastContext.svelte.js +3 -4
- package/dist/Helpers/Datamatrix.d.ts +19 -19
- package/dist/Helpers/Datamatrix.js +291 -291
- package/dist/Helpers/Helpers.svelte.d.ts +47 -4
- package/dist/Helpers/Helpers.svelte.js +97 -4
- package/dist/Helpers/dropdownPortal.d.ts +26 -41
- package/dist/Helpers/dropdownPortal.js +62 -116
- package/dist/Types/Examples/ExampleModal.svelte +35 -35
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -1
- package/dist/scss/_basics.scss +12 -12
- package/dist/scss/_colours.scss +134 -134
- package/dist/scss/_mixins.scss +3358 -3360
- package/dist/scss/_motion.scss +57 -57
- package/dist/scss/_sizing.scss +85 -85
- package/dist/scss/_transitions.scss +8 -8
- package/package.json +8 -6
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { browser } from '$app/environment';
|
|
1
|
+
import { browser, dev } from '$app/environment';
|
|
2
2
|
import { SvelteMap, SvelteSet } from 'svelte/reactivity';
|
|
3
3
|
import { PaginationType } from '../Pagination/PaginationType.js';
|
|
4
4
|
/**
|
|
@@ -6,12 +6,6 @@ import { PaginationType } from '../Pagination/PaginationType.js';
|
|
|
6
6
|
* Owns pagination state with localStorage write-through on `pageSize`,
|
|
7
7
|
* the reactive filter-mode map, the force-refresh hook, and shared
|
|
8
8
|
* static helpers for parsing comma-separated filter input.
|
|
9
|
-
*
|
|
10
|
-
* The `out FilterValueType` variance annotation is currently advisory:
|
|
11
|
-
* `filtering` reads the parameter (contravariant) but `__queryValues`
|
|
12
|
-
* does not currently use it. A proper variance audit is deferred to a
|
|
13
|
-
* future workorder; the existing annotation does not break type
|
|
14
|
-
* checking.
|
|
15
9
|
*/
|
|
16
10
|
export class TableDataRepository {
|
|
17
11
|
tableName;
|
|
@@ -20,14 +14,6 @@ export class TableDataRepository {
|
|
|
20
14
|
this.tableName = tableName;
|
|
21
15
|
this.getUserId = getUserId;
|
|
22
16
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Reactive bag of consumer-defined query values keyed by column id.
|
|
25
|
-
* Stored as `unknown` because the shape depends on the column type;
|
|
26
|
-
* narrowing to `FilterValueType` is deferred (would force consumers
|
|
27
|
-
* to choose a single value type at construction time, which is too
|
|
28
|
-
* restrictive for tables mixing several filter modes).
|
|
29
|
-
*/
|
|
30
|
-
__queryValues = new SvelteMap();
|
|
31
17
|
_paginationState = $state({
|
|
32
18
|
pageIndex: 0,
|
|
33
19
|
pageSize: 20,
|
|
@@ -37,10 +23,10 @@ export class TableDataRepository {
|
|
|
37
23
|
return this._paginationState;
|
|
38
24
|
}
|
|
39
25
|
/**
|
|
40
|
-
*
|
|
26
|
+
* Replace pagination state and write the new `pageSize` through to
|
|
41
27
|
* localStorage. Idempotent: identical states are dropped so the
|
|
42
|
-
* previously-viewed-page tracker
|
|
43
|
-
*
|
|
28
|
+
* previously-viewed-page tracker keeps its value when the same state
|
|
29
|
+
* is reassigned (e.g. from a `$derived` re-evaluation).
|
|
44
30
|
*/
|
|
45
31
|
set paginationState(v) {
|
|
46
32
|
if (v.pageIndex === this._paginationState.pageIndex &&
|
|
@@ -83,24 +69,26 @@ export class TableDataRepository {
|
|
|
83
69
|
return this._forceRefresh;
|
|
84
70
|
}
|
|
85
71
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
72
|
+
* @deprecated Assigning the setter both replaces the callback AND
|
|
73
|
+
* invokes it immediately, which is a footgun for callers wiring it up
|
|
74
|
+
* inside a constructor or `$effect.pre`. Use `registerRefreshMethod`
|
|
75
|
+
* to assign without the implicit invoke; call `repo.forceRefresh()`
|
|
76
|
+
* via the getter when an explicit refresh is wanted.
|
|
89
77
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* `triggerRefresh()` method and remove the side effect from the
|
|
93
|
-
* setter. Behaviour preserved here to avoid breaking existing
|
|
94
|
-
* consumers.
|
|
78
|
+
* Behaviour is preserved for backwards compatibility; the setter logs
|
|
79
|
+
* a dev-only warning so existing call sites surface in development.
|
|
95
80
|
*/
|
|
96
81
|
set forceRefresh(v) {
|
|
82
|
+
if (dev) {
|
|
83
|
+
console.warn('[scoria] `forceRefresh =` setter is deprecated: it invokes the callback on assignment. Use `registerRefreshMethod(fn)` then call `repo.forceRefresh()` when a refresh is wanted.');
|
|
84
|
+
}
|
|
97
85
|
this._forceRefresh = v;
|
|
98
86
|
this._forceRefresh();
|
|
99
87
|
}
|
|
100
88
|
/**
|
|
101
89
|
* Registers a refresh callback without invoking it. Preferred over
|
|
102
|
-
* the `forceRefresh` setter
|
|
103
|
-
*
|
|
90
|
+
* the deprecated `forceRefresh` setter; call `repo.forceRefresh()`
|
|
91
|
+
* separately when an explicit refresh is wanted.
|
|
104
92
|
*/
|
|
105
93
|
registerRefreshMethod = (method) => {
|
|
106
94
|
this._forceRefresh = method;
|
|
@@ -4,14 +4,14 @@ import type { Column } from './Columns/Column.js';
|
|
|
4
4
|
* consumed by `TableHead.svelte`. Holds the underlying `Column` plus
|
|
5
5
|
* header-only affordances: column-span, header size, and the resize handler.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* The variance marker `in FilterValueType` mirrors the inner
|
|
8
|
+
* `Column<T, F>` so headers compose with column assignability.
|
|
9
9
|
*/
|
|
10
|
-
export interface Header<T extends object, in FilterValueType
|
|
10
|
+
export interface Header<T extends object, in FilterValueType> {
|
|
11
11
|
id: string;
|
|
12
12
|
colSpan: number;
|
|
13
13
|
getSize: () => number;
|
|
14
|
-
column: Column<T, FilterValueType
|
|
14
|
+
column: Column<T, FilterValueType>;
|
|
15
15
|
isPlaceholder: boolean;
|
|
16
16
|
getResizeHandler: () => (e: MouseEvent) => void;
|
|
17
17
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { Header } from './Header.js';
|
|
2
2
|
/**
|
|
3
3
|
* One row of headers (left / centre / right group). `headers` is typed with
|
|
4
|
-
* the conservative placeholder element type `Header<T, never
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* `Header<T, unknown
|
|
4
|
+
* the conservative placeholder element type `Header<T, never>` because
|
|
5
|
+
* the group holds heterogeneous columns whose per-column filter value
|
|
6
|
+
* type cannot be expressed in the array element type. Tightening to
|
|
7
|
+
* `Header<T, unknown>` is deferred (workorder Types-Root finding 1).
|
|
8
8
|
*/
|
|
9
9
|
export interface HeaderGroup<T extends object> {
|
|
10
10
|
id: string;
|
|
11
|
-
headers: Array<Header<T, never
|
|
11
|
+
headers: Array<Header<T, never>>;
|
|
12
12
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Barrel re-export of every public Table API type. Imported by
|
|
3
|
-
* `src/lib/index.ts` and by
|
|
4
|
-
* runtime
|
|
5
|
-
*
|
|
6
|
-
* Phase 1 is type-only; no runtime symbols flow through this barrel.
|
|
3
|
+
* `src/lib/index.ts` and by the `ColumnFactory` runtime module. This
|
|
4
|
+
* barrel is type-only; no runtime symbols flow through it.
|
|
7
5
|
*/
|
|
8
6
|
export type { AnyEditEvent } from './AnyEditEvent.js';
|
|
9
7
|
export type { BaseColumnOptions } from './BaseColumnOptions.js';
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Barrel re-export of every public Table API type. Imported by
|
|
3
|
-
* `src/lib/index.ts` and by
|
|
4
|
-
* runtime
|
|
5
|
-
*
|
|
6
|
-
* Phase 1 is type-only; no runtime symbols flow through this barrel.
|
|
3
|
+
* `src/lib/index.ts` and by the `ColumnFactory` runtime module. This
|
|
4
|
+
* barrel is type-only; no runtime symbols flow through it.
|
|
7
5
|
*/
|
|
8
6
|
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clipboard escape helpers for the Table copy path.
|
|
3
|
+
*
|
|
4
|
+
* Every value written to `navigator.clipboard.writeText` from `<Table>`
|
|
5
|
+
* passes through these helpers so that pasted payloads cannot evaluate
|
|
6
|
+
* as spreadsheet formulas in the receiving application.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Neutralises CSV / TSV formula-injection prefixes recognised by Excel,
|
|
10
|
+
* LibreOffice Calc, Google Sheets, and Apple Numbers.
|
|
11
|
+
*
|
|
12
|
+
* When a clipboard payload reaches a spreadsheet, any cell whose first
|
|
13
|
+
* character is one of `=`, `+`, `-`, `@`, `\t`, `\r` is treated as a
|
|
14
|
+
* formula and evaluated in the user's context. Untrusted row data
|
|
15
|
+
* containing `=cmd|'/c calc'!A1` (or DDE / web-query equivalents) is the
|
|
16
|
+
* canonical attack vector. Prefixing such a value with a single quote
|
|
17
|
+
* (`'`) makes the spreadsheet interpret the cell as a literal string.
|
|
18
|
+
*
|
|
19
|
+
* Trade-off: the leading apostrophe is invisible in the rendered cell of
|
|
20
|
+
* every major spreadsheet, but the underlying cell value differs from
|
|
21
|
+
* the source when read back by another formula referencing the cell.
|
|
22
|
+
* This is the accepted industry mitigation (OWASP CSV Injection
|
|
23
|
+
* cheat sheet).
|
|
24
|
+
*/
|
|
25
|
+
export declare function escapeForSpreadsheet(value: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Wraps a single TSV / CSV cell value in double quotes, escaping any
|
|
28
|
+
* embedded quotes and replacing newlines with spaces so each cell stays
|
|
29
|
+
* on a single line. Runs `escapeForSpreadsheet` on the value first so
|
|
30
|
+
* the final string is also formula-injection safe.
|
|
31
|
+
*/
|
|
32
|
+
export declare function encapsulate(value: string): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clipboard escape helpers for the Table copy path.
|
|
3
|
+
*
|
|
4
|
+
* Every value written to `navigator.clipboard.writeText` from `<Table>`
|
|
5
|
+
* passes through these helpers so that pasted payloads cannot evaluate
|
|
6
|
+
* as spreadsheet formulas in the receiving application.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Neutralises CSV / TSV formula-injection prefixes recognised by Excel,
|
|
10
|
+
* LibreOffice Calc, Google Sheets, and Apple Numbers.
|
|
11
|
+
*
|
|
12
|
+
* When a clipboard payload reaches a spreadsheet, any cell whose first
|
|
13
|
+
* character is one of `=`, `+`, `-`, `@`, `\t`, `\r` is treated as a
|
|
14
|
+
* formula and evaluated in the user's context. Untrusted row data
|
|
15
|
+
* containing `=cmd|'/c calc'!A1` (or DDE / web-query equivalents) is the
|
|
16
|
+
* canonical attack vector. Prefixing such a value with a single quote
|
|
17
|
+
* (`'`) makes the spreadsheet interpret the cell as a literal string.
|
|
18
|
+
*
|
|
19
|
+
* Trade-off: the leading apostrophe is invisible in the rendered cell of
|
|
20
|
+
* every major spreadsheet, but the underlying cell value differs from
|
|
21
|
+
* the source when read back by another formula referencing the cell.
|
|
22
|
+
* This is the accepted industry mitigation (OWASP CSV Injection
|
|
23
|
+
* cheat sheet).
|
|
24
|
+
*/
|
|
25
|
+
export function escapeForSpreadsheet(value) {
|
|
26
|
+
if (value.length === 0) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
const first = value.charCodeAt(0);
|
|
30
|
+
// '=' 61, '+' 43, '-' 45, '@' 64, '\t' 9, '\r' 13
|
|
31
|
+
if (first === 61 || first === 43 || first === 45 || first === 64 || first === 9 || first === 13) {
|
|
32
|
+
return `'${value}`;
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Wraps a single TSV / CSV cell value in double quotes, escaping any
|
|
38
|
+
* embedded quotes and replacing newlines with spaces so each cell stays
|
|
39
|
+
* on a single line. Runs `escapeForSpreadsheet` on the value first so
|
|
40
|
+
* the final string is also formula-injection safe.
|
|
41
|
+
*/
|
|
42
|
+
export function encapsulate(value) {
|
|
43
|
+
const safe = escapeForSpreadsheet(value);
|
|
44
|
+
return `"${safe.replace(/[\n]/gm, ' ').replace(/["]/g, '""')}"`;
|
|
45
|
+
}
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `createTable` is the entry point for the
|
|
3
|
-
*
|
|
4
|
-
* instance.
|
|
2
|
+
* `createTable` is the entry point for the public Table API. It accepts a
|
|
3
|
+
* single options object and returns a structured `Table<TRow, TRowId>`
|
|
4
|
+
* instance whose sub-APIs are facades over the internal sub-contexts.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `BuiltInRemoteRepository` for `kind: 'remote'`, an adapter for
|
|
10
|
-
* `kind: 'custom'`), invokes `TableContext.init`, wires the per-column
|
|
11
|
-
* edit handlers and the optional `onAnyEdit` observer, then returns a
|
|
12
|
-
* structured `Table` instance whose sub-APIs are facades over the Phase 6
|
|
13
|
-
* sub-contexts. Phase 2 will inline the internals.
|
|
14
|
-
*
|
|
15
|
-
* The structured `Table` instance is also exposed as the `_context` field
|
|
16
|
-
* for the Phase 1 `<Table>` component which still reads from a
|
|
17
|
-
* `TableContext` via `setContext`. Phase 2 reshapes `<Table>` to consume
|
|
18
|
-
* the structured instance directly.
|
|
6
|
+
* The structured `Table` instance also exposes a `_context` field so the
|
|
7
|
+
* `<Table>` component can read from the underlying `TableContext` via
|
|
8
|
+
* `setContext`.
|
|
19
9
|
*/
|
|
20
10
|
import { TableContext } from './Types/Context/TableContext.svelte.js';
|
|
21
11
|
import type { Primitive } from './Types/Context/TableInitOptions.js';
|
|
@@ -25,8 +15,8 @@ import type { Table } from './Types/Public/Table.js';
|
|
|
25
15
|
/**
|
|
26
16
|
* Construct a new Table from the supplied options. Returns the structured
|
|
27
17
|
* `Table<TRow, TRowId>` instance. Mount the rendering component via
|
|
28
|
-
* `<Table {table} />` (
|
|
29
|
-
*
|
|
18
|
+
* `<Table {table} />` (the legacy `<Table tableContext={table._context} />`
|
|
19
|
+
* form is also accepted).
|
|
30
20
|
*
|
|
31
21
|
* @example
|
|
32
22
|
* ```ts
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `createTable` is the entry point for the
|
|
3
|
-
*
|
|
4
|
-
* instance.
|
|
2
|
+
* `createTable` is the entry point for the public Table API. It accepts a
|
|
3
|
+
* single options object and returns a structured `Table<TRow, TRowId>`
|
|
4
|
+
* instance whose sub-APIs are facades over the internal sub-contexts.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* `BuiltInRemoteRepository` for `kind: 'remote'`, an adapter for
|
|
10
|
-
* `kind: 'custom'`), invokes `TableContext.init`, wires the per-column
|
|
11
|
-
* edit handlers and the optional `onAnyEdit` observer, then returns a
|
|
12
|
-
* structured `Table` instance whose sub-APIs are facades over the Phase 6
|
|
13
|
-
* sub-contexts. Phase 2 will inline the internals.
|
|
14
|
-
*
|
|
15
|
-
* The structured `Table` instance is also exposed as the `_context` field
|
|
16
|
-
* for the Phase 1 `<Table>` component which still reads from a
|
|
17
|
-
* `TableContext` via `setContext`. Phase 2 reshapes `<Table>` to consume
|
|
18
|
-
* the structured instance directly.
|
|
6
|
+
* The structured `Table` instance also exposes a `_context` field so the
|
|
7
|
+
* `<Table>` component can read from the underlying `TableContext` via
|
|
8
|
+
* `setContext`.
|
|
19
9
|
*/
|
|
20
10
|
import { devCatch, refWrapper } from '../../Helpers/Helpers.svelte.js';
|
|
21
11
|
import { BuiltInRemoteRepository, CustomRemoteRepository, } from './Types/DataRepository/BuiltInRemoteRepository.svelte.js';
|
|
@@ -30,8 +20,8 @@ import { makeClipboardApi, makeColumnsApi, makeFilteringApi, makeFocusApi, makeM
|
|
|
30
20
|
/**
|
|
31
21
|
* Construct a new Table from the supplied options. Returns the structured
|
|
32
22
|
* `Table<TRow, TRowId>` instance. Mount the rendering component via
|
|
33
|
-
* `<Table {table} />` (
|
|
34
|
-
*
|
|
23
|
+
* `<Table {table} />` (the legacy `<Table tableContext={table._context} />`
|
|
24
|
+
* form is also accepted).
|
|
35
25
|
*
|
|
36
26
|
* @example
|
|
37
27
|
* ```ts
|
|
@@ -48,15 +38,11 @@ import { makeClipboardApi, makeColumnsApi, makeFilteringApi, makeFocusApi, makeM
|
|
|
48
38
|
* ```
|
|
49
39
|
*/
|
|
50
40
|
export function createTable(options) {
|
|
51
|
-
// ── 1. Resolve rowId ────────────────────────────────────────────
|
|
52
41
|
const rowIdFn = resolveRowId(options.rowId);
|
|
53
|
-
// ── 2. Run the column-builder closure ───────────────────────────
|
|
54
42
|
const factory = createColumnFactory();
|
|
55
43
|
const specs = options.columns(factory);
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
// These are constructed once during init and never reassigned reactively,
|
|
59
|
-
// so a plain Map is correct here.
|
|
44
|
+
// These maps are constructed once during init and never reassigned
|
|
45
|
+
// reactively, so a plain Map is correct here (no SvelteMap needed).
|
|
60
46
|
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
61
47
|
const specsById = new Map();
|
|
62
48
|
// eslint-disable-next-line svelte/prefer-svelte-reactivity
|
|
@@ -71,18 +57,14 @@ export function createTable(options) {
|
|
|
71
57
|
});
|
|
72
58
|
// remoteFilters resolution order:
|
|
73
59
|
// 1. Explicit `options.remoteFilters` thunk on createTable.
|
|
74
|
-
// 2. `kind: 'custom'` row source's `remoteFilters` field
|
|
75
|
-
//
|
|
76
|
-
//
|
|
77
|
-
// row-source factory once and the filter panel picks it up for free.
|
|
60
|
+
// 2. `kind: 'custom'` row source's `remoteFilters` field.
|
|
61
|
+
// A caller can hand the same `SvelteMap` to the custom row-source
|
|
62
|
+
// factory once and the filter panel picks it up for free.
|
|
78
63
|
const remoteFilters = options.remoteFilters?.() ??
|
|
79
64
|
(options.rows.kind === 'custom' ? options.rows.remoteFilters : undefined);
|
|
80
65
|
const defsWrapper = remoteFilters ? { defs, remoteFilters } : { defs };
|
|
81
|
-
// ── 3. Construct the repository for the chosen row source ──────
|
|
82
66
|
const repository = makeRepository(options.name, options.rows, options.getUserId);
|
|
83
|
-
// ── 4. Build the `onEditCell` wrapper ──────────────────────────
|
|
84
67
|
const onEditCell = makeOnEditCell(editHandlers, options.onAnyEdit);
|
|
85
|
-
// ── 5. Translate the new options to TableInitOptions ───────────
|
|
86
68
|
const initOptions = {
|
|
87
69
|
selectionExtractor: rowIdFn,
|
|
88
70
|
getUserId: options.getUserId ?? (() => undefined),
|
|
@@ -97,23 +79,17 @@ export function createTable(options) {
|
|
|
97
79
|
onEditCell,
|
|
98
80
|
debug: options.debug,
|
|
99
81
|
};
|
|
100
|
-
// ── 6. Build the TableContext ──────────────────────────────────
|
|
101
82
|
const ctx = TableContext.init(defsWrapper, options.name, repository, initOptions);
|
|
102
|
-
// ── 7. Wire selection.bindTo (Phase 1 uses the existing setter) ─
|
|
103
83
|
if (options.selection && options.selection.mode !== 'none' && options.selection.bindTo) {
|
|
104
84
|
ctx.setSelectionMap(options.selection.bindTo);
|
|
105
85
|
}
|
|
106
|
-
// ── 8. Apply initialState ───────────────────────────────────────
|
|
107
86
|
if (options.initialState) {
|
|
108
87
|
applyInitialState(ctx, options.initialState);
|
|
109
88
|
}
|
|
110
|
-
//
|
|
111
|
-
// `col.
|
|
112
|
-
//
|
|
113
|
-
//
|
|
114
|
-
// pin automatically here. The caller can override either pin via
|
|
115
|
-
// `initialState.columnPinning` (which runs first above), or via
|
|
116
|
-
// the live `setColumnPinning` updater on the table context.
|
|
89
|
+
// Auto-pin structural columns. `col.actions` (ellipsis menu) pins right
|
|
90
|
+
// and `col.rowSelection` (select-row checkbox) pins left by convention.
|
|
91
|
+
// Callers can override either pin via `initialState.columnPinning` (which
|
|
92
|
+
// runs above) or via the live `setColumnPinning` updater.
|
|
117
93
|
const autoPinLeft = new Map();
|
|
118
94
|
const autoPinRight = new Map();
|
|
119
95
|
for (const spec of specs) {
|
|
@@ -145,7 +121,6 @@ export function createTable(options) {
|
|
|
145
121
|
}
|
|
146
122
|
ctx.columnPinning = { left: nextLeft, right: nextRight };
|
|
147
123
|
}
|
|
148
|
-
// ── 9. Build the structured Table instance ─────────────────────
|
|
149
124
|
const table = Object.freeze({
|
|
150
125
|
get name() {
|
|
151
126
|
return ctx.tableName;
|
|
@@ -172,8 +147,7 @@ export function createTable(options) {
|
|
|
172
147
|
return ctx.dataRepo.reload?.() ?? Promise.resolve();
|
|
173
148
|
},
|
|
174
149
|
destroy() {
|
|
175
|
-
//
|
|
176
|
-
// introduce one when <Table> consumes the structured instance.
|
|
150
|
+
// No teardown hook on TableContext yet.
|
|
177
151
|
},
|
|
178
152
|
_context: ctx,
|
|
179
153
|
});
|
|
@@ -292,9 +266,7 @@ function translateToolbar(toolbar) {
|
|
|
292
266
|
return ToolbarPosition.None;
|
|
293
267
|
}
|
|
294
268
|
}
|
|
295
|
-
/** Apply the `initialState` options to a freshly-constructed TableContext.
|
|
296
|
-
* Phase 1 wires the subset of fields the existing sub-contexts already
|
|
297
|
-
* support; Phase 2 may extend the surface. */
|
|
269
|
+
/** Apply the `initialState` options to a freshly-constructed TableContext. */
|
|
298
270
|
function applyInitialState(ctx, state) {
|
|
299
271
|
if (state.sortBy && state.sortBy.length > 0) {
|
|
300
272
|
ctx.dataRepo.updateSorting?.(state.sortBy.map((s) => ({ id: s.id, desc: s.desc ?? false })));
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<script lang="ts">
|
|
4
|
-
import { TestContext } from '../../Contexts/TestContext.svelte.js';
|
|
5
|
-
import { getContext } from 'svelte';
|
|
6
|
-
|
|
7
|
-
const testContext = getContext<TestContext>(TestContext.identifier);
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<h1>counter 1: {testContext.value1.value}</h1>
|
|
11
|
-
<p>Ref wrapper 1 is incremented every time you click the button</p>
|
|
12
|
-
<h2>counter 2: {testContext.value2.value}</h2>
|
|
13
|
-
<p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<script lang="ts">
|
|
4
|
+
import { TestContext } from '../../Contexts/TestContext.svelte.js';
|
|
5
|
+
import { getContext } from 'svelte';
|
|
6
|
+
|
|
7
|
+
const testContext = getContext<TestContext>(TestContext.identifier);
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<h1>counter 1: {testContext.value1.value}</h1>
|
|
11
|
+
<p>Ref wrapper 1 is incremented every time you click the button</p>
|
|
12
|
+
<h2>counter 2: {testContext.value2.value}</h2>
|
|
13
|
+
<p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>
|