@softwareone/spi-sv5-library 1.14.4 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/Accordion.svelte +14 -23
- package/dist/components/announcement/Announcement.svelte +53 -61
- package/dist/components/avatar/Avatar.svelte +30 -12
- package/dist/components/avatar/Avatar.svelte.d.ts +2 -2
- package/dist/components/button/Button.svelte +41 -44
- package/dist/components/card/Card.svelte +4 -6
- package/dist/components/chips/Chips.svelte +37 -36
- package/dist/components/chips/Chips.svelte.d.ts +1 -1
- package/dist/components/confirmation/Confirmation.svelte +1 -1
- package/dist/components/controls/attach-file/AttachFile.svelte +18 -41
- package/dist/components/controls/attach-file/FileManager.svelte +16 -30
- package/dist/components/controls/attach-file/Warnings.svelte +13 -15
- package/dist/components/controls/input/Input.svelte +46 -72
- package/dist/components/controls/input/InputIcon.svelte +13 -13
- package/dist/components/controls/label/Label.svelte +5 -9
- package/dist/components/controls/radio-group/RadioGroup.svelte +25 -39
- package/dist/components/controls/select/Select.svelte +49 -71
- package/dist/components/controls/textarea/TextArea.svelte +36 -45
- package/dist/components/controls/toggle/Toggle.svelte +35 -37
- package/dist/components/delete-confirmation/DeleteConfirmation.svelte +1 -1
- package/dist/components/error-page/ErrorPage.svelte +9 -18
- package/dist/components/footer/Footer.svelte +6 -7
- package/dist/components/form/Form.svelte +1 -1
- package/dist/components/header/Header.svelte +39 -45
- package/dist/components/header/HeaderAccount.svelte +21 -33
- package/dist/components/header/HeaderLoader.svelte +13 -8
- package/dist/components/highlight-panel/HighlightPanel.svelte +29 -34
- package/dist/components/home/Home.svelte +18 -36
- package/dist/components/link/Link.svelte +1 -1
- package/dist/components/menu/Menu.svelte +12 -12
- package/dist/components/menu/MenuItem.svelte +25 -29
- package/dist/components/menu/Sidebar.svelte +32 -40
- package/dist/components/modal/Modal.svelte +8 -12
- package/dist/components/modal/ModalContent.svelte +3 -3
- package/dist/components/modal/ModalFooter.svelte +5 -5
- package/dist/components/modal/ModalHeader.svelte +6 -11
- package/dist/components/notification/Notification.svelte +20 -27
- package/dist/components/processing/Processing.svelte +9 -16
- package/dist/components/progress-page/ProgressPage.svelte +13 -18
- package/dist/components/progress-wizard/ProgressWizard.svelte +43 -54
- package/dist/components/search/Search.svelte +24 -29
- package/dist/components/spinner/Spinner.svelte +1 -1
- package/dist/components/switcher/Switcher.svelte +14 -23
- package/dist/components/table/ActionsColumn.svelte +13 -33
- package/dist/components/table/AdvancedFilter.svelte +39 -74
- package/dist/components/table/Body.svelte +9 -18
- package/dist/components/table/ColumnVisibilityDropdown.svelte +24 -55
- package/dist/components/table/Footer.svelte +2 -4
- package/dist/components/table/Header.svelte +23 -44
- package/dist/components/table/PageSize.svelte +24 -36
- package/dist/components/table/Pagination.svelte +49 -35
- package/dist/components/table/RowCheckBox.svelte +5 -12
- package/dist/components/table/Skeleton.svelte +16 -25
- package/dist/components/table/Table.svelte +50 -38
- package/dist/components/table/Table.svelte.d.ts +5 -1
- package/dist/components/table/types.d.ts +9 -1
- package/dist/components/table/utils.d.ts +5 -1
- package/dist/components/table/utils.js +8 -8
- package/dist/components/tabs/Tabs.svelte +16 -20
- package/dist/components/toast/Toast.svelte +27 -30
- package/dist/components/tooltip/Tooltip.svelte +15 -19
- package/dist/components/waffle/Waffle.svelte +9 -13
- package/dist/components/waffle/WaffleItems.svelte +10 -13
- package/dist/styles/index.css +3 -0
- package/dist/styles/reset.css +19 -0
- package/dist/styles/tokens/index.css +2 -0
- package/dist/styles/tokens/primitives/borders.css +17 -0
- package/dist/styles/tokens/primitives/colors.css +41 -0
- package/dist/styles/tokens/primitives/index.css +7 -0
- package/dist/styles/tokens/primitives/motion.css +11 -0
- package/dist/styles/tokens/primitives/opacity.css +6 -0
- package/dist/styles/tokens/primitives/shadows.css +11 -0
- package/dist/styles/tokens/primitives/sizing.css +19 -0
- package/dist/styles/tokens/primitives/typography.css +13 -0
- package/dist/styles/tokens/semantic/colors.css +78 -0
- package/dist/styles/tokens/semantic/index.css +2 -0
- package/dist/styles/tokens/semantic/shadows.css +9 -0
- package/dist/styles/utilities.css +73 -0
- package/package.json +3 -2
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<div class="page-size-selector">
|
|
34
34
|
<span>Rows per page:</span>
|
|
35
35
|
<select
|
|
36
|
-
class="page-size-select"
|
|
36
|
+
class="page-size-select spi-text-semibold-2"
|
|
37
37
|
name="rows-per-page"
|
|
38
38
|
id="rows-per-page"
|
|
39
39
|
title="Rows per page"
|
|
@@ -43,7 +43,9 @@
|
|
|
43
43
|
}}
|
|
44
44
|
>
|
|
45
45
|
{#each DEFAULT_ITEMS_PER_PAGE_OPTIONS as itemPerPage (itemPerPage)}
|
|
46
|
-
<option class="page-size-option" value={itemPerPage}
|
|
46
|
+
<option class="page-size-option spi-text-medium-2" value={itemPerPage}
|
|
47
|
+
>{itemPerPage}</option
|
|
48
|
+
>
|
|
47
49
|
{/each}
|
|
48
50
|
</select>
|
|
49
51
|
</div>
|
|
@@ -55,31 +57,19 @@
|
|
|
55
57
|
|
|
56
58
|
<style>
|
|
57
59
|
.page-size {
|
|
58
|
-
--color-black: #000000;
|
|
59
|
-
--color-primary: #472aff;
|
|
60
|
-
--color-gray-100: #f3f4f6;
|
|
61
|
-
--color-gray-200: #e5e7eb;
|
|
62
|
-
--color-border: #ebedef;
|
|
63
|
-
--spacing-sm: 8px;
|
|
64
|
-
--spacing-md: 12px;
|
|
65
|
-
--spacing-lg: 24px;
|
|
66
|
-
--radius-lg: 8px;
|
|
67
|
-
--font-medium: 500;
|
|
68
|
-
--font-semibold: 600;
|
|
69
|
-
|
|
70
60
|
display: flex;
|
|
71
61
|
align-items: center;
|
|
72
62
|
justify-content: center;
|
|
73
|
-
gap: var(--
|
|
63
|
+
gap: var(--spi-size-6);
|
|
74
64
|
}
|
|
75
65
|
|
|
76
66
|
@media (max-width: 750px) {
|
|
77
67
|
.page-size {
|
|
78
|
-
margin-top:
|
|
68
|
+
margin-top: var(--spi-size-5);
|
|
79
69
|
}
|
|
80
70
|
|
|
81
71
|
.page-size--margin {
|
|
82
|
-
margin-left:
|
|
72
|
+
margin-left: var(--spi-size-3);
|
|
83
73
|
}
|
|
84
74
|
}
|
|
85
75
|
|
|
@@ -90,17 +80,16 @@
|
|
|
90
80
|
}
|
|
91
81
|
|
|
92
82
|
.page-size-select {
|
|
93
|
-
width:
|
|
94
|
-
padding: var(--
|
|
95
|
-
border-radius: var(--
|
|
96
|
-
font-weight: var(--font-semibold);
|
|
83
|
+
width: var(--spi-size-16);
|
|
84
|
+
padding: var(--spi-size-2);
|
|
85
|
+
border-radius: var(--spi-rounded-lg);
|
|
97
86
|
cursor: pointer;
|
|
98
87
|
border: none;
|
|
99
88
|
background: transparent;
|
|
100
89
|
}
|
|
101
90
|
|
|
102
91
|
.page-size-select:hover {
|
|
103
|
-
background: var(--color-
|
|
92
|
+
background: var(--spi-color-surface-subtle);
|
|
104
93
|
}
|
|
105
94
|
|
|
106
95
|
.page-size-select:focus {
|
|
@@ -108,25 +97,24 @@
|
|
|
108
97
|
}
|
|
109
98
|
|
|
110
99
|
.page-size-option {
|
|
111
|
-
gap:
|
|
112
|
-
padding:
|
|
113
|
-
|
|
114
|
-
border-
|
|
115
|
-
border-left: 2px solid var(--color-border);
|
|
100
|
+
gap: var(--spi-size-5);
|
|
101
|
+
padding: var(--spi-size-1) var(--spi-size-4);
|
|
102
|
+
border-right: var(--spi-border-2) solid var(--spi-color-border-default);
|
|
103
|
+
border-left: var(--spi-border-2) solid var(--spi-color-border-default);
|
|
116
104
|
}
|
|
117
105
|
|
|
118
106
|
.page-size-option:hover {
|
|
119
|
-
background: var(--color-
|
|
107
|
+
background: var(--spi-color-surface-muted);
|
|
120
108
|
}
|
|
121
109
|
|
|
122
110
|
.page-size-option:first-of-type {
|
|
123
|
-
border-radius: var(--
|
|
124
|
-
border-top:
|
|
111
|
+
border-radius: var(--spi-rounded-lg) var(--spi-rounded-lg) 0 0;
|
|
112
|
+
border-top: var(--spi-border-2) solid var(--spi-color-border-default);
|
|
125
113
|
}
|
|
126
114
|
|
|
127
115
|
.page-size-option:last-of-type {
|
|
128
|
-
border-radius: 0 0 var(--
|
|
129
|
-
border-bottom:
|
|
116
|
+
border-radius: 0 0 var(--spi-rounded-lg) var(--spi-rounded-lg);
|
|
117
|
+
border-bottom: var(--spi-border-2) solid var(--spi-color-border-default);
|
|
130
118
|
}
|
|
131
119
|
|
|
132
120
|
select,
|
|
@@ -137,12 +125,12 @@
|
|
|
137
125
|
select::picker-icon {
|
|
138
126
|
content: '\e5e1';
|
|
139
127
|
font-family: 'Material Icons';
|
|
140
|
-
color: var(--color-
|
|
128
|
+
color: var(--spi-color-text-primary);
|
|
141
129
|
margin-left: 5px;
|
|
142
130
|
display: inline-flex;
|
|
143
131
|
align-items: center;
|
|
144
132
|
transform: rotate(90deg);
|
|
145
|
-
transition: transform
|
|
133
|
+
transition: transform var(--spi-duration-slow) var(--spi-ease-default);
|
|
146
134
|
}
|
|
147
135
|
|
|
148
136
|
option::checkmark {
|
|
@@ -150,7 +138,7 @@
|
|
|
150
138
|
font-family: 'Material Icons';
|
|
151
139
|
order: 1;
|
|
152
140
|
margin-left: auto;
|
|
153
|
-
color: var(--color-primary);
|
|
141
|
+
color: var(--spi-color-primary-base);
|
|
154
142
|
}
|
|
155
143
|
|
|
156
144
|
select:open::picker-icon {
|
|
@@ -159,6 +147,6 @@
|
|
|
159
147
|
|
|
160
148
|
::picker(select) {
|
|
161
149
|
border: none;
|
|
162
|
-
border-radius: var(--
|
|
150
|
+
border-radius: var(--spi-rounded-lg);
|
|
163
151
|
}
|
|
164
152
|
</style>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<script lang="ts" generics="T">
|
|
2
2
|
import { Tooltip } from '../../index.js';
|
|
3
3
|
import type { Table } from './adapter/index.js';
|
|
4
|
+
import { getPaginationTableContext } from './context.js';
|
|
5
|
+
import { isCursorPagination } from './utils.js';
|
|
4
6
|
|
|
5
7
|
interface Props {
|
|
6
8
|
table: Table<T>;
|
|
@@ -8,7 +10,13 @@
|
|
|
8
10
|
|
|
9
11
|
let { table }: Props = $props();
|
|
10
12
|
|
|
13
|
+
const paginationTable = getPaginationTableContext();
|
|
14
|
+
|
|
11
15
|
const initialPage = $derived(table.getState().pagination.pageIndex + 1);
|
|
16
|
+
const isCursorPaginationEnabled = $derived(
|
|
17
|
+
$paginationTable && isCursorPagination($paginationTable)
|
|
18
|
+
);
|
|
19
|
+
const hasMultiplePages = $derived(table.getPageCount() > 2);
|
|
12
20
|
|
|
13
21
|
const handlePaginationChange = (event: Event) => {
|
|
14
22
|
const input = event.currentTarget as HTMLInputElement;
|
|
@@ -37,18 +45,30 @@
|
|
|
37
45
|
</script>
|
|
38
46
|
|
|
39
47
|
<div class="pagination">
|
|
48
|
+
{#if hasMultiplePages}
|
|
49
|
+
<Tooltip content="First page" width="xs" position="bottom">
|
|
50
|
+
<button
|
|
51
|
+
type="button"
|
|
52
|
+
class="pagination-button spi-text-regular-2"
|
|
53
|
+
onclick={() => table.setPageIndex(0)}
|
|
54
|
+
disabled={!table.getCanPreviousPage()}
|
|
55
|
+
>
|
|
56
|
+
<span class="pagination-icon material-icons spi-text-regular-5">first_page</span>
|
|
57
|
+
</button>
|
|
58
|
+
</Tooltip>
|
|
59
|
+
{/if}
|
|
40
60
|
<button
|
|
41
61
|
type="button"
|
|
42
|
-
class="pagination-button"
|
|
62
|
+
class="pagination-button spi-text-regular-2"
|
|
43
63
|
onclick={() => table.previousPage()}
|
|
44
64
|
disabled={!table.getCanPreviousPage()}
|
|
45
65
|
>
|
|
46
|
-
<span class="pagination-icon material-icons">arrow_back</span>
|
|
66
|
+
<span class="pagination-icon material-icons spi-text-regular-2">arrow_back</span>
|
|
47
67
|
<span>Previous</span>
|
|
48
68
|
</button>
|
|
49
69
|
<div class="pagination-info">
|
|
50
70
|
<span>Page</span>
|
|
51
|
-
{#if table.getPageCount() > 1}
|
|
71
|
+
{#if !isCursorPaginationEnabled && table.getPageCount() > 1}
|
|
52
72
|
<Tooltip content="Enter page number" width="sm" position="bottom">
|
|
53
73
|
<input
|
|
54
74
|
type="text"
|
|
@@ -66,80 +86,74 @@
|
|
|
66
86
|
|
|
67
87
|
<button
|
|
68
88
|
type="button"
|
|
69
|
-
class="pagination-button"
|
|
89
|
+
class="pagination-button spi-text-regular-2"
|
|
70
90
|
onclick={() => table.nextPage()}
|
|
71
91
|
disabled={!table.getCanNextPage()}
|
|
72
92
|
>
|
|
73
93
|
<span>Next</span>
|
|
74
|
-
<span class="pagination-icon material-icons">arrow_forward</span>
|
|
94
|
+
<span class="pagination-icon material-icons spi-text-regular-2">arrow_forward</span>
|
|
75
95
|
</button>
|
|
96
|
+
{#if hasMultiplePages}
|
|
97
|
+
<Tooltip content="Last page" width="xs" position="bottom">
|
|
98
|
+
<button
|
|
99
|
+
type="button"
|
|
100
|
+
class="pagination-button spi-text-regular-2"
|
|
101
|
+
onclick={() => table.setPageIndex(table.getPageCount() - 1)}
|
|
102
|
+
disabled={isCursorPaginationEnabled || !table.getCanNextPage()}
|
|
103
|
+
>
|
|
104
|
+
<span class="pagination-icon material-icons spi-text-regular-5">last_page</span>
|
|
105
|
+
</button>
|
|
106
|
+
</Tooltip>
|
|
107
|
+
{/if}
|
|
76
108
|
</div>
|
|
77
109
|
|
|
78
110
|
<style>
|
|
79
111
|
.pagination {
|
|
80
|
-
--color-primary: #472aff;
|
|
81
|
-
--color-gray-300: #d1d5db;
|
|
82
|
-
--color-gray-500: #6b7280;
|
|
83
|
-
--color-text: #000000;
|
|
84
|
-
--spacing-sm: 8px;
|
|
85
|
-
--spacing-md: 12px;
|
|
86
|
-
--spacing-lg: 24px;
|
|
87
|
-
--radius-lg: 8px;
|
|
88
|
-
--font-size-sm: 14px;
|
|
89
|
-
--font-size-icon: 14px;
|
|
90
|
-
--input-height: 37px;
|
|
91
|
-
--input-width: 38px;
|
|
92
|
-
|
|
93
112
|
display: flex;
|
|
94
113
|
align-items: center;
|
|
95
114
|
justify-content: center;
|
|
96
|
-
gap: var(--
|
|
97
|
-
padding: var(--
|
|
115
|
+
gap: var(--spi-size-6);
|
|
116
|
+
padding: var(--spi-size-2) 0;
|
|
98
117
|
}
|
|
99
118
|
|
|
100
119
|
.pagination-button {
|
|
101
120
|
display: flex;
|
|
102
121
|
align-items: center;
|
|
103
|
-
gap: var(--
|
|
122
|
+
gap: var(--spi-size-2);
|
|
104
123
|
padding: 0;
|
|
105
124
|
border: none;
|
|
106
125
|
background: none;
|
|
107
|
-
|
|
108
|
-
color: var(--color-text);
|
|
126
|
+
color: var(--spi-color-text-primary);
|
|
109
127
|
cursor: pointer;
|
|
110
128
|
}
|
|
111
129
|
|
|
112
130
|
.pagination-button:disabled {
|
|
113
|
-
color: var(--color-
|
|
131
|
+
color: var(--spi-color-text-disabled);
|
|
114
132
|
cursor: not-allowed;
|
|
115
133
|
}
|
|
116
134
|
|
|
117
|
-
.pagination-icon {
|
|
118
|
-
font-size: var(--font-size-icon);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
135
|
.pagination-info {
|
|
122
136
|
display: flex;
|
|
123
137
|
align-items: center;
|
|
124
|
-
gap: var(--
|
|
138
|
+
gap: var(--spi-size-2);
|
|
125
139
|
}
|
|
126
140
|
|
|
127
141
|
.pagination-input {
|
|
128
|
-
height: var(--
|
|
129
|
-
width: var(--
|
|
142
|
+
height: var(--spi-size-9);
|
|
143
|
+
width: var(--spi-size-9);
|
|
130
144
|
padding: 0;
|
|
131
|
-
border:
|
|
132
|
-
border-radius: var(--
|
|
145
|
+
border: var(--spi-border-1) solid var(--spi-color-border-strong);
|
|
146
|
+
border-radius: var(--spi-rounded-lg);
|
|
133
147
|
text-align: center;
|
|
134
148
|
cursor: pointer;
|
|
135
149
|
}
|
|
136
150
|
|
|
137
151
|
.pagination-input:hover {
|
|
138
|
-
border-color: var(--color-primary);
|
|
152
|
+
border-color: var(--spi-color-primary-base);
|
|
139
153
|
}
|
|
140
154
|
|
|
141
155
|
.pagination-input:focus {
|
|
142
|
-
border:
|
|
156
|
+
border: var(--spi-border-1) solid var(--spi-color-primary-base);
|
|
143
157
|
outline: none;
|
|
144
158
|
}
|
|
145
159
|
</style>
|
|
@@ -9,23 +9,16 @@
|
|
|
9
9
|
let { indeterminate = false, checked, disabled = false, onchange }: Props = $props();
|
|
10
10
|
</script>
|
|
11
11
|
|
|
12
|
-
<input
|
|
13
|
-
type="checkbox"
|
|
14
|
-
class="accent-magentablue"
|
|
15
|
-
{disabled}
|
|
16
|
-
{onchange}
|
|
17
|
-
{checked}
|
|
18
|
-
bind:indeterminate
|
|
19
|
-
/>
|
|
12
|
+
<input type="checkbox" class="row-checkbox" {disabled} {onchange} {checked} bind:indeterminate />
|
|
20
13
|
|
|
21
14
|
<style>
|
|
22
|
-
.
|
|
23
|
-
accent-color:
|
|
15
|
+
.row-checkbox {
|
|
16
|
+
accent-color: var(--spi-color-primary-base);
|
|
24
17
|
cursor: pointer;
|
|
25
18
|
}
|
|
26
19
|
|
|
27
|
-
.
|
|
20
|
+
.row-checkbox:disabled {
|
|
28
21
|
cursor: not-allowed;
|
|
29
|
-
opacity:
|
|
22
|
+
opacity: var(--spi-opacity-disabled);
|
|
30
23
|
}
|
|
31
24
|
</style>
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<thead>
|
|
13
13
|
<tr>
|
|
14
14
|
{#each Array(columns).keys() as index (index)}
|
|
15
|
-
<th class="table-skeleton-header">
|
|
15
|
+
<th class="table-skeleton-header spi-text-regular-2">
|
|
16
16
|
<div class="table-skeleton-header-placeholder"></div>
|
|
17
17
|
</th>
|
|
18
18
|
{/each}
|
|
@@ -34,15 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
<style>
|
|
36
36
|
.table-skeleton {
|
|
37
|
-
--color-black: #000;
|
|
38
|
-
--color-gray-300: #d1d5db;
|
|
39
|
-
--spacing-md: 12px;
|
|
40
|
-
--spacing-lg: 16px;
|
|
41
|
-
--font-size-sm: 14px;
|
|
42
37
|
--skeleton-width: 150px;
|
|
43
|
-
--skeleton-header-height: 18px;
|
|
44
|
-
--skeleton-cell-height: 16px;
|
|
45
|
-
--radius-lg: 8px;
|
|
46
38
|
|
|
47
39
|
overflow-x: auto;
|
|
48
40
|
overflow-y: hidden;
|
|
@@ -54,11 +46,10 @@
|
|
|
54
46
|
}
|
|
55
47
|
|
|
56
48
|
.table-skeleton-header {
|
|
57
|
-
padding: var(--
|
|
58
|
-
border-right: 0.5px solid var(--color-
|
|
59
|
-
border-bottom:
|
|
49
|
+
padding: var(--spi-size-3) var(--spi-size-4);
|
|
50
|
+
border-right: 0.5px solid var(--spi-color-border-default);
|
|
51
|
+
border-bottom: var(--spi-border-2) solid var(--spi-color-text-primary);
|
|
60
52
|
text-align: left;
|
|
61
|
-
font-size: var(--font-size-sm);
|
|
62
53
|
}
|
|
63
54
|
|
|
64
55
|
.table-skeleton-header:last-child {
|
|
@@ -66,33 +57,33 @@
|
|
|
66
57
|
}
|
|
67
58
|
|
|
68
59
|
.table-skeleton-header-placeholder {
|
|
69
|
-
height:
|
|
60
|
+
height: 18px;
|
|
70
61
|
width: var(--skeleton-width);
|
|
71
|
-
background: var(--color-
|
|
72
|
-
border-radius: var(--
|
|
73
|
-
animation: pulse 2s
|
|
62
|
+
background: var(--spi-color-neutral-light);
|
|
63
|
+
border-radius: var(--spi-rounded-lg);
|
|
64
|
+
animation: pulse 2s var(--spi-ease-in-out) infinite;
|
|
74
65
|
}
|
|
75
66
|
|
|
76
67
|
.table-skeleton-cell {
|
|
77
|
-
padding: var(--
|
|
78
|
-
border-bottom:
|
|
68
|
+
padding: var(--spi-size-3) var(--spi-size-4);
|
|
69
|
+
border-bottom: var(--spi-border-2) solid var(--spi-color-border-default);
|
|
79
70
|
}
|
|
80
71
|
|
|
81
72
|
.table-skeleton-cell-placeholder {
|
|
82
|
-
height: var(--
|
|
73
|
+
height: var(--spi-size-4);
|
|
83
74
|
width: var(--skeleton-width);
|
|
84
|
-
background: var(--color-
|
|
85
|
-
border-radius: var(--
|
|
86
|
-
animation: pulse 2s
|
|
75
|
+
background: var(--spi-color-neutral-light);
|
|
76
|
+
border-radius: var(--spi-rounded-lg);
|
|
77
|
+
animation: pulse 2s var(--spi-ease-in-out) infinite;
|
|
87
78
|
}
|
|
88
79
|
|
|
89
80
|
@keyframes pulse {
|
|
90
81
|
0%,
|
|
91
82
|
100% {
|
|
92
|
-
opacity:
|
|
83
|
+
opacity: var(--spi-opacity-100);
|
|
93
84
|
}
|
|
94
85
|
50% {
|
|
95
|
-
opacity:
|
|
86
|
+
opacity: var(--spi-opacity-50);
|
|
96
87
|
}
|
|
97
88
|
}
|
|
98
89
|
</style>
|
|
@@ -23,7 +23,12 @@
|
|
|
23
23
|
import AdvancedFilter from './AdvancedFilter.svelte';
|
|
24
24
|
import Body from './Body.svelte';
|
|
25
25
|
import ColumnVisibilityDropdown from './ColumnVisibilityDropdown.svelte';
|
|
26
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
DEFAULT_MIN_PAGE_LIMIT,
|
|
28
|
+
DEFAULT_PAGE,
|
|
29
|
+
DEFAULT_PAGE_LIMIT,
|
|
30
|
+
Operator
|
|
31
|
+
} from './consts.js';
|
|
27
32
|
import { setPaginationTableContext } from './context.js';
|
|
28
33
|
import type { ExcelSetting } from './excel-setting.js';
|
|
29
34
|
import exportExcel from './excel.js';
|
|
@@ -31,7 +36,12 @@
|
|
|
31
36
|
import Header from './Header.svelte';
|
|
32
37
|
import Skeleton from './Skeleton.svelte';
|
|
33
38
|
import { type Filter, type Pagination } from './types.js';
|
|
34
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
createCheckedColumn,
|
|
41
|
+
isCursorPagination,
|
|
42
|
+
isValidPage,
|
|
43
|
+
isValidPageSize
|
|
44
|
+
} from './utils.js';
|
|
35
45
|
|
|
36
46
|
interface Props {
|
|
37
47
|
columns: ColumnDef<T, any>[];
|
|
@@ -45,13 +55,17 @@
|
|
|
45
55
|
enableColumnSearch?: boolean;
|
|
46
56
|
enableColumnVisibility?: boolean;
|
|
47
57
|
enableAdvancedFilter?: boolean;
|
|
48
|
-
|
|
58
|
+
serverSide?: boolean;
|
|
49
59
|
pagination?: Pagination;
|
|
60
|
+
initialPage?: number;
|
|
61
|
+
initialPageSize?: number;
|
|
50
62
|
excelSetting?: ExcelSetting;
|
|
51
63
|
header?: Snippet;
|
|
52
64
|
bulkActions?: Snippet<[selectedRows: T[], clearSelection: VoidFunction]>;
|
|
53
65
|
onpagechange?: (pageSize: number, pageNumber: number) => void;
|
|
54
66
|
onpagesizechange?: (pageSize: number) => void;
|
|
67
|
+
onnextpage?: (pageSize: number, pageNumber: number) => void;
|
|
68
|
+
onprevpage?: (pageSize: number, pageNumber: number) => void;
|
|
55
69
|
}
|
|
56
70
|
|
|
57
71
|
let {
|
|
@@ -66,14 +80,18 @@
|
|
|
66
80
|
enableColumnSearch = false,
|
|
67
81
|
enableColumnVisibility = true,
|
|
68
82
|
enableAdvancedFilter = false,
|
|
69
|
-
|
|
83
|
+
serverSide = false,
|
|
70
84
|
pagination,
|
|
85
|
+
initialPage,
|
|
86
|
+
initialPageSize,
|
|
71
87
|
excelSetting = {
|
|
72
88
|
fileName: 'Table',
|
|
73
89
|
exportAllColumns: false
|
|
74
90
|
},
|
|
75
91
|
onpagechange,
|
|
76
92
|
onpagesizechange,
|
|
93
|
+
onnextpage,
|
|
94
|
+
onprevpage,
|
|
77
95
|
header,
|
|
78
96
|
bulkActions
|
|
79
97
|
}: Props = $props();
|
|
@@ -86,7 +104,7 @@
|
|
|
86
104
|
let columnVisibility = $state<VisibilityState>(getInitialColumnVisibility());
|
|
87
105
|
let paginationState = $state<PaginationState>(getInitialPaginationState());
|
|
88
106
|
let tableData = $derived(data);
|
|
89
|
-
const tableManualPagination =
|
|
107
|
+
const tableManualPagination = serverSide ? setPaginationTableContext() : undefined;
|
|
90
108
|
const hasData = $derived(data.length > 0);
|
|
91
109
|
|
|
92
110
|
const tableColumns = $derived.by(() => {
|
|
@@ -160,7 +178,7 @@
|
|
|
160
178
|
getSortedRowModel: getSortedRowModel(),
|
|
161
179
|
getExpandedRowModel: getExpandedRowModel(),
|
|
162
180
|
getSubRows: (row) => ('children' in row ? (row.children as T[]) : undefined),
|
|
163
|
-
manualPagination,
|
|
181
|
+
manualPagination: serverSide,
|
|
164
182
|
paginateExpandedRows: false,
|
|
165
183
|
enableColumnFilters: true,
|
|
166
184
|
sortDescFirst: false
|
|
@@ -182,28 +200,34 @@
|
|
|
182
200
|
}
|
|
183
201
|
|
|
184
202
|
function getInitialPaginationState(): PaginationState {
|
|
185
|
-
if (!
|
|
203
|
+
if (!serverSide) {
|
|
186
204
|
return {
|
|
187
205
|
pageIndex: 0,
|
|
188
206
|
pageSize: minPageSize ? DEFAULT_MIN_PAGE_LIMIT : DEFAULT_PAGE_LIMIT
|
|
189
207
|
};
|
|
190
208
|
}
|
|
191
209
|
|
|
192
|
-
const currentPage =
|
|
193
|
-
const pageSize =
|
|
210
|
+
const currentPage = isValidPage(initialPage) ? initialPage : DEFAULT_PAGE;
|
|
211
|
+
const pageSize = isValidPageSize(initialPageSize) ? initialPageSize : undefined;
|
|
212
|
+
|
|
194
213
|
const pageIndex = Math.max(0, currentPage - 1);
|
|
195
214
|
|
|
196
|
-
return { pageIndex, pageSize };
|
|
215
|
+
return { pageIndex, pageSize: pageSize ?? DEFAULT_PAGE_LIMIT };
|
|
197
216
|
}
|
|
198
217
|
|
|
199
218
|
function changeManualPagination(updatedPaginationState: PaginationState) {
|
|
200
219
|
const pageSizeChanged = updatedPaginationState.pageSize !== paginationState.pageSize;
|
|
220
|
+
const currentPageNumber = updatedPaginationState.pageIndex + 1;
|
|
201
221
|
|
|
202
222
|
if (pageSizeChanged) {
|
|
203
223
|
updatedPaginationState.pageIndex = 0;
|
|
204
224
|
onpagesizechange?.(updatedPaginationState.pageSize);
|
|
225
|
+
} else if (pagination && isCursorPagination(pagination)) {
|
|
226
|
+
const isNext = updatedPaginationState.pageIndex > paginationState.pageIndex;
|
|
227
|
+
const handler = isNext ? onnextpage : onprevpage;
|
|
228
|
+
|
|
229
|
+
handler?.(updatedPaginationState.pageSize, currentPageNumber);
|
|
205
230
|
} else {
|
|
206
|
-
const currentPageNumber = updatedPaginationState.pageIndex + 1;
|
|
207
231
|
onpagechange?.(updatedPaginationState.pageSize, currentPageNumber);
|
|
208
232
|
}
|
|
209
233
|
}
|
|
@@ -236,7 +260,7 @@
|
|
|
236
260
|
};
|
|
237
261
|
|
|
238
262
|
$effect(() => {
|
|
239
|
-
if (
|
|
263
|
+
if (serverSide && pagination) {
|
|
240
264
|
$tableManualPagination = { ...pagination };
|
|
241
265
|
}
|
|
242
266
|
});
|
|
@@ -292,7 +316,7 @@
|
|
|
292
316
|
</header>
|
|
293
317
|
|
|
294
318
|
{#if enableChecked && (keepVisibleBulkActions || selectedRows.length > 0)}
|
|
295
|
-
<div class="table-bulk-actions">
|
|
319
|
+
<div class="table-bulk-actions spi-text-regular-2">
|
|
296
320
|
<p>
|
|
297
321
|
{selectedRows.length} of {table.getCoreRowModel().rows.length} items are selected
|
|
298
322
|
</p>
|
|
@@ -316,9 +340,9 @@
|
|
|
316
340
|
</article>
|
|
317
341
|
|
|
318
342
|
{#if !hasData}
|
|
319
|
-
<p class="table-message table-message--error">No data available</p>
|
|
343
|
+
<p class="table-message table-message--error spi-text-regular-5">No data available</p>
|
|
320
344
|
{:else if !hasFilteredRows}
|
|
321
|
-
<p class="table-message table-message--error">No items found</p>
|
|
345
|
+
<p class="table-message table-message--error spi-text-regular-5">No items found</p>
|
|
322
346
|
{/if}
|
|
323
347
|
|
|
324
348
|
{#if hasData}
|
|
@@ -329,16 +353,6 @@
|
|
|
329
353
|
|
|
330
354
|
<style>
|
|
331
355
|
.table-container {
|
|
332
|
-
--color-red-600: #dc2626;
|
|
333
|
-
--color-gray-300: #d1d5db;
|
|
334
|
-
--color-gray: #6b7180;
|
|
335
|
-
--font-size-sm: 14px;
|
|
336
|
-
--spacing-md: 16px;
|
|
337
|
-
--spacing-lg: 24px;
|
|
338
|
-
--spacing-xl: 40px;
|
|
339
|
-
--font-size-xl: 20px;
|
|
340
|
-
--search-width: 491px;
|
|
341
|
-
|
|
342
356
|
width: 100%;
|
|
343
357
|
}
|
|
344
358
|
|
|
@@ -356,44 +370,43 @@
|
|
|
356
370
|
}
|
|
357
371
|
|
|
358
372
|
.table-search {
|
|
359
|
-
width:
|
|
373
|
+
width: 491px;
|
|
360
374
|
}
|
|
361
375
|
|
|
362
376
|
.table-search-container {
|
|
363
377
|
display: flex;
|
|
364
378
|
align-items: center;
|
|
365
|
-
gap: var(--
|
|
379
|
+
gap: var(--spi-size-4);
|
|
366
380
|
}
|
|
367
381
|
|
|
368
382
|
.table-actions {
|
|
369
383
|
display: flex;
|
|
370
|
-
gap: var(--
|
|
384
|
+
gap: var(--spi-size-4);
|
|
371
385
|
}
|
|
372
386
|
|
|
373
387
|
.table-bulk-actions {
|
|
374
388
|
display: flex;
|
|
375
389
|
align-items: center;
|
|
376
|
-
gap:
|
|
377
|
-
|
|
378
|
-
margin-top: var(--spacing-md);
|
|
390
|
+
gap: var(--spi-size-2);
|
|
391
|
+
margin-top: var(--spi-size-4);
|
|
379
392
|
}
|
|
380
393
|
|
|
381
394
|
.action-divider {
|
|
382
395
|
border: none;
|
|
383
|
-
border-left:
|
|
396
|
+
border-left: var(--spi-border-1) solid var(--spi-color-border-strong);
|
|
384
397
|
margin: 0;
|
|
385
398
|
height: 15px;
|
|
386
399
|
}
|
|
387
400
|
|
|
388
401
|
.table-article {
|
|
389
|
-
margin: var(--
|
|
390
|
-
padding-right:
|
|
402
|
+
margin: var(--spi-size-4) 0;
|
|
403
|
+
padding-right: var(--spi-size-3);
|
|
391
404
|
overflow-x: auto;
|
|
392
405
|
overflow-y: hidden;
|
|
393
406
|
}
|
|
394
407
|
|
|
395
408
|
.table-article--padding {
|
|
396
|
-
padding-bottom: var(--
|
|
409
|
+
padding-bottom: var(--spi-size-4);
|
|
397
410
|
}
|
|
398
411
|
|
|
399
412
|
.table-main {
|
|
@@ -402,12 +415,11 @@
|
|
|
402
415
|
}
|
|
403
416
|
|
|
404
417
|
.table-message {
|
|
405
|
-
margin-top: var(--
|
|
418
|
+
margin-top: var(--spi-size-10);
|
|
406
419
|
text-align: center;
|
|
407
|
-
font-size: var(--font-size-xl);
|
|
408
420
|
}
|
|
409
421
|
|
|
410
422
|
.table-message--error {
|
|
411
|
-
color: var(--color-
|
|
423
|
+
color: var(--spi-color-text-danger);
|
|
412
424
|
}
|
|
413
425
|
</style>
|
|
@@ -15,13 +15,17 @@ declare function $$render<T extends object>(): {
|
|
|
15
15
|
enableColumnSearch?: boolean;
|
|
16
16
|
enableColumnVisibility?: boolean;
|
|
17
17
|
enableAdvancedFilter?: boolean;
|
|
18
|
-
|
|
18
|
+
serverSide?: boolean;
|
|
19
19
|
pagination?: Pagination;
|
|
20
|
+
initialPage?: number;
|
|
21
|
+
initialPageSize?: number;
|
|
20
22
|
excelSetting?: ExcelSetting;
|
|
21
23
|
header?: Snippet;
|
|
22
24
|
bulkActions?: Snippet<[selectedRows: T[], clearSelection: VoidFunction]>;
|
|
23
25
|
onpagechange?: (pageSize: number, pageNumber: number) => void;
|
|
24
26
|
onpagesizechange?: (pageSize: number) => void;
|
|
27
|
+
onnextpage?: (pageSize: number, pageNumber: number) => void;
|
|
28
|
+
onprevpage?: (pageSize: number, pageNumber: number) => void;
|
|
25
29
|
};
|
|
26
30
|
exports: {};
|
|
27
31
|
bindings: "";
|