@likable-hair/svelte 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/composed/common/MenuOrDrawer.svelte +1 -1
- package/dist/components/composed/common/MenuOrDrawerOptions.svelte +1 -1
- package/dist/components/composed/dashboard/DashboardShaper.svelte +20 -13
- package/dist/components/composed/dashboard/DashboardShaper.svelte.d.ts +123 -100
- package/dist/components/composed/forms/AsyncAutocomplete.svelte.d.ts +1 -0
- package/dist/components/composed/forms/DatePickerTextField.svelte +10 -2
- package/dist/components/composed/forms/DatePickerTextField.svelte.d.ts +1 -0
- package/dist/components/composed/forms/Dropdown.svelte +15 -6
- package/dist/components/composed/forms/PeriodPicker.svelte +115 -0
- package/dist/components/composed/forms/PeriodPicker.svelte.d.ts +21 -0
- package/dist/components/composed/forms/PeriodSelector.svelte +633 -0
- package/dist/components/composed/forms/PeriodSelector.svelte.d.ts +75 -0
- package/dist/components/composed/list/DynamicTable.svelte +130 -82
- package/dist/components/composed/list/DynamicTable.svelte.d.ts +2 -0
- package/dist/components/composed/list/EnhancedPaginatedTable.svelte +1 -2
- package/dist/components/composed/list/EnhancedPaginatedTable.svelte.d.ts +2 -1
- package/dist/components/composed/list/PaginatedTable.svelte +20 -16
- package/dist/components/composed/list/PaginatedTable.svelte.d.ts +2 -1
- package/dist/components/composed/search/DynamicFilters.svelte +10 -10
- package/dist/components/composed/search/DynamicFilters.svelte.d.ts +6 -0
- package/dist/components/composed/search/FilterEditor.svelte +10 -9
- package/dist/components/simple/buttons/Button.css +1 -0
- package/dist/components/simple/buttons/Button.svelte +4 -1
- package/dist/components/simple/common/Menu.svelte +124 -104
- package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
- package/dist/components/simple/dates/Calendar.css +2 -2
- package/dist/components/simple/dates/Calendar.svelte +76 -27
- package/dist/components/simple/dates/Calendar.svelte.d.ts +1 -0
- package/dist/components/simple/dates/DatePicker.svelte +30 -12
- package/dist/components/simple/dates/DatePicker.svelte.d.ts +8 -1
- package/dist/components/simple/forms/Autocomplete.svelte +2 -2
- package/dist/components/simple/forms/Autocomplete.svelte.d.ts +1 -0
- package/dist/components/simple/lists/SelectableVerticalList.svelte +5 -4
- package/dist/components/simple/lists/SimpleTable.svelte +86 -54
- package/dist/components/simple/lists/SimpleTable.svelte.d.ts +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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
|
|
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={
|
|
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={
|
|
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
|
-
{
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
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={
|
|
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={
|
|
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
|
|
1366
|
-
|
|
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
|
-
.
|
|
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(),
|
|
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(
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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,
|
|
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;
|