@likable-hair/svelte 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/composed/common/MenuOrDrawer.svelte +1 -1
- package/dist/components/composed/common/MenuOrDrawerOptions.svelte +1 -1
- 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/AsyncAutocomplete.svelte.d.ts +1 -0
- package/dist/components/composed/forms/DatePickerTextField.svelte +10 -2
- package/dist/components/composed/forms/DatePickerTextField.svelte.d.ts +1 -0
- package/dist/components/composed/forms/Dropdown.svelte +15 -6
- package/dist/components/composed/forms/PeriodPicker.svelte +115 -0
- package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +21 -0
- package/dist/components/composed/forms/PeriodSelector.svelte +633 -0
- package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +75 -0
- package/dist/components/composed/list/DynamicTable.svelte +130 -82
- package/dist/components/composed/list/DynamicTable.svelte.d.ts +2 -0
- package/dist/components/composed/list/EnhancedPaginatedTable.svelte +1 -2
- package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +2 -1
- package/dist/components/composed/list/PaginatedTable.svelte +20 -16
- package/dist/components/composed/list/PaginatedTable.svelte.d.ts +2 -1
- package/dist/components/composed/search/DynamicFilters.svelte +10 -10
- package/dist/components/composed/search/DynamicFilters.svelte.d.ts +6 -0
- package/dist/components/composed/search/FilterEditor.svelte +10 -9
- package/dist/components/simple/buttons/Button.css +1 -0
- package/dist/components/simple/buttons/Button.svelte +4 -1
- package/dist/components/simple/common/Menu.svelte +124 -104
- package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
- package/dist/components/simple/dates/Calendar.css +2 -2
- package/dist/components/simple/dates/Calendar.svelte +76 -27
- package/dist/components/simple/dates/Calendar.svelte.d.ts +1 -0
- package/dist/components/simple/dates/DatePicker.svelte +30 -12
- package/dist/components/simple/dates/DatePicker.svelte.d.ts +8 -1
- package/dist/components/simple/forms/Autocomplete.svelte +2 -2
- package/dist/components/simple/forms/Autocomplete.svelte.d.ts +1 -0
- package/dist/components/simple/lists/SelectableVerticalList.svelte +5 -4
- package/dist/components/simple/lists/SimpleTable.svelte +86 -54
- package/dist/components/simple/lists/SimpleTable.svelte.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import Drawer from '../../simple/navigation/Drawer.svelte';
|
|
|
3
3
|
import Menu from '../../simple/common/Menu.svelte';
|
|
4
4
|
import MediaQuery from '../../simple/common/MediaQuery.svelte';
|
|
5
5
|
import lodash from 'lodash';
|
|
6
|
-
let { open = $bindable(
|
|
6
|
+
let { open = $bindable(), drawerProps, menuProps, children, } = $props();
|
|
7
7
|
const menuPropsDefaultValue = {
|
|
8
8
|
closeOnClickOutside: true,
|
|
9
9
|
_boxShadow: "rgb(var(--global-color-grey-900), .5) 0px 2px 4px",
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import MenuOrDrawer from "./MenuOrDrawer.svelte";
|
|
6
6
|
import SelectableVerticalList from '../../simple/lists/SelectableVerticalList.svelte';
|
|
7
7
|
import lodash from 'lodash';
|
|
8
|
-
let { open = $bindable(
|
|
8
|
+
let { open = $bindable(), elements = [], onselect, menuProps, drawerProps, } = $props();
|
|
9
9
|
const menuPropsDefaultValue = {
|
|
10
10
|
anchor: 'bottom-center',
|
|
11
11
|
stayInViewport: true,
|
|
@@ -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;
|
|
@@ -48,6 +48,7 @@ declare class __sveltets_Render<Data> {
|
|
|
48
48
|
menuAnchor?: ComponentProps<typeof Menu>["anchor"];
|
|
49
49
|
menuStayInViewport?: ComponentProps<typeof Menu>["stayInViewport"];
|
|
50
50
|
menuFlipOnOverflow?: ComponentProps<typeof Menu>["flipOnOverflow"];
|
|
51
|
+
menuMaxHeight?: string;
|
|
51
52
|
adaptInputWidth?: boolean;
|
|
52
53
|
class?: {
|
|
53
54
|
activator?: string;
|
|
@@ -49,6 +49,10 @@ let activator = $state(), refreshPosition = $state(false), menuElement = $state(
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
|
+
let selectableYears = $derived.by(() => {
|
|
53
|
+
const range = maxYearInRange - minYearInRange + 1;
|
|
54
|
+
return Array.from({ length: range }, (_, i) => minYearInRange + i);
|
|
55
|
+
});
|
|
52
56
|
function handleTextFieldFocus(mobile) {
|
|
53
57
|
if (!mobile || !mobileDialog) {
|
|
54
58
|
menuOpened = true;
|
|
@@ -128,10 +132,11 @@ function handleInputChange(e) {
|
|
|
128
132
|
selectedDateTo = undefined;
|
|
129
133
|
}
|
|
130
134
|
}
|
|
131
|
-
if (oninput) {
|
|
135
|
+
if (oninput && (id == 'to' || id == 'from')) {
|
|
132
136
|
oninput({
|
|
133
137
|
detail: {
|
|
134
|
-
datetime: id == "to" ? selectedDateTo : selectedDate
|
|
138
|
+
datetime: id == "to" ? selectedDateTo : selectedDate,
|
|
139
|
+
type: id,
|
|
135
140
|
}
|
|
136
141
|
});
|
|
137
142
|
}
|
|
@@ -210,6 +215,7 @@ $effect(() => {
|
|
|
210
215
|
{appendInnerSnippet}
|
|
211
216
|
{prependSnippet}
|
|
212
217
|
{appendSnippet}
|
|
218
|
+
autocomplete='off'
|
|
213
219
|
--simple-textfield-default-padding='0.65rem 0.8rem'
|
|
214
220
|
--simple-textfield-default-inner-gap='4px'
|
|
215
221
|
>
|
|
@@ -248,6 +254,7 @@ $effect(() => {
|
|
|
248
254
|
onyearClick={handleYearSelect}
|
|
249
255
|
onmonthClick={handleMonthSelect}
|
|
250
256
|
skipTabs
|
|
257
|
+
{selectableYears}
|
|
251
258
|
{disabled}
|
|
252
259
|
{type}
|
|
253
260
|
></DatePicker>
|
|
@@ -281,6 +288,7 @@ $effect(() => {
|
|
|
281
288
|
onyearClick={handleYearSelect}
|
|
282
289
|
onmonthClick={handleMonthSelect}
|
|
283
290
|
skipTabs
|
|
291
|
+
{selectableYears}
|
|
284
292
|
{disabled}
|
|
285
293
|
{type}
|
|
286
294
|
></DatePicker>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import Autocomplete, {} from "../../../components/simple/forms/Autocomplete.svelte";
|
|
3
3
|
import Button from '../../simple/buttons/Button.svelte';
|
|
4
4
|
import Icon from '../../simple/media/Icon.svelte';
|
|
5
|
-
let { items = [], values = $bindable([]), multiple = false, lang = 'en', searchText = $bindable(), maxVisibleChips, placeholder = lang === 'en' ? "Select" : "Seleziona", clearable = true, mandatory = true, icon, menuOpened = $bindable(false), openingId = $bindable("autocomplete-menu"), width, height, minWidth, menuWidth = width, mobileDrawer = false, disabled = false, onchange, itemLabelSnippet, labelSnippet, } = $props();
|
|
5
|
+
let { items = [], values = $bindable([]), multiple = false, lang = 'en', searchText = $bindable(), maxVisibleChips, placeholder = lang === 'en' ? "Select" : "Seleziona", clearable = true, mandatory = true, icon, menuOpened = $bindable(false), openingId = $bindable("autocomplete-menu"), width, height, minWidth = 'none', menuWidth = width, mobileDrawer = false, disabled = false, onchange, itemLabelSnippet, labelSnippet, } = $props();
|
|
6
6
|
let generatedLabel = $derived(values.length == 1 ? values[0].label : `${values.length} Selezionati`);
|
|
7
7
|
function handleCloseClick(event) {
|
|
8
8
|
if (event) {
|
|
@@ -44,11 +44,6 @@ function handleCloseClick(event) {
|
|
|
44
44
|
>
|
|
45
45
|
{#snippet selectionContainerSnippet({ openMenu, handleKeyDown })}
|
|
46
46
|
<Button
|
|
47
|
-
--button-default-background-color="transparent"
|
|
48
|
-
--button-default-focus-background-color="rgb(var(--global-color-primary-400), .3)"
|
|
49
|
-
--button-default-focus-color="rgb(var(--global-color-contrast-900))"
|
|
50
|
-
--button-default-border="2px solid rgb(var(--global-color-primary-400))"
|
|
51
|
-
--button-default-color="rgb(var(--global-color-contrast-800))"
|
|
52
47
|
onclick={openMenu}
|
|
53
48
|
onkeydown={(event) => {
|
|
54
49
|
handleKeyDown(event.detail.nativeEvent)
|
|
@@ -57,6 +52,20 @@ function handleCloseClick(event) {
|
|
|
57
52
|
event.detail.nativeEvent.preventDefault()
|
|
58
53
|
}
|
|
59
54
|
}}
|
|
55
|
+
--button-padding="var(--dropdown-button-padding, 10px 12px)"
|
|
56
|
+
--button-border='var(--dropdown-button-border, none)'
|
|
57
|
+
--button-background-color='var(--dropdown-button-background-color, rgb(var(--global-color-background-300), .6))'
|
|
58
|
+
--button-hover-background-color='var(--dropdown-button-hover-color, rgb(var(--global-color-background-300), .6))'
|
|
59
|
+
--button-focus-background-color='var(--dropdown-button-focus-color, rgb(var(--global-color-background-300), .6))'
|
|
60
|
+
--button-active-background-color='var(--dropdown-button-active-color, rgb(var(--global-color-background-300), .6))'
|
|
61
|
+
--button-hover-color='var(--dropdown-button-hover-color, rgb(var(--global-color-contrast-800)))'
|
|
62
|
+
--button-color='var(--dropdown-button-color, rgb(var(--global-color-contrast-800)))'
|
|
63
|
+
--button-focus-color='var(--dropdown-button-focus-color, rgb(var(--global-color-contrast-800)))'
|
|
64
|
+
--button-border-radius='var(--dropdown-button-border-radius, 4px)'
|
|
65
|
+
--button-height='var(--dropdown-button-height, 38.78px)'
|
|
66
|
+
--button-active-box-shadow='var(--dropdown-button-active-box-shadow)'
|
|
67
|
+
--button-focus-box-shadow='var(--dropdown-button-focus-box-shadow)'
|
|
68
|
+
--button-box-sizing='var(--dropdown-button-box-sizing, border-box)'
|
|
60
69
|
>
|
|
61
70
|
{#if labelSnippet}
|
|
62
71
|
{@render labelSnippet({
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<script lang="ts" generics="Data extends string">import SimpleTextField from "../../simple/forms/SimpleTextField.svelte";
|
|
2
|
+
import MenuOrDrawer from "../common/MenuOrDrawer.svelte";
|
|
3
|
+
import PeriodSelector, { getPeriodLabel } from "./PeriodSelector.svelte"; // Import helper
|
|
4
|
+
import Button from "../../simple/buttons/Button.svelte";
|
|
5
|
+
import { fly } from "svelte/transition";
|
|
6
|
+
import Icon from "../../simple/media/Icon.svelte";
|
|
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
|
+
function handleChange(event) {
|
|
10
|
+
if (timespanSettings?.method == 'quick') {
|
|
11
|
+
open = false;
|
|
12
|
+
}
|
|
13
|
+
onchange?.(event);
|
|
14
|
+
}
|
|
15
|
+
function openMenu() {
|
|
16
|
+
if (!open)
|
|
17
|
+
open = true;
|
|
18
|
+
else if (valid)
|
|
19
|
+
open = false;
|
|
20
|
+
}
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<SimpleTextField
|
|
24
|
+
onfocus={() => open = true}
|
|
25
|
+
value={text}
|
|
26
|
+
bind:input
|
|
27
|
+
disabled
|
|
28
|
+
>
|
|
29
|
+
{#snippet appendInnerSnippet()}
|
|
30
|
+
<Icon
|
|
31
|
+
name='mdi-chevron-down'
|
|
32
|
+
onclick={openMenu}
|
|
33
|
+
--icon-size="20px"
|
|
34
|
+
></Icon>
|
|
35
|
+
{/snippet}
|
|
36
|
+
</SimpleTextField>
|
|
37
|
+
<MenuOrDrawer
|
|
38
|
+
bind:open
|
|
39
|
+
menuProps={{
|
|
40
|
+
activator: input,
|
|
41
|
+
_activatorGap: 16,
|
|
42
|
+
closeOnClickOutside: valid,
|
|
43
|
+
_offsetLeft: -16,
|
|
44
|
+
anchor: 'bottom',
|
|
45
|
+
flipOnOverflow: true,
|
|
46
|
+
stayInViewport: true,
|
|
47
|
+
openingId: 'period-picker',
|
|
48
|
+
_overflow: 'hidden',
|
|
49
|
+
}}
|
|
50
|
+
drawerProps={{
|
|
51
|
+
closeOnClickOutside: valid,
|
|
52
|
+
_space: 'min(50%,420px)',
|
|
53
|
+
_borderRadius: '4px',
|
|
54
|
+
_overflow: 'hidden',
|
|
55
|
+
}}
|
|
56
|
+
>
|
|
57
|
+
{#snippet children({ isDrawer, isMenu })}
|
|
58
|
+
<div
|
|
59
|
+
class:menu={isMenu}
|
|
60
|
+
class:drawer={isDrawer}
|
|
61
|
+
>
|
|
62
|
+
<PeriodSelector
|
|
63
|
+
onchange={handleChange}
|
|
64
|
+
bind:timespanSettings
|
|
65
|
+
bind:valid
|
|
66
|
+
bind:isSelectionMode
|
|
67
|
+
{quickSelectOptions}
|
|
68
|
+
{lang}
|
|
69
|
+
{...rest}
|
|
70
|
+
></PeriodSelector>
|
|
71
|
+
{#if !isSelectionMode}
|
|
72
|
+
<div
|
|
73
|
+
class:button-end={isMenu}
|
|
74
|
+
class:button-full={isDrawer}
|
|
75
|
+
in:fly={{ x: 200, duration: 250, delay: 200 }}
|
|
76
|
+
out:fly={{ x: 200, duration: 250 }}
|
|
77
|
+
>
|
|
78
|
+
<Button
|
|
79
|
+
disabled={!valid}
|
|
80
|
+
onclick={() => open = false}
|
|
81
|
+
>
|
|
82
|
+
{lang == 'en' ? 'Apply' : 'Applica'}
|
|
83
|
+
</Button>
|
|
84
|
+
</div>
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
{/snippet}
|
|
88
|
+
</MenuOrDrawer>
|
|
89
|
+
|
|
90
|
+
<style>
|
|
91
|
+
.menu {
|
|
92
|
+
padding: 8px;
|
|
93
|
+
box-shadow: 2px 2px 2px 2px rgba(0, 0, 0, 0.2);
|
|
94
|
+
border-radius: 4px;
|
|
95
|
+
background-color: rgb(var(--global-color-background-200));
|
|
96
|
+
width: 400px;
|
|
97
|
+
--period-selector-min-height: 290px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.drawer {
|
|
101
|
+
padding: 12px;
|
|
102
|
+
--period-selector-max-width: none;
|
|
103
|
+
--period-selector-list-element-padding: 8px;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.button-end {
|
|
107
|
+
display: flex;
|
|
108
|
+
justify-content: end;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.button-full {
|
|
112
|
+
display: flex;
|
|
113
|
+
--button-width: 100%
|
|
114
|
+
}
|
|
115
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ComponentProps } from "svelte";
|
|
2
|
+
import PeriodSelector from "./PeriodSelector.svelte";
|
|
3
|
+
interface Props extends Omit<ComponentProps<typeof PeriodSelector<Data>>, 'showTimeRangeLabel'> {
|
|
4
|
+
}
|
|
5
|
+
declare class __sveltets_Render<Data extends string> {
|
|
6
|
+
props(): Props;
|
|
7
|
+
events(): {};
|
|
8
|
+
slots(): {};
|
|
9
|
+
bindings(): "timespanSettings" | "valid" | "isSelectionMode";
|
|
10
|
+
exports(): {};
|
|
11
|
+
}
|
|
12
|
+
interface $$IsomorphicComponent {
|
|
13
|
+
new <Data extends string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Data>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Data>['props']>, ReturnType<__sveltets_Render<Data>['events']>, ReturnType<__sveltets_Render<Data>['slots']>> & {
|
|
14
|
+
$$bindings?: ReturnType<__sveltets_Render<Data>['bindings']>;
|
|
15
|
+
} & ReturnType<__sveltets_Render<Data>['exports']>;
|
|
16
|
+
<Data extends string>(internal: unknown, props: ReturnType<__sveltets_Render<Data>['props']> & {}): ReturnType<__sveltets_Render<Data>['exports']>;
|
|
17
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
18
|
+
}
|
|
19
|
+
declare const PeriodPicker: $$IsomorphicComponent;
|
|
20
|
+
type PeriodPicker<Data extends string> = InstanceType<typeof PeriodPicker<Data>>;
|
|
21
|
+
export default PeriodPicker;
|