@vobs/table 1.1.0 → 1.2.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.
Files changed (49) hide show
  1. package/dist/column-settings.cjs +1036 -0
  2. package/dist/column-settings.cjs.map +1 -0
  3. package/dist/column-settings.d.cts +7 -0
  4. package/dist/column-settings.d.ts +7 -0
  5. package/dist/column-settings.js +1034 -0
  6. package/dist/column-settings.js.map +1 -0
  7. package/dist/data-table.cjs +1671 -0
  8. package/dist/data-table.cjs.map +1 -0
  9. package/dist/data-table.d.cts +7 -0
  10. package/dist/data-table.d.ts +7 -0
  11. package/dist/data-table.js +1669 -0
  12. package/dist/data-table.js.map +1 -0
  13. package/dist/icons.cjs +835 -0
  14. package/dist/icons.cjs.map +1 -0
  15. package/dist/icons.d.cts +8 -0
  16. package/dist/icons.d.ts +8 -0
  17. package/dist/icons.js +833 -0
  18. package/dist/icons.js.map +1 -0
  19. package/dist/index.cjs +2067 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +8 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.js +2059 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/persistence.cjs +86 -0
  26. package/dist/persistence.cjs.map +1 -0
  27. package/dist/persistence.d.cts +8 -0
  28. package/dist/persistence.d.ts +8 -0
  29. package/dist/persistence.js +83 -0
  30. package/dist/persistence.js.map +1 -0
  31. package/dist/styles/styles.css +1 -0
  32. package/dist/styles/table.css +209 -0
  33. package/dist/types.cjs +4 -0
  34. package/dist/types.cjs.map +1 -0
  35. package/dist/types.d.cts +164 -0
  36. package/dist/types.d.ts +164 -0
  37. package/dist/types.js +3 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.cjs +525 -0
  40. package/dist/utils.cjs.map +1 -0
  41. package/dist/utils.d.cts +19 -0
  42. package/dist/utils.d.ts +19 -0
  43. package/dist/utils.js +511 -0
  44. package/dist/utils.js.map +1 -0
  45. package/package.json +38 -11
  46. package/src/data-table.ts +26 -10
  47. package/src/icons.ts +14 -0
  48. package/src/index.ts +1 -0
  49. package/src/types.ts +4 -2
package/package.json CHANGED
@@ -1,31 +1,58 @@
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
- "version": "1.1.0",
10
+ "version": "1.2.0",
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
10
14
  "description": "Optional data table primitives for Vobs.",
11
15
  "type": "module",
12
- "main": "src/index.ts",
13
- "types": "src/index.ts",
16
+ "main": "./dist/index.cjs",
17
+ "module": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
14
19
  "exports": {
15
- ".": "./src/index.ts",
16
- "./data-table": "./src/data-table.ts",
17
- "./column-settings": "./src/column-settings.ts",
18
- "./styles.css": "./src/styles/styles.css",
19
- "./table.css": "./src/styles/table.css",
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js",
23
+ "require": "./dist/index.cjs",
24
+ "default": "./dist/index.js"
25
+ },
26
+ "./data-table": {
27
+ "types": "./dist/data-table.d.ts",
28
+ "import": "./dist/data-table.js",
29
+ "require": "./dist/data-table.cjs",
30
+ "default": "./dist/data-table.js"
31
+ },
32
+ "./column-settings": {
33
+ "types": "./dist/column-settings.d.ts",
34
+ "import": "./dist/column-settings.js",
35
+ "require": "./dist/column-settings.cjs",
36
+ "default": "./dist/column-settings.js"
37
+ },
38
+ "./styles.css": "./dist/styles/styles.css",
39
+ "./table.css": "./dist/styles/table.css",
40
+ "./source": {
41
+ "types": "./src/index.ts",
42
+ "default": "./src/index.ts"
43
+ },
44
+ "./source/*": "./src/*",
20
45
  "./package.json": "./package.json"
21
46
  },
22
47
  "sideEffects": [
48
+ "./dist/styles/*.css",
23
49
  "./src/styles/*.css"
24
50
  ],
25
51
  "dependencies": {
26
- "@vobs/vobs": "1.1.0",
27
- "@vobs/reactivity": "1.1.0",
28
- "@vobs/resource": "1.1.0"
52
+ "@vobs/reactivity": "1.2.0",
53
+ "@vobs/resource": "1.2.0",
54
+ "@vobs/ui": "1.2.0",
55
+ "@vobs/vobs": "1.2.0"
29
56
  },
30
57
  "scripts": {
31
58
  "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 = readProp<DataTableIcons | undefined>(props, 'icons', undefined) ?? {}
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 = readProp<DataTableIcons | undefined>(props, 'icons', undefined) ?? {}
578
- if (sort?.columnId !== columnId) return icons.unsorted ?? ''
579
- return sort.direction === 'asc' ? icons.ascending ?? '^' : icons.descending ?? 'v'
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
- readonly page?: number
127
- readonly pageSize?: number
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. */