@likable-hair/svelte 4.2.1 → 4.2.3
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/composed/dashboard/DashboardShaper.svelte +20 -13
- package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +123 -100
- package/dist/components/composed/forms/PeriodPicker.svelte +14 -10
- package/dist/components/composed/forms/PeriodSelector.svelte +52 -40
- package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +19 -3
- package/dist/components/composed/list/PaginatedTable.svelte +1 -0
- package/dist/components/simple/lists/SimpleTable.svelte +0 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="ts">import './DashboardShaper.css';
|
|
1
|
+
<script lang="ts" generics="Data, WidgetName extends string">import './DashboardShaper.css';
|
|
2
2
|
import lodash from 'lodash';
|
|
3
3
|
import { Dialog, Icon } from "../../..";
|
|
4
4
|
import { createId } from "@paralleldrive/cuid2";
|
|
@@ -21,11 +21,12 @@ function calculateLocalWidgetsFromWidgets() {
|
|
|
21
21
|
return {
|
|
22
22
|
widget: {
|
|
23
23
|
id: w.id,
|
|
24
|
-
|
|
24
|
+
name: w.name,
|
|
25
25
|
height: w.height,
|
|
26
26
|
width: w.width,
|
|
27
27
|
left: w.left,
|
|
28
28
|
top: w.top,
|
|
29
|
+
data: w.data,
|
|
29
30
|
},
|
|
30
31
|
columnSpanFrom: w.left,
|
|
31
32
|
columnSpanTo: w.left + w.width,
|
|
@@ -149,7 +150,7 @@ function calculateWidgetsFromLocalWidgets() {
|
|
|
149
150
|
widgets = widgetCells?.map((lWidget) => {
|
|
150
151
|
return {
|
|
151
152
|
id: lWidget.widget.id,
|
|
152
|
-
|
|
153
|
+
name: lWidget.widget.name,
|
|
153
154
|
height: lWidget.widget.height,
|
|
154
155
|
width: lWidget.widget.width,
|
|
155
156
|
left: lWidget.widget.left,
|
|
@@ -180,9 +181,15 @@ function availableSizes(params) {
|
|
|
180
181
|
<div class="widget-cell-preview"></div>
|
|
181
182
|
{:else}
|
|
182
183
|
{#if widgetCellSnippet}
|
|
183
|
-
{@render widgetCellSnippet({
|
|
184
|
+
{@render widgetCellSnippet({
|
|
185
|
+
widgetCell: {
|
|
186
|
+
...widgetCell,
|
|
187
|
+
title: availableWidgetCells.find((awc) => awc.name === widgetCell.widget?.name)?.title
|
|
188
|
+
},
|
|
189
|
+
removeWidgetCell
|
|
190
|
+
})}
|
|
184
191
|
{:else}
|
|
185
|
-
{widgetCell.widget.
|
|
192
|
+
{widgetCell.widget.name}
|
|
186
193
|
{/if}
|
|
187
194
|
{/if}
|
|
188
195
|
</div>
|
|
@@ -245,9 +252,9 @@ function availableSizes(params) {
|
|
|
245
252
|
availableSizes: ws.availableSizes
|
|
246
253
|
}).length > 0)
|
|
247
254
|
.sort((a, b) => {
|
|
248
|
-
if (a.
|
|
249
|
-
if (a.
|
|
250
|
-
if (a.
|
|
255
|
+
if (a.title == 'Placeholder') return -1
|
|
256
|
+
if (a.title < b.title) return -1
|
|
257
|
+
if (a.title > b.title) return 1
|
|
251
258
|
return 0
|
|
252
259
|
}) as widgetSpec
|
|
253
260
|
}
|
|
@@ -256,7 +263,7 @@ function availableSizes(params) {
|
|
|
256
263
|
{#if widgetSpec.icon}
|
|
257
264
|
<Icon name={widgetSpec.icon} --icon-size="30px" />
|
|
258
265
|
{/if}
|
|
259
|
-
<div class="widget-title">{widgetSpec.
|
|
266
|
+
<div class="widget-title">{widgetSpec.title}</div>
|
|
260
267
|
<div class="widget-desc">{widgetSpec.description}</div>
|
|
261
268
|
</div>
|
|
262
269
|
|
|
@@ -273,7 +280,7 @@ function availableSizes(params) {
|
|
|
273
280
|
addWidgetCell({
|
|
274
281
|
widget: {
|
|
275
282
|
id: createId(),
|
|
276
|
-
|
|
283
|
+
name: widgetSpec.name,
|
|
277
284
|
height: sizes[0],
|
|
278
285
|
width: sizes[1],
|
|
279
286
|
top: addWidgetInfo!.fromRow,
|
|
@@ -337,15 +344,15 @@ function availableSizes(params) {
|
|
|
337
344
|
|
|
338
345
|
.header {
|
|
339
346
|
display: flex;
|
|
340
|
-
padding:
|
|
347
|
+
padding: 20px;
|
|
341
348
|
gap: 12px;
|
|
342
349
|
background-color: var(--dashboard-shaper-dialog-header-background-color, var(--dashboard-shaper-default-dialog-header-background-color));
|
|
343
350
|
border-block-end: 1px solid rgb(var(--global-color-contrast-100));
|
|
344
|
-
height:
|
|
351
|
+
height: min-content;
|
|
345
352
|
}
|
|
346
353
|
|
|
347
354
|
.title {
|
|
348
|
-
font-size:
|
|
355
|
+
font-size: 1.35rem;
|
|
349
356
|
font-weight: bold;
|
|
350
357
|
text-align: center;
|
|
351
358
|
}
|
|
@@ -1,104 +1,77 @@
|
|
|
1
1
|
import './DashboardShaper.css';
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
-
declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
widgetCell: {
|
|
45
|
-
widget: {
|
|
46
|
-
id: number | string;
|
|
47
|
-
componentName: string;
|
|
48
|
-
height: number;
|
|
49
|
-
width: number;
|
|
50
|
-
left: number;
|
|
51
|
-
top: number;
|
|
3
|
+
declare class __sveltets_Render<Data, WidgetName extends string> {
|
|
4
|
+
props(): {
|
|
5
|
+
layoutWidth?: number;
|
|
6
|
+
layoutHeight?: number;
|
|
7
|
+
widgets: {
|
|
8
|
+
id: number | string;
|
|
9
|
+
name: WidgetName;
|
|
10
|
+
height: number;
|
|
11
|
+
width: number;
|
|
12
|
+
left: number;
|
|
13
|
+
top: number;
|
|
14
|
+
data?: Data | undefined;
|
|
15
|
+
}[];
|
|
16
|
+
availableWidgetCells: {
|
|
17
|
+
name: WidgetName;
|
|
18
|
+
title: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
icon: string;
|
|
21
|
+
availableSizes: [number, number][];
|
|
22
|
+
}[];
|
|
23
|
+
someRowSlotEmpty?: boolean;
|
|
24
|
+
preview?: boolean;
|
|
25
|
+
canAdd?: boolean;
|
|
26
|
+
lang?: "it" | "en";
|
|
27
|
+
onaddWidgetCell?: ((event: {
|
|
28
|
+
widgetCell: {
|
|
29
|
+
widget: {
|
|
30
|
+
id: number | string;
|
|
31
|
+
name: WidgetName;
|
|
32
|
+
height: number;
|
|
33
|
+
width: number;
|
|
34
|
+
left: number;
|
|
35
|
+
top: number;
|
|
36
|
+
data?: Data | undefined;
|
|
37
|
+
};
|
|
38
|
+
columnSpanFrom: number;
|
|
39
|
+
columnSpanTo: number;
|
|
40
|
+
rowSpanFrom: number;
|
|
41
|
+
rowSpanTo: number;
|
|
42
|
+
availableHeight?: number;
|
|
43
|
+
availableWidth?: number;
|
|
52
44
|
};
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
45
|
+
}) => void) | undefined;
|
|
46
|
+
onremoveWidgetCell?: ((event: {
|
|
47
|
+
widgetCell: {
|
|
48
|
+
widget: {
|
|
49
|
+
id: number | string;
|
|
50
|
+
name: WidgetName;
|
|
51
|
+
height: number;
|
|
52
|
+
width: number;
|
|
53
|
+
left: number;
|
|
54
|
+
top: number;
|
|
55
|
+
data?: Data | undefined;
|
|
56
|
+
};
|
|
57
|
+
columnSpanFrom: number;
|
|
58
|
+
columnSpanTo: number;
|
|
59
|
+
rowSpanFrom: number;
|
|
60
|
+
rowSpanTo: number;
|
|
61
|
+
availableHeight?: number;
|
|
62
|
+
availableWidth?: number;
|
|
70
63
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
rowSpanTo: number;
|
|
75
|
-
availableHeight?: number;
|
|
76
|
-
availableWidth?: number;
|
|
77
|
-
}, "widget"> & {
|
|
78
|
-
widget?: {
|
|
79
|
-
id: number | string;
|
|
80
|
-
componentName: string;
|
|
81
|
-
height: number;
|
|
82
|
-
width: number;
|
|
83
|
-
left: number;
|
|
84
|
-
top: number;
|
|
85
|
-
} | undefined;
|
|
86
|
-
};
|
|
87
|
-
removeWidgetCell: (params: {
|
|
88
|
-
id: string | number;
|
|
89
|
-
}) => void;
|
|
90
|
-
}]>;
|
|
91
|
-
widgetSelectionDialogHeaderSnippet?: Snippet<[]>;
|
|
92
|
-
addWidgetButtonSnippet?: Snippet<[{
|
|
93
|
-
handleAddClick: (params: {
|
|
94
|
-
slot: Omit<{
|
|
64
|
+
}) => void) | undefined;
|
|
65
|
+
widgetCellSnippet?: Snippet<[{
|
|
66
|
+
widgetCell: Omit<{
|
|
95
67
|
widget: {
|
|
96
68
|
id: number | string;
|
|
97
|
-
|
|
69
|
+
name: WidgetName;
|
|
98
70
|
height: number;
|
|
99
71
|
width: number;
|
|
100
72
|
left: number;
|
|
101
73
|
top: number;
|
|
74
|
+
data?: Data | undefined;
|
|
102
75
|
};
|
|
103
76
|
columnSpanFrom: number;
|
|
104
77
|
columnSpanTo: number;
|
|
@@ -109,23 +82,60 @@ declare const DashboardShaper: import("svelte").Component<{
|
|
|
109
82
|
}, "widget"> & {
|
|
110
83
|
widget?: {
|
|
111
84
|
id: number | string;
|
|
112
|
-
|
|
85
|
+
name: WidgetName;
|
|
113
86
|
height: number;
|
|
114
87
|
width: number;
|
|
115
88
|
left: number;
|
|
116
89
|
top: number;
|
|
90
|
+
data?: Data | undefined;
|
|
117
91
|
} | undefined;
|
|
92
|
+
} & {
|
|
93
|
+
title?: string;
|
|
118
94
|
};
|
|
119
|
-
|
|
120
|
-
|
|
95
|
+
removeWidgetCell: (params: {
|
|
96
|
+
id: string | number;
|
|
97
|
+
}) => void;
|
|
98
|
+
}]> | undefined;
|
|
99
|
+
widgetSelectionDialogHeaderSnippet?: Snippet<[]>;
|
|
100
|
+
addWidgetButtonSnippet?: Snippet<[{
|
|
101
|
+
handleAddClick: (params: {
|
|
102
|
+
slot: Omit<{
|
|
103
|
+
widget: {
|
|
104
|
+
id: number | string;
|
|
105
|
+
name: WidgetName;
|
|
106
|
+
height: number;
|
|
107
|
+
width: number;
|
|
108
|
+
left: number;
|
|
109
|
+
top: number;
|
|
110
|
+
data?: Data | undefined;
|
|
111
|
+
};
|
|
112
|
+
columnSpanFrom: number;
|
|
113
|
+
columnSpanTo: number;
|
|
114
|
+
rowSpanFrom: number;
|
|
115
|
+
rowSpanTo: number;
|
|
116
|
+
availableHeight?: number;
|
|
117
|
+
availableWidth?: number;
|
|
118
|
+
}, "widget"> & {
|
|
119
|
+
widget?: {
|
|
120
|
+
id: number | string;
|
|
121
|
+
name: WidgetName;
|
|
122
|
+
height: number;
|
|
123
|
+
width: number;
|
|
124
|
+
left: number;
|
|
125
|
+
top: number;
|
|
126
|
+
data?: Data | undefined;
|
|
127
|
+
} | undefined;
|
|
128
|
+
};
|
|
129
|
+
}) => void;
|
|
121
130
|
slot: Omit<{
|
|
122
131
|
widget: {
|
|
123
132
|
id: number | string;
|
|
124
|
-
|
|
133
|
+
name: WidgetName;
|
|
125
134
|
height: number;
|
|
126
135
|
width: number;
|
|
127
136
|
left: number;
|
|
128
137
|
top: number;
|
|
138
|
+
data?: Data | undefined;
|
|
129
139
|
};
|
|
130
140
|
columnSpanFrom: number;
|
|
131
141
|
columnSpanTo: number;
|
|
@@ -136,15 +146,28 @@ declare const DashboardShaper: import("svelte").Component<{
|
|
|
136
146
|
}, "widget"> & {
|
|
137
147
|
widget?: {
|
|
138
148
|
id: number | string;
|
|
139
|
-
|
|
149
|
+
name: WidgetName;
|
|
140
150
|
height: number;
|
|
141
151
|
width: number;
|
|
142
152
|
left: number;
|
|
143
153
|
top: number;
|
|
154
|
+
data?: Data | undefined;
|
|
144
155
|
} | undefined;
|
|
145
156
|
};
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
157
|
+
}]> | undefined;
|
|
158
|
+
};
|
|
159
|
+
events(): {};
|
|
160
|
+
slots(): {};
|
|
161
|
+
bindings(): "widgets" | "someRowSlotEmpty";
|
|
162
|
+
exports(): {};
|
|
163
|
+
}
|
|
164
|
+
interface $$IsomorphicComponent {
|
|
165
|
+
new <Data, WidgetName extends string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Data, WidgetName>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Data, WidgetName>['props']>, ReturnType<__sveltets_Render<Data, WidgetName>['events']>, ReturnType<__sveltets_Render<Data, WidgetName>['slots']>> & {
|
|
166
|
+
$$bindings?: ReturnType<__sveltets_Render<Data, WidgetName>['bindings']>;
|
|
167
|
+
} & ReturnType<__sveltets_Render<Data, WidgetName>['exports']>;
|
|
168
|
+
<Data, WidgetName extends string>(internal: unknown, props: ReturnType<__sveltets_Render<Data, WidgetName>['props']> & {}): ReturnType<__sveltets_Render<Data, WidgetName>['exports']>;
|
|
169
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
|
|
170
|
+
}
|
|
171
|
+
declare const DashboardShaper: $$IsomorphicComponent;
|
|
172
|
+
type DashboardShaper<Data, WidgetName extends string> = InstanceType<typeof DashboardShaper<Data, WidgetName>>;
|
|
150
173
|
export default DashboardShaper;
|
|
@@ -1,32 +1,36 @@
|
|
|
1
1
|
<script lang="ts" generics="Data extends string">import SimpleTextField from "../../simple/forms/SimpleTextField.svelte";
|
|
2
2
|
import MenuOrDrawer from "../common/MenuOrDrawer.svelte";
|
|
3
|
-
import PeriodSelector from "./PeriodSelector.svelte";
|
|
3
|
+
import PeriodSelector, { getPeriodLabel } from "./PeriodSelector.svelte"; // Import helper
|
|
4
4
|
import Button from "../../simple/buttons/Button.svelte";
|
|
5
5
|
import { fly } from "svelte/transition";
|
|
6
6
|
import Icon from "../../simple/media/Icon.svelte";
|
|
7
|
-
let { onchange, timespanSettings = $bindable(), valid = $bindable(), isSelectionMode = $bindable(), lang = 'en',
|
|
8
|
-
let open = $state(false), input = $state(), text = $derived(
|
|
7
|
+
let { onchange, timespanSettings = $bindable(), valid = $bindable(), isSelectionMode = $bindable(), lang = 'en', quickSelectOptions, ...rest } = $props();
|
|
8
|
+
let open = $state(false), input = $state(), text = $derived(getPeriodLabel(timespanSettings, lang, quickSelectOptions));
|
|
9
9
|
function handleChange(event) {
|
|
10
10
|
if (timespanSettings?.method == 'quick') {
|
|
11
11
|
open = false;
|
|
12
12
|
}
|
|
13
13
|
onchange?.(event);
|
|
14
14
|
}
|
|
15
|
+
function openMenu() {
|
|
16
|
+
if (!open)
|
|
17
|
+
open = true;
|
|
18
|
+
else if (valid)
|
|
19
|
+
open = false;
|
|
20
|
+
}
|
|
15
21
|
</script>
|
|
16
22
|
|
|
17
23
|
<SimpleTextField
|
|
18
24
|
onfocus={() => open = true}
|
|
19
|
-
|
|
20
|
-
bind:value={text}
|
|
25
|
+
value={text}
|
|
21
26
|
bind:input
|
|
27
|
+
disabled
|
|
22
28
|
>
|
|
23
29
|
{#snippet appendInnerSnippet()}
|
|
24
30
|
<Icon
|
|
25
31
|
name='mdi-chevron-down'
|
|
26
|
-
onclick={
|
|
27
|
-
|
|
28
|
-
else if (valid) open = false
|
|
29
|
-
}}
|
|
32
|
+
onclick={openMenu}
|
|
33
|
+
--icon-size="20px"
|
|
30
34
|
></Icon>
|
|
31
35
|
{/snippet}
|
|
32
36
|
</SimpleTextField>
|
|
@@ -59,8 +63,8 @@ function handleChange(event) {
|
|
|
59
63
|
onchange={handleChange}
|
|
60
64
|
bind:timespanSettings
|
|
61
65
|
bind:valid
|
|
62
|
-
bind:timeRangeLabel
|
|
63
66
|
bind:isSelectionMode
|
|
67
|
+
{quickSelectOptions}
|
|
64
68
|
{lang}
|
|
65
69
|
{...rest}
|
|
66
70
|
></PeriodSelector>
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
<script module lang="ts">
|
|
2
|
-
</script>
|
|
3
|
-
|
|
4
|
-
<script lang="ts" generics="T extends string = string">import Dropdown from "./Dropdown.svelte";
|
|
5
|
-
import SimpleTextField from "../../simple/forms/SimpleTextField.svelte";
|
|
6
|
-
import SelectableVerticalList from "../../simple/lists/SelectableVerticalList.svelte";
|
|
7
|
-
import DatePicker from "../../simple/dates/DatePicker.svelte";
|
|
8
|
-
import { fly } from "svelte/transition";
|
|
9
|
-
import Icon from "../../simple/media/Icon.svelte";
|
|
10
|
-
import Chip from "../../simple/navigation/Chip.svelte";
|
|
11
|
-
import { tick } from "svelte";
|
|
12
|
-
const defaultQuickOptions = {
|
|
1
|
+
<script module lang="ts">export const defaultQuickOptions = {
|
|
13
2
|
'it': [
|
|
14
3
|
{ value: 'today', label: 'Oggi' },
|
|
15
4
|
{ value: 'this-week', label: 'Questa settimana' },
|
|
@@ -29,7 +18,56 @@ const defaultQuickOptions = {
|
|
|
29
18
|
{ value: 'total', label: 'All time' },
|
|
30
19
|
],
|
|
31
20
|
};
|
|
32
|
-
|
|
21
|
+
export function getPeriodLabel(settings, lang = 'en', quickOptions = defaultQuickOptions[lang]) {
|
|
22
|
+
if (!settings?.method)
|
|
23
|
+
return lang == 'en' ? 'Select range mode' : 'Seleziona una modalità';
|
|
24
|
+
if (settings.method === 'picker') {
|
|
25
|
+
let fromStr = settings.values?.from ? new Date(settings.values.from).toLocaleDateString(lang) : '';
|
|
26
|
+
let toStr = settings.values?.to ? new Date(settings.values.to).toLocaleDateString(lang) : '';
|
|
27
|
+
if (fromStr && toStr)
|
|
28
|
+
return `${lang == 'en' ? 'From' : 'Dal'} ${fromStr} ${lang == 'en' ? 'to' : 'al'} ${toStr}`;
|
|
29
|
+
if (fromStr)
|
|
30
|
+
return `${lang == 'en' ? 'From' : 'Dal'} ${fromStr}`;
|
|
31
|
+
if (toStr)
|
|
32
|
+
return `${lang == 'en' ? 'Until' : 'Fino al'} ${toStr}`;
|
|
33
|
+
return lang == 'en' ? 'Select dates' : 'Seleziona date';
|
|
34
|
+
}
|
|
35
|
+
if (settings.method === 'quick') {
|
|
36
|
+
return quickOptions.find(o => o.value === settings.values)?.label || (lang == 'en' ? 'Select a period' : 'Seleziona un periodo');
|
|
37
|
+
}
|
|
38
|
+
if (settings.method === 'rolling') {
|
|
39
|
+
const num = settings.values?.numberOfUnits;
|
|
40
|
+
const unit = settings.values?.measurementUnit;
|
|
41
|
+
const dir = settings.values?.direction ?? 'last';
|
|
42
|
+
if (!unit || !num)
|
|
43
|
+
return lang == 'en' ? 'Configure rolling window' : 'Configura periodo';
|
|
44
|
+
let unitLabel = '';
|
|
45
|
+
if (unit === 'days')
|
|
46
|
+
unitLabel = lang == 'en' ? 'Days' : 'Giorni';
|
|
47
|
+
if (unit === 'weeks')
|
|
48
|
+
unitLabel = lang == 'en' ? 'Weeks' : 'Settimane';
|
|
49
|
+
if (unit === 'months')
|
|
50
|
+
unitLabel = lang == 'en' ? 'Months' : 'Mesi';
|
|
51
|
+
if (unit === 'years')
|
|
52
|
+
unitLabel = lang == 'en' ? 'Years' : 'Anni';
|
|
53
|
+
const dirLabel = dir === 'next'
|
|
54
|
+
? (lang == 'en' ? 'Next' : unit == 'weeks' ? 'Prossime' : 'Prossimi')
|
|
55
|
+
: (lang == 'en' ? 'Last' : unit == 'weeks' ? 'Ultime' : 'Ultimi');
|
|
56
|
+
return `${dirLabel} ${num} ${unitLabel}`;
|
|
57
|
+
}
|
|
58
|
+
return lang == 'en' ? 'Select range mode' : 'Seleziona una modalità';
|
|
59
|
+
}
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<script lang="ts" generics="T extends string = string">import Dropdown from "./Dropdown.svelte";
|
|
63
|
+
import SimpleTextField from "../../simple/forms/SimpleTextField.svelte";
|
|
64
|
+
import SelectableVerticalList from "../../simple/lists/SelectableVerticalList.svelte";
|
|
65
|
+
import DatePicker from "../../simple/dates/DatePicker.svelte";
|
|
66
|
+
import { fly } from "svelte/transition";
|
|
67
|
+
import Icon from "../../simple/media/Icon.svelte";
|
|
68
|
+
import Chip from "../../simple/navigation/Chip.svelte";
|
|
69
|
+
import { tick } from "svelte";
|
|
70
|
+
let { timespanSettings = $bindable(), lang = 'en', quickSelectOptions = defaultQuickOptions[lang], valid = $bindable(), mode = 'default', locale = lang, showTimeRangeLabel = false, isSelectionMode = $bindable(), onchange, quickRangeConvertor, setTimespanLabel, } = $props();
|
|
33
71
|
if (!timespanSettings) {
|
|
34
72
|
timespanSettings = {};
|
|
35
73
|
}
|
|
@@ -40,33 +78,7 @@ $effect(() => {
|
|
|
40
78
|
if (localValid != valid)
|
|
41
79
|
valid = localValid;
|
|
42
80
|
});
|
|
43
|
-
$
|
|
44
|
-
if (!timespanSettings?.method) {
|
|
45
|
-
timeRangeLabel = lang == 'en' ? 'Select range mode' : 'Seleziona una modalità';
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (timespanSettings.method == 'picker') {
|
|
49
|
-
timeRangeLabel = formatDateLabel(timespanSettings.values?.from, timespanSettings.values?.to);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
else if (timespanSettings.method == 'quick') {
|
|
53
|
-
timeRangeLabel = quickSelectOptions.find(o => o.value == timespanSettings?.values)?.label || (lang == 'en' ? 'Select a period' : 'Seleziona un periodo');
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
else if (timespanSettings.method == 'rolling') {
|
|
57
|
-
const num = rollingNumberOfUnits ?? undefined;
|
|
58
|
-
const unitLabel = rollingMeasurementOfUnit?.label;
|
|
59
|
-
const dirLabel = rollingDirection === 'next'
|
|
60
|
-
? lang == 'en' ? 'Next' : rollingMeasurementOfUnit?.value == 'weeks' ? 'Prossime' : 'Prossimi'
|
|
61
|
-
: lang == 'en' ? 'Last' : rollingMeasurementOfUnit?.value == 'weeks' ? 'Ultime' : 'Ultimi';
|
|
62
|
-
if (!unitLabel || !num) {
|
|
63
|
-
timeRangeLabel = lang == 'en' ? 'Configure rolling window' : 'Configura periodo';
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
timeRangeLabel = `${dirLabel} ${num} ${unitLabel}`;
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
81
|
+
let timeRangeLabel = $derived(setTimespanLabel ? setTimespanLabel({ timespanSettings }) : getPeriodLabel(timespanSettings, lang, quickSelectOptions));
|
|
70
82
|
let rollingAutocompleteValues = [
|
|
71
83
|
{ value: 'days', label: lang == 'en' ? 'Days' : 'Giorni' },
|
|
72
84
|
{ value: 'weeks', label: lang == 'en' ? 'Weeks' : 'Settimane' },
|
|
@@ -14,12 +14,26 @@ type TimespanMap<T extends string> = {
|
|
|
14
14
|
rolling: RollingSelectValues;
|
|
15
15
|
picker: PickerSelectValues;
|
|
16
16
|
};
|
|
17
|
-
type TimespanSettings<T extends string = string> = {
|
|
17
|
+
export type TimespanSettings<T extends string = string> = {
|
|
18
18
|
[K in keyof TimespanMap<T>]: {
|
|
19
19
|
method?: K;
|
|
20
20
|
values?: TimespanMap<T>[K];
|
|
21
21
|
};
|
|
22
22
|
}[keyof TimespanMap<T>];
|
|
23
|
+
export declare const defaultQuickOptions: {
|
|
24
|
+
it: {
|
|
25
|
+
value: string;
|
|
26
|
+
label: string;
|
|
27
|
+
}[];
|
|
28
|
+
en: {
|
|
29
|
+
value: string;
|
|
30
|
+
label: string;
|
|
31
|
+
}[];
|
|
32
|
+
};
|
|
33
|
+
export declare function getPeriodLabel<T extends string>(settings: TimespanSettings<T> | undefined, lang?: 'en' | 'it', quickOptions?: {
|
|
34
|
+
value: string | T;
|
|
35
|
+
label: string;
|
|
36
|
+
}[]): string;
|
|
23
37
|
declare class __sveltets_Render<T extends string = string> {
|
|
24
38
|
props(): {
|
|
25
39
|
timespanSettings?: TimespanSettings<T> | undefined;
|
|
@@ -32,7 +46,6 @@ declare class __sveltets_Render<T extends string = string> {
|
|
|
32
46
|
lang?: "it" | "en";
|
|
33
47
|
locale?: "it" | "en";
|
|
34
48
|
showTimeRangeLabel?: boolean;
|
|
35
|
-
timeRangeLabel?: string;
|
|
36
49
|
isSelectionMode?: boolean;
|
|
37
50
|
onchange?: ((event: {
|
|
38
51
|
timespanSettings?: TimespanSettings<T> | undefined;
|
|
@@ -41,10 +54,13 @@ declare class __sveltets_Render<T extends string = string> {
|
|
|
41
54
|
from?: Date;
|
|
42
55
|
to: Date;
|
|
43
56
|
} | undefined) | undefined;
|
|
57
|
+
setTimespanLabel?: ((params: {
|
|
58
|
+
timespanSettings: TimespanSettings<T> | undefined;
|
|
59
|
+
}) => string) | undefined;
|
|
44
60
|
};
|
|
45
61
|
events(): {};
|
|
46
62
|
slots(): {};
|
|
47
|
-
bindings(): "timespanSettings" | "valid" | "isSelectionMode"
|
|
63
|
+
bindings(): "timespanSettings" | "valid" | "isSelectionMode";
|
|
48
64
|
exports(): {};
|
|
49
65
|
}
|
|
50
66
|
interface $$IsomorphicComponent {
|