@likable-hair/svelte 4.2.5 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/components/composed/buttons/ActivableButton.svelte +25 -7
  2. package/dist/components/composed/common/HeadersDrawer.svelte +66 -28
  3. package/dist/components/composed/common/HeadersDrawer.svelte.d.ts +22 -12
  4. package/dist/components/composed/common/MenuOrDrawer.svelte +40 -12
  5. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +51 -27
  6. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +15 -10
  7. package/dist/components/composed/common/QuickActions.svelte +59 -23
  8. package/dist/components/composed/common/ToolTip.svelte +51 -32
  9. package/dist/components/composed/dashboard/DashboardShaper.svelte +280 -147
  10. package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +54 -45
  11. package/dist/components/composed/forms/AsyncAutocomplete.svelte +81 -30
  12. package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +12 -5
  13. package/dist/components/composed/forms/AvatarDropdown.svelte +146 -70
  14. package/dist/components/composed/forms/AvatarDropdown.svelte.d.ts +27 -22
  15. package/dist/components/composed/forms/ConfirmOrCancelButtons.svelte +65 -19
  16. package/dist/components/composed/forms/CountriesAutocomplete.svelte +33 -4
  17. package/dist/components/composed/forms/DatePickerTextField.svelte +266 -161
  18. package/dist/components/composed/forms/Dropdown.svelte +88 -21
  19. package/dist/components/composed/forms/Dropdown.svelte.d.ts +18 -13
  20. package/dist/components/composed/forms/IconsDropdown.svelte +85 -40
  21. package/dist/components/composed/forms/IconsDropdown.svelte.d.ts +15 -8
  22. package/dist/components/composed/forms/LabelAndSelect.svelte +46 -5
  23. package/dist/components/composed/forms/LabelAndTextField.svelte +56 -3
  24. package/dist/components/composed/forms/PeriodPicker.svelte +38 -18
  25. package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +32 -7
  26. package/dist/components/composed/forms/PeriodSelector.svelte +427 -312
  27. package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +20 -13
  28. package/dist/components/composed/forms/ToggleList.svelte +71 -37
  29. package/dist/components/composed/forms/ToggleList.svelte.d.ts +14 -7
  30. package/dist/components/composed/forms/YearPickerTextField.svelte +154 -82
  31. package/dist/components/composed/list/DynamicTable.svelte +1372 -809
  32. package/dist/components/composed/list/DynamicTable.svelte.d.ts +85 -70
  33. package/dist/components/composed/list/EnhancedPaginatedTable.svelte +75 -32
  34. package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +16 -6
  35. package/dist/components/composed/list/PaginatedTable.svelte +324 -116
  36. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +26 -22
  37. package/dist/components/composed/progress/HorizontalStackedProgress.svelte +67 -29
  38. package/dist/components/composed/search/DynamicFilters.svelte +126 -91
  39. package/dist/components/composed/search/FilterEditor.svelte +169 -109
  40. package/dist/components/composed/search/Filters.svelte +385 -275
  41. package/dist/components/composed/search/GlobalSearchTextField.svelte +102 -42
  42. package/dist/components/composed/search/GlobalSearchTextField.svelte.d.ts +23 -20
  43. package/dist/components/composed/search/MobileFilterEditor.svelte +174 -120
  44. package/dist/components/composed/search/QuickFilters.svelte +124 -75
  45. package/dist/components/composed/search/SearchBar.svelte +42 -3
  46. package/dist/components/composed/search/SearchResults.svelte +48 -5
  47. package/dist/components/composed/search/SearchResults.svelte.d.ts +17 -17
  48. package/dist/components/layouts/CollapsibleSideBarLayout.svelte +100 -24
  49. package/dist/components/layouts/StableDividedSideBarLayout.svelte +74 -24
  50. package/dist/components/layouts/UnstableDividedSideBarLayout.svelte +140 -57
  51. package/dist/components/simple/buttons/Button.svelte +86 -36
  52. package/dist/components/simple/buttons/LinkButton.svelte +81 -25
  53. package/dist/components/simple/charts/BarChart.svelte +137 -105
  54. package/dist/components/simple/charts/LineChart.svelte +124 -92
  55. package/dist/components/simple/charts/PieChart.svelte +51 -23
  56. package/dist/components/simple/common/CollapsibleDivider.svelte +58 -26
  57. package/dist/components/simple/common/Divider.svelte +2 -1
  58. package/dist/components/simple/common/InfiniteScroll.svelte +60 -34
  59. package/dist/components/simple/common/MediaQuery.svelte +28 -3
  60. package/dist/components/simple/common/Menu.svelte +516 -371
  61. package/dist/components/simple/common/NoData.svelte +18 -4
  62. package/dist/components/simple/common/VerticalDraggableList.svelte +52 -26
  63. package/dist/components/simple/common/VerticalDraggableList.svelte.d.ts +20 -9
  64. package/dist/components/simple/dashboards/DashboardGridShaper.svelte +28 -22
  65. package/dist/components/simple/dates/Calendar.svelte +142 -72
  66. package/dist/components/simple/dates/DatePicker.svelte +138 -71
  67. package/dist/components/simple/dates/MonthSelector.svelte +49 -13
  68. package/dist/components/simple/dates/YearSelector.svelte +73 -30
  69. package/dist/components/simple/dialogs/Dialog.svelte +109 -59
  70. package/dist/components/simple/forms/Autocomplete.svelte +341 -164
  71. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +27 -20
  72. package/dist/components/simple/forms/Checkbox.svelte +57 -29
  73. package/dist/components/simple/forms/FileInput.svelte +103 -58
  74. package/dist/components/simple/forms/FileInputList.svelte +115 -51
  75. package/dist/components/simple/forms/RadioButton.svelte +36 -3
  76. package/dist/components/simple/forms/Select.svelte +30 -3
  77. package/dist/components/simple/forms/SimpleTextField.svelte +94 -4
  78. package/dist/components/simple/forms/Switch.svelte +33 -11
  79. package/dist/components/simple/forms/Textarea.svelte +22 -5
  80. package/dist/components/simple/forms/VerticalSwitch.svelte +19 -2
  81. package/dist/components/simple/forms/VerticalTextSwitch.svelte +35 -3
  82. package/dist/components/simple/lists/BoxList.svelte +42 -11
  83. package/dist/components/simple/lists/ColorInvertedSelector.svelte +83 -25
  84. package/dist/components/simple/lists/HierarchyMenu.svelte +55 -20
  85. package/dist/components/simple/lists/Paginator.svelte +53 -34
  86. package/dist/components/simple/lists/SelectableMenuList.svelte +52 -16
  87. package/dist/components/simple/lists/SelectableVerticalList.svelte +169 -85
  88. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +21 -14
  89. package/dist/components/simple/lists/SidebarMenuList.svelte +127 -79
  90. package/dist/components/simple/lists/SimpleTable.svelte +442 -245
  91. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +31 -22
  92. package/dist/components/simple/loaders/CircularLoader.css +1 -1
  93. package/dist/components/simple/loaders/CircularLoader.svelte +11 -3
  94. package/dist/components/simple/loaders/Skeleton.svelte +3 -2
  95. package/dist/components/simple/media/Avatar.svelte +35 -15
  96. package/dist/components/simple/media/DescriptiveAvatar.svelte +30 -4
  97. package/dist/components/simple/media/FlagIcon.svelte +13 -3
  98. package/dist/components/simple/media/Icon.svelte +21 -6
  99. package/dist/components/simple/navigation/Breadcrumb.svelte +41 -9
  100. package/dist/components/simple/navigation/Chip.svelte +65 -29
  101. package/dist/components/simple/navigation/Drawer.svelte +132 -71
  102. package/dist/components/simple/navigation/HeaderMenu.svelte +69 -25
  103. package/dist/components/simple/navigation/Navigator.svelte +45 -11
  104. package/dist/components/simple/navigation/TabSwitcher.svelte +60 -19
  105. package/dist/components/simple/notifiers/AlertBanner.svelte +59 -11
  106. package/dist/components/simple/progress/ProgressBar.svelte +26 -10
  107. package/dist/components/simple/timeline/SimpleTimeLine.svelte +52 -5
  108. package/dist/components/simple/timeline/SimpleTimeLine.svelte.d.ts +16 -9
  109. package/dist/components/simple/typography/Code.svelte +41 -12
  110. package/dist/stores/layouts/unstableSidebarOpened.d.ts +1 -1
  111. package/dist/stores/layouts/unstableSidebarOpened.js +1 -1
  112. package/dist/stores/theme.js +2 -2
  113. package/dist/utils/filters/builder.d.ts +2 -2
  114. package/dist/utils/filters/builder.js +7 -7
  115. package/dist/utils/filters/modifiers/where.d.ts +1 -1
  116. package/dist/utils/teleporter.js +4 -4
  117. package/package.json +39 -33
@@ -1,316 +1,426 @@
1
- <script lang="ts" module>export {};
1
+ <script lang="ts" module>
2
+ export type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
3
+
4
+ export type LabelMapper = {
5
+ [label: string]: {extended?: string, short: string}
6
+ }
2
7
  </script>
3
8
 
4
- <script lang="ts">import './Filters.css';
5
- import '../../../css/main.css';
6
- import Drawer from '../../simple/navigation/Drawer.svelte';
7
- import Menu from '../../simple/common/Menu.svelte';
8
- import MediaQuery from '../../simple/common/MediaQuery.svelte';
9
- import Button from '../../simple/buttons/Button.svelte';
10
- import Icon from '../../simple/media/Icon.svelte';
11
- import {} from 'svelte';
12
- import { ENGLISH_LABELS_MAPPER, isDateMode, isSelectMode, isStringMode, ITALIAN_LABELS_MAPPER } from '../../../utils/filters/filters';
13
- import SelectableVerticalList from '../../simple/lists/SelectableVerticalList.svelte';
14
- import Chip from '../../simple/navigation/Chip.svelte';
15
- import FilterEditor from './FilterEditor.svelte';
16
- import MobileFilterEditor from './MobileFilterEditor.svelte';
17
- import { fly } from 'svelte/transition';
18
- import Dialog from '../../simple/dialogs/Dialog.svelte';
19
- import Validator from '../../../utils/filters/validator';
20
- import ToolTip from '../common/ToolTip.svelte';
21
- import { DateTime } from 'luxon';
22
- import { TabSwitcher } from '../../..';
23
- let { filters = $bindable([]), lang = 'en', addFilterLabel = lang === 'en' ? "Filters" : "Filtri", cancelFilterLabel = lang === 'en' ? "Cancel" : "Annulla", applyFilterLabel = lang === 'en' ? "Apply filters" : "Applica filtri", showActiveFilters = true, filterTitleLabel = lang === 'en' ? "Filter by" : "Filtra per", dateLocale = lang === 'en' ? 'en' : 'it', betweenSeparator = lang === 'en' ? "and" : "e", trueString = lang === 'en' ? "true" : "vero", falseString = lang === 'en' ? "false" : "falso", editFilterMode = 'one-edit', labelsMapper = lang === 'en'
24
- ? ENGLISH_LABELS_MAPPER
25
- : ITALIAN_LABELS_MAPPER, drawerSpace = '85vh', multiEditTabs, onaddFilterClick, onapplyFilter, onremoveAllFilters, onremoveFilter, customSnippet: customInternalSnippet, customChipSnippet, appendSnippet, contentSnippet, onclick: onclickInternal, onkeydown, } = $props();
26
- let open = $state(false), mobileOpen = $state(false), activator = $state(), localMultiEditTabs = $derived.by(() => {
27
- return filters.some(f => !multiEditTabs?.find(tab => tab.name == f.tabName))
28
- ? undefined
29
- : multiEditTabs;
30
- }), selectedTab = $state(), selectedTabFilters = $derived.by(() => {
31
- return selectedTab
9
+ <script lang="ts">
10
+ import './Filters.css'
11
+ import '../../../css/main.css'
12
+ import Drawer from '../../simple/navigation/Drawer.svelte';
13
+ import Menu from '../../simple/common/Menu.svelte';
14
+ import MediaQuery from '../../simple/common/MediaQuery.svelte';
15
+ import Button from '../../simple/buttons/Button.svelte';
16
+ import Icon from '../../simple/media/Icon.svelte';
17
+ import { type ComponentProps, type Snippet } from 'svelte';
18
+ import { ENGLISH_LABELS_MAPPER, isDateMode, isSelectMode, isStringMode, ITALIAN_LABELS_MAPPER, type DateMode, type Filter, type NumberMode, type SelectMode, type StringMode } from '../../../utils/filters/filters';
19
+ import SelectableVerticalList from '../../simple/lists/SelectableVerticalList.svelte';
20
+ import Chip from '../../simple/navigation/Chip.svelte';
21
+ import type { Locale } from '../../simple/dates/utils';
22
+ import FilterEditor from './FilterEditor.svelte';
23
+ import MobileFilterEditor from './MobileFilterEditor.svelte';
24
+ import { fly } from 'svelte/transition';
25
+ import Dialog from '../../simple/dialogs/Dialog.svelte';
26
+ import Validator from '../../../utils/filters/validator';
27
+ import ToolTip from '../common/ToolTip.svelte';
28
+ import { DateTime } from 'luxon';
29
+ import type { KeyboardEventHandler, MouseEventHandler } from 'svelte/elements';
30
+ import { TabSwitcher } from '../../..';
31
+
32
+ interface Props {
33
+ filters?: Filter[];
34
+ lang?: 'it' | 'en';
35
+ addFilterLabel?: string;
36
+ cancelFilterLabel?: string;
37
+ applyFilterLabel?: string;
38
+ showActiveFilters?: boolean;
39
+ filterTitleLabel?: string;
40
+ dateLocale?: Locale;
41
+ betweenSeparator?: string;
42
+ trueString?: string;
43
+ falseString?: string;
44
+ editFilterMode?: 'one-edit' | 'multi-edit';
45
+ labelsMapper?: LabelMapper;
46
+ drawerSpace?: string
47
+ multiEditTabs?: ComponentProps<typeof TabSwitcher>['tabs']
48
+ onaddFilterClick?: () => void
49
+ onapplyFilter?: () => void
50
+ onremoveAllFilters?: () => void
51
+ onremoveFilter?: (event: {
52
+ detail: {
53
+ filter: Filter
54
+ }
55
+ }) => void
56
+ customSnippet?: Snippet<[{
57
+ filter: Filter | undefined,
58
+ updateFunction: typeof updateFunction,
59
+ mAndDown: boolean
60
+ }]>
61
+ customChipSnippet?: Snippet<[{
62
+ filter: Filter
63
+ }]>
64
+ appendSnippet?: Snippet<[]>
65
+ contentSnippet?: Snippet<[{
66
+ mAndDown: boolean,
67
+ updateMultiFilterValues: typeof updateMultiFilterValues,
68
+ handleRemoveAllFilters: typeof handleRemoveAllFilters,
69
+ filters: Filter[]
70
+ }]>
71
+ onclick?: MouseEventHandler<HTMLDivElement>
72
+ onkeydown?: KeyboardEventHandler<HTMLDivElement>
73
+ }
74
+
75
+ let {
76
+ filters = $bindable([]),
77
+ lang = 'en',
78
+ addFilterLabel = lang === 'en' ? "Filters" : "Filtri",
79
+ cancelFilterLabel = lang === 'en' ? "Cancel" : "Annulla",
80
+ applyFilterLabel = lang === 'en' ? "Apply filters" : "Applica filtri",
81
+ showActiveFilters = true,
82
+ filterTitleLabel = lang === 'en' ? "Filter by" : "Filtra per",
83
+ dateLocale = lang === 'en' ? 'en' : 'it',
84
+ betweenSeparator = lang === 'en' ? "and" : "e",
85
+ trueString = lang === 'en' ? "true" : "vero",
86
+ falseString = lang === 'en' ? "false" : "falso",
87
+ editFilterMode = 'one-edit',
88
+ labelsMapper = lang === 'en'
89
+ ? ENGLISH_LABELS_MAPPER
90
+ : ITALIAN_LABELS_MAPPER,
91
+ drawerSpace = '85vh',
92
+ multiEditTabs,
93
+ onaddFilterClick,
94
+ onapplyFilter,
95
+ onremoveAllFilters,
96
+ onremoveFilter,
97
+ customSnippet: customInternalSnippet,
98
+ customChipSnippet,
99
+ appendSnippet,
100
+ contentSnippet,
101
+ onclick: onclickInternal,
102
+ onkeydown,
103
+ }: Props = $props();
104
+
105
+ let open: boolean = $state(false),
106
+ mobileOpen: boolean = $state(false),
107
+ activator: HTMLElement | undefined = $state(),
108
+ localMultiEditTabs = $derived.by(() => {
109
+ return filters.some(f => !multiEditTabs?.find(tab => tab.name == f.tabName))
110
+ ? undefined
111
+ : multiEditTabs
112
+ }),
113
+ selectedTab: ComponentProps<typeof TabSwitcher>['selected'] = $state(),
114
+ selectedTabFilters: Filter[] = $derived.by(() => {
115
+ return selectedTab
32
116
  ? filters.filter(f => f.tabName == selectedTab)
33
- : filters;
34
- });
35
- function handleAddFilterClick() {
36
- if (onaddFilterClick) {
37
- onaddFilterClick();
117
+ : filters
118
+ })
119
+
120
+ function handleAddFilterClick() {
121
+ if(onaddFilterClick) {
122
+ onaddFilterClick()
38
123
  }
39
- open = true;
40
- mobileOpen = true;
41
- }
42
- let filterOptions = $derived(filters.map((f) => {
124
+ open = true
125
+ mobileOpen = true
126
+ }
127
+
128
+ let filterOptions = $derived(filters.map((f) => {
43
129
  return {
44
- title: f.label,
45
- name: f.name
46
- };
47
- }));
48
- let deletableFilterOptions = $derived(filters.map((f) => {
130
+ title: f.label,
131
+ name: f.name
132
+ }
133
+ }))
134
+
135
+ let deletableFilterOptions = $derived(filters.map((f) => {
49
136
  return {
50
- title: f.label,
51
- name: f.name,
52
- appendIcon: f.active ? 'mdi-delete' : undefined
53
- };
54
- }));
55
- let selected = $state();
56
- let focused = $state();
57
- $effect(() => {
58
- if (!!focused && !open)
59
- focused = undefined;
60
- });
61
- let filterOpened = $state('new');
62
- let filterOptionsListActivator = $state();
63
- let singleFilterActivator = $state();
64
- let singleFilterMenuAnchor = $state('right-center');
65
- let singleFilterMenuOpened = $state(false);
66
- let selectedFilter = $state();
67
- let selectedFilterIndex = $derived(filters.findIndex((f) => { return f.name === selected; }));
68
- $effect(() => {
69
- selectedFilter = selected === undefined ? undefined : filters[selectedFilterIndex];
70
- });
71
- function handleFilterSelection(e, mobile = false) {
72
- if (mobile) {
73
- selected = e.detail.element.name;
74
- singleFilterMenuOpened = true;
137
+ title: f.label,
138
+ name: f.name,
139
+ appendIcon: f.active ? 'mdi-delete' : undefined
75
140
  }
76
- else {
77
- singleFilterActivator = filterOptionsListActivator;
78
- singleFilterMenuAnchor = 'right-center';
79
- singleFilterMenuOpened = true;
80
- selected = e.detail.element.name;
81
- filterOpened = 'new';
141
+ }))
142
+
143
+ let selected: ArrayElement<NonNullable<ComponentProps<typeof SelectableVerticalList>['elements']>>['name'] | undefined = $state()
144
+ let focused: ArrayElement<NonNullable<ComponentProps<typeof SelectableVerticalList>['elements']>>['name'] | undefined = $state()
145
+ $effect(() => {
146
+ if(!!focused && !open) focused = undefined
147
+ })
148
+
149
+ let filterOpened: 'edit' | 'new' = $state('new')
150
+
151
+
152
+ let filterOptionsListActivator: HTMLElement | undefined = $state()
153
+ let singleFilterActivator: HTMLElement | undefined = $state()
154
+ let singleFilterMenuAnchor: 'right-center' | 'bottom-center' = $state('right-center')
155
+ let singleFilterMenuOpened: boolean = $state(false)
156
+
157
+ let selectedFilter : Filter | undefined = $state()
158
+ let selectedFilterIndex = $derived(filters.findIndex((f) => { return f.name === selected }))
159
+ $effect(() => {
160
+ selectedFilter = selected === undefined ? undefined : filters[selectedFilterIndex]
161
+ })
162
+
163
+
164
+ function handleFilterSelection(e: Parameters<NonNullable<ComponentProps<typeof SelectableVerticalList>['onselect']>>[0], mobile: boolean = false) {
165
+ if(mobile) {
166
+ selected = e.detail.element.name
167
+ singleFilterMenuOpened = true;
168
+ } else {
169
+ singleFilterActivator = filterOptionsListActivator
170
+ singleFilterMenuAnchor = 'right-center'
171
+ singleFilterMenuOpened = true;
172
+ selected = e.detail.element.name
173
+ filterOpened = 'new'
82
174
  }
83
- selectedTmpFilter = undefined;
84
- let filter = filters.find(f => f.name === e.detail.element.name);
85
- if (!!filter) {
86
- if (filter.type === 'custom') {
87
- customFilterApplyDisabled = filter.active === undefined || filter.active === false;
88
- }
175
+ selectedTmpFilter = undefined
176
+
177
+ let filter = filters.find(f => f.name === e.detail.element.name)
178
+ if(!!filter) {
179
+ if(filter.type === 'custom') {
180
+ customFilterApplyDisabled = filter.active === undefined || filter.active === false
181
+ }
89
182
  }
90
- }
91
- function handleCancelFilterClick() {
92
- open = false;
93
- mobileOpen = false;
183
+ }
184
+
185
+ function handleCancelFilterClick() {
186
+ open = false
187
+ mobileOpen = false
94
188
  singleFilterMenuOpened = false;
95
- }
96
- function handleApplyFilterClick() {
97
- if (!!selectedFilter && !!selectedTmpFilter) {
98
- selectedFilter = { ...selectedTmpFilter };
99
- selectedFilter.active = true;
100
- filters[selectedFilterIndex] = selectedFilter;
101
- open = false;
102
- mobileOpen = false;
103
- singleFilterMenuOpened = false;
104
- if (onapplyFilter) {
105
- onapplyFilter();
106
- }
189
+ }
190
+
191
+ function handleApplyFilterClick() {
192
+ if(!!selectedFilter && !!selectedTmpFilter) {
193
+ selectedFilter = {...selectedTmpFilter}
194
+ selectedFilter.active = true
195
+ filters[selectedFilterIndex] = selectedFilter
196
+ open = false
197
+ mobileOpen = false
198
+ singleFilterMenuOpened = false;
199
+ if(onapplyFilter) {
200
+ onapplyFilter()
201
+ }
107
202
  }
108
- }
109
- let activeFilters = $derived(filters.filter((f) => f.active));
110
- function handleRemoveFilter(filter) {
111
- let filterIndex = filters.findIndex((f) => f.name === filter.name);
112
- let filterName = filter.name;
113
- filters[filterIndex].active = false;
203
+ }
204
+
205
+ let activeFilters = $derived(filters.filter((f) => f.active))
206
+
207
+ function handleRemoveFilter(filter: { name: string }) {
208
+ let filterIndex = filters.findIndex((f) => f.name === filter.name)
209
+ let filterName = filter.name
210
+ filters[filterIndex].active = false
114
211
  if (tmpFilters[filterName]) {
115
- tmpFilters[filterName].active = false;
212
+ tmpFilters[filterName].active = false
116
213
  }
117
- if (Object.keys(filters[filterIndex]).includes('value')) {
214
+ if(Object.keys(filters[filterIndex]).includes('value')) {
215
+ //@ts-ignore
216
+ filters[filterIndex].value = undefined
217
+ if(!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('value')) {
118
218
  //@ts-ignore
119
- filters[filterIndex].value = undefined;
120
- if (!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('value')) {
121
- //@ts-ignore
122
- tmpFilters[filterName].value = undefined;
123
- }
219
+ tmpFilters[filterName].value = undefined
220
+ }
124
221
  }
125
- if (Object.keys(filters[filterIndex]).includes('from')) {
222
+ if(Object.keys(filters[filterIndex]).includes('from')) {
223
+ //@ts-ignore
224
+ filters[filterIndex].from = undefined
225
+ if(!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('from')) {
126
226
  //@ts-ignore
127
- filters[filterIndex].from = undefined;
128
- if (!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('from')) {
129
- //@ts-ignore
130
- tmpFilters[filterName].from = undefined;
131
- }
227
+ tmpFilters[filterName].from = undefined
228
+ }
132
229
  }
133
- if (Object.keys(filters[filterIndex]).includes('to')) {
230
+ if(Object.keys(filters[filterIndex]).includes('to')) {
231
+ //@ts-ignore
232
+ filters[filterIndex].to = undefined
233
+ if(!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('to')) {
134
234
  //@ts-ignore
135
- filters[filterIndex].to = undefined;
136
- if (!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('to')) {
137
- //@ts-ignore
138
- tmpFilters[filterName].to = undefined;
139
- }
235
+ tmpFilters[filterName].to = undefined
236
+ }
140
237
  }
141
- if (Object.keys(filters[filterIndex]).includes('values')) {
238
+ if(Object.keys(filters[filterIndex]).includes('values')) {
239
+ //@ts-ignore
240
+ filters[filterIndex].values = undefined
241
+ if(!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('values')) {
142
242
  //@ts-ignore
143
- filters[filterIndex].values = undefined;
144
- if (!!tmpFilters[filterName] && Object.keys(tmpFilters[filterName]).includes('values')) {
145
- //@ts-ignore
146
- tmpFilters[filterName].values = undefined;
147
- }
243
+ tmpFilters[filterName].values = undefined
244
+ }
148
245
  }
149
- singleFilterMenuOpened = false;
246
+ singleFilterMenuOpened = false
150
247
  filters = [...filters];
151
- if (onremoveFilter) {
152
- onremoveFilter({
153
- detail: {
154
- filter: filters[filterIndex]
155
- }
156
- });
248
+ if(onremoveFilter) {
249
+ onremoveFilter({
250
+ detail: {
251
+ filter: filters[filterIndex]
252
+ }
253
+ })
157
254
  }
158
- }
159
- let activeFiltersActivators = $state({});
160
- function handleActiveFilterClick(filter) {
161
- singleFilterActivator = activeFiltersActivators[filter.name];
162
- singleFilterMenuAnchor = 'bottom-center';
255
+ }
256
+
257
+ let activeFiltersActivators: Record<string, HTMLElement> = $state({})
258
+ function handleActiveFilterClick(filter: { name: string, type: 'custom' | string }) {
259
+ singleFilterActivator = activeFiltersActivators[filter.name]
260
+ singleFilterMenuAnchor = 'bottom-center'
163
261
  singleFilterMenuOpened = true;
164
- mobileOpen = true;
165
- selected = filter.name;
166
- filterOpened = 'edit';
167
- if (filter.type === 'custom') {
168
- customFilterApplyDisabled = false;
262
+ mobileOpen=true
263
+ selected = filter.name
264
+ filterOpened = 'edit'
265
+
266
+ if(filter.type === 'custom') {
267
+ customFilterApplyDisabled = false
169
268
  }
170
- }
171
- function handleMobileBackTap() {
172
- closeFilterMenu(0);
173
- }
174
- function closeFilterMenu(delay) {
269
+ }
270
+
271
+ function handleMobileBackTap() {
272
+ closeFilterMenu(0)
273
+ }
274
+
275
+ function closeFilterMenu(delay: number) {
175
276
  setTimeout(() => {
176
- singleFilterMenuOpened = false;
177
- }, delay);
178
- }
179
- function handleDeleteIconClick(event) {
180
- let filterIndex = event.detail.index;
181
- let name = filters[filterIndex].name;
182
- handleRemoveFilter({ name });
183
- }
184
- function handleRemoveAllFilters(event) {
185
- if (!!event)
186
- event.stopPropagation();
187
- for (let i = 0; i < filters.length; i += 1) {
188
- filters[i].active = false;
189
- if (Object.keys(filters[i]).includes('value')) {
190
- //@ts-ignore
191
- filters[i].value = undefined;
192
- }
193
- if (Object.keys(filters[i]).includes('from')) {
194
- //@ts-ignore
195
- filters[i].from = undefined;
196
- }
197
- if (Object.keys(filters[i]).includes('to')) {
198
- //@ts-ignore
199
- filters[i].to = undefined;
200
- }
201
- if (Object.keys(filters[i]).includes('values')) {
202
- //@ts-ignore
203
- filters[i].values = undefined;
204
- }
205
- singleFilterMenuOpened = false;
206
- }
207
- filters = filters;
208
- tmpFilters = {};
209
- customToBeInitialized = true;
210
- if (onremoveAllFilters) {
211
- onremoveAllFilters();
277
+ singleFilterMenuOpened = false
278
+ }, delay)
279
+ }
280
+
281
+ function handleDeleteIconClick(event: Parameters<NonNullable<ComponentProps<typeof SelectableVerticalList>['oniconClick']>>[0]) {
282
+ let filterIndex = event.detail.index
283
+ let name = filters[filterIndex].name
284
+ handleRemoveFilter({name})
285
+ }
286
+
287
+ function handleRemoveAllFilters(event?: Parameters<NonNullable<ComponentProps<typeof Icon>['onclick']>>[0]) {
288
+ if(!!event) event.stopPropagation()
289
+ for(let i = 0; i < filters.length; i += 1) {
290
+ filters[i].active = false
291
+ if(Object.keys(filters[i]).includes('value')) {
292
+ //@ts-ignore
293
+ filters[i].value = undefined
294
+ }
295
+ if(Object.keys(filters[i]).includes('from')) {
296
+ //@ts-ignore
297
+ filters[i].from = undefined
298
+ }
299
+ if(Object.keys(filters[i]).includes('to')) {
300
+ //@ts-ignore
301
+ filters[i].to = undefined
302
+ }
303
+ if(Object.keys(filters[i]).includes('values')) {
304
+ //@ts-ignore
305
+ filters[i].values = undefined
306
+ }
307
+ singleFilterMenuOpened = false
212
308
  }
213
- }
214
- function handleMultiEditApplyClick() {
215
- open = false;
216
- mobileOpen = false;
217
- if (onapplyFilter) {
218
- onapplyFilter();
309
+ filters = filters
310
+ tmpFilters = {}
311
+ customToBeInitialized = true
312
+ if(onremoveAllFilters) {
313
+ onremoveAllFilters()
219
314
  }
220
- }
221
- function handleMultiEditRemoveClick() {
222
- handleRemoveAllFilters();
223
- open = false;
224
- mobileOpen = false;
225
- }
226
- let selectedTmpFilter = $state();
227
- let tmpFilters = $state({});
228
- function handleApplyMultiFilterClick() {
229
- for (let i = 0; i < filters.length; i += 1) {
230
- if (!!filters[i] && !!tmpFilters[filters[i].name]) {
231
- filters[i] = { ...tmpFilters[filters[i].name] };
232
- filters[i].active = filters[i].type !== 'custom' ? Validator.isValid(tmpFilters[filters[i].name]) : tmpFilters[filters[i].name].active;
233
- }
315
+ }
316
+
317
+ function handleMultiEditApplyClick() {
318
+ open = false
319
+ mobileOpen = false
320
+ if(onapplyFilter) {
321
+ onapplyFilter()
234
322
  }
235
- filters = filters;
236
- handleMultiEditApplyClick();
237
- }
238
- function updateMultiFilterValues(filterName, newValue, newValid, mode) {
239
- let filter = filters.find(f => f.name === filterName);
240
- if (!filter)
241
- throw new Error('cannot find filter with name ' + filterName);
242
- if (!tmpFilters[filterName])
243
- tmpFilters[filterName] = { ...filter };
244
- let tmpFilter = tmpFilters[filterName];
245
- if ('mode' in tmpFilter && !!mode) {
246
- if (tmpFilter.type == 'date' && isDateMode(mode)) {
247
- tmpFilter.mode = mode;
248
- }
249
- else if (tmpFilter.type == 'number' && isDateMode(mode)) {
250
- tmpFilter.mode = mode;
251
- }
252
- else if (tmpFilter.type == 'string' && isStringMode(mode)) {
253
- tmpFilter.mode = mode;
254
- }
255
- else if (tmpFilter.type == 'select' && isSelectMode(mode)) {
256
- tmpFilter.mode = mode;
257
- }
323
+ }
324
+
325
+ function handleMultiEditRemoveClick() {
326
+ handleRemoveAllFilters()
327
+ open = false
328
+ mobileOpen = false
329
+ }
330
+
331
+ let selectedTmpFilter: Filter | undefined = $state()
332
+
333
+ let tmpFilters: {[filterName: string]: Filter} = $state({})
334
+
335
+ function handleApplyMultiFilterClick() {
336
+ for(let i = 0; i < filters.length; i += 1) {
337
+ if(!!filters[i] && !!tmpFilters[filters[i].name]) {
338
+ filters[i] = {...tmpFilters[filters[i].name]}
339
+ filters[i].active = filters[i].type !== 'custom' ? Validator.isValid(tmpFilters[filters[i].name]) : tmpFilters[filters[i].name].active
340
+ }
258
341
  }
259
- if (tmpFilter.type == 'select') {
260
- tmpFilter.values = newValue;
342
+ filters = filters
343
+ handleMultiEditApplyClick()
344
+ }
345
+
346
+ function updateMultiFilterValues(filterName: string, newValue: any, newValid: boolean, mode?: NumberMode | StringMode | SelectMode | DateMode) {
347
+ let filter = filters.find(f => f.name === filterName)
348
+ if(!filter) throw new Error('cannot find filter with name ' + filterName)
349
+ if(!tmpFilters[filterName]) tmpFilters[filterName] = {...filter}
350
+ let tmpFilter = tmpFilters[filterName]
351
+ if('mode' in tmpFilter && !!mode) {
352
+ if(tmpFilter.type == 'date' && isDateMode(mode)){
353
+ tmpFilter.mode = mode
354
+ }
355
+ else if(tmpFilter.type == 'number' && isDateMode(mode)){
356
+ tmpFilter.mode = mode
357
+ }
358
+ else if(tmpFilter.type == 'string' && isStringMode(mode)){
359
+ tmpFilter.mode = mode
360
+ }
361
+ else if(tmpFilter.type == 'select' && isSelectMode(mode)){
362
+ tmpFilter.mode = mode
363
+ }
261
364
  }
262
- else if ('mode' in tmpFilter && tmpFilter.mode == 'between') {
263
- if (tmpFilter.type == 'date') {
264
- if (newValue.from) {
265
- tmpFilter.from = DateTime.fromJSDate(newValue.from).setLocale('it-IT').startOf('day').toJSDate();
266
- }
267
- if (newValue.to) {
268
- tmpFilter.to = DateTime.fromJSDate(newValue.to).setLocale('it-IT').endOf('day').toJSDate();
269
- }
365
+ if(tmpFilter.type == 'select') {
366
+ tmpFilter.values = newValue
367
+ } else if('mode' in tmpFilter && tmpFilter.mode == 'between') {
368
+ if(tmpFilter.type == 'date'){
369
+ if(newValue.from){
370
+ tmpFilter.from = DateTime.fromJSDate(newValue.from).setLocale('it-IT').startOf('day').toJSDate()
270
371
  }
271
- else {
272
- tmpFilter.from = newValue.from;
273
- tmpFilter.to = newValue.to;
372
+ if(newValue.to){
373
+ tmpFilter.to = DateTime.fromJSDate(newValue.to).setLocale('it-IT').endOf('day').toJSDate()
274
374
  }
375
+ }
376
+ else {
377
+ tmpFilter.from = newValue.from
378
+ tmpFilter.to = newValue.to
379
+ }
380
+ } else {
381
+ tmpFilter.value = newValue
275
382
  }
276
- else {
277
- tmpFilter.value = newValue;
278
- }
279
- tmpFilter.active = newValid;
280
- }
281
- let customToBeInitialized = true;
282
- $effect(() => {
283
- if (customToBeInitialized && !!tmpFilters)
284
- initCustomTmpFilters();
285
- });
286
- function initCustomTmpFilters() {
287
- let customFilters = filters.filter(f => f.type === 'custom');
288
- for (const customFilter of customFilters) {
289
- if (!tmpFilters[customFilter.name]) {
290
- tmpFilters[customFilter.name] = { ...customFilter };
291
- }
383
+ tmpFilter.active = newValid
384
+ }
385
+
386
+ let customToBeInitialized = true
387
+ $effect(() => {
388
+ if(customToBeInitialized && !!tmpFilters) initCustomTmpFilters()
389
+ })
390
+
391
+ function initCustomTmpFilters() {
392
+ let customFilters = filters.filter(f => f.type === 'custom')
393
+ for(const customFilter of customFilters) {
394
+ if(!tmpFilters[customFilter.name]) {
395
+ tmpFilters[customFilter.name] = { ...customFilter }
396
+ }
292
397
  }
293
- customToBeInitialized = false;
294
- }
295
- let customFilterApplyDisabled = $state(true);
296
- function updateFunction(filterName, newValue, newValid) {
297
- let tmpFilter = tmpFilters[filterName];
298
- if (!!tmpFilter && tmpFilter.type == 'custom') {
299
- tmpFilter.value = newValue;
300
- tmpFilter.active = newValid;
301
- selectedTmpFilter = { ...tmpFilter };
302
- customFilterApplyDisabled = !newValid;
398
+ customToBeInitialized = false
399
+ }
400
+
401
+ let customFilterApplyDisabled: boolean = $state(true)
402
+ function updateFunction(filterName: string, newValue: any, newValid: boolean) {
403
+ let tmpFilter = tmpFilters[filterName]
404
+ if(!!tmpFilter && tmpFilter.type == 'custom') {
405
+ tmpFilter.value = newValue
406
+ tmpFilter.active = newValid
407
+ selectedTmpFilter = {...tmpFilter}
408
+ customFilterApplyDisabled = !newValid
303
409
  }
304
- }
305
- let moreItemsActivator = $state();
306
- function onclick(event, stopPropagation = false) {
307
- if (stopPropagation) {
308
- event.stopPropagation();
410
+ }
411
+
412
+ let moreItemsActivator: HTMLElement | undefined = $state()
413
+
414
+ function onclick(event: MouseEvent & {
415
+ currentTarget: EventTarget & HTMLDivElement;
416
+ }, stopPropagation: boolean = false) {
417
+ if(stopPropagation){
418
+ event.stopPropagation()
309
419
  }
310
- if (onclickInternal) {
311
- onclickInternal(event);
420
+ if(onclickInternal) {
421
+ onclickInternal(event)
312
422
  }
313
- }
423
+ }
314
424
  </script>
315
425
 
316
426
  <MediaQuery>