@likable-hair/svelte 4.2.4 → 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 (120) 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.css +5 -5
  8. package/dist/components/composed/common/QuickActions.svelte +76 -33
  9. package/dist/components/composed/common/ToolTip.svelte +51 -32
  10. package/dist/components/composed/dashboard/DashboardShaper.svelte +280 -147
  11. package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +54 -45
  12. package/dist/components/composed/forms/AsyncAutocomplete.svelte +81 -30
  13. package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +17 -5
  14. package/dist/components/composed/forms/AvatarDropdown.svelte +146 -70
  15. package/dist/components/composed/forms/AvatarDropdown.svelte.d.ts +27 -22
  16. package/dist/components/composed/forms/ConfirmOrCancelButtons.svelte +65 -19
  17. package/dist/components/composed/forms/CountriesAutocomplete.svelte +33 -4
  18. package/dist/components/composed/forms/DatePickerTextField.svelte +266 -161
  19. package/dist/components/composed/forms/Dropdown.svelte +89 -22
  20. package/dist/components/composed/forms/Dropdown.svelte.d.ts +18 -13
  21. package/dist/components/composed/forms/IconsDropdown.svelte +85 -40
  22. package/dist/components/composed/forms/IconsDropdown.svelte.d.ts +15 -8
  23. package/dist/components/composed/forms/LabelAndSelect.svelte +46 -5
  24. package/dist/components/composed/forms/LabelAndTextField.svelte +56 -3
  25. package/dist/components/composed/forms/PeriodPicker.svelte +38 -18
  26. package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +32 -7
  27. package/dist/components/composed/forms/PeriodSelector.svelte +427 -312
  28. package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +20 -13
  29. package/dist/components/composed/forms/ToggleList.svelte +71 -37
  30. package/dist/components/composed/forms/ToggleList.svelte.d.ts +14 -7
  31. package/dist/components/composed/forms/YearPickerTextField.svelte +154 -82
  32. package/dist/components/composed/list/DynamicTable.svelte +1377 -808
  33. package/dist/components/composed/list/DynamicTable.svelte.d.ts +85 -70
  34. package/dist/components/composed/list/EnhancedPaginatedTable.svelte +75 -32
  35. package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +16 -6
  36. package/dist/components/composed/list/PaginatedTable.svelte +325 -120
  37. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +26 -22
  38. package/dist/components/composed/progress/HorizontalStackedProgress.svelte +67 -29
  39. package/dist/components/composed/search/DynamicFilters.svelte +126 -91
  40. package/dist/components/composed/search/FilterEditor.svelte +178 -115
  41. package/dist/components/composed/search/Filters.svelte +441 -301
  42. package/dist/components/composed/search/GlobalSearchTextField.svelte +102 -42
  43. package/dist/components/composed/search/GlobalSearchTextField.svelte.d.ts +23 -20
  44. package/dist/components/composed/search/MobileFilterEditor.svelte +174 -120
  45. package/dist/components/composed/search/QuickFilters.svelte +133 -23
  46. package/dist/components/composed/search/SearchBar.svelte +42 -3
  47. package/dist/components/composed/search/SearchResults.svelte +48 -5
  48. package/dist/components/composed/search/SearchResults.svelte.d.ts +17 -17
  49. package/dist/components/layouts/CollapsibleSideBarLayout.svelte +100 -24
  50. package/dist/components/layouts/StableDividedSideBarLayout.svelte +74 -24
  51. package/dist/components/layouts/UnstableDividedSideBarLayout.svelte +140 -57
  52. package/dist/components/simple/buttons/Button.svelte +86 -36
  53. package/dist/components/simple/buttons/LinkButton.svelte +81 -25
  54. package/dist/components/simple/charts/BarChart.svelte +137 -105
  55. package/dist/components/simple/charts/LineChart.svelte +124 -92
  56. package/dist/components/simple/charts/PieChart.svelte +51 -23
  57. package/dist/components/simple/common/CollapsibleDivider.svelte +58 -26
  58. package/dist/components/simple/common/Divider.svelte +2 -1
  59. package/dist/components/simple/common/InfiniteScroll.svelte +60 -34
  60. package/dist/components/simple/common/MediaQuery.svelte +28 -3
  61. package/dist/components/simple/common/Menu.svelte +516 -390
  62. package/dist/components/simple/common/NoData.svelte +18 -4
  63. package/dist/components/simple/common/VerticalDraggableList.svelte +52 -26
  64. package/dist/components/simple/common/VerticalDraggableList.svelte.d.ts +20 -9
  65. package/dist/components/simple/dashboards/DashboardGridShaper.svelte +28 -22
  66. package/dist/components/simple/dates/Calendar.svelte +142 -72
  67. package/dist/components/simple/dates/DatePicker.svelte +138 -71
  68. package/dist/components/simple/dates/MonthSelector.svelte +49 -13
  69. package/dist/components/simple/dates/YearSelector.svelte +73 -30
  70. package/dist/components/simple/dialogs/Dialog.svelte +109 -59
  71. package/dist/components/simple/forms/Autocomplete.css +3 -0
  72. package/dist/components/simple/forms/Autocomplete.svelte +366 -164
  73. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +31 -19
  74. package/dist/components/simple/forms/Checkbox.svelte +57 -29
  75. package/dist/components/simple/forms/FileInput.svelte +103 -58
  76. package/dist/components/simple/forms/FileInputList.svelte +115 -51
  77. package/dist/components/simple/forms/RadioButton.svelte +36 -3
  78. package/dist/components/simple/forms/Select.svelte +30 -3
  79. package/dist/components/simple/forms/SimpleTextField.svelte +94 -4
  80. package/dist/components/simple/forms/Switch.svelte +33 -11
  81. package/dist/components/simple/forms/Textarea.svelte +22 -5
  82. package/dist/components/simple/forms/VerticalSwitch.svelte +19 -2
  83. package/dist/components/simple/forms/VerticalTextSwitch.svelte +35 -3
  84. package/dist/components/simple/lists/BoxList.svelte +42 -11
  85. package/dist/components/simple/lists/ColorInvertedSelector.svelte +83 -25
  86. package/dist/components/simple/lists/HierarchyMenu.svelte +55 -20
  87. package/dist/components/simple/lists/Paginator.svelte +53 -34
  88. package/dist/components/simple/lists/SelectableMenuList.svelte +52 -16
  89. package/dist/components/simple/lists/SelectableVerticalList.svelte +169 -85
  90. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +21 -14
  91. package/dist/components/simple/lists/SidebarMenuList.svelte +127 -79
  92. package/dist/components/simple/lists/SimpleTable.svelte +449 -239
  93. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +31 -22
  94. package/dist/components/simple/loaders/CircularLoader.css +1 -1
  95. package/dist/components/simple/loaders/CircularLoader.svelte +11 -3
  96. package/dist/components/simple/loaders/Skeleton.svelte +3 -2
  97. package/dist/components/simple/media/Avatar.svelte +35 -15
  98. package/dist/components/simple/media/DescriptiveAvatar.svelte +30 -4
  99. package/dist/components/simple/media/FlagIcon.svelte +13 -3
  100. package/dist/components/simple/media/Icon.svelte +21 -6
  101. package/dist/components/simple/navigation/Breadcrumb.svelte +41 -9
  102. package/dist/components/simple/navigation/Chip.css +1 -1
  103. package/dist/components/simple/navigation/Chip.svelte +65 -36
  104. package/dist/components/simple/navigation/Drawer.svelte +132 -71
  105. package/dist/components/simple/navigation/HeaderMenu.svelte +69 -25
  106. package/dist/components/simple/navigation/Navigator.svelte +45 -11
  107. package/dist/components/simple/navigation/TabSwitcher.svelte +60 -19
  108. package/dist/components/simple/notifiers/AlertBanner.svelte +59 -11
  109. package/dist/components/simple/progress/ProgressBar.svelte +26 -10
  110. package/dist/components/simple/timeline/SimpleTimeLine.svelte +52 -5
  111. package/dist/components/simple/timeline/SimpleTimeLine.svelte.d.ts +16 -9
  112. package/dist/components/simple/typography/Code.svelte +41 -12
  113. package/dist/stores/layouts/unstableSidebarOpened.d.ts +1 -1
  114. package/dist/stores/layouts/unstableSidebarOpened.js +1 -1
  115. package/dist/stores/theme.js +2 -2
  116. package/dist/utils/filters/builder.d.ts +2 -2
  117. package/dist/utils/filters/builder.js +7 -7
  118. package/dist/utils/filters/modifiers/where.d.ts +1 -1
  119. package/dist/utils/teleporter.js +4 -4
  120. package/package.json +39 -33
@@ -1,951 +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
- if (rowAppendSnippet && headersHTML['row-append-header']) {
26
- const actionCells = tableContainer?.querySelectorAll('.row-append-cell');
27
- if (actionCells && actionCells.length > 0) {
28
- let maxActionWidth = 0;
29
- for (let i = 0; i < actionCells.length; i++) {
30
- const cellContent = actionCells[i];
31
- const width = cellContent.getBoundingClientRect().width;
32
- if (width > maxActionWidth) {
33
- maxActionWidth = width;
34
- }
35
- }
36
- const finalWidth = Math.max(Math.ceil(maxActionWidth), 40);
37
- headersHTML['row-append-header'].style.width = `${finalWidth}px`;
38
- headersHTML['row-append-header'].style.minWidth = `${finalWidth}px`;
39
- }
40
- }
41
- updateHeaderHeight();
42
- window.addEventListener('resize', updateHeaderHeight);
43
- tableContainer?.addEventListener("scroll", setReachedBottomOrTop);
44
- if (tableContainer?.scrollHeight && tableContainer.clientHeight) {
45
- hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight;
46
- }
47
- for (const head of headers) {
48
- let th = headersHTML[head.value];
49
- if (!!th) {
50
- resizeHeader(th, head);
51
- }
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)
52
58
  }
53
- tableHTML?.classList.add('dynamic-resizable');
54
- resizeObserver = new ResizeObserver(() => {
55
- if (tableContainer) {
56
- const rect = tableContainer.getBoundingClientRect();
57
- containerWidth = rect.width;
58
- }
59
- calculateStickyMetrics();
60
- updateRemainingWidth();
61
- updateHeaderHeight();
62
- });
59
+ }
60
+
61
+ resizeObserver = new ResizeObserver(() => {
63
62
  if (tableContainer) {
64
- resizeObserver.observe(tableContainer);
63
+ const rect = tableContainer.getBoundingClientRect();
64
+ containerWidth = rect.width;
65
65
  }
66
- })();
66
+
67
+ calculateStickyMetrics();
68
+ updateRemainingWidth();
69
+ updateHeaderHeight();
70
+ });
71
+
72
+ if(tableContainer){
73
+ resizeObserver.observe(tableContainer);
74
+ }
75
+ })()
76
+
67
77
  return () => {
68
- window.removeEventListener('resize', updateHeaderHeight);
69
- tableContainer?.removeEventListener("scroll", setReachedBottomOrTop);
70
- resizeObserver?.disconnect();
71
- };
72
- });
73
- function updateHeaderHeight() {
78
+ window.removeEventListener('resize', updateHeaderHeight);
79
+ tableContainer?.removeEventListener("scroll", setReachedBottomOrTop);
80
+ resizeObserver?.disconnect();
81
+ }
82
+ });
83
+
84
+ function updateHeaderHeight() {
74
85
  if (mainHeader) {
75
- const headerHeight = mainHeader.getBoundingClientRect().height - 1;
76
- 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');
77
88
  }
78
- }
79
- function setReachedBottomOrTop() {
80
- if (tableContainer) {
81
- reachedBottom = tableContainer.scrollHeight - tableContainer.scrollTop === tableContainer.clientHeight;
82
- reachedTop = tableContainer.scrollTop === 0;
83
- 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
84
96
  }
85
- }
86
- $effect(() => {
87
- if (reachedBottom && rows.length < totalRows) {
88
- setTimeout(() => {
89
- if (reachedBottom) {
90
- handleLoadForward();
91
- }
92
- }, 30);
97
+ }
98
+
99
+ $effect(() => {
100
+ if(reachedBottom && rows.length < totalRows) {
101
+ setTimeout(() => {
102
+ if(reachedBottom) {
103
+ handleLoadForward()
104
+ }
105
+ }, 30)
93
106
  }
94
- });
95
- $effect(() => {
96
- if (reachedTop && currentSectionNumber > 0) {
97
- setTimeout(() => {
98
- if (reachedTop) {
99
- handleLoadBackward();
100
- }
101
- }, 30);
107
+ })
108
+
109
+ $effect(() => {
110
+ if(reachedTop && currentSectionNumber > 0) {
111
+ setTimeout(() => {
112
+ if(reachedTop) {
113
+ handleLoadBackward()
114
+ }
115
+ }, 30)
102
116
  }
103
- });
104
- 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();
105
- 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(() => {
106
- 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 +
107
496
  (!!showSelect && !showExpand && rows.length > 0 ? 1 : 0) +
108
497
  (showExpand ? 1 : 0) +
109
498
  (remainingWidth ? 1 : 0) +
110
- (customizeHeaders || rowAppendSnippet ? 1 : 0);
111
- });
112
- let stickyEnabled = $derived.by(() => {
113
- if (containerWidth <= stickyMinContainerWidth)
114
- return false;
115
- if (totalStickyWidth >= containerWidth)
116
- 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;
117
505
  return true;
118
- });
119
- const organizedHeaders = () => {
506
+ });
507
+
508
+ const organizedHeaders = () => {
120
509
  let pinnedFixedHeaders = headers.filter(h => h.pinned).map(h => ({
121
- ...h,
122
- locked: true,
123
- }));
124
- let pinnedByUserHeaders = headersToShowInTable.filter(h => h.pinned
125
- && !pinnedFixedHeaders.find(fixed => fixed.value == h.value));
126
- let otherHeaders = headersToShowInTable.filter(h => !pinnedFixedHeaders.find(fixed => fixed.value == h.value)
127
- && !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
+ )
128
521
  return [
129
- ...pinnedFixedHeaders,
130
- ...pinnedByUserHeaders,
131
- ...otherHeaders
522
+ ...pinnedFixedHeaders,
523
+ ...pinnedByUserHeaders,
524
+ ...otherHeaders
132
525
  ];
133
- };
134
- $effect(() => {
135
- if (!deepEqual(organizedHeaders(), headersToShowInTable)) {
136
- headersToShowInTable = organizedHeaders();
526
+ }
527
+
528
+ $effect(() => {
529
+ if(!deepEqual(organizedHeaders(), headersToShowInTable)) {
530
+ headersToShowInTable = organizedHeaders()
137
531
  }
138
- });
139
- function calculateStickyMetrics() {
532
+ });
533
+
534
+ function calculateStickyMetrics() {
140
535
  let width = 0;
536
+
141
537
  const hasPinnedData = headersToShowInTable.find(h => h.pinned);
538
+
142
539
  if (hasPinnedData) {
143
- if (headersHTML['select'])
144
- width += headersHTML['select'].getBoundingClientRect().width;
145
- if (headersHTML['expand'])
146
- width += headersHTML['expand'].getBoundingClientRect().width;
540
+ if (headersHTML['select']) width += headersHTML['select'].getBoundingClientRect().width;
541
+ if (headersHTML['expand']) width += headersHTML['expand'].getBoundingClientRect().width;
147
542
  }
543
+
148
544
  headersToShowInTable.forEach(head => {
149
- if (head.pinned) {
150
- const stored = resizedColumnSizeWithPadding[head.value];
151
- if (stored) {
152
- width += stored;
153
- }
154
- else if (headersHTML[head.value]) {
155
- width += headersHTML[head.value].getBoundingClientRect().width;
156
- }
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;
157
551
  }
552
+ }
158
553
  });
554
+
159
555
  if (customizeHeaders && headersHTML['row-append-header']) {
160
- width += headersHTML['row-append-header'].getBoundingClientRect().width;
556
+ width += headersHTML['row-append-header'].getBoundingClientRect().width;
161
557
  }
558
+
162
559
  totalStickyWidth = width;
163
- }
164
- const DEFAULT_MIN_WIDTH_PX = 130, DEFAULT_MAX_WIDTH_PX = 400;
165
- let totalSections = $derived((totalRows - renderedRowsNumber) / sectionRowsNumber);
166
- let hasMoreToRender = $derived(totalSections > currentSectionNumber);
167
- let totalCachedSections = $derived((rows.length - renderedRowsNumber) / sectionRowsNumber);
168
- let renderedRows = $derived(rows.slice(currentSectionNumber * sectionRowsNumber, currentSectionNumber * sectionRowsNumber + renderedRowsNumber));
169
- let openHeaderDrawer = $state(false), availableHeaders = $derived.by(() => {
170
- 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
171
573
  ? headers.filter((h) => {
172
574
  return !headersToShowInTable.find((hst) => hst.value == h.value);
173
- })
174
- : [];
175
- }), infoActivators = $state(Array(headersToShowInTable.length));
176
- let expandedRows = $state([]);
177
- function handleHeaderClick(header) {
575
+ })
576
+ : []
577
+ }),
578
+ infoActivators = $state(Array(headersToShowInTable.length))
579
+
580
+ let expandedRows: Row[] = $state([]);
581
+
582
+ function handleHeaderClick(header: Header) {
178
583
  if (header.sortable && !loading && !resizing) {
179
- if (!!sortedBy && header.value == sortedBy) {
180
- if (sortDirection == "asc")
181
- sortDirection = "desc";
182
- else if (sortDirection == "desc") {
183
- sortedBy = undefined;
184
- sortModify = undefined;
185
- }
186
- }
187
- else {
188
- sortedBy = header.value;
189
- sortDirection = "asc";
190
- sortModify = header.sortModify;
191
- }
192
- handleSearchChange(searchText);
193
- if (onsort) {
194
- onsort({
195
- detail: {
196
- sortedBy,
197
- sortDirection,
198
- }
199
- });
584
+ if (!!sortedBy && header.value == sortedBy) {
585
+ if (sortDirection == "asc") sortDirection = "desc";
586
+ else if (sortDirection == "desc") {
587
+ sortedBy = undefined;
588
+ sortModify = undefined
200
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
+ }
201
606
  }
202
- }
203
- function handleRowClick(item) {
204
- if (disabled || loading)
205
- return;
206
- if (onrowClick) {
207
- onrowClick({
208
- detail: {
209
- item,
210
- }
211
- });
607
+ }
608
+
609
+ function handleRowClick(item: RowItem) {
610
+ if (disabled || loading) return;
611
+ if(onrowClick) {
612
+ onrowClick({
613
+ detail: {
614
+ item,
615
+ }
616
+ })
212
617
  }
213
- }
214
- function handleCellClick(mouseEvent, item, cellEditorInfo, value, indexRow, indexHeader, subItem) {
215
- if (disabled || loading)
216
- 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;
217
632
  if (cellEdit && cellEditorInfo && !item.disableEdit) {
218
- mouseEvent.stopPropagation();
219
- if (!cellEditorActivator) {
220
- let target = mouseEvent.target;
221
- cellEditorActivator = target;
222
- cellEditorIndexRow = indexRow;
223
- cellEditorIndexHeader = indexHeader;
224
- cellEditorSubItem = subItem;
225
- cellEditorInfoActive = {
226
- ...cellEditorInfo,
227
- value: value,
228
- item: item,
229
- };
230
- openCellEditor = !openCellEditor;
231
- const element = target.getBoundingClientRect();
232
- const windowHeight = window.innerHeight;
233
- const windowWidth = window.innerWidth;
234
- if (openCellEditor) {
235
- setTimeout(() => {
236
- if (windowHeight - element.bottom < 300) {
237
- cellEditorContainer.style.bottom = `${windowHeight - element.top}px`;
238
- }
239
- else {
240
- cellEditorContainer.style.top = `${element.bottom}px`;
241
- }
242
- if (windowWidth - element.right < 400) {
243
- cellEditorContainer.style.right = `${windowWidth - element.left - cellEditorActivator.clientWidth}px`;
244
- }
245
- }, 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`;
246
668
  }
669
+ }, 0);
247
670
  }
671
+ }
248
672
  }
249
- if (oncellClick) {
250
- oncellClick({
251
- detail: {
252
- item,
253
- }
254
- });
673
+
674
+ if(oncellClick) {
675
+ oncellClick({
676
+ detail: {
677
+ item,
678
+ }
679
+ })
255
680
  }
256
- }
257
- function handleSaveClick() {
258
- cellEditorIndexHeader = undefined;
259
- cellEditorIndexRow = undefined;
260
- cellEditorSubItem = undefined;
261
- if (onsaveCellEdit) {
262
- onsaveCellEdit({
263
- detail: {
264
- item: cellEditorInfoActive,
265
- }
266
- });
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
+ })
267
694
  }
695
+
268
696
  cellEditorActivator = undefined;
269
697
  openCellEditor = false;
270
- }
271
- function handleCancelClick() {
272
- cellEditorIndexHeader = undefined;
273
- cellEditorIndexRow = undefined;
274
- cellEditorSubItem = undefined;
698
+ }
699
+
700
+ function handleCancelClick() {
701
+ cellEditorIndexHeader = undefined
702
+ cellEditorIndexRow = undefined
703
+ cellEditorSubItem = undefined
704
+
275
705
  cellEditorActivator = undefined;
276
706
  openCellEditor = false;
707
+
277
708
  quickFilterActivator = undefined;
278
709
  openQuickFilter = false;
279
- }
280
- function handleSelect(item, shiftKeyPressed) {
281
- let index = -1;
282
- if (selectedAll && !ignoreSelectAll) {
283
- index = unselectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
284
- }
285
- else {
286
- 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]);
287
718
  }
288
719
  // if item is not in the selected/unselected items array, add it
289
720
  if (index == -1) {
290
- if (selectMode == "single") {
291
- selectedItems = [item];
292
- selectedIndexes = [rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey])];
293
- }
294
- else if (selectMode == "multiple") {
295
- if (shiftKeyPressed && selectedIndexes.length > 0) {
296
- let lastSelectedIndex = selectedIndexes[selectedIndexes.length - 1], selectedIndex = rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]);
297
- if (selectedIndex != -1) {
298
- if (selectedIndex < lastSelectedIndex) {
299
- let x = lastSelectedIndex;
300
- lastSelectedIndex = selectedIndex - 1;
301
- selectedIndex = x;
302
- }
303
- for (let i = lastSelectedIndex + 1; i <= selectedIndex; i++) {
304
- if (selectedAll && !ignoreSelectAll) {
305
- if (!unselectedItems.find((unselectedItem) => unselectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
306
- unselectedItems = [...unselectedItems, rows[i].item];
307
- }
308
- }
309
- else {
310
- if (!selectedItems.find((selectedItem) => selectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
311
- selectedItems = [...selectedItems, rows[i].item];
312
- }
313
- }
314
- }
315
- }
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
316
733
  }
317
- else {
318
- if (selectedAll && !ignoreSelectAll) {
319
- 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]
320
738
  }
321
- else {
322
- selectedItems = [...selectedItems, item];
739
+ } else {
740
+ if(!selectedItems.find((selectedItem) => selectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
741
+ selectedItems = [...selectedItems, rows[i].item]
323
742
  }
324
- selectedIndexes.push(rows.findIndex(r => r.item[uniqueKey] == item[uniqueKey]));
743
+ }
325
744
  }
326
- }
327
- }
328
- else {
329
- if (selectedAll && !ignoreSelectAll) {
330
- unselectedItems = unselectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
745
+ }
331
746
  }
332
747
  else {
333
- 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]))
334
754
  }
335
- 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]))
336
763
  }
337
- }
338
- function handleSelectAll() {
764
+ }
765
+
766
+ function handleSelectAll() {
339
767
  if (selectMode == "multiple") {
340
- if (!selectedAll && ignoreSelectAll) {
341
- selectedItems = rows.map(r => r.item);
342
- }
343
- else {
344
- selectedItems = [];
345
- }
346
- selectedIndexes = [];
347
- unselectedItems = [];
348
- 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
349
777
  }
350
- }
351
- function expandRow(row) {
778
+ }
779
+
780
+ function expandRow(row: Row) {
352
781
  let index = expandedRows.findIndex((r) => r.item[uniqueKey] == row.item[uniqueKey]);
353
782
  if (index == -1) {
354
- expandedRows = [...expandedRows, row];
355
- }
356
- else {
357
- expandedRows = expandedRows.filter((r) => r.item[uniqueKey] != row.item[uniqueKey]);
783
+ expandedRows = [...expandedRows, row];
784
+ } else {
785
+ expandedRows = expandedRows.filter((r) => r.item[uniqueKey] != row.item[uniqueKey]);
358
786
  }
359
- }
360
- function formatDate(dateTime, dateFormat) {
787
+ }
788
+
789
+ function formatDate(
790
+ dateTime: DateTime,
791
+ dateFormat: Extract<HeaderType, { key: "date" }>["params"]
792
+ ): string {
361
793
  return dateTime.setLocale(dateFormat.locale).toFormat(dateFormat.format);
362
- }
363
- $effect(() => {
364
- if (!!cellEditorInfoActive &&
365
- cellEditorInfoActive.type.key == "number" &&
366
- ((cellEditorInfoActive.type.params?.min != undefined &&
367
- cellEditorInfoActive.value < cellEditorInfoActive.type.params.min) ||
368
- (cellEditorInfoActive.type.params?.max != undefined &&
369
- cellEditorInfoActive.value > cellEditorInfoActive.type.params.max))) {
370
- saveEditDisabled = true;
371
- }
372
- else {
373
- saveEditDisabled = false;
374
- }
375
- });
376
- function searchTextBuilder(searchText) {
377
- 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
+
378
814
  let converter = new Converter();
379
815
  builder = converter.createBuilder({
380
- filters: filters || [],
816
+ filters: filters || [],
381
817
  });
818
+
382
819
  if (!!searchText && !!searchBarColumns && searchBarColumns.length > 0) {
383
- builder.where((b) => {
384
- b.where(searchBarColumns[0], "ilike", "%" + searchText + "%");
385
- for (let i = 1; i < searchBarColumns.length; i += 1) {
386
- b.orWhere(searchBarColumns[i], "ilike", "%" + searchText + "%");
387
- }
388
- });
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
+ });
389
826
  }
827
+
390
828
  return builder;
391
- }
392
- let syncTimer;
393
- function handleSearchChange(searchText) {
829
+ }
830
+
831
+ let syncTimer: NodeJS.Timeout;
832
+ function handleSearchChange(searchText: string | undefined) {
394
833
  clearTimeout(syncTimer);
395
834
  syncTimer = setTimeout(async () => {
396
- globalBuilder = searchTextBuilder(searchText);
397
- for (let i = 0; i < quickFilters.length; i++) {
398
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i]);
399
- }
400
- handleFiltersChange();
835
+ globalBuilder = searchTextBuilder(searchText);
836
+ for (let i = 0; i < quickFilters.length; i++) {
837
+ globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i]);
838
+ }
839
+
840
+ handleFiltersChange();
401
841
  }, 800);
402
- }
403
- $effect(() => {
404
- if (searchText != undefined)
405
- handleSearchChange(searchText);
406
- });
407
- function handleFiltersChange() {
408
- if (!!tableContainer) {
409
- userScrolling = false;
410
- currentSectionNumber = 0;
411
- tableContainer.scrollTop = 0;
412
- setTimeout(() => userScrolling = true, 20);
413
- }
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
+
414
856
  if (!!sortedBy) {
415
- if (sortModify) {
416
- globalBuilder = sortModify({ builder: globalBuilder, sortDirection });
417
- }
418
- else {
419
- globalBuilder.orderBy(sortedBy, sortDirection || "asc");
420
- }
857
+ if(sortModify){
858
+ globalBuilder = sortModify({ builder: globalBuilder, sortDirection })
859
+ }
860
+ else {
861
+ globalBuilder.orderBy(sortedBy, sortDirection || "asc");
862
+ }
421
863
  }
422
- if (onfiltersChange) {
423
- onfiltersChange({
424
- detail: {
425
- builder: globalBuilder,
426
- }
427
- });
864
+
865
+ if(onfiltersChange) {
866
+ onfiltersChange({
867
+ detail: {
868
+ builder: globalBuilder,
869
+ }
870
+ })
428
871
  }
429
- }
430
- function handleClearQuickFilter(quickFilter, dispatchFiltersChange = true) {
872
+ }
873
+
874
+ function handleClearQuickFilter(
875
+ quickFilter: QuickFilter,
876
+ dispatchFiltersChange: boolean = true
877
+ ) {
431
878
  if (quickFilter.type.key == 'custom') {
432
- quickFilter.type.value = undefined;
433
- quickFilter.type.missingValue = undefined;
434
- if (dispatchFiltersChange) {
435
- if (onremoveCustomQuickFilter) {
436
- onremoveCustomQuickFilter({
437
- detail: {
438
- quickFilter
439
- }
440
- });
879
+ quickFilter.type.value = undefined;
880
+ quickFilter.type.missingValue = undefined;
881
+ if(dispatchFiltersChange) {
882
+ if(onremoveCustomQuickFilter) {
883
+ onremoveCustomQuickFilter({
884
+ detail: {
885
+ quickFilter
441
886
  }
887
+ })
442
888
  }
889
+ }
443
890
  }
444
891
  else if (quickFilter.type.key == "string") {
445
- quickFilter.type.value = undefined;
446
- quickFilter.type.missingValue = undefined;
447
- }
448
- else if (quickFilter.type.key == "number") {
449
- quickFilter.type.value = undefined;
450
- quickFilter.type.missingValue = undefined;
451
- }
452
- else if (quickFilter.type.key == "boolean") {
453
- quickFilter.type.value = undefined;
454
- }
455
- else if (quickFilter.type.key == "country") {
456
- quickFilter.type.selected = undefined;
457
- quickFilter.type.missingValue = undefined;
458
- }
459
- else if (quickFilter.type.key == "date") {
460
- quickFilter.type.from = undefined;
461
- quickFilter.type.to = undefined;
462
- }
463
- else if (quickFilter.type.key == "multi-select") {
464
- quickFilter.type.values = [];
465
- quickFilter.type.missingValue = false;
466
- 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;
467
909
  }
910
+
468
911
  if (dispatchFiltersChange) {
469
- quickFilter.active = false;
912
+ quickFilter.active = false;
470
913
  }
914
+
471
915
  globalBuilder = searchTextBuilder(searchText);
916
+
472
917
  for (let i = 0; i < quickFilters.length; i++) {
473
- if (quickFilters[i].active) {
474
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilters[i], false);
475
- }
918
+ if (quickFilters[i].active) {
919
+ globalBuilder = quickFilterBuilder(
920
+ globalBuilder,
921
+ quickFilters[i],
922
+ false
923
+ );
924
+ }
476
925
  }
926
+
477
927
  if (dispatchFiltersChange) {
478
- quickFilters = quickFilters.map(f => {
479
- if (f.title == quickFilter.title) {
480
- return { ...quickFilter };
481
- }
482
- return f;
483
- });
484
- handleFiltersChange();
928
+ quickFilters = quickFilters.map(f => {
929
+ if (f.title == quickFilter.title) {
930
+ return { ...quickFilter }
931
+ }
932
+ return f
933
+ });
934
+ handleFiltersChange();
485
935
  }
936
+
486
937
  return globalBuilder;
487
- }
488
- function handleSearchBoxKeydown(e) {
938
+ }
939
+
940
+ function handleSearchBoxKeydown(e: KeyboardEvent) {
489
941
  if (e.key == "Enter") {
490
- handleFiltersChange();
942
+ handleFiltersChange();
491
943
  }
492
- }
493
- function handleQuickFilterClick(mouseEvent, quickFilter) {
944
+ }
945
+
946
+ function handleQuickFilterClick(
947
+ mouseEvent: MouseEvent & {
948
+ currentTarget: EventTarget & HTMLButtonElement;
949
+ },
950
+ quickFilter?: QuickFilter
951
+ ) {
494
952
  handleCancelClick();
495
953
  setTimeout(() => {
496
- if (quickFilter) {
497
- if (!quickFilterActivator) {
498
- let target = mouseEvent.target;
499
- quickFilterActivator = target;
500
- quickFilterActive = quickFilter;
501
- openQuickFilter = !openQuickFilter;
502
- }
954
+ if (quickFilter) {
955
+ if (!quickFilterActivator) {
956
+ let target = mouseEvent.target as unknown as HTMLElement;
957
+ quickFilterActivator = target;
958
+ quickFilterActive = quickFilter;
959
+ openQuickFilter = !openQuickFilter;
503
960
  }
961
+ }
504
962
  }, 300);
505
- }
506
- function setQuickFilterMissingValue(quickFilter) {
963
+ }
964
+
965
+ function setQuickFilterMissingValue(quickFilter: QuickFilter) {
507
966
  if (quickFilter.type.key == 'custom') {
508
- quickFilter.type.missingValue = true;
509
- quickFilter.type.value = undefined;
967
+ quickFilter.type.missingValue = true;
968
+ quickFilter.type.value = undefined;
510
969
  }
511
970
  else if (quickFilter.type.key == "multi-select") {
512
- quickFilter.type.missingValue = true;
513
- quickFilter.type.values = [];
514
- }
515
- else if (quickFilter.type.key == "string") {
516
- quickFilter.type.missingValue = true;
517
- quickFilter.type.value = undefined;
518
- }
519
- else if (quickFilter.type.key == "country") {
520
- quickFilter.type.missingValue = true;
521
- quickFilter.type.selected = undefined;
522
- }
523
- else if (quickFilter.type.key == "number") {
524
- quickFilter.type.missingValue = true;
525
- 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;
526
982
  }
983
+
527
984
  handleApplyClick(quickFilter);
528
- }
529
- function setQuickFilterValue(quickFilter, value) {
985
+ }
986
+
987
+ function setQuickFilterValue(quickFilter: QuickFilter, value?: any) {
530
988
  if (quickFilter.type.key == "custom") {
531
- quickFilter.type.value = value;
532
- }
989
+ quickFilter.type.value = value;
990
+ }
533
991
  else if (quickFilter.type.key == "boolean") {
534
- quickFilter.type.value = value;
535
- }
992
+ quickFilter.type.value = value;
993
+ }
994
+
536
995
  handleApplyClick(quickFilter);
537
- }
538
- function handleApplyClick(quickFilter, dispatchCustomFilterClick = false) {
539
- if (quickFilter.type.key == 'custom' && dispatchCustomFilterClick) {
540
- if (onapplyCustomQuickFilter) {
541
- onapplyCustomQuickFilter({
542
- detail: {
543
- quickFilter,
544
- setQuickFilterValue
545
- }
546
- });
547
- }
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
+ }
548
1008
  }
549
1009
  else {
550
- quickFilter.active = true;
551
- quickFilters = quickFilters.map(f => {
552
- if (f.title == quickFilter.title) {
553
- return { ...quickFilter };
554
- }
555
- return f;
556
- });
557
- globalBuilder = quickFilterBuilder(globalBuilder, quickFilter);
558
- handleFiltersChange();
559
- quickFilterActivator = undefined;
560
- 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;
561
1023
  }
562
- }
563
- function quickFilterBuilder(builder, quickFilter, clearPreaviousValue = true) {
1024
+ }
1025
+
1026
+ function quickFilterBuilder(
1027
+ builder: FilterBuilder,
1028
+ quickFilter: QuickFilter,
1029
+ clearPreaviousValue: boolean = true
1030
+ ) {
564
1031
  if (quickFilter.type.key == 'custom') {
565
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
566
- if (clearPreaviousValue) {
567
- builder = handleClearQuickFilter(quickFilter, false);
568
- }
569
- quickFilter.type.value = value;
570
- quickFilter.type.missingValue = missingValue;
571
- builder = quickFilter.type.modify({
572
- builder,
573
- value: { value, missingValue },
574
- });
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
+ });
575
1044
  }
576
1045
  else if (quickFilter.type.key == "string") {
577
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
578
- if (clearPreaviousValue) {
579
- builder = handleClearQuickFilter(quickFilter, false);
580
- }
581
- quickFilter.type.value = value;
582
- quickFilter.type.missingValue = missingValue;
583
- if (quickFilter.type.modify) {
584
- builder = quickFilter.type.modify({
585
- builder,
586
- value: { value, missingValue },
587
- });
588
- }
589
- if (!!quickFilter.column) {
590
- if (missingValue) {
591
- builder.whereNull(quickFilter.column);
592
- }
593
- else if (!!value) {
594
- builder.where(quickFilter.column, quickFilter.type.mode ?? "equal", value);
595
- }
596
- }
597
- }
598
- else if (quickFilter.type.key == "boolean") {
599
- let value = quickFilter.type.value;
600
- if (clearPreaviousValue) {
601
- builder = handleClearQuickFilter(quickFilter, false);
602
- }
603
- quickFilter.type.value = value;
604
- if (quickFilter.type.modify) {
605
- builder = quickFilter.type.modify({
606
- builder,
607
- value,
608
- });
609
- }
610
- if (!!quickFilter.column && value != undefined) {
611
- builder.where(quickFilter.column, value);
612
- }
613
- }
614
- else if (quickFilter.type.key == "country") {
615
- let value = quickFilter.type.selected, missingValue = quickFilter.type.missingValue;
616
- if (clearPreaviousValue) {
617
- builder = handleClearQuickFilter(quickFilter, false);
618
- }
619
- quickFilter.type.selected = value;
620
- quickFilter.type.missingValue = missingValue;
621
- const values = value?.map((item) => item.value);
622
- if (quickFilter.type.modify) {
623
- builder = quickFilter.type.modify({
624
- builder,
625
- value: { values, missingValue },
626
- });
627
- }
628
- if (!!quickFilter.column) {
629
- if (missingValue) {
630
- builder.whereNull(quickFilter.column);
631
- }
632
- else if (!!values && values.length > 0) {
633
- builder.whereIn(quickFilter.column, values);
634
- }
635
- }
636
- }
637
- else if (quickFilter.type.key == "date") {
638
- let from = quickFilter.type.from, to = quickFilter.type.to;
639
- if (clearPreaviousValue) {
640
- builder = handleClearQuickFilter(quickFilter, false);
641
- }
642
- quickFilter.type.from = from;
643
- quickFilter.type.to = to;
644
- if (quickFilter.type.modify) {
645
- builder = quickFilter.type.modify({
646
- builder,
647
- value: { from, to },
648
- });
649
- }
650
- else if (!!quickFilter.column) {
651
- if (!!from) {
652
- builder.where(quickFilter.column, ">=", DateTime.fromJSDate(from).setLocale('it-IT').startOf('day').toString());
653
- }
654
- if (!!to) {
655
- builder.where(quickFilter.column, "<=", DateTime.fromJSDate(to).setLocale('it-IT').endOf('day').toString());
656
- }
657
- }
658
- }
659
- else if (quickFilter.type.key == "multi-select") {
660
- let value = quickFilter.type.values, missingValue = quickFilter.type.missingValue;
661
- if (clearPreaviousValue) {
662
- 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
+ );
663
1070
  }
664
- quickFilter.type.values = value;
665
- quickFilter.type.missingValue = missingValue;
666
- const values = value.map(item => item.value);
667
- if (quickFilter.type.modify) {
668
- builder = quickFilter.type.modify({
669
- builder,
670
- value: { values: values, missingValue },
671
- });
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);
672
1111
  }
673
- else if (quickFilter.column) {
674
- if (missingValue) {
675
- builder.whereNull(quickFilter.column);
676
- }
677
- else if (values.length > 0) {
678
- builder.whereIn(quickFilter.column, values);
679
- }
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
+ );
680
1134
  }
681
- }
682
- else if (quickFilter.type.key == "number") {
683
- let value = quickFilter.type.value, missingValue = quickFilter.type.missingValue;
684
- if (clearPreaviousValue) {
685
- builder = handleClearQuickFilter(quickFilter, false);
1135
+ if (!!to) {
1136
+ builder.where(
1137
+ quickFilter.column,
1138
+ "<=",
1139
+ DateTime.fromJSDate(to).setLocale('it-IT').endOf('day').toString() );
686
1140
  }
687
- quickFilter.type.value = value;
688
- quickFilter.type.missingValue = missingValue;
689
- if (quickFilter.type.modify) {
690
- builder = quickFilter.type.modify({
691
- builder,
692
- value: { value, missingValue },
693
- });
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);
694
1163
  }
695
- if (quickFilter.column) {
696
- if (missingValue) {
697
- builder.whereNull(quickFilter.column);
698
- }
699
- else if (!!value) {
700
- builder.where(quickFilter.column, value);
701
- }
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);
702
1186
  }
1187
+ }
703
1188
  }
1189
+
704
1190
  return builder;
705
- }
706
- function updateFilterValues(filter, updateMultiFilterValues) {
707
- 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' ||
708
1197
  filter.type == 'number' ||
709
1198
  filter.type == 'select' ||
710
1199
  filter.type == 'string' ?
711
- filter.mode :
712
- undefined;
713
- if (filter.type == 'select') {
714
- newValue = filter.values;
715
- if (newValue.length > 0) {
716
- newValid = true;
717
- }
718
- }
719
- else if ('mode' in filter && filter.mode == 'between') {
720
- newValue.to = filter.to;
721
- newValue.from = filter.from;
722
- if (!!newValue.from || !!newValue.to) {
723
- newValid = true;
724
- }
725
- }
726
- else {
727
- newValue = filter.value;
728
- if (!!newValue) {
729
- newValid = true;
730
- }
731
- }
732
- updateMultiFilterValues(filter.name, newValue, newValid, newMode);
733
- }
734
- function handleRemoveAllFilters() {
735
- if (onremoveAllFilters) {
736
- 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()
737
1225
  }
738
1226
  handleSearchChange(searchText);
739
- }
740
- function handleRemoveFilter(filter) {
741
- if (onremoveFilter) {
742
- onremoveFilter({
743
- detail: {
744
- filter
745
- }
746
- });
1227
+ }
1228
+
1229
+ function handleRemoveFilter(filter: Filter) {
1230
+ if(onremoveFilter) {
1231
+ onremoveFilter({
1232
+ detail: {
1233
+ filter
1234
+ }
1235
+ })
747
1236
  }
748
1237
  handleSearchChange(searchText);
749
- }
750
- async function handleLoadForward() {
751
- if (renderedRows.length >= renderedRowsNumber) {
752
- userScrolling = false;
753
- const anchorIndex = renderedRowsNumber - 1;
754
- const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey];
755
- const anchorElement = findAnchorElement(anchorUniqueKey);
756
- const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0;
757
- let removedRowCount = 0;
758
- for (let i = 0; removedRowCount < sectionRowsNumber; i++) {
759
- let row = tableBody?.children.item(i);
760
- removedRowCount++;
761
- const rowKey = row?.getAttribute("data-key");
762
- const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey);
763
- if (isExpanded) {
764
- i++;
765
- }
766
- }
767
- currentSectionNumber = currentSectionNumber + 1;
768
- await tick();
769
- if (tableContainer) {
770
- const anchorElementAfter = findAnchorElement(anchorUniqueKey);
771
- const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0;
772
- const offsetDiff = anchorOffsetAfter - anchorOffsetBefore;
773
- tableContainer.scrollTop += offsetDiff;
774
- 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++
775
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
+ }
776
1275
  }
777
- if (totalCachedSections - sectionThreshold <= currentSectionNumber
778
- && !loading
779
- && totalRows > rows.length) {
780
- if (onfetchData) {
781
- onfetchData();
782
- }
1276
+
1277
+ if(totalCachedSections - sectionThreshold <= currentSectionNumber
1278
+ && !loading
1279
+ && totalRows > rows.length
1280
+ ) {
1281
+ if(onfetchData) {
1282
+ onfetchData()
1283
+ }
783
1284
  }
784
- }
785
- async function handleLoadBackward() {
786
- if (currentSectionNumber > 0) {
787
- userScrolling = false;
788
- const anchorIndex = 0;
789
- const anchorUniqueKey = renderedRows[anchorIndex].item[uniqueKey];
790
- const anchorElement = findAnchorElement(anchorUniqueKey);
791
- const anchorOffsetBefore = anchorElement?.getBoundingClientRect().top || 0;
792
- let removedRowCount = 0;
793
- for (let i = renderedRows.length - 1; removedRowCount < sectionRowsNumber; i--) {
794
- let row = tableBody?.children.item(i);
795
- removedRowCount++;
796
- const rowKey = row?.getAttribute("data-key");
797
- const isExpanded = expandedRows.some(r => r.item[uniqueKey] == rowKey);
798
- if (isExpanded) {
799
- i--;
800
- }
801
- }
802
- currentSectionNumber = currentSectionNumber - 1;
803
- await tick();
804
- if (tableContainer) {
805
- const anchorElementAfter = findAnchorElement(anchorUniqueKey);
806
- const anchorOffsetAfter = anchorElementAfter?.getBoundingClientRect().top || 0;
807
- const offsetDiff = anchorOffsetAfter - anchorOffsetBefore;
808
- tableContainer.scrollTop += offsetDiff;
809
- 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--
810
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
+ }
811
1322
  }
812
- }
813
- function findAnchorElement(key) {
814
- if (tableBody) {
815
- for (let i = 0; i < tableBody.children.length; i++) {
816
- const child = tableBody.children.item(i);
817
- if (child?.getAttribute("data-key") == key) {
818
- return child;
819
- }
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
820
1331
  }
1332
+ }
821
1333
  }
822
- return undefined;
823
- }
824
- function resize(node) {
825
- let th = node.parentElement;
826
- let resizingInner = false;
827
- if (!!th) {
828
- let { width } = th.getBoundingClientRect();
829
- function mouseMoveHandler(e) {
830
- if (resizingInner && !!th && !!tableContainer) {
831
- width += e.movementX;
832
- const { paddingLeft, paddingRight } = getComputedStyle(th);
833
- const minWidth = headers.find(h => h.value === th.id)?.minWidth;
834
- let minWidthPx;
835
- if (!!minWidth && minWidth.endsWith('px')) {
836
- minWidthPx = parseInt(minWidth, 10);
837
- }
838
- const maxWidth = headers.find(h => h.value === th.id)?.maxWidth;
839
- let maxWidthPx;
840
- if (!!maxWidth && maxWidth.endsWith('px')) {
841
- maxWidthPx = parseInt(maxWidth, 10);
842
- }
843
- const actualMinWidth = (minWidthPx || DEFAULT_MIN_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
844
- const actualMaxWidth = (maxWidthPx || DEFAULT_MAX_WIDTH_PX) - parseFloat(paddingLeft) - parseFloat(paddingRight);
845
- if (width > actualMinWidth && width < actualMaxWidth) {
846
- th.style.width = width + 'px';
847
- resizedColumnSizeWithPadding[th.id] = th.getBoundingClientRect().width;
848
- resizedColumnSizeWithPadding = {
849
- ...resizedColumnSizeWithPadding,
850
- };
851
- calculateStickyMetrics();
852
- }
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,
853
1369
  }
1370
+ calculateStickyMetrics();
1371
+ }
854
1372
  }
855
- function mouseUpHandler(e, setResize = true) {
856
- if (!!th) {
857
- resizingInner = false;
858
- let { paddingLeft, paddingRight } = getComputedStyle(th);
859
- width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight);
860
- if (setResize) {
861
- setTimeout(() => resizing = false, 20);
862
- }
863
- if (oncolumnResize) {
864
- oncolumnResize({
865
- detail: {
866
- id: th.id,
867
- newWidthPx: width
868
- }
869
- });
870
- }
871
- calculateStickyMetrics();
872
- }
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();
873
1393
  }
874
- function mouseDownHandler(e) {
875
- if (!!th) {
876
- resizing = true;
877
- resizingInner = true;
878
- let { paddingLeft, paddingRight } = getComputedStyle(th);
879
- width = th.getBoundingClientRect().width - parseFloat(paddingLeft) - parseFloat(paddingRight);
880
- }
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)
881
1402
  }
882
- node.addEventListener('mousedown', mouseDownHandler);
883
- document.addEventListener('mouseup', mouseUpHandler);
884
- document.addEventListener('mousemove', mouseMoveHandler);
885
- return {
886
- destroy() {
887
- node.removeEventListener('mousedown', mouseDownHandler);
888
- document.removeEventListener('mouseup', mouseUpHandler);
889
- document.removeEventListener('mousemove', mouseMoveHandler);
890
- }
891
- };
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
+ }
892
1417
  }
893
- }
894
- $effect(() => {
1418
+ }
1419
+
1420
+ $effect(() => {
895
1421
  headersToShowInTable;
896
1422
  resizedColumnSizeWithPadding;
897
1423
  showSelect;
898
1424
  showExpand;
899
1425
  tick().then(() => {
900
- calculateStickyMetrics();
901
- updateRemainingWidth();
902
- });
903
- });
904
- async function updateRemainingWidth() {
905
- if (tableContainer != null && !!tableContainer && mainHeader) {
906
- const containerWidth = tableContainer.getBoundingClientRect().width - 10;
907
- if (containerWidth) {
908
- const totalResizableWidth = headersToShowInTable.reduce((sum, head) => {
909
- let th = headersHTML[head.value];
910
- if (!!th) {
911
- resizeHeader(th, head);
912
- }
913
- const width = th?.getBoundingClientRect().width || 0;
914
- return sum + width + 1;
915
- }, 0);
916
- const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header'))
917
- .reduce((sum, th) => sum + th.getBoundingClientRect().width + 1, 0);
918
- remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth + 18);
919
- }
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
+ }
1452
+ }
1453
+ }
1454
+
1455
+ function resizeRowAppendHeader() {
1456
+ if ((customizeHeaders || rowAppendSnippet) && headersHTML['row-append-header']) {
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`;
920
1473
  }
921
- }
922
- function resizeHeader(th, header) {
1474
+ }
1475
+
1476
+ function resizeHeader(th: HTMLElement, header: { value: string, minWidth?: string, maxWidth?: string }){
923
1477
  if (!resizedColumnSizeWithPadding[header.value]) {
924
- let widthWithPadding = th.getBoundingClientRect().width;
925
- let minWidth = header.minWidth, minWidthPx = DEFAULT_MIN_WIDTH_PX;
926
- if (!!minWidth && minWidth.endsWith('px')) {
927
- minWidthPx = parseInt(minWidth, 10);
928
- }
929
- if (widthWithPadding < minWidthPx) {
930
- widthWithPadding = minWidthPx;
931
- }
932
- let maxWidth = header.maxWidth, maxWidthPx = DEFAULT_MAX_WIDTH_PX;
933
- if (!!maxWidth && maxWidth.endsWith('px')) {
934
- maxWidthPx = parseInt(maxWidth, 10);
935
- }
936
- if (widthWithPadding > maxWidthPx) {
937
- widthWithPadding = maxWidthPx;
938
- }
939
- 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;
940
1512
  }
941
1513
  let { paddingLeft, paddingRight } = getComputedStyle(th);
942
1514
  let width = resizedColumnSizeWithPadding[header.value] - parseFloat(paddingLeft) - parseFloat(paddingRight);
943
- th.style.width = `${width}px`;
944
- }
945
- function handleSaveHeadersToShow(event) {
1515
+ th.style.width = `${width}px`
1516
+ }
1517
+
1518
+ function handleSaveHeadersToShow(event: Parameters<NonNullable<ComponentProps<typeof HeadersDrawer>['onsaveHeadersToShow']>>[0]) {
946
1519
  headersToShowInTable = event.detail.headersToShow;
947
- onsaveHeadersToShow?.(event);
948
- }
1520
+ onsaveHeadersToShow?.(event)
1521
+ }
949
1522
  </script>
950
1523
 
951
1524
  {#if !!rows && Array.isArray(rows) && !!headersToShowInTable && Array.isArray(headersToShowInTable)}
@@ -1139,7 +1712,7 @@ function handleSaveHeadersToShow(event) {
1139
1712
  hasMore={currentSectionNumber > 0 && userScrolling}
1140
1713
  direction='backward'
1141
1714
  />
1142
- <table style="display: table;" class="dynamic-table" bind:this={tableHTML}>
1715
+ <table style="display: table;" class="dynamic-table dynamic-resizable" bind:this={tableHTML}>
1143
1716
  <thead class="table-header {clazz.header}" bind:this={mainHeader}>
1144
1717
  <tr>
1145
1718
  {#if !!showSelect && !showExpand && rows.length > 0}
@@ -1251,6 +1824,7 @@ function handleSaveHeadersToShow(event) {
1251
1824
  <th
1252
1825
  style:width={remainingWidth + 'px'}
1253
1826
  class="filler"
1827
+ style:padding=0
1254
1828
  aria-hidden="true"
1255
1829
  ></th>
1256
1830
  {/if}
@@ -1930,13 +2504,8 @@ function handleSaveHeadersToShow(event) {
1930
2504
  width: 100%;
1931
2505
  }
1932
2506
 
1933
- .hide-scrollbar {
1934
- -ms-overflow-style: none;
1935
- scrollbar-width: none;
1936
- }
1937
-
1938
2507
  .hide-scrollbar::-webkit-scrollbar {
1939
- display: none;
2508
+ width: 0px;
1940
2509
  }
1941
2510
 
1942
2511
  .dynamic-table {