@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,961 +1,1524 @@
1
- <script lang="ts" generics="Item extends {[key: string]: any} = {[key: string]: any}, SubItem extends {[key: string]: any} = {[key: string]: any}">import { Checkbox, Chip, Converter, CountriesAutocomplete, DatePickerTextField, FilterBuilder, FlagIcon, Icon, MediaQuery, ToolTip } from "../../..";
2
- import { DateTime } from "luxon";
3
- import { onMount, tick } from "svelte";
4
- import { fade } from "svelte/transition";
5
- import {} from "../../simple/forms/Autocomplete.svelte";
6
- import Filters from "../search/Filters.svelte";
7
- import ConfirmOrCancelButtons from "../forms/ConfirmOrCancelButtons.svelte";
8
- import InfiniteScroll from "../../simple/common/InfiniteScroll.svelte";
9
- import Autocomplete from "../../simple/forms/Autocomplete.svelte";
10
- import LabelAndSelect from "../forms/LabelAndSelect.svelte";
11
- import LabelAndTextField from "../forms/LabelAndTextField.svelte";
12
- import DynamicFilters from "../search/DynamicFilters.svelte";
13
- import QuickActions, {} from "../common/QuickActions.svelte";
14
- import './DynamicTable.css';
15
- import CircularLoader from "../../simple/loaders/CircularLoader.svelte";
16
- import NoData from "../../simple/common/NoData.svelte";
17
- import SearchBar from "../search/SearchBar.svelte";
18
- import MenuOrDrawer from "../common/MenuOrDrawer.svelte";
19
- import HeadersDrawer from "../common/HeadersDrawer.svelte";
20
- import lodash from "lodash";
21
- const deepEqual = lodash.isEqual;
22
- onMount(() => {
1
+ <script lang="ts" generics="Item extends {[key: string]: any} = {[key: string]: any}, SubItem extends {[key: string]: any} = {[key: string]: any}">
2
+ import {
3
+ Checkbox,
4
+ Chip,
5
+ Converter,
6
+ CountriesAutocomplete,
7
+ DatePickerTextField,
8
+ FilterBuilder,
9
+ FlagIcon,
10
+ Icon,
11
+ MediaQuery,
12
+ ToolTip,
13
+ type PaginatedTable
14
+ } from "../../..";
15
+ import { DateTime } from "luxon";
16
+ import { onMount, tick, type ComponentProps, type Snippet } from "svelte";
17
+ import { fade } from "svelte/transition";
18
+ import { type Item as ItemAutocomplete } from "../../simple/forms/Autocomplete.svelte"
19
+ import Filters from "../search/Filters.svelte";
20
+ import ConfirmOrCancelButtons from "../forms/ConfirmOrCancelButtons.svelte";
21
+ import InfiniteScroll from "../../simple/common/InfiniteScroll.svelte";
22
+ import Autocomplete from "../../simple/forms/Autocomplete.svelte";
23
+ import LabelAndSelect from "../forms/LabelAndSelect.svelte";
24
+ import LabelAndTextField from "../forms/LabelAndTextField.svelte";
25
+ import DynamicFilters from "../search/DynamicFilters.svelte";
26
+ import type { DateMode, Filter, NumberMode, SelectMode, StringMode } from "../../../utils/filters/filters";
27
+ import QuickActions, { type Action } from "../common/QuickActions.svelte";
28
+ import './DynamicTable.css'
29
+ import type { QuickFilter } from "../../../utils/filters/quickFilters";
30
+ import CircularLoader from "../../simple/loaders/CircularLoader.svelte";
31
+ import type { UIEventHandler } from "svelte/elements";
32
+ import NoData from "../../simple/common/NoData.svelte";
33
+ import SearchBar from "../search/SearchBar.svelte";
34
+ import MenuOrDrawer from "../common/MenuOrDrawer.svelte";
35
+ import HeadersDrawer from "../common/HeadersDrawer.svelte";
36
+ import lodash from "lodash";
37
+
38
+ const deepEqual = lodash.isEqual
39
+
40
+ onMount(() => {
23
41
  (async () => {
24
- await tick();
25
- resizeRowAppendHeader();
26
- updateHeaderHeight();
27
- window.addEventListener('resize', updateHeaderHeight);
28
- tableContainer?.addEventListener("scroll", setReachedBottomOrTop);
29
- if (tableContainer?.scrollHeight && tableContainer.clientHeight) {
30
- hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight;
31
- }
32
- for (const head of headers) {
33
- let th = headersHTML[head.value];
34
- if (!!th) {
35
- resizeHeader(th, head);
36
- }
42
+ await tick()
43
+
44
+ resizeRowAppendHeader()
45
+
46
+ updateHeaderHeight();
47
+ window.addEventListener('resize', updateHeaderHeight);
48
+ tableContainer?.addEventListener("scroll", setReachedBottomOrTop);
49
+
50
+ if(tableContainer?.scrollHeight && tableContainer.clientHeight){
51
+ hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight
52
+ }
53
+
54
+ for(const head of headers) {
55
+ let th = headersHTML[head.value]
56
+ if(!!th) {
57
+ resizeHeader(th, head)
37
58
  }
38
- resizeObserver = new ResizeObserver(() => {
39
- if (tableContainer) {
40
- const rect = tableContainer.getBoundingClientRect();
41
- containerWidth = rect.width;
42
- }
43
- calculateStickyMetrics();
44
- updateRemainingWidth();
45
- updateHeaderHeight();
46
- });
59
+ }
60
+
61
+ resizeObserver = new ResizeObserver(() => {
47
62
  if (tableContainer) {
48
- resizeObserver.observe(tableContainer);
63
+ const rect = tableContainer.getBoundingClientRect();
64
+ containerWidth = rect.width;
49
65
  }
50
- })();
66
+
67
+ calculateStickyMetrics();
68
+ updateRemainingWidth();
69
+ updateHeaderHeight();
70
+ });
71
+
72
+ if(tableContainer){
73
+ resizeObserver.observe(tableContainer);
74
+ }
75
+ })()
76
+
51
77
  return () => {
52
- window.removeEventListener('resize', updateHeaderHeight);
53
- tableContainer?.removeEventListener("scroll", setReachedBottomOrTop);
54
- resizeObserver?.disconnect();
55
- };
56
- });
57
- function updateHeaderHeight() {
78
+ window.removeEventListener('resize', updateHeaderHeight);
79
+ tableContainer?.removeEventListener("scroll", setReachedBottomOrTop);
80
+ resizeObserver?.disconnect();
81
+ }
82
+ });
83
+
84
+ function updateHeaderHeight() {
58
85
  if (mainHeader) {
59
- const headerHeight = mainHeader.getBoundingClientRect().height - 1;
60
- document.documentElement.style.setProperty('--main-header-height', headerHeight + 'px');
86
+ const headerHeight = mainHeader.getBoundingClientRect().height - 1;
87
+ document.documentElement.style.setProperty('--main-header-height', headerHeight + 'px');
61
88
  }
62
- }
63
- function setReachedBottomOrTop() {
64
- if (tableContainer) {
65
- reachedBottom = tableContainer.scrollHeight - tableContainer.scrollTop === tableContainer.clientHeight;
66
- reachedTop = tableContainer.scrollTop === 0;
67
- hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight;
89
+ }
90
+
91
+ function setReachedBottomOrTop(){
92
+ if(tableContainer) {
93
+ reachedBottom = tableContainer.scrollHeight - tableContainer.scrollTop === tableContainer.clientHeight
94
+ reachedTop = tableContainer.scrollTop === 0
95
+ hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight
68
96
  }
69
- }
70
- $effect(() => {
71
- if (reachedBottom && rows.length < totalRows) {
72
- setTimeout(() => {
73
- if (reachedBottom) {
74
- handleLoadForward();
75
- }
76
- }, 30);
97
+ }
98
+
99
+ $effect(() => {
100
+ if(reachedBottom && rows.length < totalRows) {
101
+ setTimeout(() => {
102
+ if(reachedBottom) {
103
+ handleLoadForward()
104
+ }
105
+ }, 30)
77
106
  }
78
- });
79
- $effect(() => {
80
- if (reachedTop && currentSectionNumber > 0) {
81
- setTimeout(() => {
82
- if (reachedTop) {
83
- handleLoadBackward();
84
- }
85
- }, 30);
107
+ })
108
+
109
+ $effect(() => {
110
+ if(reachedTop && currentSectionNumber > 0) {
111
+ setTimeout(() => {
112
+ if(reachedTop) {
113
+ handleLoadBackward()
114
+ }
115
+ }, 30)
86
116
  }
87
- });
88
- let { headers = [], headersToShowInTable = $bindable(headers), subHeaders = [], customizeHeaders = false, rows = [], sortedBy = $bindable(), sortDirection = $bindable("asc"), cellEdit = false, lang = "en", dateLocale, noItemsText = lang == 'en' ? "No items to show" : 'Nessun elemento da visualizzare', showSelect = false, showActions = true, selectMode = "single", selectedItems = $bindable([]), unselectedItems = $bindable([]), selectedAll = $bindable(false), showExpand = false, loading = false, disabled = false, filters = $bindable([]), searchBarColumns, searchBarVisible = false, searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...", filtersVisible = false, multiEditTabs, quickFiltersVisible = false, editFilterMode = "one-edit", showActiveFilters = true, quickFilters = [], actionsForSelectedItems = [], quickActionsDisabled = false, totalRows = rows.length, searchText = $bindable(), renderedRowsNumber = 100, sectionRowsNumber = 20, sectionThreshold = 2, backwardThresholdPixel = 100, forwardThresholdPixel = 100, uniqueKey = 'id', numberOfResultsVisible = false, endLineVisible = false, resizableColumns = false, resizedColumnSizeWithPadding = $bindable({}), pinnableColumns, dynamicFilters = true, useSelectedItemsOnly = false, selectedAllDisabled = false, stickyMinContainerWidth = 1024, headerDrawerProps, filterLabels, class: clazz = {}, onapplyCustomQuickFilter, oncellClick, onfetchData, onfiltersChange, onsort, onremoveAllFilters, onremoveCustomQuickFilter, onremoveFilter, onrowClick, onsaveCellEdit, onsaveHeadersToShow, oncolumnResize, searchBarSnippet, customFilterChipSnippet, customFilterSnippet, filterAppendSnippet, onscroll, selectionSnippet: selectionInternalSnippet, itemLabelSnippet: itemLabelInternalSnippet, chipLabelSnippet, headerSnippet, headerLabelSnippet, rowAppendSnippet, customRowSnippet, subRowAppendSnippet, subHeaderLabelSnippet, subHeaderSnippet, subRowActionsSnippet, customSubRowSnippet, customQuickFilterSnippet, appendSnippet, headerDrawerContentSnippet, headerDrawerHeadersToAddSnippet, headerDrawerItemSnippet, } = $props();
89
- let openCellEditor = $state(false), cellEditorActivator = $state(), cellEditorContainer = $state(), cellEditorInfoActive = $state(), saveEditDisabled = $state(false), searchBarInput = $state(undefined), openQuickFilter = $state(false), quickFilterActivator = $state(), quickFilterActive = $state(), globalBuilder = new FilterBuilder(), calendarOpened = $state(false), calendarOpened2 = $state(false), selectedIndexes = [], cellEditorIndexRow = $state(), cellEditorIndexHeader = $state(), cellEditorSubItem = $state(), currentSectionNumber = $state(0), tableBody = $state(), tableContainer = $state(), tableHTML = $state(), headersHTML = $state({}), userScrolling = $state(true), reachedBottom = $state(false), reachedTop = false, resizing = false, remainingWidth = $state(0), hideScrollbar = $state(false), sortModify, mainHeader = $state(), resizeObserver, ignoreSelectAll = rows.length == totalRows && useSelectedItemsOnly, containerWidth = $state(0), totalStickyWidth = $state(0), colspan = $derived.by(() => {
90
- return headersToShowInTable.length +
117
+ })
118
+
119
+ type RowItem = Item & {
120
+ disableEdit?: boolean,
121
+ rowDisableBackgroundColor?: string
122
+ };
123
+
124
+ type SubRowItem = SubItem & {
125
+ disableEdit?: boolean,
126
+ rowDisableBackgroundColor?: string
127
+ };
128
+
129
+ type Row = {
130
+ item: RowItem;
131
+ subItems: SubRowItem[];
132
+ };
133
+
134
+ type MenuStringType = {
135
+ key: "string";
136
+ };
137
+
138
+ type MenuNumberType = {
139
+ key: "number";
140
+ params?: {
141
+ min?: number;
142
+ max?: number;
143
+ };
144
+ };
145
+
146
+ type MenuDateType = {
147
+ key: "date";
148
+ };
149
+
150
+ type MenuSelectType = {
151
+ key: "select";
152
+ params: {
153
+ options: {
154
+ icon?: string;
155
+ value: string | number | undefined;
156
+ id?: number | undefined;
157
+ text: string;
158
+ }[];
159
+ };
160
+ };
161
+
162
+ type MenuBooleanType = {
163
+ key: "boolean";
164
+ };
165
+
166
+ type CellEditorInfoType =
167
+ | MenuStringType
168
+ | MenuNumberType
169
+ | MenuDateType
170
+ | MenuSelectType
171
+ | MenuBooleanType;
172
+
173
+ type CellEditorInfo = {
174
+ title: string;
175
+ description: string;
176
+ type: CellEditorInfoType;
177
+ column: string;
178
+ info?: string;
179
+ };
180
+
181
+ type Headers = NonNullable<ComponentProps<typeof PaginatedTable>["headers"]>;
182
+ type Header = Headers[number] & {
183
+ cellEditorInfo?: CellEditorInfo;
184
+ info?: string;
185
+ };
186
+ type HeaderType = Header["type"];
187
+
188
+ interface Props {
189
+ headers?: Header[];
190
+ headersToShowInTable?: Header[];
191
+ subHeaders?: Header[];
192
+ customizeHeaders?: boolean;
193
+ rows?: Row[];
194
+ sortedBy?: string;
195
+ sortDirection?: "asc" | "desc";
196
+ cellEdit?: boolean;
197
+ noItemsText?: string;
198
+ showSelect?: boolean;
199
+ showActions?: boolean;
200
+ selectMode?: "single" | "multiple";
201
+ selectedItems?: RowItem[];
202
+ unselectedItems?: RowItem[];
203
+ selectedAll?: boolean;
204
+ showExpand?: boolean;
205
+ loading?: boolean;
206
+ disabled?: boolean;
207
+ filters?: ComponentProps<typeof Filters>["filters"];
208
+ multiEditTabs?: ComponentProps<typeof Filters>['multiEditTabs']
209
+ searchBarColumns?: string[];
210
+ searchBarVisible?: boolean;
211
+ searchBarPlaceholder?: string;
212
+ filtersVisible?: boolean;
213
+ quickFiltersVisible?: boolean;
214
+ lang?: "it" | "en";
215
+ dateLocale?: "it" | "en";
216
+ editFilterMode?: "one-edit" | "multi-edit";
217
+ showActiveFilters?: boolean;
218
+ quickFilters?: QuickFilter[];
219
+ actionsForSelectedItems?: Action[];
220
+ quickActionsDisabled?: boolean;
221
+ totalRows?: number;
222
+ searchText?: string;
223
+ renderedRowsNumber?: number;
224
+ sectionRowsNumber?: number;
225
+ sectionThreshold?: number;
226
+ backwardThresholdPixel?: number;
227
+ forwardThresholdPixel?: number;
228
+ uniqueKey?: keyof RowItem;
229
+ numberOfResultsVisible?: boolean;
230
+ endLineVisible?: boolean;
231
+ resizableColumns?: boolean;
232
+ resizedColumnSizeWithPadding?: { [value: string]: number };
233
+ pinnableColumns?: boolean;
234
+ dynamicFilters?: boolean;
235
+ useSelectedItemsOnly?: boolean;
236
+ selectedAllDisabled?: boolean;
237
+ stickyMinContainerWidth?: number;
238
+ headerDrawerProps?: ComponentProps<typeof HeadersDrawer>['drawerProps']
239
+ filterLabels?: Pick<ComponentProps<typeof Filters>,
240
+ 'addFilterLabel' |
241
+ 'applyFilterLabel' |
242
+ 'filterTitleLabel' |
243
+ 'cancelFilterLabel' |
244
+ 'labelsMapper' |
245
+ 'trueString' |
246
+ 'falseString' |
247
+ 'betweenSeparator'
248
+ >
249
+ class?: {
250
+ container?: string;
251
+ header?: string;
252
+ row?: string;
253
+ cell?: string;
254
+ }
255
+ onsort?: (event: {
256
+ detail: {
257
+ sortedBy: string | undefined;
258
+ sortDirection: string;
259
+ }
260
+ }) => void
261
+ onrowClick?: (event: {
262
+ detail: {
263
+ item: RowItem;
264
+ }
265
+ }) => void
266
+ oncellClick?: (event: {
267
+ detail: {
268
+ item: RowItem;
269
+ }
270
+ }) => void
271
+ onsaveCellEdit?: (event: {
272
+ detail: {
273
+ item: any;
274
+ }
275
+ }) => void
276
+ onsaveHeadersToShow?: ComponentProps<typeof HeadersDrawer>['onsaveHeadersToShow']
277
+ onfiltersChange?: (event: {
278
+ detail: {
279
+ builder: FilterBuilder;
280
+ }
281
+ }) => void
282
+ onfetchData?: () => void;
283
+ onremoveFilter?: (event: {
284
+ detail: {
285
+ filter: Filter
286
+ }
287
+ }) => void
288
+ onremoveAllFilters?: () => void;
289
+ onremoveCustomQuickFilter?: (event: {
290
+ detail: {
291
+ quickFilter: QuickFilter
292
+ }
293
+ }) => void
294
+ onapplyCustomQuickFilter?: (event: {
295
+ detail: {
296
+ quickFilter: QuickFilter
297
+ setQuickFilterValue: (quickFilter: QuickFilter, value?: any) => void
298
+ }
299
+ }) => void
300
+ oncolumnResize?: (event: {
301
+ detail: {
302
+ id: string,
303
+ newWidthPx: number
304
+ }
305
+ }) => void
306
+ searchBarSnippet?: Snippet<[{
307
+ handleSearchChange: typeof handleSearchChange
308
+ }]>
309
+ filterAppendSnippet?: ComponentProps<typeof Filters>['appendSnippet']
310
+ customFilterChipSnippet?: ComponentProps<typeof Filters>['customChipSnippet']
311
+ customFilterSnippet?: Snippet<[{
312
+ filter: Filter | undefined,
313
+ mAndDown: boolean;
314
+ updateCustomFilterValues?: Parameters<NonNullable<ComponentProps<typeof Filters>['contentSnippet']>>[0]['updateMultiFilterValues'],
315
+ updateFunction?: Parameters<NonNullable<ComponentProps<typeof Filters>['customSnippet']>>[0]['updateFunction']
316
+ }]>
317
+ onscroll?: UIEventHandler<HTMLDivElement>
318
+ selectionSnippet?: ComponentProps<typeof Autocomplete>['selectionSnippet']
319
+ itemLabelSnippet?: ComponentProps<typeof Autocomplete>['itemLabelSnippet']
320
+ chipLabelSnippet?: Snippet<[{
321
+ selection: ItemAutocomplete
322
+ }]>
323
+ headerSnippet?: Snippet<[{
324
+ header: Header
325
+ }]>
326
+ headerLabelSnippet?: Snippet<[{
327
+ header: Header
328
+ }]>
329
+ rowAppendSnippet?: Snippet<[{
330
+ index: number,
331
+ row?: Row
332
+ }]>
333
+ customRowSnippet?: Snippet<[{
334
+ index: number,
335
+ columnIndex: number,
336
+ header: Header,
337
+ row: Row
338
+ }]>
339
+ subHeaderSnippet?: Snippet<[{
340
+ subHeader: Header
341
+ }]>
342
+ subHeaderLabelSnippet?: Snippet<[{
343
+ subHeader: Header
344
+ }]>
345
+ subRowAppendSnippet?: Snippet<[{
346
+ index: number,
347
+ row?: SubRowItem
348
+ }]>
349
+ subRowActionsSnippet?: Snippet<[{
350
+ index: number,
351
+ row?: SubRowItem
352
+ }]>
353
+ customSubRowSnippet?: Snippet<[{
354
+ index: number,
355
+ columnIndex: number,
356
+ header: Header,
357
+ row: SubRowItem
358
+ }]>
359
+ customQuickFilterSnippet?: Snippet<[{
360
+ quickFilter: QuickFilter,
361
+ setQuickFilterMissingValue: typeof setQuickFilterMissingValue
362
+ }]>
363
+ appendSnippet?: Snippet<[]>
364
+ headerDrawerContentSnippet?: ComponentProps<typeof HeadersDrawer>['contentSnippet']
365
+ headerDrawerHeadersToAddSnippet?: ComponentProps<typeof HeadersDrawer>['headersToAddSnippet']
366
+ headerDrawerItemSnippet?: ComponentProps<typeof HeadersDrawer>['itemSnippet']
367
+ }
368
+
369
+ let {
370
+ headers = [],
371
+ headersToShowInTable = $bindable(headers),
372
+ subHeaders = [],
373
+ customizeHeaders = false,
374
+ rows = [],
375
+ sortedBy = $bindable(),
376
+ sortDirection = $bindable("asc"),
377
+ cellEdit = false,
378
+ lang = "en",
379
+ dateLocale,
380
+ noItemsText = lang == 'en' ? "No items to show" : 'Nessun elemento da visualizzare',
381
+ showSelect = false,
382
+ showActions = true,
383
+ selectMode = "single",
384
+ selectedItems = $bindable([]),
385
+ unselectedItems = $bindable([]),
386
+ selectedAll = $bindable(false),
387
+ showExpand = false,
388
+ loading = false,
389
+ disabled = false,
390
+ filters = $bindable([]),
391
+ searchBarColumns,
392
+ searchBarVisible = false,
393
+ searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...",
394
+ filtersVisible = false,
395
+ multiEditTabs,
396
+ quickFiltersVisible = false,
397
+ editFilterMode = "one-edit",
398
+ showActiveFilters = true,
399
+ quickFilters = [],
400
+ actionsForSelectedItems = [],
401
+ quickActionsDisabled = false,
402
+ totalRows = rows.length,
403
+ searchText = $bindable(),
404
+ renderedRowsNumber = 100,
405
+ sectionRowsNumber = 20,
406
+ sectionThreshold = 2,
407
+ backwardThresholdPixel = 100,
408
+ forwardThresholdPixel = 100,
409
+ uniqueKey = 'id',
410
+ numberOfResultsVisible = false,
411
+ endLineVisible = false,
412
+ resizableColumns = false,
413
+ resizedColumnSizeWithPadding = $bindable({}),
414
+ pinnableColumns,
415
+ dynamicFilters = true,
416
+ useSelectedItemsOnly = false,
417
+ selectedAllDisabled = false,
418
+ stickyMinContainerWidth = 1024,
419
+ headerDrawerProps,
420
+ filterLabels,
421
+ class: clazz = {},
422
+ onapplyCustomQuickFilter,
423
+ oncellClick,
424
+ onfetchData,
425
+ onfiltersChange,
426
+ onsort,
427
+ onremoveAllFilters,
428
+ onremoveCustomQuickFilter,
429
+ onremoveFilter,
430
+ onrowClick,
431
+ onsaveCellEdit,
432
+ onsaveHeadersToShow,
433
+ oncolumnResize,
434
+ searchBarSnippet,
435
+ customFilterChipSnippet,
436
+ customFilterSnippet,
437
+ filterAppendSnippet,
438
+ onscroll,
439
+ selectionSnippet: selectionInternalSnippet,
440
+ itemLabelSnippet: itemLabelInternalSnippet,
441
+ chipLabelSnippet,
442
+ headerSnippet,
443
+ headerLabelSnippet,
444
+ rowAppendSnippet,
445
+ customRowSnippet,
446
+ subRowAppendSnippet,
447
+ subHeaderLabelSnippet,
448
+ subHeaderSnippet,
449
+ subRowActionsSnippet,
450
+ customSubRowSnippet,
451
+ customQuickFilterSnippet,
452
+ appendSnippet,
453
+ headerDrawerContentSnippet,
454
+ headerDrawerHeadersToAddSnippet,
455
+ headerDrawerItemSnippet,
456
+ }: Props = $props();
457
+
458
+ let openCellEditor: boolean = $state(false),
459
+ cellEditorActivator: HTMLElement | undefined = $state(),
460
+ cellEditorContainer: HTMLElement | undefined = $state(),
461
+ cellEditorInfoActive: CellEditorInfo & {
462
+ value?: any;
463
+ item?: RowItem;
464
+ } | undefined = $state(),
465
+ saveEditDisabled: boolean = $state(false),
466
+ searchBarInput: HTMLElement | undefined = $state(undefined),
467
+ openQuickFilter: boolean = $state(false),
468
+ quickFilterActivator: HTMLElement | undefined = $state(),
469
+ quickFilterActive: QuickFilter | undefined = $state(),
470
+ globalBuilder: FilterBuilder = new FilterBuilder(),
471
+ calendarOpened: boolean = $state(false),
472
+ calendarOpened2: boolean = $state(false),
473
+ selectedIndexes: number[] = [],
474
+ cellEditorIndexRow: number | undefined = $state(),
475
+ cellEditorIndexHeader: number | undefined = $state(),
476
+ cellEditorSubItem: boolean | undefined = $state(),
477
+ currentSectionNumber = $state(0),
478
+ tableBody: HTMLElement | undefined = $state(),
479
+ tableContainer: HTMLElement | undefined = $state(),
480
+ tableHTML: HTMLElement | undefined = $state(),
481
+ headersHTML: { [value: string]: HTMLElement } = $state({}),
482
+ userScrolling = $state(true),
483
+ reachedBottom = $state(false),
484
+ reachedTop = false,
485
+ resizing = false,
486
+ remainingWidth = $state(0),
487
+ hideScrollbar = $state(false),
488
+ sortModify: Header['sortModify'],
489
+ mainHeader: Element | undefined = $state(),
490
+ resizeObserver: ResizeObserver,
491
+ ignoreSelectAll = rows.length == totalRows && useSelectedItemsOnly,
492
+ containerWidth: number = $state(0),
493
+ totalStickyWidth: number = $state(0),
494
+ colspan = $derived.by(() => {
495
+ return headersToShowInTable.length +
91
496
  (!!showSelect && !showExpand && rows.length > 0 ? 1 : 0) +
92
497
  (showExpand ? 1 : 0) +
93
498
  (remainingWidth ? 1 : 0) +
94
- (customizeHeaders || rowAppendSnippet ? 1 : 0);
95
- });
96
- let stickyEnabled = $derived.by(() => {
97
- if (containerWidth <= stickyMinContainerWidth)
98
- return false;
99
- if (totalStickyWidth >= containerWidth)
100
- return false;
499
+ (customizeHeaders || rowAppendSnippet ? 1 : 0)
500
+ })
501
+
502
+ let stickyEnabled = $derived.by(() => {
503
+ if (containerWidth <= stickyMinContainerWidth) return false;
504
+ if (totalStickyWidth >= containerWidth) return false;
101
505
  return true;
102
- });
103
- const organizedHeaders = () => {
506
+ });
507
+
508
+ const organizedHeaders = () => {
104
509
  let pinnedFixedHeaders = headers.filter(h => h.pinned).map(h => ({
105
- ...h,
106
- locked: true,
107
- }));
108
- let pinnedByUserHeaders = headersToShowInTable.filter(h => h.pinned
109
- && !pinnedFixedHeaders.find(fixed => fixed.value == h.value));
110
- let otherHeaders = headersToShowInTable.filter(h => !pinnedFixedHeaders.find(fixed => fixed.value == h.value)
111
- && !pinnedByUserHeaders.find(fixed => fixed.value == h.value));
510
+ ...h,
511
+ locked: true,
512
+ }))
513
+ let pinnedByUserHeaders = headersToShowInTable.filter(h =>
514
+ h.pinned
515
+ && !pinnedFixedHeaders.find(fixed => fixed.value == h.value)
516
+ )
517
+ let otherHeaders = headersToShowInTable.filter(h =>
518
+ !pinnedFixedHeaders.find(fixed => fixed.value == h.value)
519
+ && !pinnedByUserHeaders.find(fixed => fixed.value == h.value)
520
+ )
112
521
  return [
113
- ...pinnedFixedHeaders,
114
- ...pinnedByUserHeaders,
115
- ...otherHeaders
522
+ ...pinnedFixedHeaders,
523
+ ...pinnedByUserHeaders,
524
+ ...otherHeaders
116
525
  ];
117
- };
118
- $effect(() => {
119
- if (!deepEqual(organizedHeaders(), headersToShowInTable)) {
120
- headersToShowInTable = organizedHeaders();
526
+ }
527
+
528
+ $effect(() => {
529
+ if(!deepEqual(organizedHeaders(), headersToShowInTable)) {
530
+ headersToShowInTable = organizedHeaders()
121
531
  }
122
- });
123
- function calculateStickyMetrics() {
532
+ });
533
+
534
+ function calculateStickyMetrics() {
124
535
  let width = 0;
536
+
125
537
  const hasPinnedData = headersToShowInTable.find(h => h.pinned);
538
+
126
539
  if (hasPinnedData) {
127
- if (headersHTML['select'])
128
- width += headersHTML['select'].getBoundingClientRect().width;
129
- if (headersHTML['expand'])
130
- width += headersHTML['expand'].getBoundingClientRect().width;
540
+ if (headersHTML['select']) width += headersHTML['select'].getBoundingClientRect().width;
541
+ if (headersHTML['expand']) width += headersHTML['expand'].getBoundingClientRect().width;
131
542
  }
543
+
132
544
  headersToShowInTable.forEach(head => {
133
- if (head.pinned) {
134
- const stored = resizedColumnSizeWithPadding[head.value];
135
- if (stored) {
136
- width += stored;
137
- }
138
- else if (headersHTML[head.value]) {
139
- width += headersHTML[head.value].getBoundingClientRect().width;
140
- }
545
+ if (head.pinned) {
546
+ const stored = resizedColumnSizeWithPadding[head.value];
547
+ if (stored) {
548
+ width += stored;
549
+ } else if (headersHTML[head.value]) {
550
+ width += headersHTML[head.value].getBoundingClientRect().width;
141
551
  }
552
+ }
142
553
  });
554
+
143
555
  if (customizeHeaders && headersHTML['row-append-header']) {
144
- width += headersHTML['row-append-header'].getBoundingClientRect().width;
556
+ width += headersHTML['row-append-header'].getBoundingClientRect().width;
145
557
  }
558
+
146
559
  totalStickyWidth = width;
147
- }
148
- const DEFAULT_MIN_WIDTH_PX = 60, DEFAULT_MAX_WIDTH_PX = 400;
149
- let totalSections = $derived((totalRows - renderedRowsNumber) / sectionRowsNumber);
150
- let hasMoreToRender = $derived(totalSections > currentSectionNumber);
151
- let totalCachedSections = $derived((rows.length - renderedRowsNumber) / sectionRowsNumber);
152
- let renderedRows = $derived(rows.slice(currentSectionNumber * sectionRowsNumber, currentSectionNumber * sectionRowsNumber + renderedRowsNumber));
153
- let openHeaderDrawer = $state(false), availableHeaders = $derived.by(() => {
154
- return !!headers
560
+ }
561
+
562
+ const DEFAULT_MIN_WIDTH_PX = 60,
563
+ DEFAULT_MAX_WIDTH_PX = 400
564
+
565
+ let totalSections = $derived((totalRows - renderedRowsNumber) / sectionRowsNumber)
566
+ let hasMoreToRender = $derived(totalSections > currentSectionNumber)
567
+ let totalCachedSections = $derived((rows.length - renderedRowsNumber) / sectionRowsNumber)
568
+ let renderedRows = $derived(rows.slice(currentSectionNumber * sectionRowsNumber, currentSectionNumber * sectionRowsNumber + renderedRowsNumber))
569
+
570
+ let openHeaderDrawer: boolean = $state(false),
571
+ availableHeaders = $derived.by(() => {
572
+ return !!headers
155
573
  ? headers.filter((h) => {
156
574
  return !headersToShowInTable.find((hst) => hst.value == h.value);
157
- })
158
- : [];
159
- }), infoActivators = $state(Array(headersToShowInTable.length));
160
- let expandedRows = $state([]);
161
- function handleHeaderClick(header) {
575
+ })
576
+ : []
577
+ }),
578
+ infoActivators = $state(Array(headersToShowInTable.length))
579
+
580
+ let expandedRows: Row[] = $state([]);
581
+
582
+ function handleHeaderClick(header: Header) {
162
583
  if (header.sortable && !loading && !resizing) {
163
- if (!!sortedBy && header.value == sortedBy) {
164
- if (sortDirection == "asc")
165
- sortDirection = "desc";
166
- else if (sortDirection == "desc") {
167
- sortedBy = undefined;
168
- sortModify = undefined;
169
- }
170
- }
171
- else {
172
- sortedBy = header.value;
173
- sortDirection = "asc";
174
- sortModify = header.sortModify;
175
- }
176
- handleSearchChange(searchText);
177
- if (onsort) {
178
- onsort({
179
- detail: {
180
- sortedBy,
181
- sortDirection,
182
- }
183
- });
584
+ if (!!sortedBy && header.value == sortedBy) {
585
+ if (sortDirection == "asc") sortDirection = "desc";
586
+ else if (sortDirection == "desc") {
587
+ sortedBy = undefined;
588
+ sortModify = undefined
184
589
  }
590
+ } else {
591
+ sortedBy = header.value;
592
+ sortDirection = "asc";
593
+ sortModify = header.sortModify
594
+ }
595
+
596
+ handleSearchChange(searchText);
597
+
598
+ if(onsort) {
599
+ onsort({
600
+ detail: {
601
+ sortedBy,
602
+ sortDirection,
603
+ }
604
+ })
605
+ }
185
606
  }
186
- }
187
- function handleRowClick(item) {
188
- if (disabled || loading)
189
- return;
190
- if (onrowClick) {
191
- onrowClick({
192
- detail: {
193
- item,
194
- }
195
- });
607
+ }
608
+
609
+ function handleRowClick(item: RowItem) {
610
+ if (disabled || loading) return;
611
+ if(onrowClick) {
612
+ onrowClick({
613
+ detail: {
614
+ item,
615
+ }
616
+ })
196
617
  }
197
- }
198
- function handleCellClick(mouseEvent, item, cellEditorInfo, value, indexRow, indexHeader, subItem) {
199
- if (disabled || loading)
200
- return;
618
+ }
619
+
620
+ function handleCellClick(
621
+ mouseEvent: MouseEvent & {
622
+ currentTarget: EventTarget & HTMLTableCellElement;
623
+ },
624
+ item: RowItem,
625
+ cellEditorInfo?: CellEditorInfo,
626
+ value?: any,
627
+ indexRow?: number,
628
+ indexHeader?: number,
629
+ subItem?: boolean
630
+ ) {
631
+ if (disabled || loading) return;
201
632
  if (cellEdit && cellEditorInfo && !item.disableEdit) {
202
- mouseEvent.stopPropagation();
203
- if (!cellEditorActivator) {
204
- let target = mouseEvent.target;
205
- cellEditorActivator = target;
206
- cellEditorIndexRow = indexRow;
207
- cellEditorIndexHeader = indexHeader;
208
- cellEditorSubItem = subItem;
209
- cellEditorInfoActive = {
210
- ...cellEditorInfo,
211
- value: value,
212
- item: item,
213
- };
214
- openCellEditor = !openCellEditor;
215
- const element = target.getBoundingClientRect();
216
- const windowHeight = window.innerHeight;
217
- const windowWidth = window.innerWidth;
218
- if (openCellEditor) {
219
- setTimeout(() => {
220
- if (windowHeight - element.bottom < 300) {
221
- cellEditorContainer.style.bottom = `${windowHeight - element.top}px`;
222
- }
223
- else {
224
- cellEditorContainer.style.top = `${element.bottom}px`;
225
- }
226
- if (windowWidth - element.right < 400) {
227
- cellEditorContainer.style.right = `${windowWidth - element.left - cellEditorActivator.clientWidth}px`;
228
- }
229
- }, 0);
633
+ mouseEvent.stopPropagation()
634
+ if (!cellEditorActivator) {
635
+ let target = mouseEvent.target as unknown as HTMLElement;
636
+ cellEditorActivator = target;
637
+
638
+ cellEditorIndexRow = indexRow
639
+ cellEditorIndexHeader = indexHeader
640
+ cellEditorSubItem = subItem
641
+
642
+ cellEditorInfoActive = {
643
+ ...cellEditorInfo,
644
+ value: value,
645
+ item: item,
646
+ };
647
+
648
+ openCellEditor = !openCellEditor;
649
+
650
+ const element = target.getBoundingClientRect();
651
+ const windowHeight = window.innerHeight;
652
+ const windowWidth = window.innerWidth;
653
+
654
+ if (openCellEditor) {
655
+ setTimeout(() => {
656
+ if (windowHeight - element.bottom < 300) {
657
+ cellEditorContainer!.style.bottom = `${
658
+ windowHeight - element.top
659
+ }px`;
660
+ } else {
661
+ cellEditorContainer!.style.top = `${element.bottom}px`;
662
+ }
663
+
664
+ if (windowWidth - element.right < 400) {
665
+ cellEditorContainer!.style.right = `${
666
+ windowWidth - element.left - cellEditorActivator!.clientWidth
667
+ }px`;
230
668
  }
669
+ }, 0);
231
670
  }
671
+ }
232
672
  }
233
- if (oncellClick) {
234
- oncellClick({
235
- detail: {
236
- item,
237
- }
238
- });
673
+
674
+ if(oncellClick) {
675
+ oncellClick({
676
+ detail: {
677
+ item,
678
+ }
679
+ })
239
680
  }
240
- }
241
- function handleSaveClick() {
242
- cellEditorIndexHeader = undefined;
243
- cellEditorIndexRow = undefined;
244
- cellEditorSubItem = undefined;
245
- if (onsaveCellEdit) {
246
- onsaveCellEdit({
247
- detail: {
248
- item: cellEditorInfoActive,
249
- }
250
- });
681
+ }
682
+
683
+ function handleSaveClick() {
684
+ cellEditorIndexHeader = undefined
685
+ cellEditorIndexRow = undefined
686
+ cellEditorSubItem = undefined
687
+
688
+ if(onsaveCellEdit) {
689
+ onsaveCellEdit({
690
+ detail: {
691
+ item: cellEditorInfoActive,
692
+ }
693
+ })
251
694
  }
695
+
252
696
  cellEditorActivator = undefined;
253
697
  openCellEditor = false;
254
- }
255
- function handleCancelClick() {
256
- cellEditorIndexHeader = undefined;
257
- cellEditorIndexRow = undefined;
258
- cellEditorSubItem = undefined;
698
+ }
699
+
700
+ function handleCancelClick() {
701
+ cellEditorIndexHeader = undefined
702
+ cellEditorIndexRow = undefined
703
+ cellEditorSubItem = undefined
704
+
259
705
  cellEditorActivator = undefined;
260
706
  openCellEditor = false;
707
+
261
708
  quickFilterActivator = undefined;
262
709
  openQuickFilter = false;
263
- }
264
- function handleSelect(item, shiftKeyPressed) {
265
- let index = -1;
266
- if (selectedAll && !ignoreSelectAll) {
267
- index = unselectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
268
- }
269
- else {
270
- index = selectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
710
+ }
711
+
712
+ function handleSelect(item: Item, shiftKeyPressed: boolean) {
713
+ let index = -1
714
+ if(selectedAll && !ignoreSelectAll) {
715
+ index = unselectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
716
+ } else {
717
+ index = selectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
271
718
  }
272
719
  // if item is not in the selected/unselected items array, add it
273
720
  if (index == -1) {
274
- if (selectMode == "single") {
275
- selectedItems = [item];
276
- selectedIndexes = [rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey])];
277
- }
278
- else if (selectMode == "multiple") {
279
- if (shiftKeyPressed && selectedIndexes.length > 0) {
280
- let lastSelectedIndex = selectedIndexes[selectedIndexes.length - 1], selectedIndex = rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]);
281
- if (selectedIndex != -1) {
282
- if (selectedIndex < lastSelectedIndex) {
283
- let x = lastSelectedIndex;
284
- lastSelectedIndex = selectedIndex - 1;
285
- selectedIndex = x;
286
- }
287
- for (let i = lastSelectedIndex + 1; i <= selectedIndex; i++) {
288
- if (selectedAll && !ignoreSelectAll) {
289
- if (!unselectedItems.find((unselectedItem) => unselectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
290
- unselectedItems = [...unselectedItems, rows[i].item];
291
- }
292
- }
293
- else {
294
- if (!selectedItems.find((selectedItem) => selectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
295
- selectedItems = [...selectedItems, rows[i].item];
296
- }
297
- }
298
- }
299
- }
721
+ if (selectMode == "single") {
722
+ selectedItems = [item];
723
+ selectedIndexes = [rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey])]
724
+ } else if (selectMode == "multiple") {
725
+ if(shiftKeyPressed && selectedIndexes.length > 0) {
726
+ let lastSelectedIndex = selectedIndexes[selectedIndexes.length - 1],
727
+ selectedIndex = rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey])
728
+ if(selectedIndex != -1) {
729
+ if(selectedIndex < lastSelectedIndex) {
730
+ let x = lastSelectedIndex
731
+ lastSelectedIndex = selectedIndex - 1
732
+ selectedIndex = x
300
733
  }
301
- else {
302
- if (selectedAll && !ignoreSelectAll) {
303
- unselectedItems = [...unselectedItems, item];
734
+ for (let i = lastSelectedIndex + 1; i <= selectedIndex; i++) {
735
+ if(selectedAll && !ignoreSelectAll) {
736
+ if(!unselectedItems.find((unselectedItem) => unselectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
737
+ unselectedItems = [...unselectedItems, rows[i].item]
304
738
  }
305
- else {
306
- selectedItems = [...selectedItems, item];
739
+ } else {
740
+ if(!selectedItems.find((selectedItem) => selectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
741
+ selectedItems = [...selectedItems, rows[i].item]
307
742
  }
308
- selectedIndexes.push(rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]));
743
+ }
309
744
  }
310
- }
311
- }
312
- else {
313
- if (selectedAll && !ignoreSelectAll) {
314
- unselectedItems = unselectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
745
+ }
315
746
  }
316
747
  else {
317
- selectedItems = selectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
748
+ if(selectedAll && !ignoreSelectAll) {
749
+ unselectedItems = [...unselectedItems, item];
750
+ } else {
751
+ selectedItems = [...selectedItems, item];
752
+ }
753
+ selectedIndexes.push(rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]))
318
754
  }
319
- selectedIndexes = selectedIndexes.filter(r => r != rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]));
755
+ }
756
+ } else {
757
+ if(selectedAll && !ignoreSelectAll) {
758
+ unselectedItems = unselectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
759
+ } else {
760
+ selectedItems = selectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
761
+ }
762
+ selectedIndexes = selectedIndexes.filter(r => r != rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]))
320
763
  }
321
- }
322
- function handleSelectAll() {
764
+ }
765
+
766
+ function handleSelectAll() {
323
767
  if (selectMode == "multiple") {
324
- if (!selectedAll && ignoreSelectAll) {
325
- selectedItems = rows.map(r => r.item);
326
- }
327
- else {
328
- selectedItems = [];
329
- }
330
- selectedIndexes = [];
331
- unselectedItems = [];
332
- selectedAll = !selectedAll;
768
+ if(!selectedAll && ignoreSelectAll) {
769
+ selectedItems = rows.map(r => r.item)
770
+ }
771
+ else {
772
+ selectedItems = []
773
+ }
774
+ selectedIndexes = []
775
+ unselectedItems = []
776
+ selectedAll = !selectedAll
333
777
  }
334
- }
335
- function expandRow(row) {
778
+ }
779
+
780
+ function expandRow(row: Row) {
336
781
  let index = expandedRows.findIndex((r) => r.item[uniqueKey] == row.item[uniqueKey]);
337
782
  if (index == -1) {
338
- expandedRows = [...expandedRows, row];
783
+ expandedRows = [...expandedRows, row];
784
+ } else {
785
+ expandedRows = expandedRows.filter((r) => r.item[uniqueKey] != row.item[uniqueKey]);
339
786
  }
340
- else {
341
- expandedRows = expandedRows.filter((r) => r.item[uniqueKey] != row.item[uniqueKey]);
342
- }
343
- }
344
- function formatDate(dateTime, dateFormat) {
787
+ }
788
+
789
+ function formatDate(
790
+ dateTime: DateTime,
791
+ dateFormat: Extract<HeaderType, { key: "date" }>["params"]
792
+ ): string {
345
793
  return dateTime.setLocale(dateFormat.locale).toFormat(dateFormat.format);
346
- }
347
- $effect(() => {
348
- if (!!cellEditorInfoActive &&
349
- cellEditorInfoActive.type.key == "number" &&
350
- ((cellEditorInfoActive.type.params?.min != undefined &&
351
- cellEditorInfoActive.value < cellEditorInfoActive.type.params.min) ||
352
- (cellEditorInfoActive.type.params?.max != undefined &&
353
- cellEditorInfoActive.value > cellEditorInfoActive.type.params.max))) {
354
- saveEditDisabled = true;
355
- }
356
- else {
357
- saveEditDisabled = false;
358
- }
359
- });
360
- function searchTextBuilder(searchText) {
361
- let builder;
794
+ }
795
+
796
+ $effect(() => {
797
+ if (
798
+ !!cellEditorInfoActive &&
799
+ cellEditorInfoActive.type.key == "number" &&
800
+ ((cellEditorInfoActive.type.params?.min != undefined &&
801
+ cellEditorInfoActive.value < cellEditorInfoActive.type.params.min) ||
802
+ (cellEditorInfoActive.type.params?.max != undefined &&
803
+ cellEditorInfoActive.value > cellEditorInfoActive.type.params.max))
804
+ ) {
805
+ saveEditDisabled = true;
806
+ } else {
807
+ saveEditDisabled = false;
808
+ }
809
+ })
810
+
811
+ function searchTextBuilder(searchText?: string) {
812
+ let builder: FilterBuilder;
813
+
362
814
  let converter = new Converter();
363
815
  builder = converter.createBuilder({
364
- filters: filters || [],
816
+ filters: filters || [],
365
817
  });
818
+
366
819
  if (!!searchText && !!searchBarColumns && searchBarColumns.length > 0) {
367
- builder.where((b) => {
368
- b.where(searchBarColumns[0], "ilike", "%" + searchText + "%");
369
- for (let i = 1; i < searchBarColumns.length; i += 1) {
370
- b.orWhere(searchBarColumns[i], "ilike", "%" + searchText + "%");
371
- }
372
- });
820
+ builder.where((b) => {
821
+ b.where(searchBarColumns![0], "ilike", "%" + searchText + "%");
822
+ for (let i = 1; i < searchBarColumns!.length; i += 1) {
823
+ b.orWhere(searchBarColumns![i], "ilike", "%" + searchText + "%");
824
+ }
825
+ });
373
826
  }
827
+
374
828
  return builder;
375
- }
376
- let syncTimer;
377
- function handleSearchChange(searchText) {
829
+ }
830
+
831
+ let syncTimer: NodeJS.Timeout;
832
+ function handleSearchChange(searchText: string | undefined) {
378
833
  clearTimeout(syncTimer);
379
834
  syncTimer = setTimeout(async () => {
380
- globalBuilder = searchTextBuilder(searchText);
381
- for (let i = 0; i < quickFilters.length; i++) {
382
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i]);
383
- }
384
- handleFiltersChange();
835
+ globalBuilder = searchTextBuilder(searchText);
836
+ for (let i = 0; i < quickFilters.length; i++) {
837
+ globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i]);
838
+ }
839
+
840
+ handleFiltersChange();
385
841
  }, 800);
386
- }
387
- $effect(() => {
388
- if (searchText != undefined)
389
- handleSearchChange(searchText);
390
- });
391
- function handleFiltersChange() {
392
- if (!!tableContainer) {
393
- userScrolling = false;
394
- currentSectionNumber = 0;
395
- tableContainer.scrollTop = 0;
396
- setTimeout(() => userScrolling = true, 20);
397
- }
842
+ }
843
+
844
+ $effect(() => {
845
+ if (searchText != undefined) handleSearchChange(searchText);
846
+ })
847
+
848
+ function handleFiltersChange() {
849
+ if(!!tableContainer) {
850
+ userScrolling = false
851
+ currentSectionNumber = 0
852
+ tableContainer.scrollTop = 0
853
+ setTimeout(() => userScrolling = true, 20)
854
+ }
855
+
398
856
  if (!!sortedBy) {
399
- if (sortModify) {
400
- globalBuilder = sortModify({ builder: globalBuilder, sortDirection });
401
- }
402
- else {
403
- globalBuilder.orderBy(sortedBy, sortDirection || "asc");
404
- }
857
+ if(sortModify){
858
+ globalBuilder = sortModify({ builder: globalBuilder, sortDirection })
859
+ }
860
+ else {
861
+ globalBuilder.orderBy(sortedBy, sortDirection || "asc");
862
+ }
405
863
  }
406
- if (onfiltersChange) {
407
- onfiltersChange({
408
- detail: {
409
- builder: globalBuilder,
410
- }
411
- });
864
+
865
+ if(onfiltersChange) {
866
+ onfiltersChange({
867
+ detail: {
868
+ builder: globalBuilder,
869
+ }
870
+ })
412
871
  }
413
- }
414
- function handleClearQuickFilter(quickFilter, dispatchFiltersChange = true) {
872
+ }
873
+
874
+ function handleClearQuickFilter(
875
+ quickFilter: QuickFilter,
876
+ dispatchFiltersChange: boolean = true
877
+ ) {
415
878
  if (quickFilter.type.key == 'custom') {
416
- quickFilter.type.value = undefined;
417
- quickFilter.type.missingValue = undefined;
418
- if (dispatchFiltersChange) {
419
- if (onremoveCustomQuickFilter) {
420
- onremoveCustomQuickFilter({
421
- detail: {
422
- quickFilter
423
- }
424
- });
879
+ quickFilter.type.value = undefined;
880
+ quickFilter.type.missingValue = undefined;
881
+ if(dispatchFiltersChange) {
882
+ if(onremoveCustomQuickFilter) {
883
+ onremoveCustomQuickFilter({
884
+ detail: {
885
+ quickFilter
425
886
  }
887
+ })
426
888
  }
889
+ }
427
890
  }
428
891
  else if (quickFilter.type.key == "string") {
429
- quickFilter.type.value = undefined;
430
- quickFilter.type.missingValue = undefined;
431
- }
432
- else if (quickFilter.type.key == "number") {
433
- quickFilter.type.value = undefined;
434
- quickFilter.type.missingValue = undefined;
435
- }
436
- else if (quickFilter.type.key == "boolean") {
437
- quickFilter.type.value = undefined;
438
- }
439
- else if (quickFilter.type.key == "country") {
440
- quickFilter.type.selected = undefined;
441
- quickFilter.type.missingValue = undefined;
442
- }
443
- else if (quickFilter.type.key == "date") {
444
- quickFilter.type.from = undefined;
445
- quickFilter.type.to = undefined;
446
- }
447
- else if (quickFilter.type.key == "multi-select") {
448
- quickFilter.type.values = [];
449
- quickFilter.type.missingValue = false;
450
- quickFilter.type.missingValue = undefined;
892
+ quickFilter.type.value = undefined;
893
+ quickFilter.type.missingValue = undefined;
894
+ } else if (quickFilter.type.key == "number") {
895
+ quickFilter.type.value = undefined;
896
+ quickFilter.type.missingValue = undefined;
897
+ } else if (quickFilter.type.key == "boolean") {
898
+ quickFilter.type.value = undefined;
899
+ } else if (quickFilter.type.key == "country") {
900
+ quickFilter.type.selected = undefined;
901
+ quickFilter.type.missingValue = undefined;
902
+ } else if (quickFilter.type.key == "date") {
903
+ quickFilter.type.from = undefined;
904
+ quickFilter.type.to = undefined;
905
+ } else if (quickFilter.type.key == "multi-select") {
906
+ quickFilter.type.values = [];
907
+ quickFilter.type.missingValue = false;
908
+ quickFilter.type.missingValue = undefined;
451
909
  }
910
+
452
911
  if (dispatchFiltersChange) {
453
- quickFilter.active = false;
912
+ quickFilter.active = false;
454
913
  }
914
+
455
915
  globalBuilder = searchTextBuilder(searchText);
916
+
456
917
  for (let i = 0; i < quickFilters.length; i++) {
457
- if (quickFilters[i].active) {
458
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i], false);
459
- }
918
+ if (quickFilters[i].active) {
919
+ globalBuilder = quickFilterBuilder(
920
+ globalBuilder,
921
+ quickFilters[i],
922
+ false
923
+ );
924
+ }
460
925
  }
926
+
461
927
  if (dispatchFiltersChange) {
462
- quickFilters = quickFilters.map(f => {
463
- if (f.title == quickFilter.title) {
464
- return { ...quickFilter };
465
- }
466
- return f;
467
- });
468
- handleFiltersChange();
928
+ quickFilters = quickFilters.map(f => {
929
+ if (f.title == quickFilter.title) {
930
+ return { ...quickFilter }
931
+ }
932
+ return f
933
+ });
934
+ handleFiltersChange();
469
935
  }
936
+
470
937
  return globalBuilder;
471
- }
472
- function handleSearchBoxKeydown(e) {
938
+ }
939
+
940
+ function handleSearchBoxKeydown(e: KeyboardEvent) {
473
941
  if (e.key == "Enter") {
474
- handleFiltersChange();
942
+ handleFiltersChange();
475
943
  }
476
- }
477
- function handleQuickFilterClick(mouseEvent, quickFilter) {
944
+ }
945
+
946
+ function handleQuickFilterClick(
947
+ mouseEvent: MouseEvent & {
948
+ currentTarget: EventTarget & HTMLButtonElement;
949
+ },
950
+ quickFilter?: QuickFilter
951
+ ) {
478
952
  handleCancelClick();
479
953
  setTimeout(() => {
480
- if (quickFilter) {
481
- if (!quickFilterActivator) {
482
- let target = mouseEvent.target;
483
- quickFilterActivator = target;
484
- quickFilterActive = quickFilter;
485
- openQuickFilter = !openQuickFilter;
486
- }
954
+ if (quickFilter) {
955
+ if (!quickFilterActivator) {
956
+ let target = mouseEvent.target as unknown as HTMLElement;
957
+ quickFilterActivator = target;
958
+ quickFilterActive = quickFilter;
959
+ openQuickFilter = !openQuickFilter;
487
960
  }
961
+ }
488
962
  }, 300);
489
- }
490
- function setQuickFilterMissingValue(quickFilter) {
963
+ }
964
+
965
+ function setQuickFilterMissingValue(quickFilter: QuickFilter) {
491
966
  if (quickFilter.type.key == 'custom') {
492
- quickFilter.type.missingValue = true;
493
- quickFilter.type.value = undefined;
967
+ quickFilter.type.missingValue = true;
968
+ quickFilter.type.value = undefined;
494
969
  }
495
970
  else if (quickFilter.type.key == "multi-select") {
496
- quickFilter.type.missingValue = true;
497
- quickFilter.type.values = [];
498
- }
499
- else if (quickFilter.type.key == "string") {
500
- quickFilter.type.missingValue = true;
501
- quickFilter.type.value = undefined;
502
- }
503
- else if (quickFilter.type.key == "country") {
504
- quickFilter.type.missingValue = true;
505
- quickFilter.type.selected = undefined;
506
- }
507
- else if (quickFilter.type.key == "number") {
508
- quickFilter.type.missingValue = true;
509
- quickFilter.type.value = undefined;
971
+ quickFilter.type.missingValue = true;
972
+ quickFilter.type.values = [];
973
+ } else if (quickFilter.type.key == "string") {
974
+ quickFilter.type.missingValue = true;
975
+ quickFilter.type.value = undefined;
976
+ } else if (quickFilter.type.key == "country") {
977
+ quickFilter.type.missingValue = true;
978
+ quickFilter.type.selected = undefined;
979
+ } else if (quickFilter.type.key == "number") {
980
+ quickFilter.type.missingValue = true;
981
+ quickFilter.type.value = undefined;
510
982
  }
983
+
511
984
  handleApplyClick(quickFilter);
512
- }
513
- function setQuickFilterValue(quickFilter, value) {
985
+ }
986
+
987
+ function setQuickFilterValue(quickFilter: QuickFilter, value?: any) {
514
988
  if (quickFilter.type.key == "custom") {
515
- quickFilter.type.value = value;
516
- }
989
+ quickFilter.type.value = value;
990
+ }
517
991
  else if (quickFilter.type.key == "boolean") {
518
- quickFilter.type.value = value;
519
- }
992
+ quickFilter.type.value = value;
993
+ }
994
+
520
995
  handleApplyClick(quickFilter);
521
- }
522
- function handleApplyClick(quickFilter, dispatchCustomFilterClick = false) {
523
- if (quickFilter.type.key == 'custom' && dispatchCustomFilterClick) {
524
- if (onapplyCustomQuickFilter) {
525
- onapplyCustomQuickFilter({
526
- detail: {
527
- quickFilter,
528
- setQuickFilterValue
529
- }
530
- });
531
- }
996
+ }
997
+
998
+ function handleApplyClick(quickFilter: QuickFilter, dispatchCustomFilterClick: boolean = false) {
999
+ if(quickFilter.type.key == 'custom' && dispatchCustomFilterClick) {
1000
+ if(onapplyCustomQuickFilter) {
1001
+ onapplyCustomQuickFilter({
1002
+ detail: {
1003
+ quickFilter,
1004
+ setQuickFilterValue
1005
+ }
1006
+ })
1007
+ }
532
1008
  }
533
1009
  else {
534
- quickFilter.active = true;
535
- quickFilters = quickFilters.map(f => {
536
- if (f.title == quickFilter.title) {
537
- return { ...quickFilter };
538
- }
539
- return f;
540
- });
541
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilter);
542
- handleFiltersChange();
543
- quickFilterActivator = undefined;
544
- openQuickFilter = false;
1010
+ quickFilter.active = true
1011
+ quickFilters = quickFilters.map(f => {
1012
+ if (f.title == quickFilter.title) {
1013
+ return { ...quickFilter }
1014
+ }
1015
+ return f
1016
+ })
1017
+ globalBuilder = quickFilterBuilder(globalBuilder, quickFilter);
1018
+
1019
+ handleFiltersChange();
1020
+
1021
+ quickFilterActivator = undefined;
1022
+ openQuickFilter = false;
545
1023
  }
546
- }
547
- function quickFilterBuilder(builder, quickFilter, clearPreaviousValue = true) {
1024
+ }
1025
+
1026
+ function quickFilterBuilder(
1027
+ builder: FilterBuilder,
1028
+ quickFilter: QuickFilter,
1029
+ clearPreaviousValue: boolean = true
1030
+ ) {
548
1031
  if (quickFilter.type.key == 'custom') {
549
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
550
- if (clearPreaviousValue) {
551
- builder = handleClearQuickFilter(quickFilter, false);
552
- }
553
- quickFilter.type.value = value;
554
- quickFilter.type.missingValue = missingValue;
555
- builder = quickFilter.type.modify({
556
- builder,
557
- value: { value, missingValue },
558
- });
1032
+ let value = quickFilter.type.value,
1033
+ missingValue = quickFilter.type.missingValue;
1034
+ if (clearPreaviousValue) {
1035
+ builder = handleClearQuickFilter(quickFilter, false);
1036
+ }
1037
+ quickFilter.type.value = value;
1038
+ quickFilter.type.missingValue = missingValue;
1039
+
1040
+ builder = quickFilter.type.modify({
1041
+ builder,
1042
+ value: { value, missingValue },
1043
+ });
559
1044
  }
560
1045
  else if (quickFilter.type.key == "string") {
561
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
562
- if (clearPreaviousValue) {
563
- builder = handleClearQuickFilter(quickFilter, false);
564
- }
565
- quickFilter.type.value = value;
566
- quickFilter.type.missingValue = missingValue;
567
- if (quickFilter.type.modify) {
568
- builder = quickFilter.type.modify({
569
- builder,
570
- value: { value, missingValue },
571
- });
572
- }
573
- if (!!quickFilter.column) {
574
- if (missingValue) {
575
- builder.whereNull(quickFilter.column);
576
- }
577
- else if (!!value) {
578
- builder.where(quickFilter.column, quickFilter.type.mode ?? "equal", value);
579
- }
580
- }
581
- }
582
- else if (quickFilter.type.key == "boolean") {
583
- let value = quickFilter.type.value;
584
- if (clearPreaviousValue) {
585
- builder = handleClearQuickFilter(quickFilter, false);
586
- }
587
- quickFilter.type.value = value;
588
- if (quickFilter.type.modify) {
589
- builder = quickFilter.type.modify({
590
- builder,
591
- value,
592
- });
593
- }
594
- if (!!quickFilter.column && value != undefined) {
595
- builder.where(quickFilter.column, value);
596
- }
597
- }
598
- else if (quickFilter.type.key == "country") {
599
- let value = quickFilter.type.selected, missingValue = quickFilter.type.missingValue;
600
- if (clearPreaviousValue) {
601
- builder = handleClearQuickFilter(quickFilter, false);
602
- }
603
- quickFilter.type.selected = value;
604
- quickFilter.type.missingValue = missingValue;
605
- const values = value?.map((item) => item.value);
606
- if (quickFilter.type.modify) {
607
- builder = quickFilter.type.modify({
608
- builder,
609
- value: { values, missingValue },
610
- });
611
- }
612
- if (!!quickFilter.column) {
613
- if (missingValue) {
614
- builder.whereNull(quickFilter.column);
615
- }
616
- else if (!!values && values.length > 0) {
617
- builder.whereIn(quickFilter.column, values);
618
- }
619
- }
620
- }
621
- else if (quickFilter.type.key == "date") {
622
- let from = quickFilter.type.from, to = quickFilter.type.to;
623
- if (clearPreaviousValue) {
624
- builder = handleClearQuickFilter(quickFilter, false);
625
- }
626
- quickFilter.type.from = from;
627
- quickFilter.type.to = to;
628
- if (quickFilter.type.modify) {
629
- builder = quickFilter.type.modify({
630
- builder,
631
- value: { from, to },
632
- });
633
- }
634
- else if (!!quickFilter.column) {
635
- if (!!from) {
636
- builder.where(quickFilter.column, ">=", DateTime.fromJSDate(from).setLocale('it-IT').startOf('day').toString());
637
- }
638
- if (!!to) {
639
- builder.where(quickFilter.column, "<=", DateTime.fromJSDate(to).setLocale('it-IT').endOf('day').toString());
640
- }
641
- }
642
- }
643
- else if (quickFilter.type.key == "multi-select") {
644
- let value = quickFilter.type.values, missingValue = quickFilter.type.missingValue;
645
- if (clearPreaviousValue) {
646
- builder = handleClearQuickFilter(quickFilter, false);
1046
+ let value = quickFilter.type.value,
1047
+ missingValue = quickFilter.type.missingValue;
1048
+ if (clearPreaviousValue) {
1049
+ builder = handleClearQuickFilter(quickFilter, false);
1050
+ }
1051
+ quickFilter.type.value = value;
1052
+ quickFilter.type.missingValue = missingValue;
1053
+
1054
+ if (quickFilter.type.modify) {
1055
+ builder = quickFilter.type.modify({
1056
+ builder,
1057
+ value: { value, missingValue },
1058
+ });
1059
+ }
1060
+
1061
+ if (!!quickFilter.column) {
1062
+ if (missingValue) {
1063
+ builder.whereNull(quickFilter.column);
1064
+ } else if (!!value) {
1065
+ builder.where(
1066
+ quickFilter.column,
1067
+ quickFilter.type.mode ?? "equal",
1068
+ value
1069
+ );
647
1070
  }
648
- quickFilter.type.values = value;
649
- quickFilter.type.missingValue = missingValue;
650
- const values = value.map(item => item.value);
651
- if (quickFilter.type.modify) {
652
- builder = quickFilter.type.modify({
653
- builder,
654
- value: { values: values, missingValue },
655
- });
1071
+ }
1072
+ } else if (quickFilter.type.key == "boolean") {
1073
+ let value = quickFilter.type.value;
1074
+ if (clearPreaviousValue) {
1075
+ builder = handleClearQuickFilter(quickFilter, false);
1076
+ }
1077
+ quickFilter.type.value = value;
1078
+
1079
+ if (quickFilter.type.modify) {
1080
+ builder = quickFilter.type.modify({
1081
+ builder,
1082
+ value,
1083
+ });
1084
+ }
1085
+
1086
+ if (!!quickFilter.column && value != undefined) {
1087
+ builder.where(quickFilter.column, value);
1088
+ }
1089
+ } else if (quickFilter.type.key == "country") {
1090
+ let value = quickFilter.type.selected,
1091
+ missingValue = quickFilter.type.missingValue;
1092
+ if (clearPreaviousValue) {
1093
+ builder = handleClearQuickFilter(quickFilter, false);
1094
+ }
1095
+ quickFilter.type.selected = value;
1096
+ quickFilter.type.missingValue = missingValue;
1097
+
1098
+ const values = value?.map((item) => item.value);
1099
+ if (quickFilter.type.modify) {
1100
+ builder = quickFilter.type.modify({
1101
+ builder,
1102
+ value: { values, missingValue },
1103
+ });
1104
+ }
1105
+
1106
+ if (!!quickFilter.column) {
1107
+ if (missingValue) {
1108
+ builder.whereNull(quickFilter.column);
1109
+ } else if (!!values && values.length > 0) {
1110
+ builder.whereIn(quickFilter.column, values);
656
1111
  }
657
- else if (quickFilter.column) {
658
- if (missingValue) {
659
- builder.whereNull(quickFilter.column);
660
- }
661
- else if (values.length > 0) {
662
- builder.whereIn(quickFilter.column, values);
663
- }
1112
+ }
1113
+ } else if (quickFilter.type.key == "date") {
1114
+ let from = quickFilter.type.from,
1115
+ to = quickFilter.type.to;
1116
+ if (clearPreaviousValue) {
1117
+ builder = handleClearQuickFilter(quickFilter, false);
1118
+ }
1119
+ quickFilter.type.from = from;
1120
+ quickFilter.type.to = to;
1121
+
1122
+ if (quickFilter.type.modify) {
1123
+ builder = quickFilter.type.modify({
1124
+ builder,
1125
+ value: { from, to },
1126
+ });
1127
+ } else if (!!quickFilter.column) {
1128
+ if (!!from) {
1129
+ builder.where(
1130
+ quickFilter.column,
1131
+ ">=",
1132
+ DateTime.fromJSDate(from).setLocale('it-IT').startOf('day').toString()
1133
+ );
664
1134
  }
665
- }
666
- else if (quickFilter.type.key == "number") {
667
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
668
- if (clearPreaviousValue) {
669
- builder = handleClearQuickFilter(quickFilter, false);
1135
+ if (!!to) {
1136
+ builder.where(
1137
+ quickFilter.column,
1138
+ "<=",
1139
+ DateTime.fromJSDate(to).setLocale('it-IT').endOf('day').toString() );
670
1140
  }
671
- quickFilter.type.value = value;
672
- quickFilter.type.missingValue = missingValue;
673
- if (quickFilter.type.modify) {
674
- builder = quickFilter.type.modify({
675
- builder,
676
- value: { value, missingValue },
677
- });
1141
+ }
1142
+ } else if (quickFilter.type.key == "multi-select") {
1143
+ let value = quickFilter.type.values,
1144
+ missingValue = quickFilter.type.missingValue;
1145
+ if (clearPreaviousValue) {
1146
+ builder = handleClearQuickFilter(quickFilter, false);
1147
+ }
1148
+ quickFilter.type.values = value;
1149
+ quickFilter.type.missingValue = missingValue;
1150
+
1151
+ const values = value.map(item => item.value);
1152
+
1153
+ if (quickFilter.type.modify) {
1154
+ builder = quickFilter.type.modify({
1155
+ builder,
1156
+ value: { values: values, missingValue },
1157
+ });
1158
+ } else if (quickFilter.column) {
1159
+ if (missingValue) {
1160
+ builder.whereNull(quickFilter.column);
1161
+ } else if (values.length > 0) {
1162
+ builder.whereIn(quickFilter.column, values);
678
1163
  }
679
- if (quickFilter.column) {
680
- if (missingValue) {
681
- builder.whereNull(quickFilter.column);
682
- }
683
- else if (!!value) {
684
- builder.where(quickFilter.column, value);
685
- }
1164
+ }
1165
+ } else if (quickFilter.type.key == "number") {
1166
+ let value = quickFilter.type.value,
1167
+ missingValue = quickFilter.type.missingValue;
1168
+ if (clearPreaviousValue) {
1169
+ builder = handleClearQuickFilter(quickFilter, false);
1170
+ }
1171
+ quickFilter.type.value = value;
1172
+ quickFilter.type.missingValue = missingValue;
1173
+
1174
+ if (quickFilter.type.modify) {
1175
+ builder = quickFilter.type.modify({
1176
+ builder,
1177
+ value: { value, missingValue },
1178
+ });
1179
+ }
1180
+
1181
+ if (quickFilter.column) {
1182
+ if (missingValue) {
1183
+ builder.whereNull(quickFilter.column);
1184
+ } else if (!!value) {
1185
+ builder.where(quickFilter.column, value);
686
1186
  }
1187
+ }
687
1188
  }
1189
+
688
1190
  return builder;
689
- }
690
- function updateFilterValues(filter, updateMultiFilterValues) {
691
- let newValue = {}, newValid = false, newMode = filter.type == 'date' ||
1191
+ }
1192
+
1193
+ function updateFilterValues(filter: Filter, updateMultiFilterValues: (filterName: string, newValue: any, newValid: boolean, newMode?: NumberMode | StringMode | SelectMode | DateMode) => void) {
1194
+ let newValue: any = {},
1195
+ newValid: boolean = false,
1196
+ newMode = filter.type == 'date' ||
692
1197
  filter.type == 'number' ||
693
1198
  filter.type == 'select' ||
694
1199
  filter.type == 'string' ?
695
- filter.mode :
696
- undefined;
697
- if (filter.type == 'select') {
698
- newValue = filter.values;
699
- if (newValue.length > 0) {
700
- newValid = true;
701
- }
702
- }
703
- else if ('mode' in filter && filter.mode == 'between') {
704
- newValue.to = filter.to;
705
- newValue.from = filter.from;
706
- if (!!newValue.from || !!newValue.to) {
707
- newValid = true;
708
- }
709
- }
710
- else {
711
- newValue = filter.value;
712
- if (!!newValue) {
713
- newValid = true;
714
- }
715
- }
716
- updateMultiFilterValues(filter.name, newValue, newValid, newMode);
717
- }
718
- function handleRemoveAllFilters() {
719
- if (onremoveAllFilters) {
720
- onremoveAllFilters();
1200
+ filter.mode :
1201
+ undefined
1202
+ if(filter.type == 'select') {
1203
+ newValue = filter.values
1204
+ if(newValue.length > 0) {
1205
+ newValid = true
1206
+ }
1207
+ } else if('mode' in filter && filter.mode == 'between') {
1208
+ newValue.to = filter.to
1209
+ newValue.from = filter.from
1210
+ if(!!newValue.from || !!newValue.to) {
1211
+ newValid = true
1212
+ }
1213
+ } else {
1214
+ newValue = filter.value
1215
+ if(!!newValue) {
1216
+ newValid = true
1217
+ }
1218
+ }
1219
+ updateMultiFilterValues(filter.name, newValue, newValid, newMode)
1220
+ }
1221
+
1222
+ function handleRemoveAllFilters() {
1223
+ if(onremoveAllFilters){
1224
+ onremoveAllFilters()
721
1225
  }
722
1226
  handleSearchChange(searchText);
723
- }
724
- function handleRemoveFilter(filter) {
725
- if (onremoveFilter) {
726
- onremoveFilter({
727
- detail: {
728
- filter
729
- }
730
- });
1227
+ }
1228
+
1229
+ function handleRemoveFilter(filter: Filter) {
1230
+ if(onremoveFilter) {
1231
+ onremoveFilter({
1232
+ detail: {
1233
+ filter
1234
+ }
1235
+ })
731
1236
  }
732
1237
  handleSearchChange(searchText);
733
- }
734
- async function handleLoadForward() {
735
- if (renderedRows.length >= renderedRowsNumber) {
736
- userScrolling = false;
737
- const anchorIndex = renderedRowsNumber - 1;
738
- const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey];
739
- const anchorElement = findAnchorElement(anchorUniqueKey);
740
- const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0;
741
- let removedRowCount = 0;
742
- for (let i = 0; removedRowCount < sectionRowsNumber; i++) {
743
- let row = tableBody?.children.item(i);
744
- removedRowCount++;
745
- const rowKey = row?.getAttribute("data-key");
746
- const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey);
747
- if (isExpanded) {
748
- i++;
749
- }
750
- }
751
- currentSectionNumber = currentSectionNumber + 1;
752
- await tick();
753
- if (tableContainer) {
754
- const anchorElementAfter = findAnchorElement(anchorUniqueKey);
755
- const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0;
756
- const offsetDiff = anchorOffsetAfter - anchorOffsetBefore;
757
- tableContainer.scrollTop += offsetDiff;
758
- userScrolling = true;
1238
+ }
1239
+
1240
+ async function handleLoadForward() {
1241
+ if(renderedRows.length >= renderedRowsNumber) {
1242
+ userScrolling = false
1243
+
1244
+ const anchorIndex = renderedRowsNumber - 1
1245
+ const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey]
1246
+ const anchorElement = findAnchorElement(anchorUniqueKey)
1247
+ const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0
1248
+
1249
+ let removedRowCount = 0
1250
+
1251
+ for (let i = 0; removedRowCount < sectionRowsNumber; i++) {
1252
+ let row = tableBody?.children.item(i)
1253
+ removedRowCount++
1254
+
1255
+ const rowKey = row?.getAttribute("data-key")
1256
+ const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey)
1257
+
1258
+ if (isExpanded) {
1259
+ i++
759
1260
  }
1261
+ }
1262
+
1263
+ currentSectionNumber = currentSectionNumber + 1
1264
+
1265
+ await tick()
1266
+
1267
+ if(tableContainer) {
1268
+ const anchorElementAfter = findAnchorElement(anchorUniqueKey)
1269
+ const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0
1270
+ const offsetDiff = anchorOffsetAfter - anchorOffsetBefore
1271
+ tableContainer.scrollTop += offsetDiff
1272
+
1273
+ userScrolling = true
1274
+ }
760
1275
  }
761
- if (totalCachedSections - sectionThreshold <= currentSectionNumber
762
- && !loading
763
- && totalRows > rows.length) {
764
- if (onfetchData) {
765
- onfetchData();
766
- }
1276
+
1277
+ if(totalCachedSections - sectionThreshold <= currentSectionNumber
1278
+ && !loading
1279
+ && totalRows > rows.length
1280
+ ) {
1281
+ if(onfetchData) {
1282
+ onfetchData()
1283
+ }
767
1284
  }
768
- }
769
- async function handleLoadBackward() {
770
- if (currentSectionNumber > 0) {
771
- userScrolling = false;
772
- const anchorIndex = 0;
773
- const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey];
774
- const anchorElement = findAnchorElement(anchorUniqueKey);
775
- const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0;
776
- let removedRowCount = 0;
777
- for (let i = renderedRows.length - 1; removedRowCount < sectionRowsNumber; i--) {
778
- let row = tableBody?.children.item(i);
779
- removedRowCount++;
780
- const rowKey = row?.getAttribute("data-key");
781
- const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey);
782
- if (isExpanded) {
783
- i--;
784
- }
785
- }
786
- currentSectionNumber = currentSectionNumber - 1;
787
- await tick();
788
- if (tableContainer) {
789
- const anchorElementAfter = findAnchorElement(anchorUniqueKey);
790
- const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0;
791
- const offsetDiff = anchorOffsetAfter - anchorOffsetBefore;
792
- tableContainer.scrollTop += offsetDiff;
793
- userScrolling = true;
1285
+ }
1286
+
1287
+ async function handleLoadBackward() {
1288
+ if(currentSectionNumber > 0) {
1289
+ userScrolling = false
1290
+
1291
+ const anchorIndex = 0
1292
+ const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey]
1293
+ const anchorElement = findAnchorElement(anchorUniqueKey)
1294
+ const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0
1295
+
1296
+ let removedRowCount = 0
1297
+
1298
+ for (let i = renderedRows.length - 1; removedRowCount < sectionRowsNumber; i--) {
1299
+ let row = tableBody?.children.item(i)
1300
+ removedRowCount++
1301
+
1302
+ const rowKey = row?.getAttribute("data-key")
1303
+ const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey)
1304
+
1305
+ if (isExpanded) {
1306
+ i--
794
1307
  }
1308
+ }
1309
+
1310
+ currentSectionNumber = currentSectionNumber - 1
1311
+
1312
+ await tick()
1313
+
1314
+ if(tableContainer) {
1315
+ const anchorElementAfter = findAnchorElement(anchorUniqueKey)
1316
+ const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0
1317
+ const offsetDiff = anchorOffsetAfter - anchorOffsetBefore
1318
+ tableContainer.scrollTop += offsetDiff
1319
+
1320
+ userScrolling = true
1321
+ }
795
1322
  }
796
- }
797
- function findAnchorElement(key) {
798
- if (tableBody) {
799
- for (let i = 0; i < tableBody.children.length; i++) {
800
- const child = tableBody.children.item(i);
801
- if (child?.getAttribute("data-key") == key) {
802
- return child;
803
- }
1323
+ }
1324
+
1325
+ function findAnchorElement(key: keyof RowItem) {
1326
+ if(tableBody) {
1327
+ for (let i = 0; i < tableBody.children.length; i++) {
1328
+ const child = tableBody.children.item(i)
1329
+ if (child?.getAttribute("data-key") == key) {
1330
+ return child
804
1331
  }
1332
+ }
805
1333
  }
806
- return undefined;
807
- }
808
- function resize(node) {
809
- let th = node.parentElement;
810
- let resizingInner = false;
811
- if (!!th) {
812
- let { width } = th.getBoundingClientRect();
813
- function mouseMoveHandler(e) {
814
- if (resizingInner && !!th && !!tableContainer) {
815
- width += e.movementX;
816
- const { paddingLeft, paddingRight } = getComputedStyle(th);
817
- const minWidth = headers.find(h => h.value === th.id)?.minWidth;
818
- let minWidthPx;
819
- if (!!minWidth && minWidth.endsWith('px')) {
820
- minWidthPx = parseInt(minWidth, 10);
821
- }
822
- const maxWidth = headers.find(h => h.value === th.id)?.maxWidth;
823
- let maxWidthPx;
824
- if (!!maxWidth && maxWidth.endsWith('px')) {
825
- maxWidthPx = parseInt(maxWidth, 10);
826
- }
827
- const actualMinWidth = (minWidthPx || DEFAULT_MIN_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
828
- const actualMaxWidth = (maxWidthPx || DEFAULT_MAX_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
829
- if (width > actualMinWidth && width < actualMaxWidth) {
830
- th.style.width = width + 'px';
831
- resizedColumnSizeWithPadding[th.id] = th.getBoundingClientRect().width;
832
- resizedColumnSizeWithPadding = {
833
- ...resizedColumnSizeWithPadding,
834
- };
835
- calculateStickyMetrics();
836
- }
1334
+ return undefined
1335
+ }
1336
+
1337
+ function resize(node: HTMLElement) {
1338
+ let th: HTMLElement | null = node.parentElement
1339
+ let resizingInner = false
1340
+
1341
+ if(!!th) {
1342
+ let { width } = th.getBoundingClientRect()
1343
+
1344
+ function mouseMoveHandler(e: MouseEvent) {
1345
+ if (resizingInner && !!th && !!tableContainer) {
1346
+ width += e.movementX;
1347
+ const { paddingLeft, paddingRight } = getComputedStyle(th);
1348
+
1349
+ const minWidth: string | undefined = headers.find(h => h.value === th.id)?.minWidth;
1350
+ let minWidthPx: number | undefined;
1351
+ if (!!minWidth && minWidth.endsWith('px')) {
1352
+ minWidthPx = parseInt(minWidth, 10);
1353
+ }
1354
+
1355
+ const maxWidth: string | undefined = headers.find(h => h.value === th.id)?.maxWidth;
1356
+ let maxWidthPx: number | undefined;
1357
+ if (!!maxWidth && maxWidth.endsWith('px')) {
1358
+ maxWidthPx = parseInt(maxWidth, 10);
1359
+ }
1360
+
1361
+ const actualMinWidth = (minWidthPx || DEFAULT_MIN_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
1362
+ const actualMaxWidth = (maxWidthPx || DEFAULT_MAX_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
1363
+
1364
+ if (width > actualMinWidth && width < actualMaxWidth) {
1365
+ th.style.width = width + 'px';
1366
+ resizedColumnSizeWithPadding[th.id] = th.getBoundingClientRect().width;
1367
+ resizedColumnSizeWithPadding = {
1368
+ ...resizedColumnSizeWithPadding,
837
1369
  }
1370
+ calculateStickyMetrics();
1371
+ }
838
1372
  }
839
- function mouseUpHandler(e, setResize = true) {
840
- if (!!th) {
841
- resizingInner = false;
842
- let { paddingLeft, paddingRight } = getComputedStyle(th);
843
- width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight);
844
- if (setResize) {
845
- setTimeout(() => resizing = false, 20);
846
- }
847
- if (oncolumnResize) {
848
- oncolumnResize({
849
- detail: {
850
- id: th.id,
851
- newWidthPx: width
852
- }
853
- });
854
- }
855
- calculateStickyMetrics();
856
- }
1373
+ }
1374
+
1375
+
1376
+ function mouseUpHandler(e: MouseEvent, setResize: boolean = true) {
1377
+ if(!!th) {
1378
+ resizingInner = false
1379
+ let { paddingLeft, paddingRight } = getComputedStyle(th)
1380
+ width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight)
1381
+ if(setResize){
1382
+ setTimeout(() => resizing = false, 20)
1383
+ }
1384
+ if(oncolumnResize){
1385
+ oncolumnResize({
1386
+ detail: {
1387
+ id: th.id,
1388
+ newWidthPx: width
1389
+ }
1390
+ })
1391
+ }
1392
+ calculateStickyMetrics();
857
1393
  }
858
- function mouseDownHandler(e) {
859
- if (!!th) {
860
- resizing = true;
861
- resizingInner = true;
862
- let { paddingLeft, paddingRight } = getComputedStyle(th);
863
- width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight);
864
- }
1394
+ }
1395
+
1396
+ function mouseDownHandler(e: MouseEvent) {
1397
+ if(!!th) {
1398
+ resizing = true
1399
+ resizingInner = true
1400
+ let { paddingLeft, paddingRight } = getComputedStyle(th)
1401
+ width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight)
865
1402
  }
866
- node.addEventListener('mousedown', mouseDownHandler);
867
- document.addEventListener('mouseup', mouseUpHandler);
868
- document.addEventListener('mousemove', mouseMoveHandler);
869
- return {
870
- destroy() {
871
- node.removeEventListener('mousedown', mouseDownHandler);
872
- document.removeEventListener('mouseup', mouseUpHandler);
873
- document.removeEventListener('mousemove', mouseMoveHandler);
874
- }
875
- };
1403
+ }
1404
+
1405
+ node.addEventListener('mousedown', mouseDownHandler)
1406
+ document.addEventListener('mouseup', mouseUpHandler)
1407
+ document.addEventListener('mousemove', mouseMoveHandler)
1408
+
1409
+
1410
+ return {
1411
+ destroy() {
1412
+ node.removeEventListener('mousedown', mouseDownHandler)
1413
+ document.removeEventListener('mouseup', mouseUpHandler)
1414
+ document.removeEventListener('mousemove', mouseMoveHandler)
1415
+ }
1416
+ }
876
1417
  }
877
- }
878
- $effect(() => {
1418
+ }
1419
+
1420
+ $effect(() => {
879
1421
  headersToShowInTable;
880
1422
  resizedColumnSizeWithPadding;
881
1423
  showSelect;
882
1424
  showExpand;
883
1425
  tick().then(() => {
884
- calculateStickyMetrics();
885
- updateRemainingWidth();
886
- });
887
- });
888
- async function updateRemainingWidth() {
889
- if (tableContainer != null && !!tableContainer && mainHeader) {
890
- const containerWidth = tableContainer.getBoundingClientRect().width;
891
- if (containerWidth) {
892
- const totalResizableWidth = headersToShowInTable.reduce((sum, head) => {
893
- let th = headersHTML[head.value];
894
- if (!!th) {
895
- resizeHeader(th, head);
896
- }
897
- const width = th?.getBoundingClientRect().width || 0;
898
- return sum + width;
899
- }, 0);
900
- resizeRowAppendHeader();
901
- const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header'))
902
- .reduce((sum, th) => sum + th.getBoundingClientRect().width, 0);
903
- remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth);
904
- }
1426
+ calculateStickyMetrics();
1427
+ updateRemainingWidth();
1428
+ })
1429
+ });
1430
+
1431
+ async function updateRemainingWidth() {
1432
+ if(tableContainer != null && !!tableContainer && mainHeader) {
1433
+ const containerWidth = tableContainer.getBoundingClientRect().width;
1434
+
1435
+ if(containerWidth){
1436
+ const totalResizableWidth = headersToShowInTable.reduce((sum, head) => {
1437
+ let th = headersHTML[head.value]
1438
+ if(!!th) {
1439
+ resizeHeader(th, head)
1440
+ }
1441
+ const width = th?.getBoundingClientRect().width || 0
1442
+ return sum + width;
1443
+ }, 0);
1444
+
1445
+ resizeRowAppendHeader()
1446
+
1447
+ const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header'))
1448
+ .reduce((sum, th) => sum + th.getBoundingClientRect().width, 0);
1449
+
1450
+ remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth);
1451
+ }
905
1452
  }
906
- }
907
- function resizeRowAppendHeader() {
1453
+ }
1454
+
1455
+ function resizeRowAppendHeader() {
908
1456
  if ((customizeHeaders || rowAppendSnippet) && headersHTML['row-append-header']) {
909
- if (!!headersHTML['row-append-header'].style.width && headersHTML['row-append-header'].style.width != "0px") {
910
- return;
911
- }
912
- if (tableHTML) {
913
- tableHTML.style.tableLayout = 'auto';
914
- }
915
- let widthWithPadding = headersHTML['row-append-header'].scrollWidth;
916
- if (tableHTML) {
917
- tableHTML.style.tableLayout = 'fixed';
918
- }
919
- headersHTML['row-append-header'].style.width = `${widthWithPadding}px`;
920
- headersHTML['row-append-header'].style.minWidth = `${widthWithPadding}px`;
1457
+ if(!!headersHTML['row-append-header'].style.width && headersHTML['row-append-header'].style.width != "0px") {
1458
+ return
1459
+ }
1460
+
1461
+ if (tableHTML) {
1462
+ tableHTML.style.tableLayout = 'auto'
1463
+ }
1464
+
1465
+ let widthWithPadding = headersHTML['row-append-header'].scrollWidth
1466
+
1467
+ if (tableHTML) {
1468
+ tableHTML.style.tableLayout = 'fixed'
1469
+ }
1470
+
1471
+ headersHTML['row-append-header'].style.width = `${widthWithPadding}px`;
1472
+ headersHTML['row-append-header'].style.minWidth = `${widthWithPadding}px`;
921
1473
  }
922
- }
923
- function resizeHeader(th, header) {
1474
+ }
1475
+
1476
+ function resizeHeader(th: HTMLElement, header: { value: string, minWidth?: string, maxWidth?: string }){
924
1477
  if (!resizedColumnSizeWithPadding[header.value]) {
925
- if (tableHTML) {
926
- tableHTML.style.tableLayout = 'auto';
927
- }
928
- let widthWithPadding = th.scrollWidth;
929
- if (widthWithPadding == 0) {
930
- return;
931
- }
932
- if (tableHTML) {
933
- tableHTML.style.tableLayout = 'fixed';
934
- }
935
- let minWidth = header.minWidth, minWidthPx = DEFAULT_MIN_WIDTH_PX;
936
- if (!!minWidth && minWidth.endsWith('px')) {
937
- minWidthPx = parseInt(minWidth, 10);
938
- }
939
- if (widthWithPadding < minWidthPx) {
940
- widthWithPadding = minWidthPx;
941
- }
942
- let maxWidth = header.maxWidth, maxWidthPx = DEFAULT_MAX_WIDTH_PX;
943
- if (!!maxWidth && maxWidth.endsWith('px')) {
944
- maxWidthPx = parseInt(maxWidth, 10);
945
- }
946
- if (widthWithPadding > maxWidthPx) {
947
- widthWithPadding = maxWidthPx;
948
- }
949
- resizedColumnSizeWithPadding[header.value] = widthWithPadding;
1478
+
1479
+ if (tableHTML) {
1480
+ tableHTML.style.tableLayout = 'auto'
1481
+ }
1482
+
1483
+ let widthWithPadding = th.scrollWidth
1484
+
1485
+ if (widthWithPadding == 0) {
1486
+ return
1487
+ }
1488
+
1489
+ if (tableHTML) {
1490
+ tableHTML.style.tableLayout = 'fixed'
1491
+ }
1492
+
1493
+ let minWidth = header.minWidth,
1494
+ minWidthPx = DEFAULT_MIN_WIDTH_PX
1495
+ if (!!minWidth && minWidth.endsWith('px')) {
1496
+ minWidthPx = parseInt(minWidth, 10);
1497
+ }
1498
+ if(widthWithPadding < minWidthPx) {
1499
+ widthWithPadding = minWidthPx
1500
+ }
1501
+
1502
+ let maxWidth = header.maxWidth,
1503
+ maxWidthPx = DEFAULT_MAX_WIDTH_PX
1504
+ if (!!maxWidth && maxWidth.endsWith('px')) {
1505
+ maxWidthPx = parseInt(maxWidth, 10);
1506
+ }
1507
+ if(widthWithPadding > maxWidthPx) {
1508
+ widthWithPadding = maxWidthPx
1509
+ }
1510
+
1511
+ resizedColumnSizeWithPadding[header.value] = widthWithPadding;
950
1512
  }
951
1513
  let { paddingLeft, paddingRight } = getComputedStyle(th);
952
1514
  let width = resizedColumnSizeWithPadding[header.value] - parseFloat(paddingLeft) - parseFloat(paddingRight);
953
- th.style.width = `${width}px`;
954
- }
955
- function handleSaveHeadersToShow(event) {
1515
+ th.style.width = `${width}px`
1516
+ }
1517
+
1518
+ function handleSaveHeadersToShow(event: Parameters<NonNullable<ComponentProps<typeof HeadersDrawer>['onsaveHeadersToShow']>>[0]) {
956
1519
  headersToShowInTable = event.detail.headersToShow;
957
- onsaveHeadersToShow?.(event);
958
- }
1520
+ onsaveHeadersToShow?.(event)
1521
+ }
959
1522
  </script>
960
1523
 
961
1524
  {#if !!rows && Array.isArray(rows) && !!headersToShowInTable && Array.isArray(headersToShowInTable)}