@lavalogic/scoria 0.40.28 → 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/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
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
>import Checkbox from "../../Checkbox.svelte";
|
|
7
7
|
import DesktopModal from "../../DesktopModal.svelte";
|
|
8
8
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
9
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
9
10
|
import { getContext } from "svelte";
|
|
10
11
|
import { TableContext } from "../Types/Context/TableContext.svelte.js";
|
|
11
12
|
let { onclose } = $props();
|
|
@@ -31,35 +32,35 @@ const onCommaSeparatedCopyChange = (e) => {
|
|
|
31
32
|
</script>
|
|
32
33
|
|
|
33
34
|
<DesktopModal
|
|
34
|
-
headerLabel=
|
|
35
|
+
headerLabel={i18n['scoria.label.table_settings']()}
|
|
35
36
|
onclose={() => onclose?.()}
|
|
36
|
-
buttons={[{ label: '
|
|
37
|
+
buttons={[{ label: i18n['scoria.action.close'](), callback: () => onclose?.() }]}
|
|
37
38
|
>
|
|
38
39
|
<div class="flex">
|
|
39
40
|
<div class="column-panel">
|
|
40
41
|
<Checkbox
|
|
41
|
-
label=
|
|
42
|
+
label={i18n['scoria.label.compact']()}
|
|
42
43
|
size={Size.MediumSmall}
|
|
43
44
|
id={`is-compact-${tableContext.tableName}-modal`}
|
|
44
45
|
value={tableContext.isCompact}
|
|
45
46
|
onchange={onCompactChange}
|
|
46
47
|
/>
|
|
47
48
|
<Checkbox
|
|
48
|
-
label=
|
|
49
|
+
label={i18n['scoria.label.single_click_editing']()}
|
|
49
50
|
size={Size.MediumSmall}
|
|
50
51
|
id={`single-click-editing-${tableContext.tableName}-modal`}
|
|
51
52
|
value={tableContext.singleClickEditing}
|
|
52
53
|
onchange={onSingleClickChange}
|
|
53
54
|
/>
|
|
54
55
|
<Checkbox
|
|
55
|
-
label=
|
|
56
|
+
label={i18n['scoria.label.alternate_row_colours']()}
|
|
56
57
|
size={Size.MediumSmall}
|
|
57
58
|
id={`alternate-row-colours-${tableContext.tableName}-modal`}
|
|
58
59
|
value={tableContext.alternateRowColours}
|
|
59
60
|
onchange={onAlternateRowColoursChange}
|
|
60
61
|
/>
|
|
61
62
|
<Checkbox
|
|
62
|
-
label=
|
|
63
|
+
label={i18n['scoria.label.change_colour_hover']()}
|
|
63
64
|
size={Size.MediumSmall}
|
|
64
65
|
id={`change-colour-on-hover-${tableContext.tableName}-modal`}
|
|
65
66
|
value={tableContext.changeColourOnHover}
|
|
@@ -67,14 +68,14 @@ const onCommaSeparatedCopyChange = (e) => {
|
|
|
67
68
|
/>
|
|
68
69
|
{#if tableContext.allowCopy}
|
|
69
70
|
<Checkbox
|
|
70
|
-
label=
|
|
71
|
+
label={i18n['scoria.label.include_headers_copying']()}
|
|
71
72
|
size={Size.MediumSmall}
|
|
72
73
|
id={`copy-with-headers-${tableContext.tableName}-modal`}
|
|
73
74
|
value={tableContext.copyWithHeaders}
|
|
74
75
|
onchange={onCopyWithHeadersChange}
|
|
75
76
|
/>
|
|
76
77
|
<Checkbox
|
|
77
|
-
label=
|
|
78
|
+
label={i18n['scoria.label.copy_as_csv']()}
|
|
78
79
|
size={Size.MediumSmall}
|
|
79
80
|
id={`comma-separated-copy-${tableContext.tableName}-modal`}
|
|
80
81
|
value={tableContext.commaSeparatedCopy}
|
|
@@ -9,6 +9,7 @@ import InfoAlert from "../../InfoAlert.svelte";
|
|
|
9
9
|
import SingleSelect from "../../SingleSelect.svelte";
|
|
10
10
|
import TextInput from "../../TextInput.svelte";
|
|
11
11
|
import { cssLength } from "../../../Helpers/Helpers.svelte.js";
|
|
12
|
+
import { m as i18n } from "../../../paraglide/messages.js";
|
|
12
13
|
import { ColourSet } from "../../../scss/colours.js";
|
|
13
14
|
import { Size } from "../../../Types/Internal/Size.js";
|
|
14
15
|
import { getContext, onMount } from "svelte";
|
|
@@ -32,10 +33,10 @@ let errorMessage = $state(null);
|
|
|
32
33
|
// `true` while the PATCH is in flight, disables the footer buttons.
|
|
33
34
|
let saving = $state(false);
|
|
34
35
|
const visibilityOptions = [{
|
|
35
|
-
label: "
|
|
36
|
+
label: i18n["scoria.label.visibility_private"](),
|
|
36
37
|
value: "private"
|
|
37
38
|
}, {
|
|
38
|
-
label: "
|
|
39
|
+
label: i18n["scoria.label.visibility_public"](),
|
|
39
40
|
value: "public"
|
|
40
41
|
}];
|
|
41
42
|
const selectedVisibility = $derived(visibilityOptions.find((o) => o.value === visibility) ?? visibilityOptions[0]);
|
|
@@ -51,7 +52,7 @@ async function save() {
|
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
54
|
if (!isValidName) {
|
|
54
|
-
errorMessage =
|
|
55
|
+
errorMessage = i18n["scoria.message.name_required"]();
|
|
55
56
|
return;
|
|
56
57
|
}
|
|
57
58
|
errorMessage = null;
|
|
@@ -67,7 +68,10 @@ async function save() {
|
|
|
67
68
|
onclose();
|
|
68
69
|
} catch (e) {
|
|
69
70
|
console.error("[UpdateViewOptionsModal] save failed:", e);
|
|
70
|
-
errorMessage = e instanceof Error ?
|
|
71
|
+
errorMessage = e instanceof Error ? i18n["scoria.message.error_detail"]({
|
|
72
|
+
message: i18n["scoria.message.update_options_failed"](),
|
|
73
|
+
detail: e.message
|
|
74
|
+
}) : i18n["scoria.message.update_options_failed"]();
|
|
71
75
|
} finally {
|
|
72
76
|
saving = false;
|
|
73
77
|
}
|
|
@@ -75,8 +79,10 @@ async function save() {
|
|
|
75
79
|
</script>
|
|
76
80
|
|
|
77
81
|
<DesktopModal
|
|
78
|
-
headerLabel={
|
|
79
|
-
headerSubtitle={
|
|
82
|
+
headerLabel={i18n['scoria.label.update_options_header']({ name: view.name })}
|
|
83
|
+
headerSubtitle={view.kind === 'filter'
|
|
84
|
+
? i18n['scoria.text.update_filter_subtitle']()
|
|
85
|
+
: i18n['scoria.text.update_layout_subtitle']()}
|
|
80
86
|
onclose={() => {
|
|
81
87
|
if (!saving) {
|
|
82
88
|
onclose();
|
|
@@ -86,7 +92,7 @@ async function save() {
|
|
|
86
92
|
minWidth={cssLength('32rem')}
|
|
87
93
|
buttons={[
|
|
88
94
|
{
|
|
89
|
-
label: '
|
|
95
|
+
label: i18n['scoria.action.cancel'](),
|
|
90
96
|
callback: () => {
|
|
91
97
|
if (!saving) {
|
|
92
98
|
onclose();
|
|
@@ -95,7 +101,7 @@ async function save() {
|
|
|
95
101
|
disabled: saving,
|
|
96
102
|
},
|
|
97
103
|
{
|
|
98
|
-
label: saving ? '
|
|
104
|
+
label: saving ? i18n['scoria.action.saving']() : i18n['scoria.action.save'](),
|
|
99
105
|
callback: () => {
|
|
100
106
|
void save();
|
|
101
107
|
},
|
|
@@ -119,20 +125,22 @@ async function save() {
|
|
|
119
125
|
{/if}
|
|
120
126
|
|
|
121
127
|
<InfoAlert>
|
|
122
|
-
|
|
123
|
-
? '
|
|
124
|
-
: '
|
|
128
|
+
{view.kind === 'filter'
|
|
129
|
+
? i18n['scoria.text.changes_apply_filter']()
|
|
130
|
+
: i18n['scoria.text.changes_apply_layout']()}
|
|
125
131
|
</InfoAlert>
|
|
126
132
|
|
|
127
133
|
<div class="field">
|
|
128
134
|
<label
|
|
129
135
|
class="field-label"
|
|
130
|
-
for="update-view-name">
|
|
136
|
+
for="update-view-name">{i18n['scoria.label.name']()}</label
|
|
131
137
|
>
|
|
132
138
|
<TextInput
|
|
133
139
|
id="update-view-name"
|
|
134
140
|
bind:value={name}
|
|
135
|
-
placeholder={
|
|
141
|
+
placeholder={view.kind === 'filter'
|
|
142
|
+
? i18n['scoria.label.filter_name_placeholder']()
|
|
143
|
+
: i18n['scoria.label.layout_name_placeholder']()}
|
|
136
144
|
required
|
|
137
145
|
invalid={!isValidName}
|
|
138
146
|
/>
|
|
@@ -141,11 +149,12 @@ async function save() {
|
|
|
141
149
|
<div class="field">
|
|
142
150
|
<label
|
|
143
151
|
class="field-label"
|
|
144
|
-
for="update-view-visibility">
|
|
152
|
+
for="update-view-visibility">{i18n['scoria.label.visibility']()}</label
|
|
145
153
|
>
|
|
146
154
|
<SingleSelect
|
|
147
155
|
inputId="update-view-visibility"
|
|
148
156
|
name="Visibility"
|
|
157
|
+
placeholder={i18n['scoria.label.select_visibility']()}
|
|
149
158
|
options={visibilityOptions}
|
|
150
159
|
labelProp="label"
|
|
151
160
|
valueProp="value"
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { SelectOption } from '../../../Types/Internal/SelectOption.js';
|
|
2
2
|
import { NumberDateFilterMode } from '../Types/Filtering/NumberDateFilterMode.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* module-level array
|
|
4
|
+
* Filter-mode `SelectOption`s offered for numeric and date columns.
|
|
5
|
+
*
|
|
6
|
+
* A function, not a frozen module-level array: the labels have to resolve while
|
|
7
|
+
* a component renders, or the first request's locale is served to every later
|
|
8
|
+
* one. Callers should hold the result in a `$derived` rather than calling it in
|
|
9
|
+
* markup.
|
|
7
10
|
*/
|
|
8
|
-
export declare
|
|
11
|
+
export declare function numberDateFilterTypes(): Array<SelectOption<NumberDateFilterMode>>;
|
|
@@ -1,18 +1,30 @@
|
|
|
1
|
+
import { m as i18n } from '../../../paraglide/messages.js';
|
|
1
2
|
import { NumberDateFilterMode } from '../Types/Filtering/NumberDateFilterMode.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* module-level array
|
|
4
|
+
* Filter-mode `SelectOption`s offered for numeric and date columns.
|
|
5
|
+
*
|
|
6
|
+
* A function, not a frozen module-level array: the labels have to resolve while
|
|
7
|
+
* a component renders, or the first request's locale is served to every later
|
|
8
|
+
* one. Callers should hold the result in a `$derived` rather than calling it in
|
|
9
|
+
* markup.
|
|
6
10
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
export function numberDateFilterTypes() {
|
|
12
|
+
return [
|
|
13
|
+
{ value: NumberDateFilterMode.Equals, label: i18n['scoria.label.operator_equals']() },
|
|
14
|
+
{ value: NumberDateFilterMode.NotEquals, label: i18n['scoria.label.operator_not_equals']() },
|
|
15
|
+
{ value: NumberDateFilterMode.LessThan, label: i18n['scoria.label.operator_less_than']() },
|
|
16
|
+
{
|
|
17
|
+
value: NumberDateFilterMode.LessThanOrEqual,
|
|
18
|
+
label: i18n['scoria.label.operator_less_equal'](),
|
|
19
|
+
},
|
|
20
|
+
{ value: NumberDateFilterMode.GreaterThan, label: i18n['scoria.label.operator_greater_than']() },
|
|
21
|
+
{
|
|
22
|
+
value: NumberDateFilterMode.GreaterThanOrEqual,
|
|
23
|
+
label: i18n['scoria.label.operator_greater_equal'](),
|
|
24
|
+
},
|
|
25
|
+
{ value: NumberDateFilterMode.Between, label: i18n['scoria.label.operator_between']() },
|
|
26
|
+
{ value: NumberDateFilterMode.In, label: i18n['scoria.label.operator_in']() },
|
|
27
|
+
{ value: NumberDateFilterMode.NotIn, label: i18n['scoria.label.operator_not_in']() },
|
|
28
|
+
{ value: NumberDateFilterMode.null, label: i18n['scoria.label.operator_is_null']() },
|
|
29
|
+
];
|
|
30
|
+
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { SelectOption } from '../../../Types/Internal/SelectOption.js';
|
|
2
2
|
import { StringFilterMode } from '../Types/Filtering/StringFilterMode.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Filter-mode `SelectOption`s offered for string columns.
|
|
5
|
+
*
|
|
6
|
+
* A function, not a frozen module-level array: the labels have to resolve while
|
|
7
|
+
* a component renders, or the first request's locale is served to every later
|
|
8
|
+
* one. Callers should hold the result in a `$derived` rather than calling it in
|
|
9
|
+
* markup.
|
|
6
10
|
*/
|
|
7
|
-
export declare
|
|
11
|
+
export declare function stringFilterTypes(): Array<SelectOption<StringFilterMode>>;
|
|
@@ -1,19 +1,29 @@
|
|
|
1
|
+
import { m as i18n } from '../../../paraglide/messages.js';
|
|
1
2
|
import { StringFilterMode } from '../Types/Filtering/StringFilterMode.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
4
|
+
* Filter-mode `SelectOption`s offered for string columns.
|
|
5
|
+
*
|
|
6
|
+
* A function, not a frozen module-level array: the labels have to resolve while
|
|
7
|
+
* a component renders, or the first request's locale is served to every later
|
|
8
|
+
* one. Callers should hold the result in a `$derived` rather than calling it in
|
|
9
|
+
* markup.
|
|
5
10
|
*/
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
])
|
|
11
|
+
export function stringFilterTypes() {
|
|
12
|
+
return [
|
|
13
|
+
{ value: StringFilterMode.Equals, label: i18n['scoria.label.operator_equals']() },
|
|
14
|
+
{ value: StringFilterMode.NotEquals, label: i18n['scoria.label.operator_not_equals']() },
|
|
15
|
+
{ value: StringFilterMode.Contains, label: i18n['scoria.label.operator_contains']() },
|
|
16
|
+
{ value: StringFilterMode.NotContains, label: i18n['scoria.label.operator_not_contains']() },
|
|
17
|
+
{ value: StringFilterMode.StartsWith, label: i18n['scoria.label.operator_starts_with']() },
|
|
18
|
+
{
|
|
19
|
+
value: StringFilterMode.NotStartsWith,
|
|
20
|
+
label: i18n['scoria.label.operator_not_starts_with'](),
|
|
21
|
+
},
|
|
22
|
+
{ value: StringFilterMode.EndsWith, label: i18n['scoria.label.operator_ends_with']() },
|
|
23
|
+
{ value: StringFilterMode.NotEndsWith, label: i18n['scoria.label.operator_not_ends_with']() },
|
|
24
|
+
{ value: StringFilterMode.In, label: i18n['scoria.label.operator_in']() },
|
|
25
|
+
{ value: StringFilterMode.NotIn, label: i18n['scoria.label.operator_not_in']() },
|
|
26
|
+
{ value: StringFilterMode.Empty, label: i18n['scoria.label.operator_empty']() },
|
|
27
|
+
{ value: StringFilterMode.null, label: i18n['scoria.label.operator_is_null']() },
|
|
28
|
+
];
|
|
29
|
+
}
|
|
@@ -21,6 +21,10 @@ import { ToolbarPosition } from "./Types/Toolbar/ToolbarPosition.js";
|
|
|
21
21
|
const DEFAULT_NESTED_TABLE_OPTIONS = Object.freeze({
|
|
22
22
|
allowCopy: false,
|
|
23
23
|
enableResize: false,
|
|
24
|
+
// Nested-table columns can be reordered and pinned by default like
|
|
25
|
+
// the outer table. Callers opt out per inner table via the
|
|
26
|
+
// `inner.allowReorder` option on `col.expand` (or the matching
|
|
27
|
+
// `allowReorder` on top-level `createTable`).
|
|
24
28
|
allowColumnReordering: true,
|
|
25
29
|
allowQuickFiltering: true,
|
|
26
30
|
allowAdvancedFiltering: true,
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
<script
|
|
4
4
|
lang="ts"
|
|
5
5
|
module
|
|
6
|
-
>import {
|
|
6
|
+
>import { m as i18n } from "../../paraglide/messages.js";
|
|
7
|
+
import { ContextMenuContext } from "../../Contexts/ContextMenuContext.svelte";
|
|
7
8
|
import { cssLength, devCatch, refWrapper } from "../../Helpers/Helpers.svelte";
|
|
8
9
|
import { getContext, onMount, setContext, tick, untrack } from "svelte";
|
|
9
10
|
import LoadingOverlay from "../LoadingOverlay.svelte";
|
|
@@ -157,14 +158,14 @@ function openContextMenu(e) {
|
|
|
157
158
|
callback: () => {
|
|
158
159
|
tableContext.copyDataToClipboard().catch(devCatch);
|
|
159
160
|
},
|
|
160
|
-
text: "
|
|
161
|
+
text: i18n["scoria.action.copy_selection"]()
|
|
161
162
|
}];
|
|
162
163
|
if (tableContext.hasHighlightedItems) {
|
|
163
164
|
options.push({
|
|
164
165
|
callback: () => {
|
|
165
166
|
tableContext.copyHighlightedRowsToClipboard().catch(devCatch);
|
|
166
167
|
},
|
|
167
|
-
text: "
|
|
168
|
+
text: i18n["scoria.action.copy_highlighted_rows"]()
|
|
168
169
|
});
|
|
169
170
|
}
|
|
170
171
|
_openContextMenu(e, options).catch(devCatch);
|
|
@@ -294,13 +295,13 @@ const colsTemplate = $derived.by(() => {
|
|
|
294
295
|
}
|
|
295
296
|
return tracks.join(" ");
|
|
296
297
|
});
|
|
297
|
-
// Total rendered width of the pinned-
|
|
298
|
+
// Total rendered width of the pinned-start and pinned-end column
|
|
298
299
|
// stacks. Driven by `_columnRenderedWidths` so the values track actual
|
|
299
300
|
// layout rather than the declared `columnDef.width`. Exposed to CSS
|
|
300
|
-
// as `--pinned-
|
|
301
|
-
// `scroll-padding-{
|
|
302
|
-
// nav and focus restore) keeps the focused cell out from behind the
|
|
303
|
-
// pinned columns. The 20px highlight column is always pinned-
|
|
301
|
+
// as `--pinned-start` / `--pinned-end`; the SCSS uses these in
|
|
302
|
+
// `scroll-padding-{inline-start,inline-end}` so `scrollIntoView` (called on
|
|
303
|
+
// keyboard nav and focus restore) keeps the focused cell out from behind the
|
|
304
|
+
// pinned columns. The 20px highlight column is always pinned-start.
|
|
304
305
|
const totalPinnedLeftWidth = $derived.by(() => {
|
|
305
306
|
void tableContext._columnRenderedWidths.size;
|
|
306
307
|
let total = 20;
|
|
@@ -520,7 +521,7 @@ $effect(() => {
|
|
|
520
521
|
class:compact={tableContext.isCompact}
|
|
521
522
|
class:quick-filtering={tableContext.showQuickFiltering}
|
|
522
523
|
onkeydown={tableContext.handleTdKeydown}
|
|
523
|
-
style="--pinned-
|
|
524
|
+
style="--pinned-start: {totalPinnedLeftWidth}px; --pinned-end: {totalPinnedRightWidth}px; --sticky-top-height: {stickyTopHeight}px;"
|
|
524
525
|
>
|
|
525
526
|
<div
|
|
526
527
|
class="flex_table"
|
|
@@ -582,26 +583,26 @@ div.grid .sidebar-wrapper-left {
|
|
|
582
583
|
grid-area: sidebar-left;
|
|
583
584
|
}
|
|
584
585
|
div.grid .sidebar-wrapper-left:not(:empty) {
|
|
585
|
-
margin-
|
|
586
|
+
margin-inline-end: 1rem;
|
|
586
587
|
}
|
|
587
588
|
div.grid .sidebar-wrapper-right {
|
|
588
589
|
grid-area: sidebar-right;
|
|
589
590
|
}
|
|
590
591
|
div.grid .sidebar-wrapper-right:not(:empty) {
|
|
591
|
-
margin-
|
|
592
|
+
margin-inline-start: 1rem;
|
|
592
593
|
}
|
|
593
594
|
div.grid .footer {
|
|
594
595
|
grid-area: footer;
|
|
595
596
|
border: solid 2px #cbd4da;
|
|
596
597
|
border-top: none;
|
|
597
|
-
border-
|
|
598
|
-
border-
|
|
598
|
+
border-end-start-radius: 4px;
|
|
599
|
+
border-end-end-radius: 4px;
|
|
599
600
|
}
|
|
600
601
|
div.grid .datatable {
|
|
601
602
|
border: solid 2px #cbd4da;
|
|
602
603
|
border-bottom: none;
|
|
603
|
-
border-
|
|
604
|
-
border-
|
|
604
|
+
border-start-start-radius: 4px;
|
|
605
|
+
border-start-end-radius: 4px;
|
|
605
606
|
}
|
|
606
607
|
|
|
607
608
|
div.resizer {
|
|
@@ -681,8 +682,8 @@ div.sidebar-wrapper .sidebar.toolbar-right {
|
|
|
681
682
|
flex-grow: 1;
|
|
682
683
|
--progress-bar-radius: 18px;
|
|
683
684
|
scroll-padding-top: var(--sticky-top-height, 0px);
|
|
684
|
-
scroll-padding-
|
|
685
|
-
scroll-padding-
|
|
685
|
+
scroll-padding-inline-start: var(--pinned-start, 0px);
|
|
686
|
+
scroll-padding-inline-end: var(--pinned-end, 0px);
|
|
686
687
|
}
|
|
687
688
|
.datatable.quick-filtering {
|
|
688
689
|
--quick-filter-height: 3rem;
|
|
@@ -705,7 +706,7 @@ div.sidebar-wrapper .sidebar.toolbar-right {
|
|
|
705
706
|
flex-flow: column nowrap;
|
|
706
707
|
flex-grow: 2;
|
|
707
708
|
width: 100%;
|
|
708
|
-
text-align:
|
|
709
|
+
text-align: start;
|
|
709
710
|
min-width: max-content;
|
|
710
711
|
isolation: isolate;
|
|
711
712
|
}</style>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { m as i18n } from '../../../../../../paraglide/messages.js';
|
|
1
2
|
import { generateUUID, syntheticColumnId } from '../../../../../../Helpers/Helpers.svelte.js';
|
|
2
3
|
import { ColumnType } from '../../ColumnType.js';
|
|
3
4
|
import { ColumnDef } from '../ColumnDef.svelte.js';
|
|
@@ -15,7 +16,7 @@ export class ActionsDef extends ColumnDef {
|
|
|
15
16
|
constructor(props) {
|
|
16
17
|
super({
|
|
17
18
|
id: props.id ?? syntheticColumnId(`actions-${generateUUID()}`),
|
|
18
|
-
header: props.header ?? '
|
|
19
|
+
header: props.header ?? i18n['scoria.label.actions'](),
|
|
19
20
|
allowSorting: false,
|
|
20
21
|
allowFiltering: false,
|
|
21
22
|
});
|
package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { m as i18n } from '../../../../../../paraglide/messages.js';
|
|
1
2
|
import { generateUUID, syntheticColumnId } from '../../../../../../Helpers/Helpers.svelte.js';
|
|
2
3
|
import { ColumnType } from '../../ColumnType.js';
|
|
3
4
|
import { ColumnDef } from '../ColumnDef.svelte.js';
|
|
@@ -30,7 +31,7 @@ export class RowSelectionDef extends ColumnDef {
|
|
|
30
31
|
: propsOrIsSelectable;
|
|
31
32
|
super({
|
|
32
33
|
id: props.id ?? syntheticColumnId(`is-selectable-${generateUUID()}`),
|
|
33
|
-
header: '
|
|
34
|
+
header: i18n['scoria.label.row_selected'](),
|
|
34
35
|
allowSorting: false,
|
|
35
36
|
allowFiltering: false,
|
|
36
37
|
isValid: props.isValid,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { m as i18n } from '../../../../paraglide/messages.js';
|
|
1
2
|
import { dev } from '$app/environment';
|
|
2
3
|
import { devCatch } from '../../../../Helpers/Helpers.svelte.js';
|
|
3
4
|
import { encapsulate, escapeForSpreadsheet } from '../../clipboardEscape.js';
|
|
@@ -77,7 +78,7 @@ export class ClipboardState {
|
|
|
77
78
|
// rule below is a false-positive in that environment.
|
|
78
79
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
79
80
|
if (!navigator.clipboard) {
|
|
80
|
-
alert('
|
|
81
|
+
alert(i18n['scoria.message.cannot_copy_insecure']());
|
|
81
82
|
return;
|
|
82
83
|
}
|
|
83
84
|
return this._performRowCopy(await this.getHighlightedRowData());
|
|
@@ -86,7 +87,7 @@ export class ClipboardState {
|
|
|
86
87
|
copyDataToClipboard = async () => {
|
|
87
88
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
88
89
|
if (!navigator.clipboard) {
|
|
89
|
-
alert('
|
|
90
|
+
alert(i18n['scoria.message.cannot_copy_insecure']());
|
|
90
91
|
return;
|
|
91
92
|
}
|
|
92
93
|
return this._performRowCopy(await this.getFocusElementData());
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { m as i18n } from '../../../../paraglide/messages.js';
|
|
1
2
|
/**
|
|
2
3
|
* Per-kind slice of the view-selection state machine - the mutable state
|
|
3
4
|
* for *one* `DatatableViewKind` (`'layout'` or `'filter'`):
|
|
@@ -110,9 +111,11 @@ export class ViewState {
|
|
|
110
111
|
*/
|
|
111
112
|
static deriveDropdownLabel(active, dirty) {
|
|
112
113
|
if (active.kind === 'default') {
|
|
113
|
-
return dirty
|
|
114
|
+
return dirty
|
|
115
|
+
? i18n['scoria.label.custom_unsaved']()
|
|
116
|
+
: i18n['scoria.label.default_view']();
|
|
114
117
|
}
|
|
115
|
-
return dirty ?
|
|
118
|
+
return dirty ? i18n['scoria.label.name_unsaved']({ name: active.name }) : active.name;
|
|
116
119
|
}
|
|
117
120
|
/** Resolve the mutable slice for a `DatatableViewKind`. */
|
|
118
121
|
slice(kind) {
|
|
@@ -29,6 +29,12 @@ import type { SortingState } from './SortingState.js';
|
|
|
29
29
|
export interface IDataRepository<T extends object> {
|
|
30
30
|
paginationState: PaginationState;
|
|
31
31
|
setPageSize: (size: number) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Applies the table's configured `defaultPageSize` unless a persisted
|
|
34
|
+
* records-per-page choice was restored (that always wins). Optional so
|
|
35
|
+
* custom repositories need not implement it.
|
|
36
|
+
*/
|
|
37
|
+
applyDefaultPageSize?: (size: number) => void;
|
|
32
38
|
setPage: (page: number) => void;
|
|
33
39
|
nextPage: () => void;
|
|
34
40
|
prevPage: () => void;
|
|
@@ -52,6 +52,14 @@ export declare abstract class TableDataRepository<T extends object, out FilterVa
|
|
|
52
52
|
abstract pageStartIndex: number;
|
|
53
53
|
abstract pageEndIndexExclusive: number;
|
|
54
54
|
constructor(tableName: string, getUserId: () => string | undefined);
|
|
55
|
+
/** True when a persisted records-per-page choice was restored on init. */
|
|
56
|
+
private restoredPageSize;
|
|
57
|
+
/**
|
|
58
|
+
* Applies the table's configured default page size, unless the user's own
|
|
59
|
+
* persisted choice was restored (that always wins). Does not write through
|
|
60
|
+
* to localStorage: a default is not a choice.
|
|
61
|
+
*/
|
|
62
|
+
applyDefaultPageSize(size: number): void;
|
|
55
63
|
private _paginationState;
|
|
56
64
|
/** Current page index plus the configured page size. */
|
|
57
65
|
get paginationState(): ReadonlyPaginationState;
|
|
@@ -26,10 +26,24 @@ export class TableDataRepository {
|
|
|
26
26
|
const parsed = Number.parseInt(saved, 10);
|
|
27
27
|
if (Number.isFinite(parsed) && parsed > 0) {
|
|
28
28
|
this._paginationState = { pageIndex: 0, pageSize: parsed };
|
|
29
|
+
this.restoredPageSize = true;
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
}
|
|
34
|
+
/** True when a persisted records-per-page choice was restored on init. */
|
|
35
|
+
restoredPageSize = false;
|
|
36
|
+
/**
|
|
37
|
+
* Applies the table's configured default page size, unless the user's own
|
|
38
|
+
* persisted choice was restored (that always wins). Does not write through
|
|
39
|
+
* to localStorage: a default is not a choice.
|
|
40
|
+
*/
|
|
41
|
+
applyDefaultPageSize(size) {
|
|
42
|
+
if (this.restoredPageSize || !Number.isFinite(size) || size <= 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this._paginationState = { pageIndex: 0, pageSize: size };
|
|
46
|
+
}
|
|
33
47
|
_paginationState = $state({
|
|
34
48
|
pageIndex: 0,
|
|
35
49
|
pageSize: 20,
|
|
@@ -89,6 +89,9 @@ export interface CreateTableOptions<TRow extends object, TRowId extends Primitiv
|
|
|
89
89
|
/** Page-size options shown in the footer's page-size picker. Defaults to
|
|
90
90
|
* `[10, 25, 50, 100]`. */
|
|
91
91
|
pageSizes?: ReadonlyArray<number>;
|
|
92
|
+
/** Records per page before the user has chosen one (a persisted choice
|
|
93
|
+
* always wins). Defaults to 20. */
|
|
94
|
+
defaultPageSize?: number;
|
|
92
95
|
/** Row count above which virtualisation kicks in. Defaults to 100;
|
|
93
96
|
* matches Phase 7.4. */
|
|
94
97
|
rowVirtualisationThreshold?: number;
|
|
@@ -64,6 +64,9 @@ export function createTable(options) {
|
|
|
64
64
|
(options.rows.kind === 'custom' ? options.rows.remoteFilters : undefined);
|
|
65
65
|
const defsWrapper = remoteFilters ? { defs, remoteFilters } : { defs };
|
|
66
66
|
const repository = makeRepository(options.name, options.rows, options.getUserId);
|
|
67
|
+
if (options.defaultPageSize != null) {
|
|
68
|
+
repository.applyDefaultPageSize?.(options.defaultPageSize);
|
|
69
|
+
}
|
|
67
70
|
const onEditCell = makeOnEditCell(editHandlers, options.onAnyEdit);
|
|
68
71
|
const initOptions = {
|
|
69
72
|
selectionExtractor: rowIdFn,
|