@softwareone/spi-sv5-library 1.9.0 → 1.10.1
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/Button/Button.svelte +16 -0
- package/dist/Controls/Input/Input.svelte +1 -1
- package/dist/Controls/{Label.svelte → Label/Label.svelte} +1 -1
- package/dist/Controls/Select/Select.svelte +1 -1
- package/dist/Controls/TextArea/TextArea.svelte +1 -1
- package/dist/Controls/Toggle/Toggle.svelte +1 -1
- package/dist/ProgressWizard/ProgressWizard.svelte +3 -3
- package/dist/Table/ActionsColumn.svelte +203 -0
- package/dist/Table/ActionsColumn.svelte.d.ts +9 -0
- package/dist/Table/Body.svelte +90 -0
- package/dist/Table/Body.svelte.d.ts +27 -0
- package/dist/Table/ColumnVisibilityDropdown.svelte +174 -0
- package/dist/Table/ColumnVisibilityDropdown.svelte.d.ts +27 -0
- package/dist/Table/Footer.svelte +34 -0
- package/dist/Table/Footer.svelte.d.ts +28 -0
- package/dist/Table/Header.svelte +176 -0
- package/dist/Table/Header.svelte.d.ts +28 -0
- package/dist/Table/PageSize.svelte +164 -0
- package/dist/Table/PageSize.svelte.d.ts +28 -0
- package/dist/Table/Pagination.svelte +145 -0
- package/dist/Table/Pagination.svelte.d.ts +27 -0
- package/dist/Table/RowCheckBox.svelte +31 -0
- package/dist/Table/RowCheckBox.svelte.d.ts +9 -0
- package/dist/Table/Skeleton.svelte +99 -0
- package/dist/Table/Skeleton.svelte.d.ts +7 -0
- package/dist/Table/Table.svelte +351 -0
- package/dist/Table/Table.svelte.d.ts +45 -0
- package/dist/Table/adapter/flex-render.svelte +40 -0
- package/dist/Table/adapter/flex-render.svelte.d.ts +28 -0
- package/dist/Table/adapter/index.d.ts +4 -0
- package/dist/Table/adapter/index.js +4 -0
- package/dist/Table/adapter/render-component.d.ts +13 -0
- package/dist/Table/adapter/render-component.js +18 -0
- package/dist/Table/adapter/table.svelte.d.ts +6 -0
- package/dist/Table/adapter/table.svelte.js +66 -0
- package/dist/Table/consts.d.ts +4 -0
- package/dist/Table/consts.js +4 -0
- package/dist/Table/context.d.ts +4 -0
- package/dist/Table/context.js +15 -0
- package/dist/Table/excel-setting.d.ts +8 -0
- package/dist/Table/excel-setting.js +3 -0
- package/dist/Table/excel.d.ts +4 -0
- package/dist/Table/excel.js +66 -0
- package/dist/Table/index.d.ts +6 -0
- package/dist/Table/index.js +6 -0
- package/dist/Table/types.d.ts +16 -0
- package/dist/Table/types.js +1 -0
- package/dist/Table/util.d.ts +4 -0
- package/dist/Table/util.js +46 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/package.json +21 -1
- /package/dist/Controls/{Label.svelte.d.ts → Label/Label.svelte.d.ts} +0 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
<script lang="ts" generics="T extends RowData">
|
|
2
|
+
import { Search } from '../index.js';
|
|
3
|
+
import { FlexRender, type HeaderGroup, type RowData } from './adapter/index.js';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
headerGroups: HeaderGroup<T>[];
|
|
7
|
+
enableColumnSearch: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const getSortIcon: Record<string, string> = {
|
|
11
|
+
asc: 'arrow_upward',
|
|
12
|
+
desc: 'arrow_downward',
|
|
13
|
+
false: 'swap_vert'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
let { headerGroups, enableColumnSearch }: Props = $props();
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<thead class="container">
|
|
20
|
+
{#each headerGroups as headerGroup (headerGroup.id)}
|
|
21
|
+
<tr class="table-header-row">
|
|
22
|
+
{#each headerGroup.headers as header}
|
|
23
|
+
{@const alignColumn = header.column.columnDef.meta?.alignColumn}
|
|
24
|
+
{@const className = header.column.columnDef.meta?.className}
|
|
25
|
+
{@const columnWidth = header.column.columnDef.meta?.columnWidth}
|
|
26
|
+
{@const columnStyle = header.column.columnDef.meta?.style}
|
|
27
|
+
{@const hideColumnFilter = header.column.columnDef.meta?.hideColumnFilter}
|
|
28
|
+
{@const justifyContent = alignColumn ?? 'left'}
|
|
29
|
+
{@const isSorted = header.column.getIsSorted().toString() !== 'false'}
|
|
30
|
+
<th
|
|
31
|
+
colSpan={header.colSpan}
|
|
32
|
+
class={['table-header-cell', className, isSorted && 'table-header-cell--sorted']}
|
|
33
|
+
style:width={columnWidth}
|
|
34
|
+
style={columnStyle}
|
|
35
|
+
>
|
|
36
|
+
{#if !header.isPlaceholder}
|
|
37
|
+
{@const canSort = header.column.getCanSort()}
|
|
38
|
+
|
|
39
|
+
<button
|
|
40
|
+
type="button"
|
|
41
|
+
class={[
|
|
42
|
+
'table-header-button',
|
|
43
|
+
canSort && 'table-header-button--sortable',
|
|
44
|
+
!canSort && 'table-header-button--disabled'
|
|
45
|
+
]}
|
|
46
|
+
disabled={!canSort}
|
|
47
|
+
style:justify-content={justifyContent}
|
|
48
|
+
onclick={header.column.getToggleSortingHandler()}
|
|
49
|
+
>
|
|
50
|
+
<span class="table-header-label" class:table-header-label--sortable={canSort}>
|
|
51
|
+
<FlexRender
|
|
52
|
+
content={header.column.columnDef.header}
|
|
53
|
+
context={header.getContext()}
|
|
54
|
+
/>
|
|
55
|
+
</span>
|
|
56
|
+
|
|
57
|
+
{#if canSort}
|
|
58
|
+
<div class="table-header-sort-icon">
|
|
59
|
+
<span class="material-icons"
|
|
60
|
+
>{getSortIcon[header.column.getIsSorted().toString()]}</span
|
|
61
|
+
>
|
|
62
|
+
</div>
|
|
63
|
+
{/if}
|
|
64
|
+
</button>
|
|
65
|
+
|
|
66
|
+
{#if enableColumnSearch && !hideColumnFilter}
|
|
67
|
+
<div class="table-header-search" style:justify-content={justifyContent}>
|
|
68
|
+
<Search
|
|
69
|
+
oninput={({ currentTarget }) => header.column.setFilterValue(currentTarget.value)}
|
|
70
|
+
onclear={() => header.column.setFilterValue('')}
|
|
71
|
+
disabled={!header.column.getCanFilter()}
|
|
72
|
+
/>
|
|
73
|
+
</div>
|
|
74
|
+
{/if}
|
|
75
|
+
{/if}
|
|
76
|
+
</th>
|
|
77
|
+
{/each}
|
|
78
|
+
</tr>
|
|
79
|
+
{/each}
|
|
80
|
+
</thead>
|
|
81
|
+
|
|
82
|
+
<style>
|
|
83
|
+
.container {
|
|
84
|
+
--color-primary: #472aff;
|
|
85
|
+
--color-black: #000000;
|
|
86
|
+
--color-gray-100: #f3f4f6;
|
|
87
|
+
--color-gray-200: #e5e7eb;
|
|
88
|
+
--color-gray-300: #e0e5e8;
|
|
89
|
+
--spacing-xs: 4px;
|
|
90
|
+
--spacing-sm: 8px;
|
|
91
|
+
--spacing-md: 16px;
|
|
92
|
+
--font-size-xs: 12px;
|
|
93
|
+
--font-size-sm: 14px;
|
|
94
|
+
--font-bold: 700;
|
|
95
|
+
--font-normal: 400;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.table-header-cell:first-child {
|
|
99
|
+
border-left: 0.5px solid var(--color-gray-300);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.table-header-cell {
|
|
103
|
+
padding: var(--spacing-sm) var(--spacing-md);
|
|
104
|
+
border-right: 0.5px solid var(--color-gray-300);
|
|
105
|
+
border-bottom: 2px solid var(--color-black);
|
|
106
|
+
text-align: left;
|
|
107
|
+
font-size: var(--font-size-sm);
|
|
108
|
+
font-weight: var(--font-bold);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.table-header-cell:hover {
|
|
112
|
+
background: var(--color-gray-100);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.table-header-cell--sorted {
|
|
116
|
+
background: var(--color-gray-200);
|
|
117
|
+
color: var(--color-primary);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.table-header-button {
|
|
121
|
+
position: relative;
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
width: 100%;
|
|
125
|
+
padding: 0;
|
|
126
|
+
border: none;
|
|
127
|
+
background: none;
|
|
128
|
+
font-size: inherit;
|
|
129
|
+
font-weight: inherit;
|
|
130
|
+
color: inherit;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.table-header-button--sortable {
|
|
134
|
+
cursor: pointer;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.table-header-button--disabled {
|
|
138
|
+
cursor: default;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.table-header-label {
|
|
142
|
+
white-space: nowrap;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.table-header-label--sortable {
|
|
146
|
+
margin-right: 16px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@media (max-width: 750px) {
|
|
150
|
+
.table-header-label {
|
|
151
|
+
white-space: normal;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.table-header-sort-icon {
|
|
156
|
+
position: absolute;
|
|
157
|
+
right: -8px;
|
|
158
|
+
margin-top: 4px;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.table-header-sort-icon .material-icons {
|
|
162
|
+
font-size: var(--font-size-sm);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.table-header-search {
|
|
166
|
+
display: flex;
|
|
167
|
+
width: 144px;
|
|
168
|
+
margin: var(--spacing-xs) 0;
|
|
169
|
+
font-weight: var(--font-normal);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.table-header-search :global(.search-input) {
|
|
173
|
+
padding: var(--spacing-xs) 36px;
|
|
174
|
+
font-size: var(--font-size-xs);
|
|
175
|
+
}
|
|
176
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type HeaderGroup, type RowData } from './adapter/index.js';
|
|
2
|
+
declare function $$render<T extends RowData>(): {
|
|
3
|
+
props: {
|
|
4
|
+
headerGroups: HeaderGroup<T>[];
|
|
5
|
+
enableColumnSearch: boolean;
|
|
6
|
+
};
|
|
7
|
+
exports: {};
|
|
8
|
+
bindings: "";
|
|
9
|
+
slots: {};
|
|
10
|
+
events: {};
|
|
11
|
+
};
|
|
12
|
+
declare class __sveltets_Render<T extends RowData> {
|
|
13
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
14
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
15
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
16
|
+
bindings(): "";
|
|
17
|
+
exports(): {};
|
|
18
|
+
}
|
|
19
|
+
interface $$IsomorphicComponent {
|
|
20
|
+
new <T extends RowData>(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']>> & {
|
|
21
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
22
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
<T extends RowData>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
24
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
25
|
+
}
|
|
26
|
+
declare const Header: $$IsomorphicComponent;
|
|
27
|
+
type Header<T extends RowData> = InstanceType<typeof Header<T>>;
|
|
28
|
+
export default Header;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
<script lang="ts" generics="T">
|
|
2
|
+
import type { Table } from './adapter/index.js';
|
|
3
|
+
import { DEFAULT_ITEMS_PER_PAGE_OPTIONS } from './consts.js';
|
|
4
|
+
import { getPaginationTableContext } from './context.js';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
table: Table<T>;
|
|
8
|
+
minPageSize: boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { table, minPageSize }: Props = $props();
|
|
12
|
+
|
|
13
|
+
const paginationTable = getPaginationTableContext();
|
|
14
|
+
|
|
15
|
+
const rowsLength = $derived(
|
|
16
|
+
$paginationTable ? $paginationTable.totalItems : table.getFilteredRowModel().rows.length
|
|
17
|
+
);
|
|
18
|
+
const currentPageSize = $derived(table.getState().pagination.pageSize);
|
|
19
|
+
const currentPageIndex = $derived(table.getState().pagination.pageIndex);
|
|
20
|
+
const initialPageSize = $derived(currentPageIndex * currentPageSize);
|
|
21
|
+
|
|
22
|
+
const endPageSize = $derived.by(() => {
|
|
23
|
+
if ($paginationTable) {
|
|
24
|
+
const calculatedEnd = initialPageSize + currentPageSize;
|
|
25
|
+
return calculatedEnd > rowsLength ? rowsLength : calculatedEnd;
|
|
26
|
+
}
|
|
27
|
+
return table.getCanNextPage() ? initialPageSize + currentPageSize : rowsLength;
|
|
28
|
+
});
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<div class="page-size" class:page-size--margin={!minPageSize}>
|
|
32
|
+
{#if !minPageSize && rowsLength > DEFAULT_ITEMS_PER_PAGE_OPTIONS[0]}
|
|
33
|
+
<div class="page-size-selector">
|
|
34
|
+
<span>Rows per page:</span>
|
|
35
|
+
<select
|
|
36
|
+
class="page-size-select"
|
|
37
|
+
name="rows-per-page"
|
|
38
|
+
id="rows-per-page"
|
|
39
|
+
title="Rows per page"
|
|
40
|
+
value={currentPageSize}
|
|
41
|
+
onchange={(e) => {
|
|
42
|
+
table.setPageSize(Number(e.currentTarget.value));
|
|
43
|
+
}}
|
|
44
|
+
>
|
|
45
|
+
{#each DEFAULT_ITEMS_PER_PAGE_OPTIONS as itemPerPage}
|
|
46
|
+
<option class="page-size-option" value={itemPerPage}>{itemPerPage}</option>
|
|
47
|
+
{/each}
|
|
48
|
+
</select>
|
|
49
|
+
</div>
|
|
50
|
+
{/if}
|
|
51
|
+
<span
|
|
52
|
+
>{rowsLength !== 0 ? `${initialPageSize + 1}-${endPageSize} of ${rowsLength}` : rowsLength} rows</span
|
|
53
|
+
>
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<style>
|
|
57
|
+
.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
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
gap: var(--spacing-lg);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@media (max-width: 750px) {
|
|
77
|
+
.page-size {
|
|
78
|
+
margin-top: 20px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.page-size--margin {
|
|
82
|
+
margin-left: 12px;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.page-size-selector {
|
|
87
|
+
display: flex;
|
|
88
|
+
align-items: center;
|
|
89
|
+
justify-content: center;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.page-size-select {
|
|
93
|
+
width: 64px;
|
|
94
|
+
padding: var(--spacing-sm);
|
|
95
|
+
border-radius: var(--radius-lg);
|
|
96
|
+
font-weight: var(--font-semibold);
|
|
97
|
+
cursor: pointer;
|
|
98
|
+
border: none;
|
|
99
|
+
background: transparent;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.page-size-select:hover {
|
|
103
|
+
background: var(--color-gray-100);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.page-size-select:focus {
|
|
107
|
+
outline: none;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.page-size-option {
|
|
111
|
+
gap: 20px;
|
|
112
|
+
padding: 4px 16px;
|
|
113
|
+
font-weight: var(--font-medium);
|
|
114
|
+
border-right: 2px solid var(--color-border);
|
|
115
|
+
border-left: 2px solid var(--color-border);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.page-size-option:hover {
|
|
119
|
+
background: var(--color-gray-200);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.page-size-option:first-of-type {
|
|
123
|
+
border-radius: var(--radius-lg) var(--radius-lg) 0 0;
|
|
124
|
+
border-top: 2px solid var(--color-border);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.page-size-option:last-of-type {
|
|
128
|
+
border-radius: 0 0 var(--radius-lg) var(--radius-lg);
|
|
129
|
+
border-bottom: 2px solid var(--color-border);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
select,
|
|
133
|
+
::picker(select) {
|
|
134
|
+
appearance: base-select;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
select::picker-icon {
|
|
138
|
+
content: '\e5e1';
|
|
139
|
+
font-family: 'Material Icons';
|
|
140
|
+
color: var(--color-black);
|
|
141
|
+
margin-left: 5px;
|
|
142
|
+
display: inline-flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
transform: rotate(90deg);
|
|
145
|
+
transition: transform 0.4s ease;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
option::checkmark {
|
|
149
|
+
content: '\e5ca';
|
|
150
|
+
font-family: 'Material Icons';
|
|
151
|
+
order: 1;
|
|
152
|
+
margin-left: auto;
|
|
153
|
+
color: var(--color-primary);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
select:open::picker-icon {
|
|
157
|
+
transform: rotate(270deg);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
::picker(select) {
|
|
161
|
+
border: none;
|
|
162
|
+
border-radius: var(--radius-lg);
|
|
163
|
+
}
|
|
164
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Table } from './adapter/index.js';
|
|
2
|
+
declare function $$render<T>(): {
|
|
3
|
+
props: {
|
|
4
|
+
table: Table<T>;
|
|
5
|
+
minPageSize: boolean;
|
|
6
|
+
};
|
|
7
|
+
exports: {};
|
|
8
|
+
bindings: "";
|
|
9
|
+
slots: {};
|
|
10
|
+
events: {};
|
|
11
|
+
};
|
|
12
|
+
declare class __sveltets_Render<T> {
|
|
13
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
14
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
15
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
16
|
+
bindings(): "";
|
|
17
|
+
exports(): {};
|
|
18
|
+
}
|
|
19
|
+
interface $$IsomorphicComponent {
|
|
20
|
+
new <T>(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']>> & {
|
|
21
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
22
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
24
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
25
|
+
}
|
|
26
|
+
declare const PageSize: $$IsomorphicComponent;
|
|
27
|
+
type PageSize<T> = InstanceType<typeof PageSize<T>>;
|
|
28
|
+
export default PageSize;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
<script lang="ts" generics="T">
|
|
2
|
+
import { Tooltip } from '../index.js';
|
|
3
|
+
import type { Table } from './adapter/index.js';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
table: Table<T>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { table }: Props = $props();
|
|
10
|
+
|
|
11
|
+
const initialPage = $derived(table.getState().pagination.pageIndex + 1);
|
|
12
|
+
|
|
13
|
+
const handlePaginationChange = (event: Event) => {
|
|
14
|
+
const input = event.currentTarget as HTMLInputElement;
|
|
15
|
+
if (input.value) {
|
|
16
|
+
const value = Number(input.value);
|
|
17
|
+
if (value > 0 && value <= table.getPageCount()) {
|
|
18
|
+
table.setPageIndex(value - 1);
|
|
19
|
+
} else {
|
|
20
|
+
input.value = '';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
resizeCurrentPageHtml(input);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const handleInput = (event: Event) => {
|
|
28
|
+
const input = event.currentTarget as HTMLInputElement;
|
|
29
|
+
input.value = input.value.replace(/[^0-9]/g, '');
|
|
30
|
+
resizeCurrentPageHtml(input);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const resizeCurrentPageHtml = (htmlInputElement: HTMLInputElement) => {
|
|
34
|
+
htmlInputElement.style.width =
|
|
35
|
+
htmlInputElement.value.length > 2 ? `${htmlInputElement.value.length * 14}px` : '36px';
|
|
36
|
+
};
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<div class="pagination">
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
class="pagination-button"
|
|
43
|
+
onclick={() => table.previousPage()}
|
|
44
|
+
disabled={!table.getCanPreviousPage()}
|
|
45
|
+
>
|
|
46
|
+
<span class="pagination-icon material-icons">arrow_back</span>
|
|
47
|
+
<span>Previous</span>
|
|
48
|
+
</button>
|
|
49
|
+
<div class="pagination-info">
|
|
50
|
+
<span>Page</span>
|
|
51
|
+
{#if table.getPageCount() > 1}
|
|
52
|
+
<Tooltip content="Enter page number" width="sm" position="bottom">
|
|
53
|
+
<input
|
|
54
|
+
type="text"
|
|
55
|
+
onchange={handlePaginationChange}
|
|
56
|
+
oninput={handleInput}
|
|
57
|
+
class="pagination-input"
|
|
58
|
+
value={initialPage}
|
|
59
|
+
/>
|
|
60
|
+
</Tooltip>
|
|
61
|
+
{:else}
|
|
62
|
+
<span>{initialPage}</span>
|
|
63
|
+
{/if}
|
|
64
|
+
<span>of {table.getPageCount() !== 0 ? table.getPageCount() : initialPage}</span>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<button
|
|
68
|
+
type="button"
|
|
69
|
+
class="pagination-button"
|
|
70
|
+
onclick={() => table.nextPage()}
|
|
71
|
+
disabled={!table.getCanNextPage()}
|
|
72
|
+
>
|
|
73
|
+
<span>Next</span>
|
|
74
|
+
<span class="pagination-icon material-icons">arrow_forward</span>
|
|
75
|
+
</button>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<style>
|
|
79
|
+
.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
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
justify-content: center;
|
|
96
|
+
gap: var(--spacing-lg);
|
|
97
|
+
padding: var(--spacing-sm) 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.pagination-button {
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
gap: var(--spacing-sm);
|
|
104
|
+
padding: 0;
|
|
105
|
+
border: none;
|
|
106
|
+
background: none;
|
|
107
|
+
font-size: var(--font-size-sm);
|
|
108
|
+
color: var(--color-text);
|
|
109
|
+
cursor: pointer;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.pagination-button:disabled {
|
|
113
|
+
color: var(--color-gray-300);
|
|
114
|
+
cursor: not-allowed;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.pagination-icon {
|
|
118
|
+
font-size: var(--font-size-icon);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.pagination-info {
|
|
122
|
+
display: flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
gap: var(--spacing-sm);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.pagination-input {
|
|
128
|
+
height: var(--input-height);
|
|
129
|
+
width: var(--input-width);
|
|
130
|
+
padding: 0;
|
|
131
|
+
border: 1px solid var(--color-gray-500);
|
|
132
|
+
border-radius: var(--radius-lg);
|
|
133
|
+
text-align: center;
|
|
134
|
+
cursor: pointer;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.pagination-input:hover {
|
|
138
|
+
border-color: var(--color-primary);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.pagination-input:focus {
|
|
142
|
+
border: 1px solid var(--color-primary);
|
|
143
|
+
outline: none;
|
|
144
|
+
}
|
|
145
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Table } from './adapter/index.js';
|
|
2
|
+
declare function $$render<T>(): {
|
|
3
|
+
props: {
|
|
4
|
+
table: Table<T>;
|
|
5
|
+
};
|
|
6
|
+
exports: {};
|
|
7
|
+
bindings: "";
|
|
8
|
+
slots: {};
|
|
9
|
+
events: {};
|
|
10
|
+
};
|
|
11
|
+
declare class __sveltets_Render<T> {
|
|
12
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
13
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
14
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
15
|
+
bindings(): "";
|
|
16
|
+
exports(): {};
|
|
17
|
+
}
|
|
18
|
+
interface $$IsomorphicComponent {
|
|
19
|
+
new <T>(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']>> & {
|
|
20
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
21
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
22
|
+
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
24
|
+
}
|
|
25
|
+
declare const Pagination: $$IsomorphicComponent;
|
|
26
|
+
type Pagination<T> = InstanceType<typeof Pagination<T>>;
|
|
27
|
+
export default Pagination;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
indeterminate?: boolean;
|
|
4
|
+
checked: boolean;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
onchange: (event: Event) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let { indeterminate = false, checked, disabled = false, onchange }: Props = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<input
|
|
13
|
+
type="checkbox"
|
|
14
|
+
class="accent-magentablue"
|
|
15
|
+
{disabled}
|
|
16
|
+
{onchange}
|
|
17
|
+
{checked}
|
|
18
|
+
bind:indeterminate
|
|
19
|
+
/>
|
|
20
|
+
|
|
21
|
+
<style>
|
|
22
|
+
.accent-magentablue {
|
|
23
|
+
accent-color: #472aff;
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.accent-magentablue:disabled {
|
|
28
|
+
cursor: not-allowed;
|
|
29
|
+
opacity: 0.5;
|
|
30
|
+
}
|
|
31
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
indeterminate?: boolean;
|
|
3
|
+
checked: boolean;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
onchange: (event: Event) => void;
|
|
6
|
+
}
|
|
7
|
+
declare const RowCheckBox: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type RowCheckBox = ReturnType<typeof RowCheckBox>;
|
|
9
|
+
export default RowCheckBox;
|