@likable-hair/svelte 4.2.0 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/components/composed/common/MenuOrDrawer.svelte +1 -1
  2. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +1 -1
  3. package/dist/components/composed/dashboard/DashboardShaper.svelte +20 -13
  4. package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +123 -100
  5. package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +1 -0
  6. package/dist/components/composed/forms/DatePickerTextField.svelte +10 -2
  7. package/dist/components/composed/forms/DatePickerTextField.svelte.d.ts +1 -0
  8. package/dist/components/composed/forms/Dropdown.svelte +15 -6
  9. package/dist/components/composed/forms/PeriodPicker.svelte +115 -0
  10. package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +21 -0
  11. package/dist/components/composed/forms/PeriodSelector.svelte +633 -0
  12. package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +75 -0
  13. package/dist/components/composed/list/DynamicTable.svelte +130 -82
  14. package/dist/components/composed/list/DynamicTable.svelte.d.ts +2 -0
  15. package/dist/components/composed/list/EnhancedPaginatedTable.svelte +1 -2
  16. package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +2 -1
  17. package/dist/components/composed/list/PaginatedTable.svelte +20 -16
  18. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +2 -1
  19. package/dist/components/composed/search/DynamicFilters.svelte +10 -10
  20. package/dist/components/composed/search/DynamicFilters.svelte.d.ts +6 -0
  21. package/dist/components/composed/search/FilterEditor.svelte +10 -9
  22. package/dist/components/simple/buttons/Button.css +1 -0
  23. package/dist/components/simple/buttons/Button.svelte +4 -1
  24. package/dist/components/simple/common/Menu.svelte +124 -104
  25. package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
  26. package/dist/components/simple/dates/Calendar.css +2 -2
  27. package/dist/components/simple/dates/Calendar.svelte +76 -27
  28. package/dist/components/simple/dates/Calendar.svelte.d.ts +1 -0
  29. package/dist/components/simple/dates/DatePicker.svelte +30 -12
  30. package/dist/components/simple/dates/DatePicker.svelte.d.ts +8 -1
  31. package/dist/components/simple/forms/Autocomplete.svelte +2 -2
  32. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +1 -0
  33. package/dist/components/simple/lists/SelectableVerticalList.svelte +5 -4
  34. package/dist/components/simple/lists/SimpleTable.svelte +86 -54
  35. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +2 -0
  38. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ type RollingMeasurementUnit = 'days' | 'weeks' | 'months' | 'years';
2
+ type RollingDirection = 'last' | 'next';
3
+ type PickerSelectValues = {
4
+ from?: Date;
5
+ to?: Date;
6
+ };
7
+ type RollingSelectValues = {
8
+ numberOfUnits?: number;
9
+ measurementUnit?: RollingMeasurementUnit;
10
+ direction?: RollingDirection;
11
+ };
12
+ type TimespanMap<T extends string> = {
13
+ quick: T | undefined;
14
+ rolling: RollingSelectValues;
15
+ picker: PickerSelectValues;
16
+ };
17
+ export type TimespanSettings<T extends string = string> = {
18
+ [K in keyof TimespanMap<T>]: {
19
+ method?: K;
20
+ values?: TimespanMap<T>[K];
21
+ };
22
+ }[keyof TimespanMap<T>];
23
+ export declare const defaultQuickOptions: {
24
+ it: {
25
+ value: string;
26
+ label: string;
27
+ }[];
28
+ en: {
29
+ value: string;
30
+ label: string;
31
+ }[];
32
+ };
33
+ export declare function getPeriodLabel<T extends string>(settings: TimespanSettings<T> | undefined, lang?: 'en' | 'it', quickOptions?: {
34
+ value: string | T;
35
+ label: string;
36
+ }[]): string;
37
+ declare class __sveltets_Render<T extends string = string> {
38
+ props(): {
39
+ timespanSettings?: TimespanSettings<T> | undefined;
40
+ quickSelectOptions?: {
41
+ value: T;
42
+ label: string;
43
+ }[] | undefined;
44
+ valid?: boolean;
45
+ mode?: "default" | "datepicker";
46
+ lang?: "it" | "en";
47
+ locale?: "it" | "en";
48
+ showTimeRangeLabel?: boolean;
49
+ isSelectionMode?: boolean;
50
+ onchange?: ((event: {
51
+ timespanSettings?: TimespanSettings<T> | undefined;
52
+ }) => void) | undefined;
53
+ quickRangeConvertor?: ((value: string) => {
54
+ from?: Date;
55
+ to: Date;
56
+ } | undefined) | undefined;
57
+ setTimespanLabel?: ((params: {
58
+ timespanSettings: TimespanSettings<T> | undefined;
59
+ }) => string) | undefined;
60
+ };
61
+ events(): {};
62
+ slots(): {};
63
+ bindings(): "timespanSettings" | "valid" | "isSelectionMode";
64
+ exports(): {};
65
+ }
66
+ interface $$IsomorphicComponent {
67
+ new <T extends string = string>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
68
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
69
+ } & ReturnType<__sveltets_Render<T>['exports']>;
70
+ <T extends string = string>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
71
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
72
+ }
73
+ declare const PeriodSelector: $$IsomorphicComponent;
74
+ type PeriodSelector<T extends string = string> = InstanceType<typeof PeriodSelector<T>>;
75
+ export default PeriodSelector;
@@ -20,42 +20,50 @@ import HeadersDrawer from "../common/HeadersDrawer.svelte";
20
20
  import lodash from "lodash";
21
21
  const deepEqual = lodash.isEqual;
22
22
  onMount(() => {
23
- if (rowAppendSnippet && headersHTML['row-append-header']) {
24
- const actionCells = tableContainer?.querySelectorAll('.row-append-cell');
25
- if (actionCells && actionCells.length > 0) {
26
- let maxActionWidth = 0;
27
- for (let i = 0; i < actionCells.length; i++) {
28
- const cellContent = actionCells[i];
29
- const width = cellContent.getBoundingClientRect().width;
30
- if (width > maxActionWidth) {
31
- maxActionWidth = width;
23
+ (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
+ }
32
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`;
33
39
  }
34
- const finalWidth = Math.ceil(maxActionWidth + 15);
35
- headersHTML['row-append-header'].style.width = `${finalWidth}px`;
36
- headersHTML['row-append-header'].style.minWidth = `${finalWidth}px`;
37
- }
38
- }
39
- updateHeaderHeight();
40
- window.addEventListener('resize', updateHeaderHeight);
41
- tableContainer?.addEventListener("scroll", setReachedBottomOrTop);
42
- if (tableContainer?.scrollHeight && tableContainer.clientHeight) {
43
- hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight;
44
- }
45
- for (const head of headers) {
46
- let th = headersHTML[head.value];
47
- if (!!th) {
48
- resizeHeader(th, head);
49
40
  }
50
- }
51
- tableHTML?.classList.add('dynamic-resizable');
52
- resizeObserver = new ResizeObserver(() => {
53
- updateRemainingWidth();
54
41
  updateHeaderHeight();
55
- });
56
- if (tableContainer) {
57
- resizeObserver.observe(tableContainer);
58
- }
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
+ }
52
+ }
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
+ });
63
+ if (tableContainer) {
64
+ resizeObserver.observe(tableContainer);
65
+ }
66
+ })();
59
67
  return () => {
60
68
  window.removeEventListener('resize', updateHeaderHeight);
61
69
  tableContainer?.removeEventListener("scroll", setReachedBottomOrTop);
@@ -93,14 +101,20 @@ $effect(() => {
93
101
  }, 30);
94
102
  }
95
103
  });
96
- 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, headerDrawerProps, 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();
97
- 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, colspan = $derived.by(() => {
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(() => {
98
106
  return headersToShowInTable.length +
99
107
  (!!showSelect && !showExpand && rows.length > 0 ? 1 : 0) +
100
108
  (showExpand ? 1 : 0) +
101
109
  (remainingWidth ? 1 : 0) +
102
- (rowAppendSnippet ? 1 : 0) +
103
- (customizeHeaders ? 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;
117
+ return true;
104
118
  });
105
119
  const organizedHeaders = () => {
106
120
  let pinnedFixedHeaders = headers.filter(h => h.pinned).map(h => ({
@@ -122,7 +136,32 @@ $effect(() => {
122
136
  headersToShowInTable = organizedHeaders();
123
137
  }
124
138
  });
125
- const DEFAULT_MIN_WIDTH_PX = 100, DEFAULT_MAX_WIDTH_PX = 400;
139
+ function calculateStickyMetrics() {
140
+ let width = 0;
141
+ const hasPinnedData = headersToShowInTable.find(h => h.pinned);
142
+ if (hasPinnedData) {
143
+ if (headersHTML['select'])
144
+ width += headersHTML['select'].getBoundingClientRect().width;
145
+ if (headersHTML['expand'])
146
+ width += headersHTML['expand'].getBoundingClientRect().width;
147
+ }
148
+ 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
+ }
157
+ }
158
+ });
159
+ if (customizeHeaders && headersHTML['row-append-header']) {
160
+ width += headersHTML['row-append-header'].getBoundingClientRect().width;
161
+ }
162
+ totalStickyWidth = width;
163
+ }
164
+ const DEFAULT_MIN_WIDTH_PX = 130, DEFAULT_MAX_WIDTH_PX = 400;
126
165
  let totalSections = $derived((totalRows - renderedRowsNumber) / sectionRowsNumber);
127
166
  let hasMoreToRender = $derived(totalSections > currentSectionNumber);
128
167
  let totalCachedSections = $derived((rows.length - renderedRowsNumber) / sectionRowsNumber);
@@ -809,6 +848,7 @@ function resize(node) {
809
848
  resizedColumnSizeWithPadding = {
810
849
  ...resizedColumnSizeWithPadding,
811
850
  };
851
+ calculateStickyMetrics();
812
852
  }
813
853
  }
814
854
  }
@@ -828,6 +868,7 @@ function resize(node) {
828
868
  }
829
869
  });
830
870
  }
871
+ calculateStickyMetrics();
831
872
  }
832
873
  }
833
874
  function mouseDownHandler(e) {
@@ -851,12 +892,14 @@ function resize(node) {
851
892
  }
852
893
  }
853
894
  $effect(() => {
854
- if (!!tableContainer &&
855
- headersToShowInTable.length > 0 &&
856
- resizedColumnSizeWithPadding &&
857
- mainHeader) {
858
- tick().then(updateRemainingWidth);
859
- }
895
+ headersToShowInTable;
896
+ resizedColumnSizeWithPadding;
897
+ showSelect;
898
+ showExpand;
899
+ tick().then(() => {
900
+ calculateStickyMetrics();
901
+ updateRemainingWidth();
902
+ });
860
903
  });
861
904
  async function updateRemainingWidth() {
862
905
  if (tableContainer != null && !!tableContainer && mainHeader) {
@@ -870,7 +913,7 @@ async function updateRemainingWidth() {
870
913
  const width = th?.getBoundingClientRect().width || 0;
871
914
  return sum + width + 1;
872
915
  }, 0);
873
- const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header, th.fixed-col'))
916
+ const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header'))
874
917
  .reduce((sum, th) => sum + th.getBoundingClientRect().width + 1, 0);
875
918
  remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth + 18);
876
919
  }
@@ -962,6 +1005,7 @@ function handleSaveHeadersToShow(event) {
962
1005
  drawerSpace='40rem'
963
1006
  appendSnippet={filterAppendSnippet}
964
1007
  customChipSnippet={customFilterChipSnippet}
1008
+ {...filterLabels}
965
1009
  >
966
1010
  {#snippet contentSnippet({ filters, mAndDown, updateMultiFilterValues, })}
967
1011
  {#key filters}
@@ -971,6 +1015,7 @@ function handleSaveHeadersToShow(event) {
971
1015
  {mAndDown}
972
1016
  onchange={e => updateFilterValues(e.detail.filter, updateMultiFilterValues)}
973
1017
  {updateMultiFilterValues}
1018
+ labelsMapper={filterLabels?.labelsMapper}
974
1019
  >
975
1020
  {#snippet customSnippet({ filter, mAndDown, updateCustomFilterValues })}
976
1021
  {@render customFilterSnippet?.({ filter, mAndDown, updateCustomFilterValues })}
@@ -996,6 +1041,7 @@ function handleSaveHeadersToShow(event) {
996
1041
  appendSnippet={filterAppendSnippet}
997
1042
  customChipSnippet={customFilterChipSnippet}
998
1043
  customSnippet={customFilterSnippet}
1044
+ {...filterLabels}
999
1045
  >
1000
1046
  </Filters>
1001
1047
  {/if}
@@ -1098,9 +1144,10 @@ function handleSaveHeadersToShow(event) {
1098
1144
  <tr>
1099
1145
  {#if !!showSelect && !showExpand && rows.length > 0}
1100
1146
  <th
1147
+ bind:this={headersHTML['select']}
1101
1148
  class="non-resizable"
1102
- class:sticky-col={headersToShowInTable.find(h => h.pinned)}
1103
- style:left={"0"}
1149
+ class:sticky-col={headersToShowInTable.find(h => h.pinned) && stickyEnabled}
1150
+ style:left={headersToShowInTable.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
1104
1151
  >
1105
1152
  {#if selectMode === "multiple" && !selectedAllDisabled}
1106
1153
  <Checkbox
@@ -1114,9 +1161,10 @@ function handleSaveHeadersToShow(event) {
1114
1161
  {/if}
1115
1162
  {#if showExpand}
1116
1163
  <th
1164
+ bind:this={headersHTML['expand']}
1117
1165
  class="non-resizable"
1118
- class:sticky-col={headersToShowInTable.find(h => h.pinned)}
1119
- style:left={"0"}
1166
+ class:sticky-col={headersToShowInTable.find(h => h.pinned) && stickyEnabled}
1167
+ style:left={headersToShowInTable.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
1120
1168
  ></th>
1121
1169
  {/if}
1122
1170
  {#each headersToShowInTable as header, index}
@@ -1127,9 +1175,9 @@ function handleSaveHeadersToShow(event) {
1127
1175
  style:min-width={header.minWidth}
1128
1176
  style:max-width={header.maxWidth}
1129
1177
  class:sortable={header.sortable}
1130
- class:sticky-col={header.pinned}
1178
+ class:sticky-col={header.pinned && stickyEnabled}
1131
1179
  style:left={
1132
- header.pinned
1180
+ (header.pinned && stickyEnabled)
1133
1181
  ? (showExpand || showSelect)
1134
1182
  ? `calc(${baseLeft}px + ${extraLeft})`
1135
1183
  : `${baseLeft}px`
@@ -1178,26 +1226,25 @@ function handleSaveHeadersToShow(event) {
1178
1226
  {/if}
1179
1227
  </th>
1180
1228
  {/each}
1181
- {#if rowAppendSnippet}
1229
+ {#if customizeHeaders || rowAppendSnippet}
1182
1230
  <th
1231
+ class:sticky-col={(customizeHeaders || !!rowAppendSnippet) && stickyEnabled}
1232
+ style:right={((customizeHeaders || !!rowAppendSnippet) && stickyEnabled) ? 0 : undefined}
1183
1233
  class="row-append-header"
1184
1234
  bind:this={headersHTML['row-append-header']}
1185
1235
  >
1186
- {@render rowAppendSnippet({ index: -1, row: undefined })}
1187
- </th>
1188
- {/if}
1189
- {#if customizeHeaders}
1190
- <th
1191
- class="fixed-col"
1192
- >
1193
- <Icon
1194
- name="mdi-plus-circle-outline"
1195
- onclick={() => (openHeaderDrawer = true)}
1196
- --icon-size="var(
1197
- --dynamic-table-customize-headers-icon-size,
1198
- var(--dynamic-table-default-customize-headers-icon-size)
1199
- )"
1200
- />
1236
+ {#if customizeHeaders}
1237
+ <Icon
1238
+ name="mdi-plus-circle-outline"
1239
+ onclick={() => (openHeaderDrawer = true)}
1240
+ --icon-size="var(
1241
+ --dynamic-table-customize-headers-icon-size,
1242
+ var(--dynamic-table-default-customize-headers-icon-size)
1243
+ )"
1244
+ />
1245
+ {:else if rowAppendSnippet}
1246
+ {@render rowAppendSnippet({ index: -1, row: undefined })}
1247
+ {/if}
1201
1248
  </th>
1202
1249
  {/if}
1203
1250
  {#if remainingWidth}
@@ -1267,8 +1314,8 @@ function handleSaveHeadersToShow(event) {
1267
1314
  {#if !!showSelect && !showExpand}
1268
1315
  <td
1269
1316
  class=non-resizable
1270
- class:sticky-col={headersToShowInTable.find(h => h.pinned)}
1271
- style:left={"0"}
1317
+ class:sticky-col={headersToShowInTable.find(h => h.pinned) && stickyEnabled}
1318
+ style:left={headersToShowInTable.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
1272
1319
  >
1273
1320
  <Checkbox
1274
1321
  id={row.item[uniqueKey]}
@@ -1290,8 +1337,8 @@ function handleSaveHeadersToShow(event) {
1290
1337
  {#if showExpand}
1291
1338
  <td
1292
1339
  class=non-resizable
1293
- class:sticky-col={headersToShowInTable.find(h => h.pinned)}
1294
- style:left={"0"}
1340
+ class:sticky-col={headersToShowInTable.find(h => h.pinned) && stickyEnabled}
1341
+ style:left={headersToShowInTable.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
1295
1342
  >
1296
1343
  <Icon
1297
1344
  name={expandedRows.findIndex(
@@ -1313,9 +1360,9 @@ function handleSaveHeadersToShow(event) {
1313
1360
  <td
1314
1361
  class:hover-cell={cellEdit && !loading && !!header.cellEditorInfo}
1315
1362
  class:cell-edit-activator={cellEditorIndexHeader == indexHeader && cellEditorIndexRow == indexRow && !cellEditorSubItem}
1316
- class:sticky-col={header.pinned}
1363
+ class:sticky-col={header.pinned && stickyEnabled}
1317
1364
  style:left={
1318
- header.pinned
1365
+ (header.pinned && stickyEnabled)
1319
1366
  ? (showExpand || showSelect)
1320
1367
  ? `calc(${baseLeft}px + ${extraLeft})`
1321
1368
  : `${baseLeft}px`
@@ -1361,16 +1408,20 @@ function handleSaveHeadersToShow(event) {
1361
1408
  {/if}
1362
1409
  </td>
1363
1410
  {/each}
1364
- {#if rowAppendSnippet}
1365
- <td class={clazz.cell || ""}>
1366
- <div class="row-append-cell" style="display: inline-block; white-space: nowrap;">
1411
+ {#if customizeHeaders || rowAppendSnippet}
1412
+ <td
1413
+ class={clazz.cell || ""}
1414
+ class:sticky-col={(customizeHeaders || !!rowAppendSnippet) && stickyEnabled}
1415
+ style:right={((customizeHeaders || !!rowAppendSnippet) && stickyEnabled) ? 0 : undefined}
1416
+ >
1417
+ <div
1418
+ class="row-append-cell"
1419
+ style="display: inline-block; white-space: nowrap;"
1420
+ >
1367
1421
  {@render rowAppendSnippet?.({ index: indexRow, row })}
1368
1422
  </div>
1369
1423
  </td>
1370
1424
  {/if}
1371
- {#if customizeHeaders}
1372
- <td></td>
1373
- {/if}
1374
1425
  {#if remainingWidth}
1375
1426
  <td></td>
1376
1427
  {/if}
@@ -2289,10 +2340,7 @@ function handleSaveHeadersToShow(event) {
2289
2340
  .pointer {
2290
2341
  cursor: pointer;
2291
2342
  }
2292
- .table-header th.fixed-col {
2293
- position: sticky;
2294
- right: 0;
2295
- z-index: 3;
2343
+ .row-append-header {
2296
2344
  width: 23px;
2297
2345
  min-width: 23px;
2298
2346
  }
@@ -177,7 +177,9 @@ declare class __sveltets_Render<Item extends {
177
177
  dynamicFilters?: boolean;
178
178
  useSelectedItemsOnly?: boolean;
179
179
  selectedAllDisabled?: boolean;
180
+ stickyMinContainerWidth?: number;
180
181
  headerDrawerProps?: ComponentProps<typeof HeadersDrawer>["drawerProps"];
182
+ filterLabels?: Pick<ComponentProps<typeof Filters>, "addFilterLabel" | "applyFilterLabel" | "filterTitleLabel" | "cancelFilterLabel" | "labelsMapper" | "trueString" | "falseString" | "betweenSeparator">;
181
183
  class?: {
182
184
  container?: string;
183
185
  header?: string;
@@ -4,7 +4,7 @@ import { Icon } from "../../..";
4
4
  import './EnhancedPaginatedTable.css';
5
5
  import lodash from "lodash";
6
6
  const deepEqual = lodash.isEqual;
7
- let { headersToShowInTable = $bindable(), pinnableColumns, headerDrawerProps, onsaveHeadersToShow, headerDrawerContentSnippet, headerDrawerItemSnippet, headerDrawerHeadersToAddSnippet, lang = 'en', headers, stickyAppendSnippet: internalStickyAppendSnippet, sortedBy = $bindable(undefined), sortDirection = $bindable("asc"), page = $bindable(1), rowsPerPage = $bindable(20), filters = $bindable([]), quickFilters = $bindable(), selectedItems = $bindable([]), selectedAll = $bindable(), stickFirstColumn, resizedColumnSizeWithPadding = $bindable({}), ...rest } = $props();
7
+ let { headersToShowInTable = $bindable(), pinnableColumns, headerDrawerProps, onsaveHeadersToShow, headerDrawerContentSnippet, headerDrawerItemSnippet, headerDrawerHeadersToAddSnippet, lang = 'en', headers, stickyAppendSnippet: internalStickyAppendSnippet, sortedBy = $bindable(undefined), sortDirection = $bindable("asc"), page = $bindable(1), rowsPerPage = $bindable(20), filters = $bindable([]), quickFilters = $bindable(), selectedItems = $bindable([]), selectedAll = $bindable(), resizedColumnSizeWithPadding = $bindable({}), ...rest } = $props();
8
8
  const organizedHeaders = () => {
9
9
  let pinnedFixedHeaders = headers.filter(h => h.pinned).map(h => ({
10
10
  ...h,
@@ -43,7 +43,6 @@ function handleSaveHeadersToShow(event) {
43
43
  {...rest}
44
44
  {lang}
45
45
  headers={headersToShowInTable}
46
- {stickFirstColumn}
47
46
  bind:sortedBy
48
47
  bind:sortDirection
49
48
  bind:page
@@ -19,9 +19,9 @@ declare class __sveltets_Render<Item extends {
19
19
  loading?: boolean;
20
20
  doubleClickActive?: boolean;
21
21
  doubleClickDelay?: number;
22
- stickFirstColumn?: boolean;
23
22
  calculateRowStyles?: import("../../simple/lists/SimpleTable.svelte").CalculateRowStyles<Item> | undefined;
24
23
  calculateRowClasses?: import("../../simple/lists/SimpleTable.svelte").CalculateRowClasses<Item> | undefined;
24
+ stickyMinContainerWidth?: number;
25
25
  onsort?: ((event: {
26
26
  detail: {
27
27
  sortedBy: string | undefined;
@@ -99,6 +99,7 @@ declare class __sveltets_Render<Item extends {
99
99
  uniqueKey?: keyof Item | undefined;
100
100
  hideActions?: boolean;
101
101
  actionsForSelectedItems?: import("../common/QuickActions.svelte").Action[];
102
+ filterLabels?: Pick<ComponentProps<typeof import("../../..").Filters>, "addFilterLabel" | "applyFilterLabel" | "filterTitleLabel" | "cancelFilterLabel" | "labelsMapper" | "trueString" | "falseString" | "betweenSeparator">;
102
103
  class?: {
103
104
  simpleTable?: {
104
105
  container?: string;
@@ -13,7 +13,7 @@ let { headers = [], items = [], sortedBy = $bindable(undefined), sortDirection =
13
13
  { label: "20", value: 20 },
14
14
  { label: "50", value: 50 },
15
15
  { label: "100", value: 100 },
16
- ], hideRowsPerPage = false, totalElements = undefined, rowsPerPage = $bindable(20), filters = $bindable([]), quickFilters = $bindable(), searchBarColumns = undefined, searchBarVisible = true, quickFiltersVisible = false, lang = "en", dateLocale, multiEditTabs, searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...", editFilterMode = "one-edit", showActiveFilters = true, resizableColumns = false, resizedColumnSizeWithPadding = $bindable({}), pointerOnRowHover = undefined, doubleClickActive = false, doubleClickDelay = 250, searchTimeoutDelay = 300, hideSelectAll, showSelection, selectedItems = $bindable([]), selectionMode = 'multiple', selectedAll = $bindable(), uniqueKey = 'id', hideActions, actionsForSelectedItems = [], calculateRowStyles = undefined, calculateRowClasses = undefined, class: clazz = {}, onfiltersChange, onpaginationChange, onremoveFilter, onremoveAllFilters, customFilterChipSnippet, customFilterSnippet, filterAppendSnippet, onrowClick, onrowDoubleClick, appendSnippet, customSnippet, headerLabelSnippet, headerSnippet, onsort, footerSnippet, rangeDescriptorSnippet, searchBarSnippet, noDataSnippet, totalsSnippet, oncolumnResize, prependSnippet: prependSnippetInternal, ...rest } = $props();
16
+ ], hideRowsPerPage = false, totalElements = undefined, rowsPerPage = $bindable(20), filters = $bindable(), quickFilters = $bindable(), searchBarColumns = undefined, searchBarVisible = true, quickFiltersVisible = false, lang = "en", dateLocale, multiEditTabs, searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...", editFilterMode = "one-edit", showActiveFilters = true, resizableColumns = false, resizedColumnSizeWithPadding = $bindable({}), pointerOnRowHover = undefined, doubleClickActive = false, doubleClickDelay = 250, searchTimeoutDelay = 300, hideSelectAll, showSelection, selectedItems = $bindable([]), selectionMode = 'multiple', selectedAll = $bindable(), uniqueKey = 'id', hideActions, actionsForSelectedItems = [], filterLabels, calculateRowStyles = undefined, calculateRowClasses = undefined, class: clazz = {}, onfiltersChange, onpaginationChange, onremoveFilter, onremoveAllFilters, customFilterChipSnippet, customFilterSnippet, filterAppendSnippet, onrowClick, onrowDoubleClick, appendSnippet, customSnippet, headerLabelSnippet, headerSnippet, onsort, footerSnippet, rangeDescriptorSnippet, searchBarSnippet, noDataSnippet, totalsSnippet, oncolumnResize, prependSnippet: prependSnippetInternal, ...rest } = $props();
17
17
  let searchBarInput = $state(), searchText = $state(), sortModify, searchTimeout, selectedIndexes = [];
18
18
  let rowsPerPageSelection = $state([]);
19
19
  $effect(() => {
@@ -188,21 +188,24 @@ function handleSelect(item, shiftKeyPressed) {
188
188
  ></SearchBar>
189
189
  {/if}
190
190
  {/if}
191
- <Filters
192
- bind:filters
193
- onapplyFilter={handleFiltersChange}
194
- onremoveFilter={handleRemoveFilter}
195
- onremoveAllFilters={handleRemoveAllFilters}
196
- --filters-default-wrapper-width={!!searchBarVisible ? undefined : "100%"}
197
- {lang}
198
- {dateLocale}
199
- {editFilterMode}
200
- {showActiveFilters}
201
- {multiEditTabs}
202
- appendSnippet={filterAppendSnippet}
203
- customChipSnippet={customFilterChipSnippet}
204
- customSnippet={customFilterSnippet}
205
- ></Filters>
191
+ {#if filters?.length}
192
+ <Filters
193
+ bind:filters
194
+ onapplyFilter={handleFiltersChange}
195
+ onremoveFilter={handleRemoveFilter}
196
+ onremoveAllFilters={handleRemoveAllFilters}
197
+ --filters-default-wrapper-width={!!searchBarVisible ? undefined : "100%"}
198
+ {lang}
199
+ {dateLocale}
200
+ {editFilterMode}
201
+ {showActiveFilters}
202
+ {multiEditTabs}
203
+ appendSnippet={filterAppendSnippet}
204
+ customChipSnippet={customFilterChipSnippet}
205
+ customSnippet={customFilterSnippet}
206
+ {...filterLabels}
207
+ ></Filters>
208
+ {/if}
206
209
  </div>
207
210
  {#if quickFiltersVisible}
208
211
  <div class="quick-filters-container">
@@ -254,6 +257,7 @@ function handleSelect(item, shiftKeyPressed) {
254
257
  <div
255
258
  style:display=flex
256
259
  style:align-items=middle
260
+ style:justify-content=center
257
261
  style:padding="8px 0px"
258
262
  >
259
263
  <Checkbox
@@ -24,9 +24,9 @@ declare class __sveltets_Render<Item extends {
24
24
  loading?: boolean;
25
25
  doubleClickActive?: boolean;
26
26
  doubleClickDelay?: number;
27
- stickFirstColumn?: boolean;
28
27
  calculateRowStyles?: import("../../simple/lists/SimpleTable.svelte").CalculateRowStyles<Item> | undefined;
29
28
  calculateRowClasses?: import("../../simple/lists/SimpleTable.svelte").CalculateRowClasses<Item> | undefined;
29
+ stickyMinContainerWidth?: number;
30
30
  onsort?: ((event: {
31
31
  detail: {
32
32
  sortedBy: string | undefined;
@@ -104,6 +104,7 @@ declare class __sveltets_Render<Item extends {
104
104
  uniqueKey?: keyof Item | undefined;
105
105
  hideActions?: boolean;
106
106
  actionsForSelectedItems?: Action[];
107
+ filterLabels?: Pick<ComponentProps<typeof Filters>, "addFilterLabel" | "applyFilterLabel" | "filterTitleLabel" | "cancelFilterLabel" | "labelsMapper" | "trueString" | "falseString" | "betweenSeparator">;
107
108
  class?: {
108
109
  simpleTable?: {
109
110
  container?: string;
@@ -1,15 +1,7 @@
1
1
  <script lang="ts">import { FilterEditor, Icon } from "../../..";
2
2
  import MediaQuery from "../../simple/common/MediaQuery.svelte";
3
3
  import {} from "svelte";
4
- let { filters = [], lang = "en", mAndDown = false, onchange, updateMultiFilterValues, customSnippet: customSnippetInternal, } = $props();
5
- let selectedFilter = $state();
6
- let tmpFilters = $state(filters.reduce((acc, f) => {
7
- if (f.active) {
8
- acc[f.name] = f;
9
- }
10
- return acc;
11
- }, {}));
12
- let labelsMapper = lang == 'en' ? {
4
+ let { filters = [], lang = "en", mAndDown = false, labelsMapper = lang == 'en' ? {
13
5
  equal: { extended: "equal to", short: "equal" },
14
6
  like: { short: "includes" },
15
7
  ilike: { short: "includes" },
@@ -27,7 +19,14 @@ let labelsMapper = lang == 'en' ? {
27
19
  lower: { short: "minore", extended: "minore di" },
28
20
  between: { short: "compreso", extended: "è compreso tra" },
29
21
  different: { short: "diverso", extended: "diverso da" },
30
- };
22
+ }, onchange, updateMultiFilterValues, customSnippet: customSnippetInternal, } = $props();
23
+ let selectedFilter = $state();
24
+ let tmpFilters = $state(filters.reduce((acc, f) => {
25
+ if (f.active) {
26
+ acc[f.name] = f;
27
+ }
28
+ return acc;
29
+ }, {}));
31
30
  function selectFilter(filter) {
32
31
  selectedFilter = filter === selectedFilter ? undefined : filter;
33
32
  }
@@ -148,6 +147,7 @@ function updateCustomFilterValues(filterName, newValue, newValid, mode) {
148
147
  --dropdown-button-active-color='transparent'
149
148
  --dropdown-button-active-box-shadow='inset 0 0 0 2px rgb(var(--global-color-primary-500))'
150
149
  --dropdown-button-focus-box-shadow='inset 0 0 0 2px rgb(var(--global-color-primary-500))'
150
+ --dropdown-button-box-sizing=content-box
151
151
  >
152
152
  {#snippet customSnippet({ filter })}
153
153
  {@render customSnippetInternal?.({ filter, mAndDown, updateCustomFilterValues })}
@@ -4,6 +4,12 @@ declare const DynamicFilters: import("svelte").Component<{
4
4
  filters?: Filter[];
5
5
  lang?: "it" | "en";
6
6
  mAndDown?: boolean;
7
+ labelsMapper?: {
8
+ [label: string]: {
9
+ extended?: string;
10
+ short: string;
11
+ };
12
+ };
7
13
  onchange?: (event: {
8
14
  detail: {
9
15
  filter: Filter;