@poirazis/supercomponents-shared 1.1.7 → 1.2.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 (61) hide show
  1. package/dist/index.js +21096 -44266
  2. package/dist/index.umd.cjs +19 -23
  3. package/dist/style.css +1 -1
  4. package/package.json +5 -6
  5. package/src/index.js +4 -0
  6. package/src/index.ts +3 -0
  7. package/src/lib/Actions/index.js +3 -3
  8. package/src/lib/SuperButton/SuperButton.svelte +39 -4
  9. package/src/lib/SuperField/SuperField.svelte +4 -1
  10. package/src/lib/SuperForm/InnerForm.svelte +2 -2
  11. package/src/lib/SuperList/SuperList.svelte +2 -2
  12. package/src/lib/SuperList/drag-handle.svelte +8 -8
  13. package/src/lib/SuperTable/SuperTable.css +11 -7
  14. package/src/lib/SuperTable/SuperTable.svelte +315 -186
  15. package/src/lib/SuperTable/controls/ColumnsSection.svelte +18 -14
  16. package/src/lib/SuperTable/controls/PaginationLimitOffset.svelte +133 -0
  17. package/src/lib/SuperTable/controls/RowButtonsColumn.svelte +9 -15
  18. package/src/lib/SuperTable/controls/SelectionColumn.svelte +58 -118
  19. package/src/lib/SuperTable/controls/SuperTableWelcome.svelte +1 -1
  20. package/src/lib/SuperTable/overlays/AddNewRowOverlay.svelte +3 -3
  21. package/src/lib/SuperTable/overlays/EmptyResultSetOverlay.svelte +1 -1
  22. package/src/lib/SuperTable/overlays/ScrollbarsOverlay.svelte +43 -43
  23. package/src/lib/SuperTableCells/CellAttachment.svelte +0 -11
  24. package/src/lib/SuperTableCells/CellAttachmentExpanded.svelte +1 -12
  25. package/src/lib/SuperTableCells/CellAttachmentSlider.svelte +2 -33
  26. package/src/lib/SuperTableCells/CellBoolean.svelte +1 -12
  27. package/src/lib/SuperTableCells/CellColor.svelte +7 -7
  28. package/src/lib/SuperTableCells/CellCommon.css +20 -4
  29. package/src/lib/SuperTableCells/CellDateRange.svelte +0 -11
  30. package/src/lib/SuperTableCells/CellDatetime.svelte +0 -11
  31. package/src/lib/SuperTableCells/CellIcon.svelte +8 -8
  32. package/src/lib/SuperTableCells/CellJSON.svelte +2 -30
  33. package/src/lib/SuperTableCells/CellLink.svelte +50 -43
  34. package/src/lib/SuperTableCells/CellLinkAdvanced.svelte +2 -15
  35. package/src/lib/SuperTableCells/CellLinkPickerSelect.svelte +10 -11
  36. package/src/lib/SuperTableCells/CellLinkPickerTree.svelte +5 -0
  37. package/src/lib/SuperTableCells/CellNumber.svelte +157 -75
  38. package/src/lib/SuperTableCells/CellOptions.svelte +18 -24
  39. package/src/lib/SuperTableCells/CellOptionsAdvanced.svelte +11 -9
  40. package/src/lib/SuperTableCells/CellSQLLink.svelte +301 -0
  41. package/src/lib/SuperTableCells/CellSQLLinkPicker.svelte +569 -0
  42. package/src/lib/SuperTableCells/CellString.svelte +90 -54
  43. package/src/lib/SuperTableCells/CellStringMask.svelte +1 -1
  44. package/src/lib/SuperTableCells/CellTags.svelte +151 -108
  45. package/src/lib/SuperTableCells/JSDOC_GUIDE.md +869 -0
  46. package/src/lib/SuperTableCells/index.js +3 -2
  47. package/src/lib/SuperTableCells/types.js +220 -0
  48. package/src/lib/SuperTableColumn/SuperTableColumn.svelte +2 -4
  49. package/src/lib/SuperTableColumn/parts/SuperColumnBody.svelte +13 -16
  50. package/src/lib/SuperTableColumn/parts/SuperColumnHeader.svelte +2 -2
  51. package/src/lib/SuperTableColumn/parts/SuperColumnRow.svelte +9 -16
  52. package/src/lib/SuperTabs/SuperTabs.svelte +7 -4
  53. package/src/lib/SuperTree/SuperTree.svelte +84 -38
  54. package/src/lib/UI/elements/Checkbox.svelte +79 -0
  55. package/src/lib/UI/elements/Icon.svelte +0 -0
  56. package/src/lib/UI/elements/IconButton.svelte +115 -0
  57. package/src/lib/UI/elements/Tooltip.svelte +65 -0
  58. package/src/lib/SuperTableCells/CellEditorStateMachine.js +0 -130
  59. package/src/lib/SuperTableCells/CellNumberSimple.svelte +0 -56
  60. package/src/lib/SuperTableCells/MaskUtils.js +0 -100
  61. package/src/lib/SuperTableCells/remixIcons.js +0 -6772
@@ -0,0 +1,301 @@
1
+ <script>
2
+ import { createEventDispatcher, getContext } from "svelte";
3
+ import fsm from "svelte-fsm";
4
+ import SuperPopover from "../SuperPopover/SuperPopover.svelte";
5
+ import CellSQLLinkPicker from "./CellSQLLinkPicker.svelte";
6
+ import CellLinkPickerTree from "../../lib/SuperTableCells/CellLinkPickerTree.svelte";
7
+ const dispatch = createEventDispatcher();
8
+ const { API } = getContext("sdk");
9
+
10
+ export let value;
11
+ export let fieldSchema;
12
+ export let cellOptions;
13
+ export let simpleView = true;
14
+ export let filter = [];
15
+ export let limit = 100;
16
+ export let multi = false;
17
+
18
+ // In case of a self referencing relationship, the current row cannot be the parent of itself
19
+ export let ownId;
20
+
21
+ let originalValue = JSON.stringify(value);
22
+ let anchor;
23
+ let popup;
24
+ let search;
25
+ let pickerApi;
26
+
27
+ export let cellState = fsm(cellOptions.initialState ?? "View", {
28
+ "*": {
29
+ goTo(state) {
30
+ return state;
31
+ },
32
+ reset(val) {
33
+ localValue = undefined;
34
+ },
35
+ },
36
+ View: {
37
+ _enter() {},
38
+ focus() {
39
+ if (!cellOptions.readonly && !cellOptions.disabled) return "Editing";
40
+ },
41
+ },
42
+ Editing: {
43
+ _enter() {
44
+ originalValue = JSON.stringify(localValue);
45
+ editorState.open();
46
+ dispatch("enteredit");
47
+ },
48
+ _exit() {
49
+ editorState.close();
50
+ dispatch("exitedit");
51
+ },
52
+ focusout(e) {
53
+ if (popup?.contains(e?.relatedTarget)) return;
54
+ this.submit();
55
+ },
56
+
57
+ clear() {
58
+ localValue = [];
59
+ },
60
+ submit() {
61
+ if (isDirty) dispatch("change", localValue);
62
+
63
+ return "View";
64
+ },
65
+ cancel() {
66
+ return "View";
67
+ },
68
+ },
69
+ });
70
+
71
+ const editorState = fsm("Closed", {
72
+ Open: {
73
+ close() {
74
+ return "Closed";
75
+ },
76
+ toggle() {
77
+ return "Closed";
78
+ },
79
+ },
80
+ Closed: {
81
+ open() {
82
+ return "Open";
83
+ },
84
+ toggle() {
85
+ return "Open";
86
+ },
87
+ },
88
+ });
89
+
90
+ $: relatedField = fieldSchema?.relatedField || "id";
91
+ $: relatedTableId = fieldSchema?.tableId;
92
+ $: relatedColumns = fieldSchema?.relatedColumns || [];
93
+
94
+ $: pills = cellOptions.relViewMode == "pills";
95
+ $: ownId = ownId || cellOptions?.ownId;
96
+
97
+ $: localValue = enrichValue(value);
98
+
99
+ $: inEdit = $cellState == "Editing";
100
+ $: isDirty = inEdit && originalValue != JSON.stringify(localValue);
101
+ $: simpleView = cellOptions.relViewMode == "text";
102
+ $: inline = cellOptions.role == "inlineInput";
103
+
104
+ $: placeholder = cellOptions.placeholder || "";
105
+ $: readonly = cellOptions.readonly || cellOptions.disabled;
106
+
107
+ const handleKeyboard = (e) => {
108
+ if (e.key == "Escape") {
109
+ if ($editorState == "Open") {
110
+ editorState.close();
111
+ } else {
112
+ cellState.focusout(e);
113
+ }
114
+ } else if (e.keyCode == 32 && $cellState == "Editing") {
115
+ editorState.toggle();
116
+ } else if (e.key == "Tab" && $editorState == "Open") {
117
+ cellState.focusout(e);
118
+ } else if ($editorState == "Open") {
119
+ if (e.key === "ArrowUp") {
120
+ e.preventDefault();
121
+ pickerApi?.focusPrev();
122
+ pickerApi?.scrollIntoView();
123
+ } else if (e.key === "ArrowDown") {
124
+ e.preventDefault();
125
+ pickerApi?.focusNext();
126
+ pickerApi?.scrollIntoView();
127
+ } else if (e.key.length == 1 && e.key.match(/\S/)) {
128
+ pickerApi?.setSearch(e.key);
129
+ }
130
+ }
131
+ };
132
+
133
+ const handleChange = (e) => {
134
+ localValue = e.detail;
135
+
136
+ if (!multi) {
137
+ editorState.close();
138
+ }
139
+ };
140
+
141
+ const enrichValue = (x) => {
142
+ if (Array.isArray(x) && multi) {
143
+ // Enrich array of ids for multi-select, only fetch missing ones
144
+ const existingIds = localValue
145
+ ? localValue.map((v) => v[relatedField])
146
+ : [];
147
+ const missingIds = x.filter((id) => !existingIds.includes(id));
148
+ if (missingIds.length > 0) {
149
+ API.fetchTableDefinition(relatedTableId).then((def) => {
150
+ fieldSchema.primaryDisplay = def.primaryDisplay;
151
+ });
152
+
153
+ Promise.all(
154
+ missingIds.map((id) => API.fetchRow(relatedTableId, id, true))
155
+ )
156
+ .then((rows) => {
157
+ const newEnriched = rows.map((row) => ({
158
+ [relatedField]: row[relatedField],
159
+ primaryDisplay: fieldSchema.primaryDisplay
160
+ ? row[fieldSchema.primaryDisplay]
161
+ : row.name || row.id,
162
+ }));
163
+ // Append new enriched items to existing localValue
164
+ localValue = [...(localValue || []), ...newEnriched];
165
+ })
166
+ .catch((e) => {
167
+ // On error, keep existing localValue
168
+ });
169
+ }
170
+ return localValue || [];
171
+ } else if (x && !Array.isArray(x)) {
172
+ // Enrich single id, only if not already enriched
173
+ const existing =
174
+ localValue && localValue.find((v) => v[relatedField] === x);
175
+ if (!existing) {
176
+ API.fetchTableDefinition(relatedTableId).then((def) => {
177
+ fieldSchema.primaryDisplay = def.primaryDisplay;
178
+ });
179
+
180
+ API.fetchRow(relatedTableId, x, true)
181
+ .then((row) => {
182
+ localValue = [
183
+ {
184
+ [relatedField]: row[relatedField],
185
+ primaryDisplay: fieldSchema.primaryDisplay
186
+ ? row[fieldSchema.primaryDisplay]
187
+ : row.name || row.id,
188
+ },
189
+ ];
190
+ })
191
+ .catch((e) => {
192
+ localValue = [];
193
+ });
194
+ }
195
+ return localValue || [];
196
+ } else if (multi) {
197
+ return value && Array.isArray(value) ? value : [];
198
+ } else {
199
+ return value ? [value] : [];
200
+ }
201
+ };
202
+ </script>
203
+
204
+ <!-- svelte-ignore a11y-click-events-have-key-events -->
205
+ <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
206
+ <!-- svelte-ignore a11y-no-static-element-interactions -->
207
+ <div
208
+ class="superCell"
209
+ tabindex={cellOptions?.disabled ? -1 : 0}
210
+ bind:this={anchor}
211
+ class:isDirty={isDirty && cellOptions.showDirty}
212
+ class:inEdit
213
+ class:inline
214
+ class:tableCell={cellOptions.role == "tableCell"}
215
+ class:formInput={cellOptions.role == "formInput"}
216
+ class:disabled={cellOptions.disabled}
217
+ class:readonly
218
+ class:error={cellOptions.error}
219
+ style:color={cellOptions.color}
220
+ style:background={cellOptions.background}
221
+ style:font-weight={cellOptions.fontWeight}
222
+ on:mousedown={editorState.toggle}
223
+ on:focusin={cellState.focus}
224
+ on:keydown|self={handleKeyboard}
225
+ on:focusout={cellState.focusout}
226
+ >
227
+ {#if cellOptions?.icon}
228
+ <i class={cellOptions.icon + " field-icon"}></i>
229
+ {/if}
230
+
231
+ <div class="value" class:placeholder={localValue?.length < 1}>
232
+ {#if localValue?.length < 1}
233
+ <span> {placeholder} </span>
234
+ {:else if pills}
235
+ <div
236
+ class="items"
237
+ class:pills
238
+ class:withCount={localValue.length > 5}
239
+ class:inEdit
240
+ >
241
+ {#each localValue as val, idx}
242
+ {#if idx < 5}
243
+ <div class="item">
244
+ <span>{val.primaryDisplay}</span>
245
+ </div>
246
+ {/if}
247
+ {/each}
248
+ {#if localValue.length > 5}
249
+ <span class="count">
250
+ (+ {localValue.length - 5})
251
+ </span>
252
+ {/if}
253
+ </div>
254
+ {:else}
255
+ <span>
256
+ {#if cellOptions.role == "formInput" && localValue.length > 1}
257
+ ({localValue.length})
258
+ {/if}
259
+ {localValue.map((v) => v.primaryDisplay).join(", ")}
260
+ </span>
261
+ {/if}
262
+ </div>
263
+ {#if !readonly && (cellOptions.role == "formInput" || inEdit)}
264
+ <i class="ph ph-caret-down control-icon"></i>
265
+ {/if}
266
+ </div>
267
+
268
+ {#if inEdit}
269
+ <SuperPopover
270
+ {anchor}
271
+ useAnchorWidth
272
+ bind:popup
273
+ open={$editorState == "Open"}
274
+ >
275
+ {#if fieldSchema.recursiveTable}
276
+ <CellLinkPickerTree
277
+ {fieldSchema}
278
+ filter={filter ?? []}
279
+ {search}
280
+ {limit}
281
+ joinColumn={cellOptions.joinColumn}
282
+ value={localValue}
283
+ {ownId}
284
+ {multi}
285
+ on:change={handleChange}
286
+ />
287
+ {:else}
288
+ <CellSQLLinkPicker
289
+ {fieldSchema}
290
+ {filter}
291
+ {multi}
292
+ value={localValue}
293
+ bind:api={pickerApi}
294
+ on:change={handleChange}
295
+ on:close={() => {
296
+ cellState.focusout(null);
297
+ }}
298
+ />
299
+ {/if}
300
+ </SuperPopover>
301
+ {/if}