@vobs/table 1.1.0 → 1.2.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/column-settings.cjs +1036 -0
- package/dist/column-settings.cjs.map +1 -0
- package/dist/column-settings.d.cts +7 -0
- package/dist/column-settings.d.ts +7 -0
- package/dist/column-settings.js +1034 -0
- package/dist/column-settings.js.map +1 -0
- package/dist/data-table.cjs +1671 -0
- package/dist/data-table.cjs.map +1 -0
- package/dist/data-table.d.cts +7 -0
- package/dist/data-table.d.ts +7 -0
- package/dist/data-table.js +1669 -0
- package/dist/data-table.js.map +1 -0
- package/dist/icons.cjs +835 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.d.cts +8 -0
- package/dist/icons.d.ts +8 -0
- package/dist/icons.js +833 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.cjs +2067 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +2059 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence.cjs +86 -0
- package/dist/persistence.cjs.map +1 -0
- package/dist/persistence.d.cts +8 -0
- package/dist/persistence.d.ts +8 -0
- package/dist/persistence.js +83 -0
- package/dist/persistence.js.map +1 -0
- package/dist/styles/styles.css +1 -0
- package/dist/styles/table.css +209 -0
- package/dist/types.cjs +4 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +164 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.cjs +525 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +19 -0
- package/dist/utils.d.ts +19 -0
- package/dist/utils.js +511 -0
- package/dist/utils.js.map +1 -0
- package/package.json +42 -11
- package/src/data-table.ts +26 -10
- package/src/icons.ts +14 -0
- package/src/index.ts +1 -0
- package/src/types.ts +4 -2
package/package.json
CHANGED
|
@@ -1,31 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"license": "MIT",
|
|
3
3
|
"files": [
|
|
4
|
+
"dist",
|
|
4
5
|
"src",
|
|
5
6
|
"README.md",
|
|
6
7
|
"LICENSE"
|
|
7
8
|
],
|
|
8
9
|
"name": "@vobs/table",
|
|
9
|
-
"
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/vobsjs/vobs.git"
|
|
13
|
+
},
|
|
14
|
+
"version": "1.2.1",
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
10
18
|
"description": "Optional data table primitives for Vobs.",
|
|
11
19
|
"type": "module",
|
|
12
|
-
"main": "
|
|
13
|
-
"
|
|
20
|
+
"main": "./dist/index.cjs",
|
|
21
|
+
"module": "./dist/index.js",
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
14
23
|
"exports": {
|
|
15
|
-
".":
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js",
|
|
27
|
+
"require": "./dist/index.cjs",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./data-table": {
|
|
31
|
+
"types": "./dist/data-table.d.ts",
|
|
32
|
+
"import": "./dist/data-table.js",
|
|
33
|
+
"require": "./dist/data-table.cjs",
|
|
34
|
+
"default": "./dist/data-table.js"
|
|
35
|
+
},
|
|
36
|
+
"./column-settings": {
|
|
37
|
+
"types": "./dist/column-settings.d.ts",
|
|
38
|
+
"import": "./dist/column-settings.js",
|
|
39
|
+
"require": "./dist/column-settings.cjs",
|
|
40
|
+
"default": "./dist/column-settings.js"
|
|
41
|
+
},
|
|
42
|
+
"./styles.css": "./dist/styles/styles.css",
|
|
43
|
+
"./table.css": "./dist/styles/table.css",
|
|
44
|
+
"./source": {
|
|
45
|
+
"types": "./src/index.ts",
|
|
46
|
+
"default": "./src/index.ts"
|
|
47
|
+
},
|
|
48
|
+
"./source/*": "./src/*",
|
|
20
49
|
"./package.json": "./package.json"
|
|
21
50
|
},
|
|
22
51
|
"sideEffects": [
|
|
52
|
+
"./dist/styles/*.css",
|
|
23
53
|
"./src/styles/*.css"
|
|
24
54
|
],
|
|
25
55
|
"dependencies": {
|
|
26
|
-
"@vobs/
|
|
27
|
-
"@vobs/
|
|
28
|
-
"@vobs/
|
|
56
|
+
"@vobs/reactivity": "1.2.1",
|
|
57
|
+
"@vobs/ui": "1.2.1",
|
|
58
|
+
"@vobs/vobs": "1.2.1",
|
|
59
|
+
"@vobs/resource": "1.2.1"
|
|
29
60
|
},
|
|
30
61
|
"scripts": {
|
|
31
62
|
"test": "vitest --environment jsdom"
|
package/src/data-table.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { effect, state } from '@vobs/reactivity'
|
|
1
|
+
import { effect, state, type Signal } from '@vobs/reactivity'
|
|
2
2
|
import {
|
|
3
3
|
addEventListener,
|
|
4
4
|
createElement,
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
resolveSlot,
|
|
23
23
|
setOptionalAttribute
|
|
24
24
|
} from './utils'
|
|
25
|
+
import { defaultIcons } from './icons'
|
|
25
26
|
import type {
|
|
26
27
|
DataTableColumn,
|
|
27
28
|
DataTableChildren,
|
|
@@ -320,11 +321,9 @@ function createPageButton<Row>(
|
|
|
320
321
|
setAttribute(button, 'class', 'vobs-data-table__page-button')
|
|
321
322
|
setAttribute(button, 'aria-label', label)
|
|
322
323
|
setProperty(button, 'disabled', disabled)
|
|
323
|
-
const icons =
|
|
324
|
+
const icons = resolveIcons(props)
|
|
324
325
|
const icon = direction === 'previous' ? icons.previous : icons.next
|
|
325
|
-
const node = icon === undefined
|
|
326
|
-
? createText(direction === 'previous' ? '<' : '>')
|
|
327
|
-
: resolveSlot(icon)
|
|
326
|
+
const node = icon === undefined ? undefined : resolveSlot(icon)
|
|
328
327
|
if (node) insertBefore(button, node, null)
|
|
329
328
|
addEventListener(button, 'click', () => {
|
|
330
329
|
if (disabled) return
|
|
@@ -540,10 +539,14 @@ function resolveWindow<Row>(props: KitDataTableProps<Row>, count: number, scroll
|
|
|
540
539
|
return { start, end, before: start * rowHeight, after: (count - end) * rowHeight }
|
|
541
540
|
}
|
|
542
541
|
|
|
542
|
+
function unwrapQueryValue(value: number | Signal<number>): number {
|
|
543
|
+
return typeof value === 'number' ? value : value.value
|
|
544
|
+
}
|
|
545
|
+
|
|
543
546
|
function currentQuery<Row>(props: KitDataTableProps<Row>): DataTableQuery {
|
|
544
547
|
const internal = internalQueries.get(props)?.value
|
|
545
|
-
const page = readProp(props, 'page', internal?.page ?? 1)
|
|
546
|
-
const pageSize = readProp(props, 'pageSize', internal?.pageSize ?? DEFAULT_PAGE_SIZE)
|
|
548
|
+
const page = unwrapQueryValue(readProp(props, 'page', internal?.page ?? 1))
|
|
549
|
+
const pageSize = unwrapQueryValue(readProp(props, 'pageSize', internal?.pageSize ?? DEFAULT_PAGE_SIZE))
|
|
547
550
|
return {
|
|
548
551
|
page: Math.max(1, Math.floor(page)),
|
|
549
552
|
pageSize: normalizePositive(pageSize, DEFAULT_PAGE_SIZE),
|
|
@@ -552,9 +555,18 @@ function currentQuery<Row>(props: KitDataTableProps<Row>): DataTableQuery {
|
|
|
552
555
|
}
|
|
553
556
|
}
|
|
554
557
|
|
|
558
|
+
function readSignalProp<T>(props: object, name: string): Signal<T> | undefined {
|
|
559
|
+
const value = Reflect.get(props, name) as Signal<T> | undefined
|
|
560
|
+
return value && typeof value === 'object' && 'value' in value ? value : undefined
|
|
561
|
+
}
|
|
562
|
+
|
|
555
563
|
function emitQuery<Row>(props: KitDataTableProps<Row>, query: DataTableQuery): void {
|
|
556
564
|
const internal = internalQueries.get(props)
|
|
557
565
|
if (internal) internal.value = query
|
|
566
|
+
const pageSignal = readSignalProp<number>(props, 'page')
|
|
567
|
+
if (pageSignal) pageSignal.value = query.page
|
|
568
|
+
const pageSizeSignal = readSignalProp<number>(props, 'pageSize')
|
|
569
|
+
if (pageSizeSignal) pageSizeSignal.value = query.pageSize
|
|
558
570
|
readProp<KitDataTableProps<Row>['onQueryChange'] | undefined>(props, 'onQueryChange', undefined)?.(query)
|
|
559
571
|
}
|
|
560
572
|
|
|
@@ -573,10 +585,14 @@ function visibleColumns<Row>(props: KitDataTableProps<Row>): readonly DataTableC
|
|
|
573
585
|
.filter(column => column.visible !== false && (!visible || visible.has(column.id)))
|
|
574
586
|
}
|
|
575
587
|
|
|
588
|
+
function resolveIcons<Row>(props: KitDataTableProps<Row>): Required<DataTableIcons> {
|
|
589
|
+
return { ...defaultIcons(), ...(readProp<DataTableIcons | undefined>(props, 'icons', undefined) ?? {}) }
|
|
590
|
+
}
|
|
591
|
+
|
|
576
592
|
function sortIcon<Row>(props: KitDataTableProps<Row>, sort: DataTableSort | null, columnId: string) {
|
|
577
|
-
const icons =
|
|
578
|
-
if (sort?.columnId !== columnId) return icons.unsorted
|
|
579
|
-
return sort.direction === 'asc' ? icons.ascending
|
|
593
|
+
const icons = resolveIcons(props)
|
|
594
|
+
if (sort?.columnId !== columnId) return icons.unsorted
|
|
595
|
+
return sort.direction === 'asc' ? icons.ascending : icons.descending
|
|
580
596
|
}
|
|
581
597
|
|
|
582
598
|
function pageLabel<Row>(
|
package/src/icons.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createComponent } from '@vobs/vobs'
|
|
2
|
+
import { Icon } from '@vobs/ui'
|
|
3
|
+
import type { DataTableIcons } from './types'
|
|
4
|
+
|
|
5
|
+
/** 内置默认图标;`icons` prop 中的同名项会逐个覆盖。 */
|
|
6
|
+
export function defaultIcons(): Required<DataTableIcons> {
|
|
7
|
+
return {
|
|
8
|
+
ascending: () => createComponent(Icon, { name: 'chevron-up' }),
|
|
9
|
+
descending: () => createComponent(Icon, { name: 'chevron-down' }),
|
|
10
|
+
unsorted: () => createComponent(Icon, { name: 'sort' }),
|
|
11
|
+
previous: () => createComponent(Icon, { name: 'chevron-left' }),
|
|
12
|
+
next: () => createComponent(Icon, { name: 'chevron-right' })
|
|
13
|
+
}
|
|
14
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { KitDataTable } from './data-table'
|
|
2
2
|
export { KitColumnSettings } from './column-settings'
|
|
3
|
+
export { defaultIcons } from './icons'
|
|
3
4
|
export { createColumnSettingsPersistence, createLocalColumnSettingsPersistence } from './persistence'
|
|
4
5
|
export type {
|
|
5
6
|
DataTableAlign,
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Signal } from '@vobs/reactivity'
|
|
1
2
|
import type { VobsNode } from '@vobs/vobs'
|
|
2
3
|
|
|
3
4
|
export type DataTableAlign = 'start' | 'center' | 'end'
|
|
@@ -123,8 +124,9 @@ export interface KitDataTableProps<Row = Record<string, unknown>> extends DataTa
|
|
|
123
124
|
readonly rows?: readonly Row[]
|
|
124
125
|
readonly resource?: DataTableResource<Row>
|
|
125
126
|
readonly rowKey?: (row: Row, index: number) => unknown
|
|
126
|
-
|
|
127
|
-
readonly
|
|
127
|
+
/** 传入 Signal 时受控分页:表格翻页后自动写回信号。 */
|
|
128
|
+
readonly page?: number | Signal<number>
|
|
129
|
+
readonly pageSize?: number | Signal<number>
|
|
128
130
|
readonly total?: number
|
|
129
131
|
readonly sort?: DataTableSort | null
|
|
130
132
|
/** Client sorts loaded rows; server leaves row order to the resource owner. */
|