@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
|
@@ -5,41 +5,49 @@ import YearSelector from "./YearSelector.svelte";
|
|
|
5
5
|
import MonthSelector from "./MonthSelector.svelte";
|
|
6
6
|
import Calendar from "./Calendar.svelte";
|
|
7
7
|
import Button from "../buttons/Button.svelte";
|
|
8
|
-
let { selectedYear = $bindable(new Date().getFullYear()), selectedMonth = $bindable(new Date().getMonth()), selectedDate = $bindable(undefined), selectedDateTo = $bindable(undefined), visibleMonth = $bindable(selectedMonth), visibleYear = $bindable(selectedYear), view = "day", locale = "it", selectableYears = [...Array(150).keys()].map((i) => i + (new Date().getFullYear() - 75)), skipTabs = false, disabled = false, type, class: clazz = {}, onmonthClick, onyearClick, ondayClick, } = $props();
|
|
8
|
+
let { selectedYear = $bindable(new Date().getFullYear()), selectedMonth = $bindable(new Date().getMonth()), selectedDate = $bindable(undefined), selectedDateTo = $bindable(undefined), visibleMonth = $bindable(selectedMonth), visibleYear = $bindable(selectedYear), view = "day", locale = "it", selectableYears = [...Array(150).keys()].map((i) => i + (new Date().getFullYear() - 75)), skipTabs = false, disabled = false, type, fillOpenRange, class: clazz = {}, headerLabelSnippet, onmonthClick, onyearClick, ondayClick, } = $props();
|
|
9
9
|
let visibleSelector = $derived(view == "day" || view == "month");
|
|
10
10
|
let selectorText = $derived(view == "day"
|
|
11
11
|
? getMonthName(visibleMonth, locale) + " " + visibleYear
|
|
12
12
|
: visibleYear.toString());
|
|
13
13
|
let elementDisabled = $derived(view == "year" ? "year" : "date");
|
|
14
14
|
let lastSelectedYear = selectedYear;
|
|
15
|
+
let minSelectableYear = $derived(selectableYears[0]);
|
|
16
|
+
let maxSelectableYear = $derived(selectableYears[selectableYears.length - 1]);
|
|
15
17
|
function next() {
|
|
16
18
|
if (view == "day") {
|
|
17
19
|
if (visibleMonth == 11) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
if (visibleYear < maxSelectableYear) {
|
|
21
|
+
visibleMonth = 0;
|
|
22
|
+
visibleYear += 1;
|
|
23
|
+
}
|
|
20
24
|
}
|
|
21
25
|
else {
|
|
22
26
|
visibleMonth += 1;
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
29
|
else {
|
|
26
|
-
if (visibleYear
|
|
30
|
+
if (visibleYear < maxSelectableYear) {
|
|
27
31
|
visibleYear++;
|
|
32
|
+
}
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
function previous() {
|
|
31
36
|
if (view == "day") {
|
|
32
37
|
if (visibleMonth == 0) {
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
if (visibleYear > minSelectableYear) {
|
|
39
|
+
visibleMonth = 11;
|
|
40
|
+
visibleYear -= 1;
|
|
41
|
+
}
|
|
35
42
|
}
|
|
36
43
|
else {
|
|
37
44
|
visibleMonth -= 1;
|
|
38
45
|
}
|
|
39
46
|
}
|
|
40
47
|
else {
|
|
41
|
-
if (visibleYear
|
|
48
|
+
if (visibleYear > minSelectableYear) {
|
|
42
49
|
visibleYear--;
|
|
50
|
+
}
|
|
43
51
|
}
|
|
44
52
|
}
|
|
45
53
|
function SelectorHandler() {
|
|
@@ -106,10 +114,17 @@ function handleMonthChange() {
|
|
|
106
114
|
class="unstyled day"
|
|
107
115
|
tabindex={skipTabs ? -1 : undefined}
|
|
108
116
|
>
|
|
109
|
-
{#if
|
|
110
|
-
{
|
|
111
|
-
|
|
112
|
-
|
|
117
|
+
{#if headerLabelSnippet}
|
|
118
|
+
{@render headerLabelSnippet({
|
|
119
|
+
dateString: selectedDate ? dateToString(selectedDate, "dayAndMonth", locale) : undefined,
|
|
120
|
+
dateToString: selectedDateTo ? dateToString(selectedDateTo, "dayAndMonth", locale) : undefined,
|
|
121
|
+
})}
|
|
122
|
+
{:else}
|
|
123
|
+
{#if !!selectedDate && !selectedDateTo}
|
|
124
|
+
{dateToString(selectedDate, "dayAndMonth", locale)}
|
|
125
|
+
{:else if !!selectedDate && !!selectedDateTo}
|
|
126
|
+
{dateToString(selectedDate, "dayAndMonth", locale)} - {dateToString(selectedDateTo, "dayAndMonth", locale)}
|
|
127
|
+
{/if}
|
|
113
128
|
{/if}
|
|
114
129
|
</button>
|
|
115
130
|
</div>
|
|
@@ -124,6 +139,7 @@ function handleMonthChange() {
|
|
|
124
139
|
icon="mdi-chevron-left"
|
|
125
140
|
onclick={previous}
|
|
126
141
|
tabindex={skipTabs ? -1 : undefined}
|
|
142
|
+
disabled={view === 'day' ? (visibleYear <= minSelectableYear && visibleMonth === 0) : visibleYear <= minSelectableYear}
|
|
127
143
|
/>
|
|
128
144
|
</div>
|
|
129
145
|
<div class="row-elem selector">
|
|
@@ -146,6 +162,7 @@ function handleMonthChange() {
|
|
|
146
162
|
icon="mdi-chevron-right"
|
|
147
163
|
onclick={next}
|
|
148
164
|
tabindex={skipTabs ? -1 : undefined}
|
|
165
|
+
disabled={view === 'day' ? (visibleYear >= maxSelectableYear && visibleMonth === 11) : visibleYear >= maxSelectableYear}
|
|
149
166
|
/>
|
|
150
167
|
</div>
|
|
151
168
|
</div>
|
|
@@ -176,6 +193,7 @@ function handleMonthChange() {
|
|
|
176
193
|
{type}
|
|
177
194
|
{locale}
|
|
178
195
|
disabled={disabled}
|
|
196
|
+
{fillOpenRange}
|
|
179
197
|
{ondayClick}
|
|
180
198
|
/>
|
|
181
199
|
{/if}
|
|
@@ -282,4 +300,4 @@ function handleMonthChange() {
|
|
|
282
300
|
cursor: pointer;
|
|
283
301
|
outline: inherit;
|
|
284
302
|
}
|
|
285
|
-
</style>
|
|
303
|
+
</style>
|
|
@@ -2,7 +2,7 @@ import '../../../css/main.css';
|
|
|
2
2
|
import './DatePicker.css';
|
|
3
3
|
import type { Locale } from "./utils";
|
|
4
4
|
import Calendar from "./Calendar.svelte";
|
|
5
|
-
import type { ComponentProps } from 'svelte';
|
|
5
|
+
import type { ComponentProps, Snippet } from 'svelte';
|
|
6
6
|
interface Props {
|
|
7
7
|
selectedYear?: number;
|
|
8
8
|
selectedMonth?: number;
|
|
@@ -16,11 +16,18 @@ interface Props {
|
|
|
16
16
|
selectableYears?: number[];
|
|
17
17
|
skipTabs?: boolean;
|
|
18
18
|
disabled?: boolean;
|
|
19
|
+
fillOpenRange?: boolean;
|
|
19
20
|
class?: {
|
|
20
21
|
container?: string;
|
|
21
22
|
header?: string;
|
|
22
23
|
selectorRow?: string;
|
|
23
24
|
};
|
|
25
|
+
headerLabelSnippet?: Snippet<[
|
|
26
|
+
{
|
|
27
|
+
dateString?: string;
|
|
28
|
+
dateToString?: string;
|
|
29
|
+
}
|
|
30
|
+
]>;
|
|
24
31
|
onyearClick?: (event: {
|
|
25
32
|
detail: {
|
|
26
33
|
year: number;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<script lang="ts" generics="Data">import "../../../css/main.css";
|
|
5
5
|
import "./Autocomplete.css";
|
|
6
6
|
import { scrollInMenu } from "../common/scroller";
|
|
7
|
-
let { values = $bindable(), items = [], searchFunction = undefined, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = undefined, minWidth = "200px", openingId = $bindable("autocomplete-menu"), searchText = $bindable(), maxVisibleChips = undefined, menuOpened = $bindable(false), closeOnSelect = !multiple, emptySearchTextOnMenuClose = true, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false, menuWidth = undefined, menuAnchor = 'bottom-center', class: clazz = {}, menuStayInViewport, menuFlipOnOverflow = true, adaptInputWidth = true, selectionContainerSnippet, selectionSnippet, chipLabelSnippet, exceedCounterSnippet, menuSnippet, itemLabelSnippet, itemSnippet, onchange, onfocus, onblur, onkeydown, onclose, } = $props();
|
|
7
|
+
let { values = $bindable(), items = [], searchFunction = undefined, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = undefined, minWidth = "200px", openingId = $bindable("autocomplete-menu"), searchText = $bindable(), maxVisibleChips = undefined, menuOpened = $bindable(false), closeOnSelect = !multiple, emptySearchTextOnMenuClose = true, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false, menuWidth = undefined, menuAnchor = 'bottom-center', class: clazz = {}, menuStayInViewport, menuFlipOnOverflow = true, menuMaxHeight = '300px', adaptInputWidth = true, selectionContainerSnippet, selectionSnippet, chipLabelSnippet, exceedCounterSnippet, menuSnippet, itemLabelSnippet, itemSnippet, onchange, onfocus, onblur, onkeydown, onclose, } = $props();
|
|
8
8
|
let notVisibleChipNumber = $derived(Math.max(((values || []).length || 0) - (maxVisibleChips || 0), 0));
|
|
9
9
|
function select(item) {
|
|
10
10
|
if (disabled)
|
|
@@ -286,7 +286,7 @@ import Icon from "../media/Icon.svelte";
|
|
|
286
286
|
{activator}
|
|
287
287
|
_width={localMenuWidth || ""}
|
|
288
288
|
_height={menuHeight}
|
|
289
|
-
_maxHeight=
|
|
289
|
+
_maxHeight={menuMaxHeight}
|
|
290
290
|
_boxShadow={menuBoxShadow}
|
|
291
291
|
_borderRadius={menuBorderRadius}
|
|
292
292
|
bind:open={menuOpened}
|
|
@@ -36,6 +36,7 @@ declare class __sveltets_Render<Data> {
|
|
|
36
36
|
menuAnchor?: ComponentProps<typeof Menu>["anchor"];
|
|
37
37
|
menuStayInViewport?: ComponentProps<typeof Menu>["stayInViewport"];
|
|
38
38
|
menuFlipOnOverflow?: ComponentProps<typeof Menu>["flipOnOverflow"];
|
|
39
|
+
menuMaxHeight?: string;
|
|
39
40
|
adaptInputWidth?: boolean;
|
|
40
41
|
class?: {
|
|
41
42
|
activator?: string;
|
|
@@ -6,10 +6,10 @@ import './SelectableVerticalList.css';
|
|
|
6
6
|
import keyboarder from "../../../utils/keyboarder";
|
|
7
7
|
import { onMount } from "svelte";
|
|
8
8
|
import Icon from '../media/Icon.svelte';
|
|
9
|
-
let { activeKeyboard = false, loopSelection = true, focused = $bindable(
|
|
10
|
-
let focusedIndex = $derived(elements
|
|
9
|
+
let { activeKeyboard = false, loopSelection = true, focused = $bindable(), selected = $bindable(), elements = $bindable(), centered = false, bicolor = false, appendIconSize = "20pt", onfocus, oniconClick, onselect, onkeypress, elementSnippet, descriptionSnippet, titleSnippet, } = $props();
|
|
10
|
+
let focusedIndex = $derived(elements?.findIndex((el) => el.name == focused));
|
|
11
11
|
function handleKeypress(params) {
|
|
12
|
-
if (activeKeyboard && elements.length > 0) {
|
|
12
|
+
if (activeKeyboard && elements && elements.length > 0) {
|
|
13
13
|
if (params.key == 'ArrowDown') {
|
|
14
14
|
let newIndex;
|
|
15
15
|
if ((focusedIndex === undefined || focusedIndex === -1) || (loopSelection && focusedIndex >= (elements.length - 1))) {
|
|
@@ -46,7 +46,7 @@ function handleKeypress(params) {
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
else if (params.key == 'Enter' && focusedIndex !== -1) {
|
|
49
|
+
else if (params.key == 'Enter' && focusedIndex !== -1 && focusedIndex != undefined) {
|
|
50
50
|
selected = elements[focusedIndex].name;
|
|
51
51
|
if (onselect) {
|
|
52
52
|
onselect({
|
|
@@ -101,6 +101,7 @@ function handleIconClick(index, element) {
|
|
|
101
101
|
<ul
|
|
102
102
|
class="list"
|
|
103
103
|
role="listbox"
|
|
104
|
+
onmouseleave={() => { focused = undefined }}
|
|
104
105
|
>
|
|
105
106
|
{#each elements as element, index (element.name)}
|
|
106
107
|
<div
|
|
@@ -6,20 +6,38 @@ import './SimpleTable.css';
|
|
|
6
6
|
import Icon from '../media/Icon.svelte';
|
|
7
7
|
import { onMount, tick } from 'svelte';
|
|
8
8
|
import NoData from '../common/NoData.svelte';
|
|
9
|
-
let { headers = [], items = [], sortedBy = $bindable(undefined), sortDirection = $bindable("asc"), resizableColumns = false, resizedColumnSizeWithPadding = $bindable({}), pointerOnRowHover = false, lang = 'en', doubleClickActive = false, doubleClickDelay = 250, noItemsText, loading,
|
|
9
|
+
let { headers = [], items = [], sortedBy = $bindable(undefined), sortDirection = $bindable("asc"), resizableColumns = false, resizedColumnSizeWithPadding = $bindable({}), pointerOnRowHover = false, lang = 'en', doubleClickActive = false, doubleClickDelay = 250, noItemsText, loading, calculateRowStyles = undefined, calculateRowClasses = undefined, stickyMinContainerWidth = 1024, oncolumnResize, onrowClick, onrowDoubleClick, onsort, headerSnippet, headerLabelSnippet, appendSnippet, prependSnippet, stickyAppendSnippet, customSnippet, noDataSnippet, class: clazz = {}, } = $props();
|
|
10
10
|
if (!onrowClick && !!onrowDoubleClick) {
|
|
11
11
|
throw new Error('cannot define an onrowDoubleClick event without defining an onrowClick event');
|
|
12
12
|
}
|
|
13
|
-
let clickTimeout = undefined, sortModify, tableContainer = $state(), mainHeader = $state(), remainingWidth = $state(0), resizeObserver, headersHTML = $state({}), tableHTML = $state(), resizing = false, colspan = $derived.by(() => {
|
|
13
|
+
let clickTimeout = undefined, sortModify, tableContainer = $state(), mainHeader = $state(), remainingWidth = $state(0), containerWidth = $state(0), totalStickyWidth = $state(0), resizeObserver, headersHTML = $state({}), tableHTML = $state(), resizing = false, colspan = $derived.by(() => {
|
|
14
14
|
return headers.length +
|
|
15
|
-
(stickyAppendSnippet ? 1 : 0) +
|
|
16
|
-
(appendSnippet ? 1 : 0) +
|
|
15
|
+
(appendSnippet || stickyAppendSnippet ? 1 : 0) +
|
|
17
16
|
(prependSnippet ? 1 : 0) +
|
|
18
|
-
(
|
|
17
|
+
(remainingWidth ? 1 : 0);
|
|
19
18
|
});
|
|
20
|
-
|
|
19
|
+
let stickyEnabled = $derived.by(() => {
|
|
20
|
+
if (containerWidth <= stickyMinContainerWidth)
|
|
21
|
+
return false;
|
|
22
|
+
if (totalStickyWidth >= containerWidth)
|
|
23
|
+
return false;
|
|
24
|
+
return true;
|
|
25
|
+
});
|
|
26
|
+
const DEFAULT_MIN_WIDTH_PX = 130, DEFAULT_MAX_WIDTH_PX = 400;
|
|
21
27
|
onMount(() => {
|
|
22
|
-
|
|
28
|
+
(async () => {
|
|
29
|
+
await tick();
|
|
30
|
+
resizeObserver = new ResizeObserver(() => {
|
|
31
|
+
if (tableContainer) {
|
|
32
|
+
const rect = tableContainer.getBoundingClientRect();
|
|
33
|
+
containerWidth = rect.width;
|
|
34
|
+
}
|
|
35
|
+
calculateStickyMetrics();
|
|
36
|
+
updateRemainingWidth();
|
|
37
|
+
});
|
|
38
|
+
if (tableContainer) {
|
|
39
|
+
resizeObserver.observe(tableContainer);
|
|
40
|
+
}
|
|
23
41
|
if (appendSnippet && headersHTML['row-append-header']) {
|
|
24
42
|
const actionCells = tableContainer?.querySelectorAll('.row-append-cell');
|
|
25
43
|
if (actionCells && actionCells.length > 0) {
|
|
@@ -31,7 +49,7 @@ onMount(() => {
|
|
|
31
49
|
maxActionWidth = width;
|
|
32
50
|
}
|
|
33
51
|
}
|
|
34
|
-
const finalWidth = Math.ceil(maxActionWidth
|
|
52
|
+
const finalWidth = Math.max(Math.ceil(maxActionWidth), 40);
|
|
35
53
|
headersHTML['row-append-header'].style.width = `${finalWidth}px`;
|
|
36
54
|
headersHTML['row-append-header'].style.minWidth = `${finalWidth}px`;
|
|
37
55
|
}
|
|
@@ -43,17 +61,32 @@ onMount(() => {
|
|
|
43
61
|
}
|
|
44
62
|
}
|
|
45
63
|
tableHTML?.classList.add('resizable');
|
|
46
|
-
resizeObserver = new ResizeObserver(() => {
|
|
47
|
-
updateRemainingWidth();
|
|
48
|
-
});
|
|
49
|
-
if (tableContainer) {
|
|
50
|
-
resizeObserver.observe(tableContainer);
|
|
51
|
-
}
|
|
52
64
|
return () => {
|
|
53
65
|
resizeObserver?.disconnect();
|
|
54
66
|
};
|
|
55
|
-
}
|
|
67
|
+
})();
|
|
56
68
|
});
|
|
69
|
+
function calculateStickyMetrics() {
|
|
70
|
+
let width = 0;
|
|
71
|
+
if (prependSnippet && headersHTML['prepend']) {
|
|
72
|
+
width += headersHTML['prepend'].getBoundingClientRect().width;
|
|
73
|
+
}
|
|
74
|
+
headers.forEach(head => {
|
|
75
|
+
if (head.pinned) {
|
|
76
|
+
const stored = resizedColumnSizeWithPadding[head.value];
|
|
77
|
+
if (stored) {
|
|
78
|
+
width += stored;
|
|
79
|
+
}
|
|
80
|
+
else if (headersHTML[head.value]) {
|
|
81
|
+
width += headersHTML[head.value].getBoundingClientRect().width;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
if (stickyAppendSnippet && headersHTML['row-append-header']) {
|
|
86
|
+
width += headersHTML['row-append-header'].getBoundingClientRect().width;
|
|
87
|
+
}
|
|
88
|
+
totalStickyWidth = width;
|
|
89
|
+
}
|
|
57
90
|
function handleHeaderClick(header) {
|
|
58
91
|
if (header.sortable && !resizing) {
|
|
59
92
|
if (!!sortedBy && header.value == sortedBy) {
|
|
@@ -146,6 +179,7 @@ function resize(node) {
|
|
|
146
179
|
resizedColumnSizeWithPadding = {
|
|
147
180
|
...resizedColumnSizeWithPadding,
|
|
148
181
|
};
|
|
182
|
+
calculateStickyMetrics();
|
|
149
183
|
}
|
|
150
184
|
}
|
|
151
185
|
}
|
|
@@ -165,6 +199,7 @@ function resize(node) {
|
|
|
165
199
|
}
|
|
166
200
|
});
|
|
167
201
|
}
|
|
202
|
+
calculateStickyMetrics();
|
|
168
203
|
}
|
|
169
204
|
}
|
|
170
205
|
function mouseDownHandler(e) {
|
|
@@ -188,14 +223,12 @@ function resize(node) {
|
|
|
188
223
|
}
|
|
189
224
|
}
|
|
190
225
|
$effect(() => {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
tick().then(updateRemainingWidth);
|
|
198
|
-
}
|
|
226
|
+
headers;
|
|
227
|
+
resizedColumnSizeWithPadding;
|
|
228
|
+
tick().then(() => {
|
|
229
|
+
calculateStickyMetrics();
|
|
230
|
+
updateRemainingWidth();
|
|
231
|
+
});
|
|
199
232
|
});
|
|
200
233
|
async function updateRemainingWidth() {
|
|
201
234
|
if (tableContainer != null && !!tableContainer && mainHeader) {
|
|
@@ -209,7 +242,7 @@ async function updateRemainingWidth() {
|
|
|
209
242
|
const width = th?.getBoundingClientRect().width || 0;
|
|
210
243
|
return sum + width + 1;
|
|
211
244
|
}, 0);
|
|
212
|
-
const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header
|
|
245
|
+
const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.row-append-header'))
|
|
213
246
|
.reduce((sum, th) => sum + th.getBoundingClientRect().width + 1, 0);
|
|
214
247
|
remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth);
|
|
215
248
|
}
|
|
@@ -241,15 +274,16 @@ function resizeHeader(th, header) {
|
|
|
241
274
|
</script>
|
|
242
275
|
|
|
243
276
|
{#if !!items && Array.isArray(items)}
|
|
244
|
-
<div class="simple-table-container {clazz.container || ''}"
|
|
277
|
+
<div class="simple-table-container {clazz.container || ''}" bind:this={tableContainer}>
|
|
245
278
|
<table class="table" bind:this={tableHTML}>
|
|
246
279
|
<thead class="thead {clazz.header || ''}" bind:this={mainHeader}>
|
|
247
280
|
<tr>
|
|
248
281
|
{#if prependSnippet}
|
|
249
282
|
<th
|
|
283
|
+
bind:this={headersHTML['prepend']}
|
|
250
284
|
class="non-resizable"
|
|
251
|
-
class:sticky-col={headers.find(h => h.pinned)}
|
|
252
|
-
style:left={
|
|
285
|
+
class:sticky-col={headers.find(h => h.pinned) && stickyEnabled}
|
|
286
|
+
style:left={headers.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
|
|
253
287
|
>
|
|
254
288
|
{@render prependSnippet({ index: -1 })}
|
|
255
289
|
</th>
|
|
@@ -262,9 +296,9 @@ function resizeHeader(th, header) {
|
|
|
262
296
|
style:min-width={head.minWidth}
|
|
263
297
|
style:max-width={head.maxWidth}
|
|
264
298
|
class:sortable={head.sortable}
|
|
265
|
-
class:sticky-col={head.pinned}
|
|
299
|
+
class:sticky-col={head.pinned && stickyEnabled}
|
|
266
300
|
style:left={
|
|
267
|
-
head.pinned
|
|
301
|
+
(head.pinned && stickyEnabled)
|
|
268
302
|
? (prependSnippet)
|
|
269
303
|
? `calc(${baseLeft}px + ${extraLeft})`
|
|
270
304
|
: `${baseLeft}px`
|
|
@@ -314,22 +348,21 @@ function resizeHeader(th, header) {
|
|
|
314
348
|
{/if}
|
|
315
349
|
</th>
|
|
316
350
|
{/each}
|
|
317
|
-
{#if appendSnippet}
|
|
351
|
+
{#if stickyAppendSnippet || appendSnippet}
|
|
318
352
|
<th
|
|
353
|
+
class:sticky-col={stickyAppendSnippet && stickyEnabled}
|
|
354
|
+
style:right={stickyAppendSnippet && stickyEnabled ? 0 : undefined}
|
|
319
355
|
class="row-append-header"
|
|
320
356
|
bind:this={headersHTML['row-append-header']}
|
|
321
357
|
>
|
|
322
|
-
{
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
class="fixed-col"
|
|
328
|
-
>
|
|
329
|
-
{@render stickyAppendSnippet()}
|
|
358
|
+
{#if stickyAppendSnippet}
|
|
359
|
+
{@render stickyAppendSnippet()}
|
|
360
|
+
{:else if appendSnippet}
|
|
361
|
+
{@render appendSnippet({ index: -1, })}
|
|
362
|
+
{/if}
|
|
330
363
|
</th>
|
|
331
364
|
{/if}
|
|
332
|
-
{#if
|
|
365
|
+
{#if remainingWidth}
|
|
333
366
|
<th
|
|
334
367
|
style:width={remainingWidth + 'px'}
|
|
335
368
|
class="filler"
|
|
@@ -370,8 +403,8 @@ function resizeHeader(th, header) {
|
|
|
370
403
|
{#if prependSnippet}
|
|
371
404
|
<td
|
|
372
405
|
class="{clazz.cell || ''} non-resizable"
|
|
373
|
-
class:sticky-col={headers.find(h => h.pinned)}
|
|
374
|
-
style:left={
|
|
406
|
+
class:sticky-col={headers.find(h => h.pinned) && stickyEnabled}
|
|
407
|
+
style:left={headers.find(h => h.pinned) && stickyEnabled ? 0 : undefined}
|
|
375
408
|
>
|
|
376
409
|
{@render prependSnippet({ index: i, item })}
|
|
377
410
|
</td>
|
|
@@ -381,9 +414,9 @@ function resizeHeader(th, header) {
|
|
|
381
414
|
{@const extraLeft = 'var(--simple-table-non-resizable-header-width, var(--simple-table-default-non-resizable-header-width))'}
|
|
382
415
|
<td
|
|
383
416
|
class="{clazz.cell || ''}"
|
|
384
|
-
class:sticky-col={header.pinned}
|
|
417
|
+
class:sticky-col={header.pinned && stickyEnabled}
|
|
385
418
|
style:left={
|
|
386
|
-
header.pinned
|
|
419
|
+
(header.pinned && stickyEnabled)
|
|
387
420
|
? (prependSnippet)
|
|
388
421
|
? `calc(${baseLeft}px + ${extraLeft})`
|
|
389
422
|
: `${baseLeft}px`
|
|
@@ -419,19 +452,21 @@ function resizeHeader(th, header) {
|
|
|
419
452
|
{/if}
|
|
420
453
|
</td>
|
|
421
454
|
{/each}
|
|
422
|
-
{#if appendSnippet}
|
|
455
|
+
{#if stickyAppendSnippet || appendSnippet}
|
|
423
456
|
<td
|
|
424
457
|
class="{clazz.cell || ''}"
|
|
458
|
+
class:sticky-col={stickyAppendSnippet && stickyEnabled}
|
|
459
|
+
style:right={stickyAppendSnippet && stickyEnabled ? 0 : undefined}
|
|
425
460
|
>
|
|
426
|
-
<div
|
|
427
|
-
|
|
461
|
+
<div
|
|
462
|
+
class="row-append-cell"
|
|
463
|
+
style="display: inline-block; white-space: nowrap;"
|
|
464
|
+
>
|
|
465
|
+
{@render appendSnippet?.({ index: i, item })}
|
|
428
466
|
</div>
|
|
429
467
|
</td>
|
|
430
468
|
{/if}
|
|
431
|
-
{#if
|
|
432
|
-
<td></td>
|
|
433
|
-
{/if}
|
|
434
|
-
{#if resizableColumns && remainingWidth}
|
|
469
|
+
{#if remainingWidth}
|
|
435
470
|
<td></td>
|
|
436
471
|
{/if}
|
|
437
472
|
</tr>
|
|
@@ -750,10 +785,7 @@ function resizeHeader(th, header) {
|
|
|
750
785
|
var(--simple-table-default-non-resizable-header-width)
|
|
751
786
|
);
|
|
752
787
|
}
|
|
753
|
-
.
|
|
754
|
-
position: sticky;
|
|
755
|
-
right: 0;
|
|
756
|
-
z-index: 3;
|
|
788
|
+
.row-append-header {
|
|
757
789
|
width: 23px;
|
|
758
790
|
min-width: 23px;
|
|
759
791
|
}
|
|
@@ -45,9 +45,9 @@ declare class __sveltets_Render<Item extends {
|
|
|
45
45
|
loading?: boolean;
|
|
46
46
|
doubleClickActive?: boolean;
|
|
47
47
|
doubleClickDelay?: number;
|
|
48
|
-
stickFirstColumn?: boolean;
|
|
49
48
|
calculateRowStyles?: CalculateRowStyles<Item> | undefined;
|
|
50
49
|
calculateRowClasses?: CalculateRowClasses<Item> | undefined;
|
|
50
|
+
stickyMinContainerWidth?: number;
|
|
51
51
|
onsort?: ((event: {
|
|
52
52
|
detail: {
|
|
53
53
|
sortedBy: string | undefined;
|
package/dist/index.d.ts
CHANGED
|
@@ -85,3 +85,5 @@ export { default as CollapsibleDivider } from './components/simple/common/Collap
|
|
|
85
85
|
export { default as ConfirmOrCancelButtons } from './components/composed/forms/ConfirmOrCancelButtons.svelte';
|
|
86
86
|
export { default as SearchBar } from './components/composed/search/SearchBar.svelte';
|
|
87
87
|
export { default as DashboardShaper } from './components/composed/dashboard/DashboardShaper.svelte';
|
|
88
|
+
export { default as PeriodSelector } from './components/composed/forms/PeriodSelector.svelte';
|
|
89
|
+
export { default as PeriodPicker } from './components/composed/forms/PeriodPicker.svelte';
|
package/dist/index.js
CHANGED
|
@@ -85,3 +85,5 @@ export { default as CollapsibleDivider } from './components/simple/common/Collap
|
|
|
85
85
|
export { default as ConfirmOrCancelButtons } from './components/composed/forms/ConfirmOrCancelButtons.svelte';
|
|
86
86
|
export { default as SearchBar } from './components/composed/search/SearchBar.svelte';
|
|
87
87
|
export { default as DashboardShaper } from './components/composed/dashboard/DashboardShaper.svelte';
|
|
88
|
+
export { default as PeriodSelector } from './components/composed/forms/PeriodSelector.svelte';
|
|
89
|
+
export { default as PeriodPicker } from './components/composed/forms/PeriodPicker.svelte';
|