@lavalogic/scoria 0.40.27 → 0.40.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Components/AccordionGroup.svelte +1 -1
- package/dist/Components/AlertModal.svelte +3 -2
- package/dist/Components/Base/BaseModal.svelte +55 -41
- package/dist/Components/Base/Pagination.svelte +20 -12
- package/dist/Components/Base/PaginationProps.d.ts +5 -0
- package/dist/Components/Base/Snippets.svelte +4 -3
- package/dist/Components/Button.svelte +9 -8
- package/dist/Components/Checkbox.svelte +2 -2
- package/dist/Components/ChipsInput.svelte +6 -6
- package/dist/Components/CollapsibleCard.svelte +3 -3
- package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +7 -6
- package/dist/Components/Contexts/ContextMenu.svelte +3 -2
- package/dist/Components/Contexts/Toast.svelte +4 -3
- package/dist/Components/Contexts/ToastContainer.svelte +6 -5
- package/dist/Components/Contexts/Tooltip.svelte +2 -2
- package/dist/Components/DataMatrixIcon.svelte +4 -3
- package/dist/Components/DateInput.svelte +25 -26
- package/dist/Components/DesktopModal.svelte +1 -1
- package/dist/Components/DimensionInput.svelte +30 -31
- package/dist/Components/DragMenu/DragMenuHolder.svelte +6 -6
- package/dist/Components/DragMenu/DraggableCard.svelte +3 -3
- package/dist/Components/FileCard.svelte +3 -2
- package/dist/Components/FileUpload.svelte +24 -25
- package/dist/Components/GridInput.svelte +2 -2
- package/dist/Components/HorizontalTabGroup.svelte +1 -1
- package/dist/Components/Icon.svelte +8 -2
- package/dist/Components/IconProps.d.ts +7 -0
- package/dist/Components/Icons.js +365 -365
- package/dist/Components/LoadingAnimation.svelte +50 -30
- package/dist/Components/LoadingAnimation.svelte.d.ts +1 -1
- package/dist/Components/LoadingModal.svelte +3 -2
- package/dist/Components/Modal.svelte +9 -9
- package/dist/Components/MultiSelect.svelte +37 -18
- package/dist/Components/MultiSelectCommonProps.d.ts +15 -1
- package/dist/Components/Nav/Nav.svelte +13 -13
- package/dist/Components/Nav/ServiceMenuItem.svelte +2 -0
- package/dist/Components/Nav/ServicesNav.svelte +6 -6
- package/dist/Components/NumberInput.svelte +25 -26
- package/dist/Components/PasswordInput.svelte +25 -24
- package/dist/Components/PopoverButton.svelte +8 -8
- package/dist/Components/QuerySelect.svelte +33 -16
- package/dist/Components/QuerySelectProps.d.ts +10 -1
- package/dist/Components/ResourceCalendar/ResourceCalendar.svelte +23 -22
- package/dist/Components/SidebarPanel.svelte +1 -1
- package/dist/Components/SingleSelect.svelte +30 -15
- package/dist/Components/SingleSelectCommonProps.d.ts +10 -1
- package/dist/Components/StepForm.svelte +6 -5
- package/dist/Components/Switch.svelte +5 -5
- package/dist/Components/Table/Body/QuickSearchCell.svelte +363 -351
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +5 -6
- package/dist/Components/Table/Body/Rows/ColumnList.svelte +3 -2
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +7 -6
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +6 -7
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +8 -7
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +11 -9
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +7 -8
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +5 -5
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +3 -2
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +3 -3
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +5 -4
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +9 -6
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +4 -4
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +4 -4
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +3 -3
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +9 -7
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +7 -6
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +6 -7
- package/dist/Components/Table/Body/Rows/TableRow.svelte +6 -5
- package/dist/Components/Table/Body/TableBody.svelte +2 -2
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte +3 -2
- package/dist/Components/Table/Headers/SelectAllHeader.svelte +4 -3
- package/dist/Components/Table/Headers/TableHead.svelte +6 -5
- package/dist/Components/Table/Misc/ColumnPanel.svelte +5 -4
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +5 -4
- package/dist/Components/Table/Misc/FilterInput.svelte +23 -14
- package/dist/Components/Table/Misc/FilterPanel.svelte +12 -11
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +3 -2
- package/dist/Components/Table/Misc/ShareViewModal.svelte +25 -15
- package/dist/Components/Table/Misc/SidePanel.svelte +2 -2
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte +50 -40
- package/dist/Components/Table/Misc/TableFooter.svelte +18 -12
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +8 -7
- package/dist/Components/Table/Misc/TableSidebar.svelte +8 -7
- package/dist/Components/Table/Misc/TableViewDropdown.svelte +6 -2
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +8 -7
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +9 -8
- package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +23 -14
- package/dist/Components/Table/Misc/numberDateFilterTypes.d.ts +7 -4
- package/dist/Components/Table/Misc/numberDateFilterTypes.js +27 -15
- package/dist/Components/Table/Misc/stringFilterTypes.d.ts +7 -3
- package/dist/Components/Table/Misc/stringFilterTypes.js +26 -16
- package/dist/Components/Table/NestedTable.svelte +4 -0
- package/dist/Components/Table/Table.svelte +19 -18
- package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +2 -1
- package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js +2 -1
- package/dist/Components/Table/Types/Context/ClipboardState.svelte.js +3 -2
- package/dist/Components/Table/Types/Context/ViewState.svelte.js +5 -2
- package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +6 -0
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +8 -0
- package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.js +14 -0
- package/dist/Components/Table/Types/Public/CreateTableOptions.d.ts +3 -0
- package/dist/Components/Table/createTable.svelte.js +3 -0
- package/dist/Components/TextArea.svelte +24 -23
- package/dist/Components/TextInput.svelte +25 -26
- package/dist/Components/ThreeStateRadio.svelte +21 -16
- package/dist/Components/Touch/BoolCard.svelte +2 -2
- package/dist/Components/Touch/DateModal.svelte +5 -4
- package/dist/Components/Touch/EditCard.svelte +7 -7
- package/dist/Components/Touch/NumberKeyboard.svelte +3 -2
- package/dist/Components/Touch/NumberModal.svelte +4 -3
- package/dist/Components/Touch/PlusMinusCard.svelte +6 -5
- package/dist/Components/Touch/SelectModal.svelte +5 -4
- package/dist/Components/Touch/SummaryCard.svelte +9 -9
- package/dist/Components/Touch/TextAreaModal.svelte +4 -3
- package/dist/Components/Touch/TextModal.svelte +4 -3
- package/dist/Components/Touch/TouchCard.svelte +4 -3
- package/dist/Components/Touch/TouchModal.svelte +9 -8
- package/dist/Components/VerticalTabGroup.svelte +5 -4
- package/dist/Contexts/AlertContext.svelte.d.ts +8 -5
- package/dist/Contexts/AlertContext.svelte.js +10 -9
- package/dist/Helpers/Helpers.svelte.d.ts +23 -2
- package/dist/Helpers/Helpers.svelte.js +37 -9
- package/dist/Strings/locale.d.ts +19 -0
- package/dist/Strings/locale.js +27 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/scss/_mixins.scss +3406 -3392
- package/package.json +14 -7
|
@@ -11,6 +11,7 @@ import InfoAlert from "../../InfoAlert.svelte";
|
|
|
11
11
|
import TextInput from "../../TextInput.svelte";
|
|
12
12
|
import VerticalTabGroup from "../../VerticalTabGroup.svelte";
|
|
13
13
|
import { cssLength } from "../../../Helpers/Helpers.svelte.js";
|
|
14
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
14
15
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
15
16
|
import { Variant } from "../../../Types/Internal/Variant.js";
|
|
16
17
|
import { getContext, onMount } from "svelte";
|
|
@@ -61,7 +62,7 @@ function saveLiveStateInto(view) {
|
|
|
61
62
|
void guard(async () => {
|
|
62
63
|
await tableContext.saveLiveStateIntoView(view);
|
|
63
64
|
await tableContext.refreshSavedViews();
|
|
64
|
-
},
|
|
65
|
+
}, i18n["scoria.message.save_into_failed"]({ name: view.name }));
|
|
65
66
|
}
|
|
66
67
|
// Whether remote saved views are available at all. A table created
|
|
67
68
|
// without `datatableUuid` / `remoteLayouts` opts out of remote views;
|
|
@@ -79,10 +80,17 @@ const currentUserId = $derived(tableContext.getUserId());
|
|
|
79
80
|
const sectionViews = $derived(tableContext._viewState.savedViews(section));
|
|
80
81
|
const myViews = $derived(sectionViews.filter((view) => currentUserId === undefined || view.ownerUserId === currentUserId));
|
|
81
82
|
const sharedViews = $derived(sectionViews.filter((view) => currentUserId !== undefined && view.ownerUserId !== currentUserId));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Picks the layout or filter member of a paired message.
|
|
85
|
+
*
|
|
86
|
+
* Every phrase naming the section ships as two complete sentences rather than
|
|
87
|
+
* one with the noun injected: articles and adjectives agree with the noun in
|
|
88
|
+
* most European languages, and `.toLowerCase()` on a noun is wrong in German
|
|
89
|
+
* and meaningless in scripts without case.
|
|
90
|
+
*/
|
|
91
|
+
function pair(layout, filter) {
|
|
92
|
+
return section === "filter" ? filter() : layout();
|
|
93
|
+
}
|
|
86
94
|
/**
|
|
87
95
|
* Run an adapter-backed action, clearing any prior error first and
|
|
88
96
|
* routing a rejection to the inline error banner. Keeps every async
|
|
@@ -112,7 +120,7 @@ onMount(() => {
|
|
|
112
120
|
return;
|
|
113
121
|
}
|
|
114
122
|
loadingViews = true;
|
|
115
|
-
void guard(() => tableContext.refreshSavedViews(), "
|
|
123
|
+
void guard(() => tableContext.refreshSavedViews(), i18n["scoria.message.views_load_failed"]()).finally(() => {
|
|
116
124
|
loadingViews = false;
|
|
117
125
|
});
|
|
118
126
|
});
|
|
@@ -130,7 +138,7 @@ function deleteView(view) {
|
|
|
130
138
|
void guard(async () => {
|
|
131
139
|
await adapter.deleteView(view.id);
|
|
132
140
|
await tableContext.refreshSavedViews();
|
|
133
|
-
},
|
|
141
|
+
}, i18n["scoria.message.delete_failed"]({ name: view.name }));
|
|
134
142
|
}
|
|
135
143
|
/**
|
|
136
144
|
* Save the live state of the active section as a brand-new view.
|
|
@@ -149,7 +157,7 @@ function saveNewView() {
|
|
|
149
157
|
await tableContext.saveCurrentAsNewView(trimmed, section);
|
|
150
158
|
newViewName = "";
|
|
151
159
|
selectTab("mine");
|
|
152
|
-
},
|
|
160
|
+
}, pair(i18n["scoria.message.save_layout_failed"], i18n["scoria.message.save_filter_failed"]));
|
|
153
161
|
}
|
|
154
162
|
/** Remove the current user as a subscriber of a shared view. */
|
|
155
163
|
function unsubscribe(view) {
|
|
@@ -160,7 +168,7 @@ function unsubscribe(view) {
|
|
|
160
168
|
void guard(async () => {
|
|
161
169
|
await adapter.removeSubscriber(view.id, currentUserId);
|
|
162
170
|
await tableContext.refreshSavedViews();
|
|
163
|
-
},
|
|
171
|
+
}, i18n["scoria.message.unsubscribe_failed"]({ name: view.name }));
|
|
164
172
|
}
|
|
165
173
|
/** Remove a named subscriber from a view the current user owns. */
|
|
166
174
|
function removeSubscriber(view, userId) {
|
|
@@ -171,7 +179,7 @@ function removeSubscriber(view, userId) {
|
|
|
171
179
|
void guard(async () => {
|
|
172
180
|
await adapter.removeSubscriber(view.id, userId);
|
|
173
181
|
await tableContext.refreshSavedViews();
|
|
174
|
-
}, "
|
|
182
|
+
}, i18n["scoria.message.remove_subscriber_failed"]());
|
|
175
183
|
}
|
|
176
184
|
/** Fetch the public views the user could subscribe to. */
|
|
177
185
|
function loadPublicViews() {
|
|
@@ -184,7 +192,7 @@ function loadPublicViews() {
|
|
|
184
192
|
void guard(async () => {
|
|
185
193
|
const all = await adapter.listPublicViews(datatableUuid);
|
|
186
194
|
publicViews = all.filter((view) => view.kind === section);
|
|
187
|
-
}, "
|
|
195
|
+
}, i18n["scoria.message.load_public_views_failed"]()).finally(() => {
|
|
188
196
|
loadingPublicViews = false;
|
|
189
197
|
});
|
|
190
198
|
}
|
|
@@ -198,7 +206,7 @@ function subscribe(view) {
|
|
|
198
206
|
await adapter.addSubscriber(view.id, currentUserId);
|
|
199
207
|
await tableContext.refreshSavedViews();
|
|
200
208
|
loadPublicViews();
|
|
201
|
-
},
|
|
209
|
+
}, i18n["scoria.message.subscribe_failed"]({ name: view.name }));
|
|
202
210
|
}
|
|
203
211
|
/** Switch the active left-nav section, resetting the tab + scratch UI. */
|
|
204
212
|
function selectSection(next) {
|
|
@@ -229,7 +237,7 @@ function selectTab(next) {
|
|
|
229
237
|
* flips so the labels track "My Layouts" / "My Filters" etc. */
|
|
230
238
|
const innerTabs = $derived([
|
|
231
239
|
{
|
|
232
|
-
label:
|
|
240
|
+
label: pair(i18n["scoria.label.my_layouts"], i18n["scoria.label.my_filters"]),
|
|
233
241
|
content: tabBody,
|
|
234
242
|
args: { tab: "mine" },
|
|
235
243
|
onclick: () => {
|
|
@@ -237,7 +245,11 @@ const innerTabs = $derived([
|
|
|
237
245
|
}
|
|
238
246
|
},
|
|
239
247
|
{
|
|
240
|
-
|
|
248
|
+
// DESIGN-REVIEW: the mockups were internally inconsistent
|
|
249
|
+
// ("Subscribed to Filters" on one, "Shared Filters" on
|
|
250
|
+
// another). Resolved to "Shared" consistently for both the
|
|
251
|
+
// layout and filter sections.
|
|
252
|
+
label: pair(i18n["scoria.label.shared_layouts"], i18n["scoria.label.shared_filters"]),
|
|
241
253
|
content: tabBody,
|
|
242
254
|
args: { tab: "shared" },
|
|
243
255
|
onclick: () => {
|
|
@@ -245,7 +257,7 @@ const innerTabs = $derived([
|
|
|
245
257
|
}
|
|
246
258
|
},
|
|
247
259
|
{
|
|
248
|
-
label:
|
|
260
|
+
label: pair(i18n["scoria.label.save_new_layout"], i18n["scoria.label.save_new_filter"]),
|
|
249
261
|
content: tabBody,
|
|
250
262
|
args: { tab: "save" },
|
|
251
263
|
onclick: () => {
|
|
@@ -257,14 +269,14 @@ const selectedInnerTab = $derived(innerTabs.find((t) => t.args.tab === tab) ?? i
|
|
|
257
269
|
/** The two left-nav sections. Each renders the inner `VerticalTabGroup`
|
|
258
270
|
* via the shared `sectionPane` snippet. */
|
|
259
271
|
const sectionTabs = [{
|
|
260
|
-
label: "
|
|
272
|
+
label: i18n["scoria.label.layouts_section"](),
|
|
261
273
|
content: sectionPane,
|
|
262
274
|
args: { kind: "layout" },
|
|
263
275
|
onclick: () => {
|
|
264
276
|
selectSection("layout");
|
|
265
277
|
}
|
|
266
278
|
}, {
|
|
267
|
-
label: "
|
|
279
|
+
label: i18n["scoria.label.filters_section"](),
|
|
268
280
|
content: sectionPane,
|
|
269
281
|
args: { kind: "filter" },
|
|
270
282
|
onclick: () => {
|
|
@@ -303,11 +315,10 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
303
315
|
|
|
304
316
|
{#if args.tab === 'mine'}
|
|
305
317
|
{#if loadingViews}
|
|
306
|
-
<InfoAlert>
|
|
318
|
+
<InfoAlert>{pair(i18n['scoria.message.loading_layouts'], i18n['scoria.message.loading_filters'])}</InfoAlert>
|
|
307
319
|
{:else if myViews.length === 0}
|
|
308
320
|
<InfoAlert>
|
|
309
|
-
|
|
310
|
-
tab to create one.
|
|
321
|
+
{pair(i18n['scoria.text.no_layouts_saved'], i18n['scoria.text.no_filters_saved'])}
|
|
311
322
|
</InfoAlert>
|
|
312
323
|
{:else}
|
|
313
324
|
<ul class="card-list">
|
|
@@ -322,7 +333,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
322
333
|
nowrap
|
|
323
334
|
onclick={() => {
|
|
324
335
|
applyView(view);
|
|
325
|
-
}}>
|
|
336
|
+
}}>{i18n['scoria.action.apply']()}</Button
|
|
326
337
|
>
|
|
327
338
|
<!--
|
|
328
339
|
"Save Layout" / "Save Filter" overwrites THIS saved
|
|
@@ -339,7 +350,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
339
350
|
iconLeft={{ name: 'circle-tick', size: Size.Small }}
|
|
340
351
|
onclick={() => {
|
|
341
352
|
saveLiveStateInto(view);
|
|
342
|
-
}}>
|
|
353
|
+
}}>{pair(i18n['scoria.action.save_layout'], i18n['scoria.action.save_filter'])}</Button
|
|
343
354
|
>
|
|
344
355
|
<!--
|
|
345
356
|
"Update Options" opens a dedicated modal that edits
|
|
@@ -355,7 +366,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
355
366
|
iconLeft={{ name: 'edit', size: Size.Small }}
|
|
356
367
|
onclick={() => {
|
|
357
368
|
updatingOptionsView = view;
|
|
358
|
-
}}>
|
|
369
|
+
}}>{i18n['scoria.action.update_options']()}</Button
|
|
359
370
|
>
|
|
360
371
|
<Button
|
|
361
372
|
variant={Variant.Secondary}
|
|
@@ -369,7 +380,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
369
380
|
// to Additional" (which is the current user
|
|
370
381
|
// joining a public view).
|
|
371
382
|
sharingView = view;
|
|
372
|
-
}}>
|
|
383
|
+
}}>{i18n['scoria.action.share']()}</Button
|
|
373
384
|
>
|
|
374
385
|
<Button
|
|
375
386
|
variant={Variant.Secondary}
|
|
@@ -378,7 +389,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
378
389
|
iconLeft={{ name: 'circle-cross', size: Size.Small }}
|
|
379
390
|
onclick={() => {
|
|
380
391
|
deleteView(view);
|
|
381
|
-
}}>
|
|
392
|
+
}}>{i18n['scoria.action.delete']()}</Button
|
|
382
393
|
>
|
|
383
394
|
</div>
|
|
384
395
|
</div>
|
|
@@ -397,7 +408,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
397
408
|
nowrap
|
|
398
409
|
onclick={() => {
|
|
399
410
|
removeSubscriber(view, subscriber.userId);
|
|
400
|
-
}}>
|
|
411
|
+
}}>{i18n['scoria.action.remove']()}</Button
|
|
401
412
|
>
|
|
402
413
|
</li>
|
|
403
414
|
{/each}
|
|
@@ -415,14 +426,14 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
415
426
|
nowrap
|
|
416
427
|
disabled={loadingPublicViews}
|
|
417
428
|
iconLeft={{ name: 'circle-plus', size: Size.Small }}
|
|
418
|
-
onclick={loadPublicViews}>
|
|
429
|
+
onclick={loadPublicViews}>{i18n['scoria.action.subscribe_additional']()}</Button
|
|
419
430
|
>
|
|
420
431
|
</div>
|
|
421
432
|
|
|
422
433
|
{#if publicViews !== null}
|
|
423
434
|
{#if publicViews.length === 0}
|
|
424
435
|
<InfoAlert>
|
|
425
|
-
|
|
436
|
+
{pair(i18n['scoria.text.no_further_layouts'], i18n['scoria.text.no_further_filters'])}
|
|
426
437
|
</InfoAlert>
|
|
427
438
|
{:else}
|
|
428
439
|
<ul class="card-list">
|
|
@@ -438,7 +449,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
438
449
|
disabled={currentUserId === undefined}
|
|
439
450
|
onclick={() => {
|
|
440
451
|
subscribe(view);
|
|
441
|
-
}}>
|
|
452
|
+
}}>{i18n['scoria.action.subscribe']()}</Button
|
|
442
453
|
>
|
|
443
454
|
</div>
|
|
444
455
|
</div>
|
|
@@ -450,7 +461,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
450
461
|
|
|
451
462
|
{#if sharedViews.length === 0}
|
|
452
463
|
<InfoAlert>
|
|
453
|
-
|
|
464
|
+
{pair(i18n['scoria.text.no_layouts_shared'], i18n['scoria.text.no_filters_shared'])}
|
|
454
465
|
</InfoAlert>
|
|
455
466
|
{:else}
|
|
456
467
|
<ul class="card-list">
|
|
@@ -465,7 +476,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
465
476
|
nowrap
|
|
466
477
|
onclick={() => {
|
|
467
478
|
applyView(view);
|
|
468
|
-
}}>
|
|
479
|
+
}}>{i18n['scoria.action.apply']()}</Button
|
|
469
480
|
>
|
|
470
481
|
<Button
|
|
471
482
|
variant={Variant.Secondary}
|
|
@@ -474,7 +485,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
474
485
|
disabled={currentUserId === undefined}
|
|
475
486
|
onclick={() => {
|
|
476
487
|
unsubscribe(view);
|
|
477
|
-
}}>
|
|
488
|
+
}}>{i18n['scoria.action.unsubscribe']()}</Button
|
|
478
489
|
>
|
|
479
490
|
</div>
|
|
480
491
|
</div>
|
|
@@ -485,8 +496,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
485
496
|
{:else}
|
|
486
497
|
<div class="save-tab">
|
|
487
498
|
<InfoAlert>
|
|
488
|
-
|
|
489
|
-
{sectionNoun.toLowerCase()}.
|
|
499
|
+
{pair(i18n['scoria.text.save_layout_intro'], i18n['scoria.text.save_filter_intro'])}
|
|
490
500
|
</InfoAlert>
|
|
491
501
|
<!-- The InfoAlert above spans the full tab body so the
|
|
492
502
|
empty-state visuals are consistent across all three tabs.
|
|
@@ -496,7 +506,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
496
506
|
the whole 50vw modal. -->
|
|
497
507
|
<div class="save-tab-form">
|
|
498
508
|
<TextInput
|
|
499
|
-
placeholder={
|
|
509
|
+
placeholder={pair(i18n['scoria.label.layout_name_placeholder'], i18n['scoria.label.filter_name_placeholder'])}
|
|
500
510
|
bind:value={newViewName}
|
|
501
511
|
onkeydown={(e: KeyboardEvent) => {
|
|
502
512
|
if (e.key === 'Enter') {
|
|
@@ -512,7 +522,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
512
522
|
<div class="save-tab-actions">
|
|
513
523
|
<Button
|
|
514
524
|
disabled={!newViewName.trim()}
|
|
515
|
-
onclick={saveNewView}>
|
|
525
|
+
onclick={saveNewView}>{i18n['scoria.action.save_current']()}</Button
|
|
516
526
|
>
|
|
517
527
|
</div>
|
|
518
528
|
</div>
|
|
@@ -522,12 +532,12 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
522
532
|
{/snippet}
|
|
523
533
|
|
|
524
534
|
<DesktopModal
|
|
525
|
-
headerLabel=
|
|
535
|
+
headerLabel={i18n['scoria.action.table_configuration']()}
|
|
526
536
|
headerSubtitle={tableContext.datatableUuid
|
|
527
|
-
?
|
|
537
|
+
? i18n['scoria.label.table_identifier']({ id: tableContext.datatableUuid })
|
|
528
538
|
: undefined}
|
|
529
539
|
onclose={() => onclose?.()}
|
|
530
|
-
buttons={[{ label: '
|
|
540
|
+
buttons={[{ label: i18n['scoria.action.close'](), callback: () => onclose?.() }]}
|
|
531
541
|
width={cssLength('50vw')}
|
|
532
542
|
minWidth={cssLength('40rem')}
|
|
533
543
|
>
|
|
@@ -537,7 +547,7 @@ const selectedSectionTab = $derived(sectionTabs.find((t) => t.args.kind === sect
|
|
|
537
547
|
name="circle-information"
|
|
538
548
|
size={Size.Large}
|
|
539
549
|
/>
|
|
540
|
-
<p>
|
|
550
|
+
<p>{i18n['scoria.text.views_unavailable']()}</p>
|
|
541
551
|
</div>
|
|
542
552
|
{:else}
|
|
543
553
|
<div class="config">
|
|
@@ -9,7 +9,8 @@ import Icon from "../../Icon.svelte";
|
|
|
9
9
|
import NumberInput from "../../NumberInput.svelte";
|
|
10
10
|
import SingleSelect from "../../SingleSelect.svelte";
|
|
11
11
|
import { AlertContext } from "../../../Contexts/AlertContext.svelte.js";
|
|
12
|
-
import {
|
|
12
|
+
import { devCatch } from "../../../Helpers/Helpers.svelte.js";
|
|
13
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
13
14
|
import { Colour, ColourSet } from "../../../scss/colours.js";
|
|
14
15
|
import { Side } from "../../../Types/Internal/Side.js";
|
|
15
16
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
@@ -159,12 +160,16 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
159
160
|
>
|
|
160
161
|
<div class="block">
|
|
161
162
|
<span
|
|
162
|
-
>
|
|
163
|
+
>{tableContext.dataRepo.filterType === FilterType.Real
|
|
164
|
+
? i18n['scoria.text.actioning_loaded']()
|
|
165
|
+
: i18n['scoria.text.actioning_all']()}</span
|
|
163
166
|
>
|
|
164
167
|
</div>
|
|
165
168
|
|
|
166
169
|
<div class="block">
|
|
167
|
-
<span
|
|
170
|
+
<span
|
|
171
|
+
>{i18n['scoria.text.records_selected']({ count: tableContext.selectedItems.size })}</span
|
|
172
|
+
>
|
|
168
173
|
<Action
|
|
169
174
|
size={Size.FillHeight}
|
|
170
175
|
disabled={hasNoSelectedItems}
|
|
@@ -188,7 +193,7 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
188
193
|
colour: selectedItemIconColour,
|
|
189
194
|
}}
|
|
190
195
|
onclick={() => {
|
|
191
|
-
alertContext.prompt('
|
|
196
|
+
alertContext.prompt(i18n['scoria.prompt.clear_selection'](), {
|
|
192
197
|
onYes: () => {
|
|
193
198
|
tableContext.showSelectedOnly = false;
|
|
194
199
|
tableContext.resetSelectedItems();
|
|
@@ -199,17 +204,18 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
199
204
|
</div>
|
|
200
205
|
|
|
201
206
|
<div class="block">
|
|
202
|
-
<span>{tableContext.paginationRepo?.totalRows ?? 0}
|
|
207
|
+
<span>{i18n['scoria.text.row_count']({ count: tableContext.paginationRepo?.totalRows ?? 0 })}</span>
|
|
203
208
|
</div>
|
|
204
209
|
|
|
205
210
|
{#if tableContext.paginationRepo}
|
|
206
211
|
<!-- forceUpwards={!nested} -->
|
|
207
212
|
<div class="block records-per-page">
|
|
208
|
-
<span>
|
|
213
|
+
<span>{i18n['scoria.label.records_per_page']()}</span>
|
|
209
214
|
<!-- label="Records per Page:" -->
|
|
210
215
|
<SingleSelect
|
|
211
216
|
lazyDropdown
|
|
212
217
|
name="Page Size"
|
|
218
|
+
placeholder={i18n['scoria.label.select_page_size']()}
|
|
213
219
|
borderless
|
|
214
220
|
creatable
|
|
215
221
|
createFilter={(value: string) => {
|
|
@@ -251,7 +257,7 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
251
257
|
name="paper"
|
|
252
258
|
colour={Colour['$ui-blue-6']}
|
|
253
259
|
/>
|
|
254
|
-
<span>{
|
|
260
|
+
<span>{i18n['scoria.text.page_count']({ count: tableContext.lastPage })}</span>
|
|
255
261
|
</div>
|
|
256
262
|
|
|
257
263
|
<div class="block">
|
|
@@ -262,7 +268,7 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
262
268
|
/></label
|
|
263
269
|
>
|
|
264
270
|
|
|
265
|
-
<label for="{tableContext.tableName}-jump-to-page">
|
|
271
|
+
<label for="{tableContext.tableName}-jump-to-page">{i18n['scoria.label.jump_to_page']()}</label>
|
|
266
272
|
|
|
267
273
|
<NumberInput
|
|
268
274
|
id="{tableContext.tableName}-jump-to-page"
|
|
@@ -290,7 +296,7 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
290
296
|
iconLeft={{
|
|
291
297
|
name: 'left-close',
|
|
292
298
|
size: Size.FillHeight,
|
|
293
|
-
}}>
|
|
299
|
+
}}>{i18n['scoria.action.previous_page']()}</Button
|
|
294
300
|
>
|
|
295
301
|
</div>
|
|
296
302
|
|
|
@@ -324,7 +330,7 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
324
330
|
iconRight={{
|
|
325
331
|
name: 'right-close',
|
|
326
332
|
size: Size.FillHeight,
|
|
327
|
-
}}>
|
|
333
|
+
}}>{i18n['scoria.action.next_page']()}</Button
|
|
328
334
|
>
|
|
329
335
|
</div>
|
|
330
336
|
</div>
|
|
@@ -396,10 +402,10 @@ let selectedItemIconColour = $derived(hasNoSelectedItems ? Colour["$ui-blue-4"]
|
|
|
396
402
|
background-color: #ffffff;
|
|
397
403
|
}
|
|
398
404
|
.spread_row > *:first-child {
|
|
399
|
-
border-
|
|
405
|
+
border-end-start-radius: 4px;
|
|
400
406
|
}
|
|
401
407
|
.spread_row > *:last-child {
|
|
402
|
-
border-
|
|
408
|
+
border-end-end-radius: 4px;
|
|
403
409
|
}
|
|
404
410
|
.spread_row .spacer {
|
|
405
411
|
flex-grow: 2;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
generics="T extends object, IdType extends Primitive"
|
|
6
6
|
>import Button from "../../Button.svelte";
|
|
7
7
|
import { devCatch } from "../../../Helpers/Helpers.svelte.js";
|
|
8
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
8
9
|
import { Side } from "../../../Types/Internal/Side.js";
|
|
9
10
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
10
11
|
import { Variant } from "../../../Types/Internal/Variant.js";
|
|
@@ -46,7 +47,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
46
47
|
variant={Variant.Toolbar}
|
|
47
48
|
iconTop={{
|
|
48
49
|
name: 'assessment',
|
|
49
|
-
}}>
|
|
50
|
+
}}>{i18n['scoria.action.quick_filter']()}</Button
|
|
50
51
|
>
|
|
51
52
|
<Button
|
|
52
53
|
side={Side.Bottom}
|
|
@@ -59,7 +60,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
59
60
|
variant={Variant.Toolbar}
|
|
60
61
|
iconTop={{
|
|
61
62
|
name: 'filter-bars',
|
|
62
|
-
}}>
|
|
63
|
+
}}>{i18n['scoria.action.advanced_filter']()}</Button
|
|
63
64
|
>
|
|
64
65
|
<Button
|
|
65
66
|
side={Side.Bottom}
|
|
@@ -71,7 +72,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
71
72
|
toggled={expandedPanel === ExpandedPanel.Column}
|
|
72
73
|
iconTop={{
|
|
73
74
|
name: 'columns',
|
|
74
|
-
}}>
|
|
75
|
+
}}>{i18n['scoria.action.modify_columns']()}</Button
|
|
75
76
|
>
|
|
76
77
|
<Button
|
|
77
78
|
size={Size.Small}
|
|
@@ -83,7 +84,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
83
84
|
variant={Variant.Toolbar}
|
|
84
85
|
iconTop={{
|
|
85
86
|
name: 'category',
|
|
86
|
-
}}>
|
|
87
|
+
}}>{i18n['scoria.action.toolbox']()}</Button
|
|
87
88
|
>
|
|
88
89
|
<Button
|
|
89
90
|
size={Size.Small}
|
|
@@ -96,7 +97,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
96
97
|
variant={Variant.Toolbar}
|
|
97
98
|
iconTop={{
|
|
98
99
|
name: 'setting-cog',
|
|
99
|
-
}}>
|
|
100
|
+
}}>{i18n['scoria.action.table_configuration']()}</Button
|
|
100
101
|
>
|
|
101
102
|
{#if tableContext.dataRepo.addEmptyRow}
|
|
102
103
|
<Button
|
|
@@ -108,7 +109,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
108
109
|
variant={Variant.Toolbar}
|
|
109
110
|
iconTop={{
|
|
110
111
|
name: 'plus',
|
|
111
|
-
}}>
|
|
112
|
+
}}>{i18n['scoria.action.add_row']()}</Button
|
|
112
113
|
>
|
|
113
114
|
{/if}
|
|
114
115
|
|
|
@@ -124,7 +125,7 @@ let ExpandedPanelElement = $derived(expandedPanel ? panels[expandedPanel] : null
|
|
|
124
125
|
variant={Variant.Toolbar}
|
|
125
126
|
iconTop={{
|
|
126
127
|
name: 'refresh',
|
|
127
|
-
}}>
|
|
128
|
+
}}>{i18n['scoria.action.refresh']()}</Button
|
|
128
129
|
>
|
|
129
130
|
{/if}
|
|
130
131
|
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
<script
|
|
4
4
|
lang="ts"
|
|
5
5
|
generics="T extends object, IdType extends Primitive"
|
|
6
|
-
>import
|
|
6
|
+
>import { m as i18n } from "../../../paraglide/messages.js";
|
|
7
|
+
import Button from "../../Button.svelte";
|
|
7
8
|
import { devCatch } from "../../../Helpers/Helpers.svelte.js";
|
|
8
9
|
import { Side } from "../../../Types/Internal/Side.js";
|
|
9
10
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
@@ -105,7 +106,7 @@ function handleEscKey(e) {
|
|
|
105
106
|
name: 'assessment',
|
|
106
107
|
size: Size.Medium,
|
|
107
108
|
}}
|
|
108
|
-
label=
|
|
109
|
+
label={i18n['scoria.action.quick_filter']()}
|
|
109
110
|
/>
|
|
110
111
|
<Button
|
|
111
112
|
side={tableContext.toolbarPosition === ToolbarPosition.Left ? Side.Left : Side.Right}
|
|
@@ -119,7 +120,7 @@ function handleEscKey(e) {
|
|
|
119
120
|
name: 'filter-bars',
|
|
120
121
|
size: Size.Medium,
|
|
121
122
|
}}
|
|
122
|
-
label=
|
|
123
|
+
label={i18n['scoria.action.advanced_filter']()}
|
|
123
124
|
/>
|
|
124
125
|
<Button
|
|
125
126
|
side={tableContext.toolbarPosition === ToolbarPosition.Left ? Side.Left : Side.Right}
|
|
@@ -132,7 +133,7 @@ function handleEscKey(e) {
|
|
|
132
133
|
name: 'columns',
|
|
133
134
|
size: Size.Medium,
|
|
134
135
|
}}
|
|
135
|
-
label=
|
|
136
|
+
label={i18n['scoria.action.modify_columns']()}
|
|
136
137
|
/>
|
|
137
138
|
<Button
|
|
138
139
|
side={tableContext.toolbarPosition === ToolbarPosition.Left ? Side.Left : Side.Right}
|
|
@@ -145,7 +146,7 @@ function handleEscKey(e) {
|
|
|
145
146
|
name: 'category',
|
|
146
147
|
size: Size.Medium,
|
|
147
148
|
}}
|
|
148
|
-
label=
|
|
149
|
+
label={i18n['scoria.action.toolbox']()}
|
|
149
150
|
/>
|
|
150
151
|
<Button
|
|
151
152
|
side={tableContext.toolbarPosition === ToolbarPosition.Left ? Side.Left : Side.Right}
|
|
@@ -159,7 +160,7 @@ function handleEscKey(e) {
|
|
|
159
160
|
name: 'setting-cog',
|
|
160
161
|
size: Size.Medium,
|
|
161
162
|
}}
|
|
162
|
-
label=
|
|
163
|
+
label={i18n['scoria.action.table_configuration']()}
|
|
163
164
|
/>
|
|
164
165
|
|
|
165
166
|
{#if tableContext.paginationRepo?.reload}
|
|
@@ -175,7 +176,7 @@ function handleEscKey(e) {
|
|
|
175
176
|
name: 'refresh',
|
|
176
177
|
size: Size.Medium,
|
|
177
178
|
}}
|
|
178
|
-
label=
|
|
179
|
+
label={i18n['scoria.action.refresh']()}
|
|
179
180
|
/>
|
|
180
181
|
{/if}
|
|
181
182
|
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
lang="ts"
|
|
5
5
|
generics="T extends object, IdType extends Primitive"
|
|
6
6
|
>import SingleSelect from "../../SingleSelect.svelte";
|
|
7
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
7
8
|
import { getContext } from "svelte";
|
|
8
9
|
import { TableContext } from "../Types/Context/TableContext.svelte.js";
|
|
9
10
|
const { kind } = $props();
|
|
@@ -34,7 +35,7 @@ const activeValue = $derived(activeView.kind === "saved" ? activeView.id : DEFAU
|
|
|
34
35
|
// table state is dirty. "Default" is present even when remote saved
|
|
35
36
|
// views are disabled and `savedViews` is empty.
|
|
36
37
|
const options = $derived([{
|
|
37
|
-
label: "
|
|
38
|
+
label: i18n["scoria.label.default_view"](),
|
|
38
39
|
value: DEFAULT_OPTION
|
|
39
40
|
}, ...savedViews.map((view) => ({
|
|
40
41
|
label: view.name,
|
|
@@ -70,8 +71,11 @@ function selectOption(option) {
|
|
|
70
71
|
|
|
71
72
|
<div class="view-dropdown">
|
|
72
73
|
<SingleSelect
|
|
73
|
-
label={kind === 'filter' ? '
|
|
74
|
+
label={kind === 'filter' ? i18n['scoria.label.filter_noun']() : i18n['scoria.label.layout_noun']()}
|
|
74
75
|
name={kind === 'filter' ? 'Filter' : 'Layout'}
|
|
76
|
+
placeholder={kind === 'filter'
|
|
77
|
+
? i18n['scoria.label.select_filter']()
|
|
78
|
+
: i18n['scoria.label.select_layout']()}
|
|
75
79
|
{options}
|
|
76
80
|
labelProp="label"
|
|
77
81
|
valueProp="value"
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
generics="T extends object, IdType extends Primitive"
|
|
6
6
|
>import Checkbox from "../../Checkbox.svelte";
|
|
7
7
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
8
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
8
9
|
import { getContext } from "svelte";
|
|
9
10
|
import { TableContext } from "../Types/Context/TableContext.svelte.js";
|
|
10
11
|
const tableContext = getContext(TableContext.identifier);
|
|
@@ -30,32 +31,32 @@ const onCommaSeparatedCopyChange = (e) => {
|
|
|
30
31
|
|
|
31
32
|
<section class="side-panel-section">
|
|
32
33
|
<header class="side-panel-header">
|
|
33
|
-
<h2>
|
|
34
|
+
<h2>{i18n['scoria.label.settings']()}</h2>
|
|
34
35
|
</header>
|
|
35
36
|
<div class="side-panel-body">
|
|
36
37
|
<Checkbox
|
|
37
|
-
label=
|
|
38
|
+
label={i18n['scoria.label.compact']()}
|
|
38
39
|
size={Size.MediumSmall}
|
|
39
40
|
id={`is-compact-${tableContext.tableName}`}
|
|
40
41
|
value={tableContext.isCompact}
|
|
41
42
|
onchange={onCompactChange}
|
|
42
43
|
/>
|
|
43
44
|
<Checkbox
|
|
44
|
-
label=
|
|
45
|
+
label={i18n['scoria.label.single_click_editing']()}
|
|
45
46
|
size={Size.MediumSmall}
|
|
46
47
|
id={`single-click-editing-${tableContext.tableName}`}
|
|
47
48
|
value={tableContext.singleClickEditing}
|
|
48
49
|
onchange={onSingleClickChange}
|
|
49
50
|
/>
|
|
50
51
|
<Checkbox
|
|
51
|
-
label=
|
|
52
|
+
label={i18n['scoria.label.alternate_row_colours']()}
|
|
52
53
|
size={Size.MediumSmall}
|
|
53
54
|
id={`alternate-row-colours-${tableContext.tableName}`}
|
|
54
55
|
value={tableContext.alternateRowColours}
|
|
55
56
|
onchange={onAlternateRowColoursChange}
|
|
56
57
|
/>
|
|
57
58
|
<Checkbox
|
|
58
|
-
label=
|
|
59
|
+
label={i18n['scoria.label.change_colour_hover']()}
|
|
59
60
|
size={Size.MediumSmall}
|
|
60
61
|
id={`change-colour-on-hover-${tableContext.tableName}`}
|
|
61
62
|
value={tableContext.changeColourOnHover}
|
|
@@ -63,14 +64,14 @@ const onCommaSeparatedCopyChange = (e) => {
|
|
|
63
64
|
/>
|
|
64
65
|
{#if tableContext.allowCopy}
|
|
65
66
|
<Checkbox
|
|
66
|
-
label=
|
|
67
|
+
label={i18n['scoria.label.include_headers_copying']()}
|
|
67
68
|
size={Size.MediumSmall}
|
|
68
69
|
id={`copy-with-headers-${tableContext.tableName}`}
|
|
69
70
|
value={tableContext.copyWithHeaders}
|
|
70
71
|
onchange={onCopyWithHeadersChange}
|
|
71
72
|
/>
|
|
72
73
|
<Checkbox
|
|
73
|
-
label=
|
|
74
|
+
label={i18n['scoria.label.copy_as_csv']()}
|
|
74
75
|
size={Size.MediumSmall}
|
|
75
76
|
id={`comma-separated-copy-${tableContext.tableName}`}
|
|
76
77
|
value={tableContext.commaSeparatedCopy}
|