@lavalogic/scoria 0.40.0 → 0.40.2
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/AlertModal.svelte +195 -195
- package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +729 -729
- 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/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 -86
- 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/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/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 -196
- 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/Icons.js +357 -357
- package/dist/Components/InfoAlert.svelte +35 -35
- package/dist/Components/LoadingAnimation.svelte +29 -29
- package/dist/Components/LoadingModal.svelte +45 -45
- package/dist/Components/LoadingOverlay.svelte +25 -25
- package/dist/Components/Modal.svelte +258 -258
- package/dist/Components/MultiSelect.svelte +220 -220
- package/dist/Components/Nav/Nav.svelte +110 -110
- package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
- package/dist/Components/Nav/NavTab.svelte +62 -62
- package/dist/Components/Nav/ServiceMenuItem.svelte +112 -112
- 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 -107
- package/dist/Components/QuerySelect.svelte +366 -366
- package/dist/Components/SingleSelect.svelte +250 -250
- 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 -298
- package/dist/Components/Table/Body/QuickSearchCell.svelte +679 -679
- 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 +454 -454
- package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -185
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +131 -120
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +234 -234
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
- 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/TableNumberInput.svelte +216 -216
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -252
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -221
- 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/ColumnFactory.svelte.js +1 -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 -415
- package/dist/Components/Table/Misc/ColumnPanel.svelte +39 -39
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +39 -39
- package/dist/Components/Table/Misc/FilterInput.svelte +641 -641
- package/dist/Components/Table/Misc/FilterPanel.svelte +190 -190
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +31 -31
- package/dist/Components/Table/Misc/ShareViewModal.svelte +291 -291
- package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte +644 -644
- package/dist/Components/Table/Misc/TableFooter.svelte +340 -340
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +140 -140
- package/dist/Components/Table/Misc/TableSidebar.svelte +200 -200
- package/dist/Components/Table/Misc/TableViewDropdown.svelte +105 -105
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
- package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +192 -192
- package/dist/Components/Table/NestedTable.svelte +130 -130
- package/dist/Components/Table/Table.svelte +692 -692
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +5 -0
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +3 -0
- package/dist/Components/Table/Types/Public/ColumnOptions.d.ts +10 -0
- 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 +127 -127
- 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/Helpers/Datamatrix.d.ts +19 -19
- package/dist/Helpers/Datamatrix.js +291 -291
- package/dist/Types/Examples/ExampleModal.svelte +35 -35
- package/dist/scss/_basics.scss +12 -12
- package/dist/scss/_colours.scss +134 -134
- package/dist/scss/_mixins.scss +3392 -3392
- package/dist/scss/_motion.scss +57 -57
- package/dist/scss/_sizing.scss +85 -85
- package/dist/scss/_transitions.scss +8 -8
- package/package.json +1 -1
|
@@ -1,198 +1,198 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<script
|
|
4
|
-
lang="ts"
|
|
5
|
-
module
|
|
6
|
-
>
|
|
7
|
-
import { dev } from '$app/environment';
|
|
8
|
-
import { loadingText } from '../Helpers/Helpers.svelte.js';
|
|
9
|
-
import type { GridItem } from '../Types/Internal/GridItem.js';
|
|
10
|
-
import type {
|
|
11
|
-
GridMultiSelectItem,
|
|
12
|
-
GridMultiSelectItemAsObject,
|
|
13
|
-
GridMultiSelectItemAsPrimitive,
|
|
14
|
-
} from '../Types/Internal/GridMultiSelectItem.js';
|
|
15
|
-
import type { GridSelectItem } from '../Types/Internal/GridSelectItem.js';
|
|
16
|
-
import type {
|
|
17
|
-
GridSingleSelectItem,
|
|
18
|
-
GridSingleSelectItemAsObject,
|
|
19
|
-
GridSingleSelectItemAsPrimitive,
|
|
20
|
-
} from '../Types/Internal/GridSingleSelectItem.js';
|
|
21
|
-
import type { GridTextItem } from '../Types/Internal/GridTextItem.js';
|
|
22
|
-
import type { ValueProp } from '../Types/Internal/Misc.js';
|
|
23
|
-
import type { GridInputProps } from './GridInputProps.js';
|
|
24
|
-
import MultiSelect from './MultiSelect.svelte';
|
|
25
|
-
import SingleSelect from './SingleSelect.svelte';
|
|
26
|
-
import TextInput from './TextInput.svelte';
|
|
27
|
-
|
|
28
|
-
const textTypes = new Set(['text', 'email', 'tel']);
|
|
29
|
-
</script>
|
|
30
|
-
|
|
31
|
-
<script
|
|
32
|
-
lang="ts"
|
|
33
|
-
generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
|
|
34
|
-
>
|
|
35
|
-
const { item, first, last }: GridInputProps<V, VP> = $props();
|
|
36
|
-
|
|
37
|
-
let value = $derived(isText(item) ? (item.value ?? '') : '');
|
|
38
|
-
|
|
39
|
-
function isText<V extends Record<string, unknown>, VP extends ValueProp<V>>(
|
|
40
|
-
item: GridItem<V, VP>
|
|
41
|
-
): item is GridTextItem {
|
|
42
|
-
return item.type == null || textTypes.has(item.type);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function isSelect(item: GridItem<V, VP>): item is GridSelectItem<V, VP> {
|
|
46
|
-
return item.type == 'select';
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function isMultiSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
50
|
-
item: GridSelectItem<A, B>
|
|
51
|
-
): item is GridMultiSelectItem<A, B> {
|
|
52
|
-
return 'multi' in item && item.multi === true;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function isMultiSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
56
|
-
item: GridMultiSelectItem<A, B>
|
|
57
|
-
): item is GridMultiSelectItemAsPrimitive<A, B> {
|
|
58
|
-
return 'valueAsObject' in item && !item.valueAsObject;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function isMultiSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
62
|
-
item: GridMultiSelectItem<A, B>
|
|
63
|
-
): item is GridMultiSelectItemAsObject<A, B> {
|
|
64
|
-
return 'valueAsObject' in item && item.valueAsObject;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function isSingleSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
68
|
-
item: GridSelectItem<A, B>
|
|
69
|
-
): item is GridSingleSelectItem<A, B> {
|
|
70
|
-
return !('multi' in item) || item.multi === false;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function isSingleSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
74
|
-
item: GridSingleSelectItem<A, B>
|
|
75
|
-
): item is GridSingleSelectItemAsPrimitive<A, B> {
|
|
76
|
-
return 'valueAsObject' in item && !item.valueAsObject;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function isSingleSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
80
|
-
item: GridSingleSelectItem<A, B>
|
|
81
|
-
): item is GridSingleSelectItemAsObject<A, B> {
|
|
82
|
-
return 'valueAsObject' in item && item.valueAsObject;
|
|
83
|
-
}
|
|
84
|
-
</script>
|
|
85
|
-
|
|
86
|
-
<label
|
|
87
|
-
class:first
|
|
88
|
-
class:last
|
|
89
|
-
>
|
|
90
|
-
<div class="left">
|
|
91
|
-
<span
|
|
92
|
-
class:first
|
|
93
|
-
class:last>{item.label}</span
|
|
94
|
-
>
|
|
95
|
-
</div>
|
|
96
|
-
{#if isText(item)}
|
|
97
|
-
<TextInput
|
|
98
|
-
disabled={item.disabled}
|
|
99
|
-
bind:value
|
|
100
|
-
oninput={() => {
|
|
101
|
-
item.updater(value);
|
|
102
|
-
}}
|
|
103
|
-
required={item.required}
|
|
104
|
-
invalid={item.invalid}
|
|
105
|
-
/>
|
|
106
|
-
{:else if isSelect(item)}
|
|
107
|
-
{#if isMultiSelect(item)}
|
|
108
|
-
{#await item.options}
|
|
109
|
-
{loadingText}
|
|
110
|
-
{:then options}
|
|
111
|
-
{#if isMultiSelectObject<V, VP>(item)}
|
|
112
|
-
<MultiSelect
|
|
113
|
-
name={item.name}
|
|
114
|
-
{options}
|
|
115
|
-
valueAsObject={true}
|
|
116
|
-
labelProp={item.labelProp}
|
|
117
|
-
valueProp={item.valueProp}
|
|
118
|
-
selectedValues={item.value}
|
|
119
|
-
invalid={item.invalid}
|
|
120
|
-
onchange={(v: Array<V>) => {
|
|
121
|
-
item.updater(v);
|
|
122
|
-
}}
|
|
123
|
-
/>
|
|
124
|
-
{:else if isMultiSelectPrimitive(item)}
|
|
125
|
-
<MultiSelect
|
|
126
|
-
name={item.name}
|
|
127
|
-
{options}
|
|
128
|
-
valueAsObject={false}
|
|
129
|
-
labelProp={item.labelProp}
|
|
130
|
-
valueProp={item.valueProp}
|
|
131
|
-
selectedValues={item.value}
|
|
132
|
-
invalid={item.invalid}
|
|
133
|
-
onchange={(v: Array<V[VP]>) => {
|
|
134
|
-
// `valueAsObject={false}` → primitives, not SelectOption objects.
|
|
135
|
-
item.updater(v);
|
|
136
|
-
}}
|
|
137
|
-
/>
|
|
138
|
-
{/if}
|
|
139
|
-
{/await}
|
|
140
|
-
{:else if isSingleSelect(item)}
|
|
141
|
-
{#await item.options}
|
|
142
|
-
{loadingText}
|
|
143
|
-
{:then options}
|
|
144
|
-
{#if isSingleSelectObject(item)}
|
|
145
|
-
<SingleSelect
|
|
146
|
-
{options}
|
|
147
|
-
name={item.name}
|
|
148
|
-
valueAsObject={true}
|
|
149
|
-
labelProp={item.labelProp}
|
|
150
|
-
valueProp={item.valueProp}
|
|
151
|
-
value={item.value}
|
|
152
|
-
required={item.required}
|
|
153
|
-
clearable={!item.required}
|
|
154
|
-
disabled={item.disabled}
|
|
155
|
-
invalid={item.invalid}
|
|
156
|
-
onchange={(v: V | null) => {
|
|
157
|
-
item.updater(v);
|
|
158
|
-
}}
|
|
159
|
-
/>
|
|
160
|
-
{:else if isSingleSelectPrimitive(item)}
|
|
161
|
-
<SingleSelect
|
|
162
|
-
{options}
|
|
163
|
-
name={item.name}
|
|
164
|
-
valueAsObject={false}
|
|
165
|
-
labelProp={item.labelProp}
|
|
166
|
-
valueProp={item.valueProp}
|
|
167
|
-
value={item.value}
|
|
168
|
-
required={item.required}
|
|
169
|
-
clearable={!item.required}
|
|
170
|
-
disabled={item.disabled}
|
|
171
|
-
invalid={item.invalid}
|
|
172
|
-
onchange={(
|
|
173
|
-
// `valueAsObject={false}` → primitive value, not a
|
|
174
|
-
// SelectOption. `clearable` is on (since the field is
|
|
175
|
-
// not required) so the callback must accept null.
|
|
176
|
-
// The annotation collapses to `unknown | null` because
|
|
177
|
-
// `V extends Record<string, unknown>` makes `V[VP]`
|
|
178
|
-
// itself `unknown`.
|
|
179
|
-
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
180
|
-
v: V[VP] | null
|
|
181
|
-
) => {
|
|
182
|
-
item.updater(v);
|
|
183
|
-
}}
|
|
184
|
-
/>
|
|
185
|
-
{/if}
|
|
186
|
-
{/await}
|
|
187
|
-
{/if}
|
|
188
|
-
{:else if dev}
|
|
189
|
-
{@const type = item.type}
|
|
190
|
-
unknown type: {type}
|
|
191
|
-
<!-- eslint-disable-next-line svelte/no-at-debug-tags -->
|
|
192
|
-
{@debug type}
|
|
193
|
-
{/if}
|
|
194
|
-
</label>
|
|
195
|
-
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<script
|
|
4
|
+
lang="ts"
|
|
5
|
+
module
|
|
6
|
+
>
|
|
7
|
+
import { dev } from '$app/environment';
|
|
8
|
+
import { loadingText } from '../Helpers/Helpers.svelte.js';
|
|
9
|
+
import type { GridItem } from '../Types/Internal/GridItem.js';
|
|
10
|
+
import type {
|
|
11
|
+
GridMultiSelectItem,
|
|
12
|
+
GridMultiSelectItemAsObject,
|
|
13
|
+
GridMultiSelectItemAsPrimitive,
|
|
14
|
+
} from '../Types/Internal/GridMultiSelectItem.js';
|
|
15
|
+
import type { GridSelectItem } from '../Types/Internal/GridSelectItem.js';
|
|
16
|
+
import type {
|
|
17
|
+
GridSingleSelectItem,
|
|
18
|
+
GridSingleSelectItemAsObject,
|
|
19
|
+
GridSingleSelectItemAsPrimitive,
|
|
20
|
+
} from '../Types/Internal/GridSingleSelectItem.js';
|
|
21
|
+
import type { GridTextItem } from '../Types/Internal/GridTextItem.js';
|
|
22
|
+
import type { ValueProp } from '../Types/Internal/Misc.js';
|
|
23
|
+
import type { GridInputProps } from './GridInputProps.js';
|
|
24
|
+
import MultiSelect from './MultiSelect.svelte';
|
|
25
|
+
import SingleSelect from './SingleSelect.svelte';
|
|
26
|
+
import TextInput from './TextInput.svelte';
|
|
27
|
+
|
|
28
|
+
const textTypes = new Set(['text', 'email', 'tel']);
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<script
|
|
32
|
+
lang="ts"
|
|
33
|
+
generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
|
|
34
|
+
>
|
|
35
|
+
const { item, first, last }: GridInputProps<V, VP> = $props();
|
|
36
|
+
|
|
37
|
+
let value = $derived(isText(item) ? (item.value ?? '') : '');
|
|
38
|
+
|
|
39
|
+
function isText<V extends Record<string, unknown>, VP extends ValueProp<V>>(
|
|
40
|
+
item: GridItem<V, VP>
|
|
41
|
+
): item is GridTextItem {
|
|
42
|
+
return item.type == null || textTypes.has(item.type);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isSelect(item: GridItem<V, VP>): item is GridSelectItem<V, VP> {
|
|
46
|
+
return item.type == 'select';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function isMultiSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
50
|
+
item: GridSelectItem<A, B>
|
|
51
|
+
): item is GridMultiSelectItem<A, B> {
|
|
52
|
+
return 'multi' in item && item.multi === true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function isMultiSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
56
|
+
item: GridMultiSelectItem<A, B>
|
|
57
|
+
): item is GridMultiSelectItemAsPrimitive<A, B> {
|
|
58
|
+
return 'valueAsObject' in item && !item.valueAsObject;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isMultiSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
62
|
+
item: GridMultiSelectItem<A, B>
|
|
63
|
+
): item is GridMultiSelectItemAsObject<A, B> {
|
|
64
|
+
return 'valueAsObject' in item && item.valueAsObject;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function isSingleSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
68
|
+
item: GridSelectItem<A, B>
|
|
69
|
+
): item is GridSingleSelectItem<A, B> {
|
|
70
|
+
return !('multi' in item) || item.multi === false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isSingleSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
74
|
+
item: GridSingleSelectItem<A, B>
|
|
75
|
+
): item is GridSingleSelectItemAsPrimitive<A, B> {
|
|
76
|
+
return 'valueAsObject' in item && !item.valueAsObject;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function isSingleSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
|
|
80
|
+
item: GridSingleSelectItem<A, B>
|
|
81
|
+
): item is GridSingleSelectItemAsObject<A, B> {
|
|
82
|
+
return 'valueAsObject' in item && item.valueAsObject;
|
|
83
|
+
}
|
|
84
|
+
</script>
|
|
85
|
+
|
|
86
|
+
<label
|
|
87
|
+
class:first
|
|
88
|
+
class:last
|
|
89
|
+
>
|
|
90
|
+
<div class="left">
|
|
91
|
+
<span
|
|
92
|
+
class:first
|
|
93
|
+
class:last>{item.label}</span
|
|
94
|
+
>
|
|
95
|
+
</div>
|
|
96
|
+
{#if isText(item)}
|
|
97
|
+
<TextInput
|
|
98
|
+
disabled={item.disabled}
|
|
99
|
+
bind:value
|
|
100
|
+
oninput={() => {
|
|
101
|
+
item.updater(value);
|
|
102
|
+
}}
|
|
103
|
+
required={item.required}
|
|
104
|
+
invalid={item.invalid}
|
|
105
|
+
/>
|
|
106
|
+
{:else if isSelect(item)}
|
|
107
|
+
{#if isMultiSelect(item)}
|
|
108
|
+
{#await item.options}
|
|
109
|
+
{loadingText}
|
|
110
|
+
{:then options}
|
|
111
|
+
{#if isMultiSelectObject<V, VP>(item)}
|
|
112
|
+
<MultiSelect
|
|
113
|
+
name={item.name}
|
|
114
|
+
{options}
|
|
115
|
+
valueAsObject={true}
|
|
116
|
+
labelProp={item.labelProp}
|
|
117
|
+
valueProp={item.valueProp}
|
|
118
|
+
selectedValues={item.value}
|
|
119
|
+
invalid={item.invalid}
|
|
120
|
+
onchange={(v: Array<V>) => {
|
|
121
|
+
item.updater(v);
|
|
122
|
+
}}
|
|
123
|
+
/>
|
|
124
|
+
{:else if isMultiSelectPrimitive(item)}
|
|
125
|
+
<MultiSelect
|
|
126
|
+
name={item.name}
|
|
127
|
+
{options}
|
|
128
|
+
valueAsObject={false}
|
|
129
|
+
labelProp={item.labelProp}
|
|
130
|
+
valueProp={item.valueProp}
|
|
131
|
+
selectedValues={item.value}
|
|
132
|
+
invalid={item.invalid}
|
|
133
|
+
onchange={(v: Array<V[VP]>) => {
|
|
134
|
+
// `valueAsObject={false}` → primitives, not SelectOption objects.
|
|
135
|
+
item.updater(v);
|
|
136
|
+
}}
|
|
137
|
+
/>
|
|
138
|
+
{/if}
|
|
139
|
+
{/await}
|
|
140
|
+
{:else if isSingleSelect(item)}
|
|
141
|
+
{#await item.options}
|
|
142
|
+
{loadingText}
|
|
143
|
+
{:then options}
|
|
144
|
+
{#if isSingleSelectObject(item)}
|
|
145
|
+
<SingleSelect
|
|
146
|
+
{options}
|
|
147
|
+
name={item.name}
|
|
148
|
+
valueAsObject={true}
|
|
149
|
+
labelProp={item.labelProp}
|
|
150
|
+
valueProp={item.valueProp}
|
|
151
|
+
value={item.value}
|
|
152
|
+
required={item.required}
|
|
153
|
+
clearable={!item.required}
|
|
154
|
+
disabled={item.disabled}
|
|
155
|
+
invalid={item.invalid}
|
|
156
|
+
onchange={(v: V | null) => {
|
|
157
|
+
item.updater(v);
|
|
158
|
+
}}
|
|
159
|
+
/>
|
|
160
|
+
{:else if isSingleSelectPrimitive(item)}
|
|
161
|
+
<SingleSelect
|
|
162
|
+
{options}
|
|
163
|
+
name={item.name}
|
|
164
|
+
valueAsObject={false}
|
|
165
|
+
labelProp={item.labelProp}
|
|
166
|
+
valueProp={item.valueProp}
|
|
167
|
+
value={item.value}
|
|
168
|
+
required={item.required}
|
|
169
|
+
clearable={!item.required}
|
|
170
|
+
disabled={item.disabled}
|
|
171
|
+
invalid={item.invalid}
|
|
172
|
+
onchange={(
|
|
173
|
+
// `valueAsObject={false}` → primitive value, not a
|
|
174
|
+
// SelectOption. `clearable` is on (since the field is
|
|
175
|
+
// not required) so the callback must accept null.
|
|
176
|
+
// The annotation collapses to `unknown | null` because
|
|
177
|
+
// `V extends Record<string, unknown>` makes `V[VP]`
|
|
178
|
+
// itself `unknown`.
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
|
|
180
|
+
v: V[VP] | null
|
|
181
|
+
) => {
|
|
182
|
+
item.updater(v);
|
|
183
|
+
}}
|
|
184
|
+
/>
|
|
185
|
+
{/if}
|
|
186
|
+
{/await}
|
|
187
|
+
{/if}
|
|
188
|
+
{:else if dev}
|
|
189
|
+
{@const type = item.type}
|
|
190
|
+
unknown type: {type}
|
|
191
|
+
<!-- eslint-disable-next-line svelte/no-at-debug-tags -->
|
|
192
|
+
{@debug type}
|
|
193
|
+
{/if}
|
|
194
|
+
</label>
|
|
195
|
+
|
|
196
196
|
<style>label {
|
|
197
197
|
display: contents;
|
|
198
198
|
--input-border-radius: 0;
|
|
@@ -211,4 +211,4 @@ label.first {
|
|
|
211
211
|
}
|
|
212
212
|
label.last {
|
|
213
213
|
border-radius: 0 0 4px 4px;
|
|
214
|
-
}</style>
|
|
214
|
+
}</style>
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<script
|
|
4
|
-
lang="ts"
|
|
5
|
-
generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
|
|
6
|
-
>
|
|
7
|
-
import type { ValueProp } from '../Types/Internal/Misc.js';
|
|
8
|
-
import GridInput from './GridInput.svelte';
|
|
9
|
-
import type { GridInputSetProps } from './GridInputSetProps.js';
|
|
10
|
-
|
|
11
|
-
const { items, header }: GridInputSetProps<V, VP> = $props();
|
|
12
|
-
|
|
13
|
-
const lastIndex = $derived(items.length - 1);
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<div class="grid">
|
|
17
|
-
{#if header}
|
|
18
|
-
{@render header()}
|
|
19
|
-
{/if}
|
|
20
|
-
{#each items as item, index (item.label)}
|
|
21
|
-
<GridInput
|
|
22
|
-
{item}
|
|
23
|
-
first={index == 0}
|
|
24
|
-
last={index == lastIndex}
|
|
25
|
-
/>
|
|
26
|
-
{/each}
|
|
27
|
-
</div>
|
|
28
|
-
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<script
|
|
4
|
+
lang="ts"
|
|
5
|
+
generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
|
|
6
|
+
>
|
|
7
|
+
import type { ValueProp } from '../Types/Internal/Misc.js';
|
|
8
|
+
import GridInput from './GridInput.svelte';
|
|
9
|
+
import type { GridInputSetProps } from './GridInputSetProps.js';
|
|
10
|
+
|
|
11
|
+
const { items, header }: GridInputSetProps<V, VP> = $props();
|
|
12
|
+
|
|
13
|
+
const lastIndex = $derived(items.length - 1);
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<div class="grid">
|
|
17
|
+
{#if header}
|
|
18
|
+
{@render header()}
|
|
19
|
+
{/if}
|
|
20
|
+
{#each items as item, index (item.label)}
|
|
21
|
+
<GridInput
|
|
22
|
+
{item}
|
|
23
|
+
first={index == 0}
|
|
24
|
+
last={index == lastIndex}
|
|
25
|
+
/>
|
|
26
|
+
{/each}
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
29
|
<style>.grid {
|
|
30
30
|
display: grid;
|
|
31
31
|
grid-template-columns: [label] 16rem [value] 1fr;
|
|
@@ -33,4 +33,4 @@
|
|
|
33
33
|
border: solid 1px #dae0e5;
|
|
34
34
|
border-radius: 4px;
|
|
35
35
|
background-color: #dae0e5;
|
|
36
|
-
}</style>
|
|
36
|
+
}</style>
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<script
|
|
4
|
-
lang="ts"
|
|
5
|
-
generics="CommonDenominator"
|
|
6
|
-
>
|
|
7
|
-
import { ellipses } from '../Helpers/Helpers.svelte.js';
|
|
8
|
-
import { Colour } from '../scss/colours.js';
|
|
9
|
-
import HorizontalTabGroupButton from './HorizontalTabGroupButton.svelte';
|
|
10
|
-
import type { HorizontalTabGroupProps } from './HorizontalTabGroupProps.js';
|
|
11
|
-
import TextInput from './TextInput.svelte';
|
|
12
|
-
const {
|
|
13
|
-
tabComponent,
|
|
14
|
-
tabs,
|
|
15
|
-
selected,
|
|
16
|
-
noRadius = false,
|
|
17
|
-
grow = false,
|
|
18
|
-
dense = false,
|
|
19
|
-
filterable = false,
|
|
20
|
-
filterFn,
|
|
21
|
-
}: HorizontalTabGroupProps<CommonDenominator> = $props();
|
|
22
|
-
|
|
23
|
-
let searchValue = $state('');
|
|
24
|
-
|
|
25
|
-
// Debounce only the search value, not the tabs array. This way a parent
|
|
26
|
-
// rebuilding `tabs` shows the new list immediately, while typing still
|
|
27
|
-
// pays the 300ms cost.
|
|
28
|
-
let debouncedSearch = $state('');
|
|
29
|
-
$effect(() => {
|
|
30
|
-
const term = searchValue;
|
|
31
|
-
const id = setTimeout(() => {
|
|
32
|
-
debouncedSearch = term;
|
|
33
|
-
}, 300);
|
|
34
|
-
return () => {
|
|
35
|
-
clearTimeout(id);
|
|
36
|
-
};
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
const filteredTabs = $derived(filterFn ? tabs.filter((t) => filterFn(t, debouncedSearch)) : tabs);
|
|
40
|
-
</script>
|
|
41
|
-
|
|
42
|
-
<div
|
|
43
|
-
class="wrapper"
|
|
44
|
-
class:no-radius={noRadius}
|
|
45
|
-
class:grow
|
|
46
|
-
class:dense
|
|
47
|
-
>
|
|
48
|
-
<div class="tabs">
|
|
49
|
-
<div class="sticky">
|
|
50
|
-
{#if filterable}
|
|
51
|
-
<div class="searchbar">
|
|
52
|
-
<TextInput
|
|
53
|
-
bind:value={searchValue}
|
|
54
|
-
placeholder="Search any keyword to find matches{ellipses}"
|
|
55
|
-
rightIcon={{ name: 'search-1', colour: Colour['$ui-blue-4'] }}
|
|
56
|
-
/>
|
|
57
|
-
</div>
|
|
58
|
-
{/if}
|
|
59
|
-
</div>
|
|
60
|
-
{#if tabComponent}
|
|
61
|
-
{#each filteredTabs as option (option.label)}
|
|
62
|
-
{@render tabComponent(option, selected?.label === option.label)}
|
|
63
|
-
{/each}
|
|
64
|
-
{:else}
|
|
65
|
-
{#each filteredTabs as option (option.label)}
|
|
66
|
-
<HorizontalTabGroupButton
|
|
67
|
-
{option}
|
|
68
|
-
noRadius={noRadius || filterable}
|
|
69
|
-
selected={selected?.label === option.label}
|
|
70
|
-
/>
|
|
71
|
-
{/each}
|
|
72
|
-
{/if}
|
|
73
|
-
</div>
|
|
74
|
-
|
|
75
|
-
<div class="content">
|
|
76
|
-
{#if selected}
|
|
77
|
-
{@render selected.content(selected.args)}
|
|
78
|
-
{/if}
|
|
79
|
-
</div>
|
|
80
|
-
</div>
|
|
81
|
-
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<script
|
|
4
|
+
lang="ts"
|
|
5
|
+
generics="CommonDenominator"
|
|
6
|
+
>
|
|
7
|
+
import { ellipses } from '../Helpers/Helpers.svelte.js';
|
|
8
|
+
import { Colour } from '../scss/colours.js';
|
|
9
|
+
import HorizontalTabGroupButton from './HorizontalTabGroupButton.svelte';
|
|
10
|
+
import type { HorizontalTabGroupProps } from './HorizontalTabGroupProps.js';
|
|
11
|
+
import TextInput from './TextInput.svelte';
|
|
12
|
+
const {
|
|
13
|
+
tabComponent,
|
|
14
|
+
tabs,
|
|
15
|
+
selected,
|
|
16
|
+
noRadius = false,
|
|
17
|
+
grow = false,
|
|
18
|
+
dense = false,
|
|
19
|
+
filterable = false,
|
|
20
|
+
filterFn,
|
|
21
|
+
}: HorizontalTabGroupProps<CommonDenominator> = $props();
|
|
22
|
+
|
|
23
|
+
let searchValue = $state('');
|
|
24
|
+
|
|
25
|
+
// Debounce only the search value, not the tabs array. This way a parent
|
|
26
|
+
// rebuilding `tabs` shows the new list immediately, while typing still
|
|
27
|
+
// pays the 300ms cost.
|
|
28
|
+
let debouncedSearch = $state('');
|
|
29
|
+
$effect(() => {
|
|
30
|
+
const term = searchValue;
|
|
31
|
+
const id = setTimeout(() => {
|
|
32
|
+
debouncedSearch = term;
|
|
33
|
+
}, 300);
|
|
34
|
+
return () => {
|
|
35
|
+
clearTimeout(id);
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const filteredTabs = $derived(filterFn ? tabs.filter((t) => filterFn(t, debouncedSearch)) : tabs);
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<div
|
|
43
|
+
class="wrapper"
|
|
44
|
+
class:no-radius={noRadius}
|
|
45
|
+
class:grow
|
|
46
|
+
class:dense
|
|
47
|
+
>
|
|
48
|
+
<div class="tabs">
|
|
49
|
+
<div class="sticky">
|
|
50
|
+
{#if filterable}
|
|
51
|
+
<div class="searchbar">
|
|
52
|
+
<TextInput
|
|
53
|
+
bind:value={searchValue}
|
|
54
|
+
placeholder="Search any keyword to find matches{ellipses}"
|
|
55
|
+
rightIcon={{ name: 'search-1', colour: Colour['$ui-blue-4'] }}
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
{/if}
|
|
59
|
+
</div>
|
|
60
|
+
{#if tabComponent}
|
|
61
|
+
{#each filteredTabs as option (option.label)}
|
|
62
|
+
{@render tabComponent(option, selected?.label === option.label)}
|
|
63
|
+
{/each}
|
|
64
|
+
{:else}
|
|
65
|
+
{#each filteredTabs as option (option.label)}
|
|
66
|
+
<HorizontalTabGroupButton
|
|
67
|
+
{option}
|
|
68
|
+
noRadius={noRadius || filterable}
|
|
69
|
+
selected={selected?.label === option.label}
|
|
70
|
+
/>
|
|
71
|
+
{/each}
|
|
72
|
+
{/if}
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="content">
|
|
76
|
+
{#if selected}
|
|
77
|
+
{@render selected.content(selected.args)}
|
|
78
|
+
{/if}
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
82
|
<style>.searchbar {
|
|
83
83
|
display: flex;
|
|
84
84
|
width: 100%;
|
|
@@ -132,4 +132,4 @@
|
|
|
132
132
|
flex-grow: 1;
|
|
133
133
|
overflow: visible;
|
|
134
134
|
border-radius: 0 4px 0 4px;
|
|
135
|
-
}</style>
|
|
135
|
+
}</style>
|