ui-svelte 0.2.10 → 0.2.12
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/charts/ArcChart.svelte +9 -13
- package/dist/charts/ArcChart.svelte.d.ts +3 -3
- package/dist/charts/AreaChart.svelte +347 -118
- package/dist/charts/AreaChart.svelte.d.ts +33 -4
- package/dist/charts/BarChart.svelte +288 -66
- package/dist/charts/BarChart.svelte.d.ts +26 -1
- package/dist/charts/Candlestick.svelte +53 -50
- package/dist/charts/Candlestick.svelte.d.ts +8 -8
- package/dist/charts/LineChart.svelte +391 -91
- package/dist/charts/LineChart.svelte.d.ts +26 -3
- package/dist/charts/PieChart.svelte +333 -92
- package/dist/charts/PieChart.svelte.d.ts +33 -5
- package/dist/charts/css/arc-chart.css +3 -3
- package/dist/charts/css/area-chart.css +127 -29
- package/dist/charts/css/bar-chart.css +114 -8
- package/dist/charts/css/candlestick.css +2 -0
- package/dist/charts/css/line-chart.css +111 -13
- package/dist/charts/css/pie-chart.css +92 -20
- package/dist/control/Audio.svelte +86 -44
- package/dist/control/Audio.svelte.d.ts +4 -1
- package/dist/control/Button.svelte +18 -27
- package/dist/control/Button.svelte.d.ts +3 -2
- package/dist/control/IconButton.svelte +17 -27
- package/dist/control/IconButton.svelte.d.ts +3 -3
- package/dist/control/Image.svelte +123 -0
- package/dist/control/Image.svelte.d.ts +13 -0
- package/dist/control/Record.svelte +144 -98
- package/dist/control/Record.svelte.d.ts +2 -1
- package/dist/control/ToggleGroup.svelte +22 -8
- package/dist/control/ToggleGroup.svelte.d.ts +2 -1
- package/dist/control/ToggleTheme.svelte +13 -11
- package/dist/control/ToggleTheme.svelte.d.ts +3 -2
- package/dist/control/Video.svelte +55 -29
- package/dist/control/Video.svelte.d.ts +1 -0
- package/dist/control/css/btn.css +200 -152
- package/dist/control/css/image.css +56 -0
- package/dist/control/css/media.css +95 -30
- package/dist/control/css/toggle-group.css +269 -84
- package/dist/control/css/video.css +1 -14
- package/dist/css/animations.css +427 -2
- package/dist/css/base.css +13 -347
- package/dist/css/decorations.css +402 -0
- package/dist/css/rich-text.css +485 -0
- package/dist/css/transitions.css +158 -0
- package/dist/css/typography.css +291 -0
- package/dist/display/Accordion.svelte +28 -4
- package/dist/display/Accordion.svelte.d.ts +2 -1
- package/dist/display/Alert.svelte +32 -12
- package/dist/display/Alert.svelte.d.ts +2 -3
- package/dist/display/Avatar.svelte +54 -26
- package/dist/display/Avatar.svelte.d.ts +7 -1
- package/dist/display/AvatarGroup.svelte +26 -18
- package/dist/display/AvatarGroup.svelte.d.ts +9 -3
- package/dist/display/Badge.svelte +11 -4
- package/dist/display/Badge.svelte.d.ts +2 -1
- package/dist/display/Card.svelte +15 -14
- package/dist/display/Card.svelte.d.ts +2 -3
- package/dist/display/Carousel.svelte +130 -99
- package/dist/display/Carousel.svelte.d.ts +6 -4
- package/dist/display/ChatBox.svelte +245 -106
- package/dist/display/ChatBox.svelte.d.ts +32 -5
- package/dist/display/Chip.svelte +31 -17
- package/dist/display/Chip.svelte.d.ts +3 -2
- package/dist/display/Code.svelte +6 -3
- package/dist/display/Code.svelte.d.ts +1 -0
- package/dist/display/Collapsible.svelte +30 -4
- package/dist/display/Collapsible.svelte.d.ts +2 -1
- package/dist/display/Empty.svelte +37 -3
- package/dist/display/Empty.svelte.d.ts +3 -0
- package/dist/display/Item.svelte +31 -18
- package/dist/display/Item.svelte.d.ts +2 -2
- package/dist/display/Map.svelte +488 -0
- package/dist/display/Map.svelte.d.ts +44 -0
- package/dist/display/Section.svelte +14 -12
- package/dist/display/Section.svelte.d.ts +2 -3
- package/dist/display/Skeleton.svelte +32 -0
- package/dist/display/Skeleton.svelte.d.ts +10 -0
- package/dist/display/Table.svelte +94 -132
- package/dist/display/Table.svelte.d.ts +10 -1
- package/dist/display/css/accordion.css +349 -52
- package/dist/display/css/alert.css +18 -25
- package/dist/display/css/avatar-group.css +38 -44
- package/dist/display/css/avatar.css +152 -123
- package/dist/display/css/badge.css +50 -27
- package/dist/display/css/card.css +51 -71
- package/dist/display/css/carousel.css +25 -5
- package/dist/display/css/chat-box.css +158 -26
- package/dist/display/css/chip.css +142 -68
- package/dist/display/css/code.css +2 -6
- package/dist/display/css/collapsible.css +349 -45
- package/dist/display/css/divider.css +8 -6
- package/dist/display/css/empty.css +7 -0
- package/dist/display/css/item.css +311 -89
- package/dist/display/css/map.css +164 -0
- package/dist/display/css/section.css +78 -33
- package/dist/display/css/skeleton.css +58 -0
- package/dist/display/css/table.css +320 -189
- package/dist/form/Checkbox.svelte +11 -5
- package/dist/form/Checkbox.svelte.d.ts +2 -1
- package/dist/form/ColorField.svelte +543 -0
- package/dist/form/ColorField.svelte.d.ts +29 -0
- package/dist/form/ComboBox.svelte +24 -9
- package/dist/form/ComboBox.svelte.d.ts +2 -2
- package/dist/form/CsvField.svelte +62 -136
- package/dist/form/CsvField.svelte.d.ts +2 -2
- package/dist/form/DateField.svelte +33 -15
- package/dist/form/DateField.svelte.d.ts +2 -1
- package/dist/form/DateRange.svelte +436 -0
- package/dist/form/DateRange.svelte.d.ts +24 -0
- package/dist/form/DragDrop.svelte +348 -0
- package/dist/form/DragDrop.svelte.d.ts +32 -0
- package/dist/form/Dropzone.svelte +28 -8
- package/dist/form/Dropzone.svelte.d.ts +2 -2
- package/dist/form/Editor.svelte +626 -0
- package/dist/form/Editor.svelte.d.ts +50 -0
- package/dist/form/ImageCropper.svelte +291 -61
- package/dist/form/ImageCropper.svelte.d.ts +15 -1
- package/dist/form/PasswordField.svelte +120 -75
- package/dist/form/PasswordField.svelte.d.ts +9 -10
- package/dist/form/PhoneField.svelte +34 -16
- package/dist/form/PhoneField.svelte.d.ts +4 -3
- package/dist/form/PinField.svelte +39 -31
- package/dist/form/PinField.svelte.d.ts +3 -3
- package/dist/form/RadioGroup.svelte +4 -4
- package/dist/form/RadioGroup.svelte.d.ts +1 -1
- package/dist/form/Select.svelte +20 -19
- package/dist/form/Select.svelte.d.ts +2 -2
- package/dist/form/Slider.svelte +4 -2
- package/dist/form/Slider.svelte.d.ts +1 -0
- package/dist/form/TextField.svelte +16 -7
- package/dist/form/TextField.svelte.d.ts +2 -2
- package/dist/form/Textarea.svelte +15 -6
- package/dist/form/Textarea.svelte.d.ts +2 -2
- package/dist/form/Toggle.svelte +11 -1
- package/dist/form/Toggle.svelte.d.ts +2 -0
- package/dist/form/css/checkbox.css +18 -2
- package/dist/form/css/color-field.css +141 -0
- package/dist/form/css/control.css +193 -82
- package/dist/form/css/csv-field.css +226 -0
- package/dist/form/css/date-range.css +122 -0
- package/dist/form/css/date.css +24 -2
- package/dist/form/css/drag-drop.css +271 -0
- package/dist/form/css/dropzone.css +153 -34
- package/dist/form/css/editor.css +367 -0
- package/dist/form/css/field.css +4 -0
- package/dist/form/css/image-cropper.css +223 -22
- package/dist/form/css/password.css +1 -1
- package/dist/form/css/radio-group.css +1 -1
- package/dist/form/css/select.css +2 -2
- package/dist/form/css/slider.css +1 -0
- package/dist/form/css/textarea.css +178 -75
- package/dist/form/css/toggle.css +11 -2
- package/dist/hooks/use-table.svelte.d.ts +1 -0
- package/dist/hooks/use-table.svelte.js +6 -0
- package/dist/icons/index.d.ts +38 -2
- package/dist/icons/index.js +40 -4
- package/dist/index.css +16 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.js +10 -2
- package/dist/layout/AppBar.svelte +22 -14
- package/dist/layout/AppBar.svelte.d.ts +2 -1
- package/dist/layout/Footer.svelte +19 -11
- package/dist/layout/Footer.svelte.d.ts +2 -1
- package/dist/layout/Provider.svelte +27 -4
- package/dist/layout/Provider.svelte.d.ts +3 -1
- package/dist/layout/css/app-bar.css +63 -66
- package/dist/layout/css/footer.css +62 -65
- package/dist/navigation/BottomNav.svelte +41 -13
- package/dist/navigation/FooterGroup.svelte +1 -1
- package/dist/navigation/NavMenu.svelte +47 -23
- package/dist/navigation/NavMenu.svelte.d.ts +29 -0
- package/dist/navigation/Pagination.svelte +158 -0
- package/dist/navigation/Pagination.svelte.d.ts +18 -0
- package/dist/navigation/SideNav.svelte +30 -25
- package/dist/navigation/SideNav.svelte.d.ts +2 -3
- package/dist/navigation/Tabs.svelte +17 -7
- package/dist/navigation/Tabs.svelte.d.ts +2 -2
- package/dist/navigation/css/bottom-nav.css +279 -257
- package/dist/navigation/css/footer-group.css +1 -1
- package/dist/navigation/css/footer-nav.css +1 -1
- package/dist/navigation/css/nav-menu.css +332 -106
- package/dist/navigation/css/pagination.css +74 -0
- package/dist/navigation/css/side-nav.css +515 -75
- package/dist/navigation/css/tabs.css +246 -52
- package/dist/overlay/Command.svelte +340 -0
- package/dist/overlay/Command.svelte.d.ts +24 -25
- package/dist/overlay/Drawer.svelte +49 -21
- package/dist/overlay/Drawer.svelte.d.ts +2 -2
- package/dist/overlay/Dropdown.svelte +4 -5
- package/dist/overlay/Modal.svelte +51 -16
- package/dist/overlay/Modal.svelte.d.ts +3 -3
- package/dist/overlay/Toast.svelte +41 -17
- package/dist/overlay/Toast.svelte.d.ts +1 -1
- package/dist/overlay/Tooltip.svelte +40 -26
- package/dist/overlay/Tooltip.svelte.d.ts +2 -2
- package/dist/overlay/css/command.css +80 -0
- package/dist/overlay/css/drawer.css +63 -24
- package/dist/overlay/css/dropdown.css +1 -1
- package/dist/overlay/css/hovercard.css +1 -1
- package/dist/overlay/css/modal.css +27 -27
- package/dist/overlay/css/toast.css +17 -29
- package/dist/overlay/css/tooltip.css +83 -66
- package/dist/stores/theme.svelte.js +26 -1
- package/dist/stores/toast.svelte.d.ts +4 -4
- package/dist/stores/toast.svelte.js +2 -2
- package/package.json +1 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import type { TableState } from '../hooks/use-table.svelte.js';
|
|
3
3
|
import { cn } from '../utils/class-names.js';
|
|
4
|
-
import { Empty, TextField, Select, Checkbox, Icon, Button } from '../index.js';
|
|
4
|
+
import { Empty, TextField, Select, Checkbox, Icon, Button, Pagination } from '../index.js';
|
|
5
5
|
import type { Snippet } from 'svelte';
|
|
6
6
|
import {
|
|
7
|
-
ArrowLeft24RegularIcon,
|
|
8
|
-
ArrowRight24RegularIcon,
|
|
9
7
|
ArrowSortDownLines24RegularIcon,
|
|
10
|
-
ArrowSortUpLines24RegularIcon
|
|
8
|
+
ArrowSortUpLines24RegularIcon,
|
|
9
|
+
Search24RegularIcon
|
|
11
10
|
} from '../icons/index.js';
|
|
11
|
+
import IconButton from '../control/IconButton.svelte';
|
|
12
12
|
|
|
13
13
|
const handleSort = (column: { field: string; sortable?: boolean }) => {
|
|
14
14
|
if (!column.sortable) return;
|
|
@@ -17,15 +17,6 @@
|
|
|
17
17
|
table.setSort(column.field, newOrder);
|
|
18
18
|
};
|
|
19
19
|
|
|
20
|
-
const getSortIcon = (field: string): string => {
|
|
21
|
-
if (table.sortBy !== field) {
|
|
22
|
-
return 'fluent:arrow-sort-down-lines-24-regular';
|
|
23
|
-
}
|
|
24
|
-
return table.sortOrder === 'ASC'
|
|
25
|
-
? 'fluent:arrow-sort-up-lines-24-regular'
|
|
26
|
-
: 'fluent:arrow-sort-down-lines-24-regular';
|
|
27
|
-
};
|
|
28
|
-
|
|
29
20
|
const isColumnSorted = (field: string): boolean => {
|
|
30
21
|
return table.sortBy === field;
|
|
31
22
|
};
|
|
@@ -35,6 +26,7 @@
|
|
|
35
26
|
isStriped?: boolean;
|
|
36
27
|
isBordered?: boolean;
|
|
37
28
|
hasDividers?: boolean;
|
|
29
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
38
30
|
noDataTitle?: string;
|
|
39
31
|
noDataDescription?: string;
|
|
40
32
|
noDataType?: 'playlist' | 'result' | 'data' | 'template';
|
|
@@ -51,11 +43,19 @@
|
|
|
51
43
|
totalLabel?: string;
|
|
52
44
|
showToolbar?: boolean;
|
|
53
45
|
toolbarClass?: string;
|
|
54
|
-
|
|
46
|
+
hideSelectionCount?: boolean;
|
|
55
47
|
selectionCountLabel?: string;
|
|
48
|
+
selectionClearLabel?: string;
|
|
56
49
|
toolbarStart?: Snippet;
|
|
57
50
|
toolbarEnd?: Snippet;
|
|
58
51
|
selectionActions?: Snippet<[any[]]>;
|
|
52
|
+
emptyState?: Snippet;
|
|
53
|
+
onRowClick?: (row: any, index: number) => void;
|
|
54
|
+
rowClass?: (row: any, index: number) => string;
|
|
55
|
+
rootClass?: string;
|
|
56
|
+
containerClass?: string;
|
|
57
|
+
headerClass?: string;
|
|
58
|
+
bodyClass?: string;
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
const {
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
isStriped,
|
|
64
64
|
isBordered,
|
|
65
65
|
hasDividers,
|
|
66
|
+
color = 'muted',
|
|
66
67
|
noDataTitle = 'No data',
|
|
67
68
|
noDataDescription = 'There are no records to display',
|
|
68
69
|
noDataType = 'data',
|
|
@@ -79,11 +80,19 @@
|
|
|
79
80
|
totalLabel = 'Total',
|
|
80
81
|
showToolbar = false,
|
|
81
82
|
toolbarClass,
|
|
82
|
-
|
|
83
|
+
hideSelectionCount,
|
|
83
84
|
selectionCountLabel = 'selected',
|
|
85
|
+
selectionClearLabel = 'Clear selection',
|
|
84
86
|
toolbarStart,
|
|
85
87
|
toolbarEnd,
|
|
86
|
-
selectionActions
|
|
88
|
+
selectionActions,
|
|
89
|
+
emptyState,
|
|
90
|
+
onRowClick,
|
|
91
|
+
rowClass,
|
|
92
|
+
rootClass,
|
|
93
|
+
containerClass,
|
|
94
|
+
headerClass,
|
|
95
|
+
bodyClass
|
|
87
96
|
}: Props = $props();
|
|
88
97
|
|
|
89
98
|
const tableSizes = {
|
|
@@ -92,10 +101,21 @@
|
|
|
92
101
|
lg: 'is-lg'
|
|
93
102
|
};
|
|
94
103
|
|
|
104
|
+
const tableColors = {
|
|
105
|
+
primary: 'is-primary',
|
|
106
|
+
secondary: 'is-secondary',
|
|
107
|
+
muted: 'is-muted',
|
|
108
|
+
success: 'is-success',
|
|
109
|
+
info: 'is-info',
|
|
110
|
+
danger: 'is-danger',
|
|
111
|
+
warning: 'is-warning'
|
|
112
|
+
};
|
|
113
|
+
|
|
95
114
|
const shouldShowToolbar = $derived(showToolbar || showSearch || toolbarStart || toolbarEnd);
|
|
96
115
|
|
|
97
116
|
const hasSelection = $derived(table.selectable && table.selectedRows.length > 0);
|
|
98
117
|
|
|
118
|
+
// svelte-ignore state_referenced_locally
|
|
99
119
|
let searchValue = $state(table.search ?? '');
|
|
100
120
|
|
|
101
121
|
const rowsPerPageSelectOptions = $derived(
|
|
@@ -125,47 +145,9 @@
|
|
|
125
145
|
const handleRowSelectChange = (row: any) => {
|
|
126
146
|
table.toggleRow(row);
|
|
127
147
|
};
|
|
128
|
-
|
|
129
|
-
const getPageNumbers = (current: number, total: number): (number | string)[] => {
|
|
130
|
-
const pages: (number | string)[] = [];
|
|
131
|
-
const delta = 1;
|
|
132
|
-
|
|
133
|
-
if (total <= 7) {
|
|
134
|
-
for (let i = 1; i <= total; i++) {
|
|
135
|
-
pages.push(i);
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
pages.push(1);
|
|
139
|
-
const start = Math.max(2, current - delta);
|
|
140
|
-
const end = Math.min(total - 1, current + delta);
|
|
141
|
-
|
|
142
|
-
if (start > 2) {
|
|
143
|
-
pages.push('...');
|
|
144
|
-
}
|
|
145
|
-
for (let i = start; i <= end; i++) {
|
|
146
|
-
pages.push(i);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (end < total - 1) {
|
|
150
|
-
pages.push('...');
|
|
151
|
-
}
|
|
152
|
-
pages.push(total);
|
|
153
|
-
}
|
|
154
|
-
return pages;
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const pageNumbers = $derived(
|
|
158
|
-
showPagination && table.page && table.totalPages
|
|
159
|
-
? getPageNumbers(table.page, table.totalPages)
|
|
160
|
-
: []
|
|
161
|
-
);
|
|
162
148
|
</script>
|
|
163
149
|
|
|
164
|
-
{
|
|
165
|
-
<SearchIcon class="control-icon" />
|
|
166
|
-
{/snippet}
|
|
167
|
-
|
|
168
|
-
<div class="table-wrapper">
|
|
150
|
+
<div class={cn('table-wrapper', rootClass)}>
|
|
169
151
|
{#if shouldShowToolbar}
|
|
170
152
|
<div class={cn('table-toolbar', toolbarClass)}>
|
|
171
153
|
<div class="table-toolbar-start">
|
|
@@ -173,11 +155,11 @@
|
|
|
173
155
|
<TextField
|
|
174
156
|
value={searchValue}
|
|
175
157
|
placeholder={searchPlaceholder}
|
|
176
|
-
|
|
158
|
+
startIcon={Search24RegularIcon}
|
|
177
159
|
variant="outlined"
|
|
178
160
|
size="sm"
|
|
179
161
|
oninput={handleSearchInput}
|
|
180
|
-
|
|
162
|
+
rootClass="table-toolbar-search"
|
|
181
163
|
/>
|
|
182
164
|
{/if}
|
|
183
165
|
{#if toolbarStart}
|
|
@@ -194,17 +176,17 @@
|
|
|
194
176
|
{/if}
|
|
195
177
|
|
|
196
178
|
{#if hasSelection}
|
|
197
|
-
<div class=
|
|
179
|
+
<div class={cn('table-selection-bar', tableColors[color])}>
|
|
198
180
|
<div class="table-selection-info">
|
|
199
|
-
{#if
|
|
181
|
+
{#if !hideSelectionCount}
|
|
200
182
|
<span class="table-selection-count">
|
|
201
183
|
{table.selectedRows.length}
|
|
202
184
|
{selectionCountLabel}
|
|
203
185
|
</span>
|
|
204
186
|
{/if}
|
|
205
|
-
<
|
|
206
|
-
|
|
207
|
-
</
|
|
187
|
+
<Button variant="ghost" {color} size="sm" onclick={() => table.clearSelection()}>
|
|
188
|
+
{selectionClearLabel}
|
|
189
|
+
</Button>
|
|
208
190
|
</div>
|
|
209
191
|
{#if selectionActions}
|
|
210
192
|
<div class="table-selection-actions">
|
|
@@ -214,17 +196,18 @@
|
|
|
214
196
|
</div>
|
|
215
197
|
{/if}
|
|
216
198
|
|
|
217
|
-
<div class=
|
|
199
|
+
<div class={cn('table-container', containerClass)}>
|
|
218
200
|
<table
|
|
219
201
|
class={cn(
|
|
220
202
|
'table',
|
|
221
203
|
tableSizes[size],
|
|
222
204
|
isStriped && 'is-striped',
|
|
223
205
|
isBordered && 'is-bordered',
|
|
224
|
-
hasDividers && 'has-dividers'
|
|
206
|
+
hasDividers && 'has-dividers',
|
|
207
|
+
color && tableColors[color]
|
|
225
208
|
)}
|
|
226
209
|
>
|
|
227
|
-
<thead class=
|
|
210
|
+
<thead class={cn('table-header', headerClass)}>
|
|
228
211
|
<tr>
|
|
229
212
|
{#if table.selectable}
|
|
230
213
|
<th class="table-head table-checkbox-cell" style="width: 48px;">
|
|
@@ -232,6 +215,7 @@
|
|
|
232
215
|
checked={table.isAllSelected}
|
|
233
216
|
onchange={handleSelectAllChange}
|
|
234
217
|
class={cn('table-checkbox', table.isIndeterminate && 'is-indeterminate')}
|
|
218
|
+
isMuted
|
|
235
219
|
/>
|
|
236
220
|
</th>
|
|
237
221
|
{/if}
|
|
@@ -252,27 +236,24 @@
|
|
|
252
236
|
>
|
|
253
237
|
<span class="table-head-label">{column.label}</span>
|
|
254
238
|
{#if column.sortable}
|
|
255
|
-
<
|
|
239
|
+
<IconButton
|
|
240
|
+
icon={table.sortBy !== column.field
|
|
241
|
+
? ArrowSortDownLines24RegularIcon
|
|
242
|
+
: table.sortOrder === 'ASC'
|
|
243
|
+
? ArrowSortUpLines24RegularIcon
|
|
244
|
+
: ArrowSortDownLines24RegularIcon}
|
|
256
245
|
variant="ghost"
|
|
246
|
+
{color}
|
|
257
247
|
size="xs"
|
|
258
248
|
onclick={() => handleSort(column)}
|
|
259
|
-
|
|
260
|
-
>
|
|
261
|
-
{#if table.sortBy !== column.field}
|
|
262
|
-
<Icon icon={ArrowSortDownLines24RegularIcon} />
|
|
263
|
-
{:else if table.sortOrder === 'ASC'}
|
|
264
|
-
<Icon icon={ArrowSortUpLines24RegularIcon} />
|
|
265
|
-
{:else}
|
|
266
|
-
<Icon icon={ArrowSortDownLines24RegularIcon} />
|
|
267
|
-
{/if}
|
|
268
|
-
</Button>
|
|
249
|
+
/>
|
|
269
250
|
{/if}
|
|
270
251
|
</div>
|
|
271
252
|
</th>
|
|
272
253
|
{/each}
|
|
273
254
|
</tr>
|
|
274
255
|
</thead>
|
|
275
|
-
<tbody class=
|
|
256
|
+
<tbody class={cn('table-body', bodyClass)}>
|
|
276
257
|
{#if table.isLoading}
|
|
277
258
|
{#each Array(loadingRows) as _, index}
|
|
278
259
|
<tr class="table-loading-row">
|
|
@@ -288,26 +269,39 @@
|
|
|
288
269
|
{/each}
|
|
289
270
|
</tr>
|
|
290
271
|
{/each}
|
|
291
|
-
{:else if table.data.length === 0}
|
|
272
|
+
{:else if table.hasInitialized && table.data.length === 0}
|
|
292
273
|
<tr class="table-empty-row">
|
|
293
274
|
<td
|
|
294
275
|
colspan={table.selectable ? table.columns.length + 1 : table.columns.length}
|
|
295
276
|
class="table-empty-cell"
|
|
296
277
|
>
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
278
|
+
{#if emptyState}
|
|
279
|
+
{@render emptyState()}
|
|
280
|
+
{:else}
|
|
281
|
+
<div class="empty-state">
|
|
282
|
+
<div class="empty-icon">
|
|
283
|
+
<Empty type={noDataType} />
|
|
284
|
+
</div>
|
|
285
|
+
<div class="empty-content">
|
|
286
|
+
<h3 class="empty-title">{noDataTitle}</h3>
|
|
287
|
+
<p class="empty-description">{noDataDescription}</p>
|
|
288
|
+
</div>
|
|
304
289
|
</div>
|
|
305
|
-
|
|
290
|
+
{/if}
|
|
306
291
|
</td>
|
|
307
292
|
</tr>
|
|
308
293
|
{:else}
|
|
309
294
|
{#each table.data as item, index}
|
|
310
|
-
|
|
295
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
296
|
+
<!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
|
297
|
+
<tr
|
|
298
|
+
class={cn(
|
|
299
|
+
table.selectable && table.isRowSelected(item) && 'table-row-selected',
|
|
300
|
+
onRowClick && 'is-clickable',
|
|
301
|
+
rowClass?.(item, index)
|
|
302
|
+
)}
|
|
303
|
+
onclick={onRowClick ? () => onRowClick(item, index) : undefined}
|
|
304
|
+
>
|
|
311
305
|
{#if table.selectable}
|
|
312
306
|
<td class="table-checkbox-cell">
|
|
313
307
|
<Checkbox
|
|
@@ -351,7 +345,6 @@
|
|
|
351
345
|
onchange={handleRowsPerPageChange}
|
|
352
346
|
variant="outlined"
|
|
353
347
|
size="sm"
|
|
354
|
-
class="table-rows-per-page-select"
|
|
355
348
|
/>
|
|
356
349
|
</div>
|
|
357
350
|
{/if}
|
|
@@ -359,49 +352,18 @@
|
|
|
359
352
|
{/if}
|
|
360
353
|
|
|
361
354
|
{#if showPagination && table.totalPages && table.totalPages > 1 && !table.isLoading}
|
|
362
|
-
<
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
aria-label="Previous page"
|
|
376
|
-
>
|
|
377
|
-
<Icon icon={ArrowLeft24RegularIcon} />
|
|
378
|
-
</button>
|
|
379
|
-
|
|
380
|
-
{#each pageNumbers as pageNum}
|
|
381
|
-
{#if pageNum === '...'}
|
|
382
|
-
<span class="pagination-ellipsis">...</span>
|
|
383
|
-
{:else}
|
|
384
|
-
<button
|
|
385
|
-
class="pagination-btn"
|
|
386
|
-
class:active={pageNum === table.page}
|
|
387
|
-
onclick={() => table.goToPage?.(pageNum as number)}
|
|
388
|
-
aria-label="Page {pageNum}"
|
|
389
|
-
aria-current={pageNum === table.page ? 'page' : undefined}
|
|
390
|
-
>
|
|
391
|
-
{pageNum}
|
|
392
|
-
</button>
|
|
393
|
-
{/if}
|
|
394
|
-
{/each}
|
|
395
|
-
|
|
396
|
-
<button
|
|
397
|
-
class="pagination-btn"
|
|
398
|
-
onclick={() => table.nextPage?.()}
|
|
399
|
-
disabled={!table.hasNextPage}
|
|
400
|
-
aria-label="Next page"
|
|
401
|
-
>
|
|
402
|
-
<Icon icon={ArrowRight24RegularIcon} />
|
|
403
|
-
</button>
|
|
404
|
-
</div>
|
|
405
|
-
</div>
|
|
355
|
+
<Pagination
|
|
356
|
+
page={table.page ?? 1}
|
|
357
|
+
totalPages={table.totalPages}
|
|
358
|
+
onPrev={() => table.prevPage?.()}
|
|
359
|
+
onNext={() => table.nextPage?.()}
|
|
360
|
+
onPageChange={(p) => table.goToPage?.(p)}
|
|
361
|
+
hasPrevPage={table.hasPrevPage}
|
|
362
|
+
hasNextPage={table.hasNextPage}
|
|
363
|
+
align={paginationAlign}
|
|
364
|
+
variant="soft"
|
|
365
|
+
{color}
|
|
366
|
+
{size}
|
|
367
|
+
/>
|
|
406
368
|
{/if}
|
|
407
369
|
</div>
|
|
@@ -5,6 +5,7 @@ type Props = {
|
|
|
5
5
|
isStriped?: boolean;
|
|
6
6
|
isBordered?: boolean;
|
|
7
7
|
hasDividers?: boolean;
|
|
8
|
+
color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'danger' | 'warning';
|
|
8
9
|
noDataTitle?: string;
|
|
9
10
|
noDataDescription?: string;
|
|
10
11
|
noDataType?: 'playlist' | 'result' | 'data' | 'template';
|
|
@@ -21,11 +22,19 @@ type Props = {
|
|
|
21
22
|
totalLabel?: string;
|
|
22
23
|
showToolbar?: boolean;
|
|
23
24
|
toolbarClass?: string;
|
|
24
|
-
|
|
25
|
+
hideSelectionCount?: boolean;
|
|
25
26
|
selectionCountLabel?: string;
|
|
27
|
+
selectionClearLabel?: string;
|
|
26
28
|
toolbarStart?: Snippet;
|
|
27
29
|
toolbarEnd?: Snippet;
|
|
28
30
|
selectionActions?: Snippet<[any[]]>;
|
|
31
|
+
emptyState?: Snippet;
|
|
32
|
+
onRowClick?: (row: any, index: number) => void;
|
|
33
|
+
rowClass?: (row: any, index: number) => string;
|
|
34
|
+
rootClass?: string;
|
|
35
|
+
containerClass?: string;
|
|
36
|
+
headerClass?: string;
|
|
37
|
+
bodyClass?: string;
|
|
29
38
|
};
|
|
30
39
|
declare const Table: import("svelte").Component<Props, {}, "">;
|
|
31
40
|
type Table = ReturnType<typeof Table>;
|