@tanstack/table-core 8.0.0-alpha.83 → 8.0.0-alpha.84

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 (93) hide show
  1. package/build/cjs/core/cell.js +38 -0
  2. package/build/cjs/core/cell.js.map +1 -0
  3. package/build/cjs/core/column.js +88 -0
  4. package/build/cjs/core/column.js.map +1 -0
  5. package/build/cjs/{features/Headers.js → core/headers.js} +54 -66
  6. package/build/cjs/core/headers.js.map +1 -0
  7. package/build/cjs/core/instance.js +255 -0
  8. package/build/cjs/core/instance.js.map +1 -0
  9. package/build/cjs/core/row.js +77 -0
  10. package/build/cjs/core/row.js.map +1 -0
  11. package/build/cjs/features/ColumnSizing.js.map +1 -1
  12. package/build/cjs/features/Expanding.js.map +1 -1
  13. package/build/cjs/features/Filters.js +1 -1
  14. package/build/cjs/features/Filters.js.map +1 -1
  15. package/build/cjs/features/Grouping.js.map +1 -1
  16. package/build/cjs/features/Ordering.js.map +1 -1
  17. package/build/cjs/features/Pagination.js.map +1 -1
  18. package/build/cjs/features/Pinning.js +3 -3
  19. package/build/cjs/features/Pinning.js.map +1 -1
  20. package/build/cjs/features/RowSelection.js.map +1 -1
  21. package/build/cjs/features/Sorting.js.map +1 -1
  22. package/build/cjs/features/Visibility.js.map +1 -1
  23. package/build/cjs/index.js +9 -5
  24. package/build/cjs/index.js.map +1 -1
  25. package/build/cjs/utils/filterRowsUtils.js +23 -21
  26. package/build/cjs/utils/filterRowsUtils.js.map +1 -1
  27. package/build/cjs/utils/getCoreRowModel.js +9 -8
  28. package/build/cjs/utils/getCoreRowModel.js.map +1 -1
  29. package/build/cjs/utils/getGroupedRowModel.js +12 -11
  30. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  31. package/build/esm/index.js +656 -761
  32. package/build/esm/index.js.map +1 -1
  33. package/build/stats-html.html +1 -1
  34. package/build/stats-react.json +391 -368
  35. package/build/types/core/cell.d.ts +9 -0
  36. package/build/types/{features/Columns.d.ts → core/column.d.ts} +3 -17
  37. package/build/types/{features/Headers.d.ts → core/headers.d.ts} +26 -11
  38. package/build/types/core/instance.d.ts +57 -0
  39. package/build/types/core/row.d.ts +15 -0
  40. package/build/types/features/ColumnSizing.d.ts +2 -1
  41. package/build/types/features/Expanding.d.ts +2 -1
  42. package/build/types/features/Filters.d.ts +2 -1
  43. package/build/types/features/Grouping.d.ts +2 -1
  44. package/build/types/features/Ordering.d.ts +2 -1
  45. package/build/types/features/Pagination.d.ts +2 -1
  46. package/build/types/features/Pinning.d.ts +2 -1
  47. package/build/types/features/RowSelection.d.ts +2 -1
  48. package/build/types/features/Sorting.d.ts +2 -1
  49. package/build/types/features/Visibility.d.ts +2 -1
  50. package/build/types/index.d.ts +4 -2
  51. package/build/types/sortingFns.d.ts +4 -4
  52. package/build/types/types.d.ts +10 -53
  53. package/build/umd/index.development.js +660 -759
  54. package/build/umd/index.development.js.map +1 -1
  55. package/build/umd/index.production.js +1 -1
  56. package/build/umd/index.production.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/core/cell.ts +47 -0
  59. package/src/core/column.ts +148 -0
  60. package/src/{features/Headers.ts → core/headers.ts} +98 -99
  61. package/src/core/instance.ts +361 -0
  62. package/src/core/row.ts +85 -0
  63. package/src/features/ColumnSizing.ts +1 -1
  64. package/src/features/Expanding.ts +1 -2
  65. package/src/features/Filters.ts +2 -2
  66. package/src/features/Grouping.ts +1 -1
  67. package/src/features/Ordering.ts +1 -1
  68. package/src/features/Pagination.ts +1 -1
  69. package/src/features/Pinning.ts +8 -4
  70. package/src/features/RowSelection.ts +1 -1
  71. package/src/features/Sorting.ts +1 -1
  72. package/src/features/Visibility.ts +1 -1
  73. package/src/index.ts +4 -8
  74. package/src/types.ts +9 -61
  75. package/src/utils/filterRowsUtils.ts +4 -2
  76. package/src/utils/getCoreRowModel.ts +4 -2
  77. package/src/utils/getGroupedRowModel.ts +6 -6
  78. package/build/cjs/core.js +0 -168
  79. package/build/cjs/core.js.map +0 -1
  80. package/build/cjs/features/Cells.js +0 -101
  81. package/build/cjs/features/Cells.js.map +0 -1
  82. package/build/cjs/features/Columns.js +0 -191
  83. package/build/cjs/features/Columns.js.map +0 -1
  84. package/build/cjs/features/Headers.js.map +0 -1
  85. package/build/cjs/features/Rows.js +0 -94
  86. package/build/cjs/features/Rows.js.map +0 -1
  87. package/build/types/core.d.ts +0 -30
  88. package/build/types/features/Cells.d.ts +0 -13
  89. package/build/types/features/Rows.d.ts +0 -28
  90. package/src/core.ts +0 -246
  91. package/src/features/Cells.ts +0 -128
  92. package/src/features/Columns.ts +0 -293
  93. package/src/features/Rows.ts +0 -142
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/table-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "8.0.0-alpha.83",
4
+ "version": "8.0.0-alpha.84",
5
5
  "description": "Hooks for building lightweight, fast and extendable datagrids for React",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/tanstack/react-table#readme",
@@ -0,0 +1,47 @@
1
+ import { Cell, Column, Row, TableGenerics, TableInstance } from '../types'
2
+
3
+ export type CoreCell<TGenerics extends TableGenerics> = {
4
+ id: string
5
+ getValue: () => TGenerics['Value']
6
+ row: Row<TGenerics>
7
+ column: Column<TGenerics>
8
+ renderCell: () => string | null | TGenerics['Rendered']
9
+ }
10
+
11
+ export function createCell<TGenerics extends TableGenerics>(
12
+ instance: TableInstance<TGenerics>,
13
+ row: Row<TGenerics>,
14
+ column: Column<TGenerics>,
15
+ columnId: string
16
+ ) {
17
+ const cell: CoreCell<TGenerics> = {
18
+ id: `${row.id}_${column.id}`,
19
+ row,
20
+ column,
21
+ getValue: () => row.getValue(columnId),
22
+ renderCell: () =>
23
+ column.columnDef.cell
24
+ ? instance._render(column.columnDef.cell, {
25
+ instance,
26
+ column,
27
+ row,
28
+ cell: cell as Cell<TGenerics>,
29
+ getValue: cell.getValue,
30
+ })
31
+ : null,
32
+ }
33
+
34
+ instance._features.forEach(feature => {
35
+ Object.assign(
36
+ cell,
37
+ feature.createCell?.(
38
+ cell as Cell<TGenerics>,
39
+ column,
40
+ row as Row<TGenerics>,
41
+ instance
42
+ )
43
+ )
44
+ }, {})
45
+
46
+ return cell as Cell<TGenerics>
47
+ }
@@ -0,0 +1,148 @@
1
+ import {
2
+ Cell,
3
+ Column,
4
+ Header,
5
+ TableGenerics,
6
+ TableInstance,
7
+ Row,
8
+ AccessorFn,
9
+ ColumnDef,
10
+ Renderable,
11
+ } from '../types'
12
+ import { memo } from '../utils'
13
+
14
+ export type CoreColumnDefType = 'data' | 'display' | 'group'
15
+
16
+ export type CoreColumnDef<TGenerics extends TableGenerics> = {
17
+ id: string
18
+ accessorKey?: string & keyof TGenerics['Row']
19
+ accessorFn?: AccessorFn<TGenerics['Row']>
20
+ columns?: ColumnDef<TGenerics>[]
21
+ header?: Renderable<
22
+ TGenerics,
23
+ {
24
+ instance: TableInstance<TGenerics>
25
+ header: Header<TGenerics>
26
+ column: Column<TGenerics>
27
+ }
28
+ >
29
+ footer?: Renderable<
30
+ TGenerics,
31
+ {
32
+ instance: TableInstance<TGenerics>
33
+ header: Header<TGenerics>
34
+ column: Column<TGenerics>
35
+ }
36
+ >
37
+ cell?: Renderable<
38
+ TGenerics,
39
+ {
40
+ instance: TableInstance<TGenerics>
41
+ row: Row<TGenerics>
42
+ column: Column<TGenerics>
43
+ cell: Cell<TGenerics>
44
+ getValue: () => TGenerics['Value']
45
+ }
46
+ >
47
+ meta?: TGenerics['ColumnMeta']
48
+ }
49
+
50
+ export type CoreColumn<TGenerics extends TableGenerics> = {
51
+ id: string
52
+ depth: number
53
+ accessorFn?: AccessorFn<TGenerics['Row']>
54
+ columnDef: ColumnDef<TGenerics>
55
+ columnDefType: CoreColumnDefType
56
+ columns: Column<TGenerics>[]
57
+ parent?: Column<TGenerics>
58
+ getFlatColumns: () => Column<TGenerics>[]
59
+ getLeafColumns: () => Column<TGenerics>[]
60
+ }
61
+
62
+ export function createColumn<TGenerics extends TableGenerics>(
63
+ instance: TableInstance<TGenerics>,
64
+ columnDef: ColumnDef<TGenerics> & { columnDefType?: CoreColumnDefType },
65
+ depth: number,
66
+ parent?: Column<TGenerics>
67
+ ) {
68
+ const defaultColumn = instance._getDefaultColumnDef()
69
+
70
+ columnDef = {
71
+ ...defaultColumn,
72
+ ...columnDef,
73
+ }
74
+
75
+ let id =
76
+ columnDef.id ??
77
+ columnDef.accessorKey ??
78
+ (typeof columnDef.header === 'string' ? columnDef.header : undefined)
79
+
80
+ let accessorFn: AccessorFn<TGenerics['Row']> | undefined
81
+
82
+ if (columnDef.accessorFn) {
83
+ accessorFn = columnDef.accessorFn
84
+ } else if (columnDef.accessorKey) {
85
+ accessorFn = (originalRow?: TGenerics['Row']) =>
86
+ (originalRow as any)[columnDef.accessorKey]
87
+ }
88
+
89
+ if (!id) {
90
+ if (process.env.NODE_ENV !== 'production') {
91
+ throw new Error(
92
+ columnDef.accessorFn
93
+ ? `Columns require an id when using an accessorFn`
94
+ : `Columns require an id when using a non-string header`
95
+ )
96
+ }
97
+ throw new Error()
98
+ }
99
+
100
+ let column: CoreColumn<TGenerics> = {
101
+ ...columnDef,
102
+ id: `${id}`,
103
+ accessorFn,
104
+ parent: parent as any,
105
+ depth,
106
+ columnDef,
107
+ columnDefType: columnDef.columnDefType as CoreColumnDefType,
108
+ columns: [],
109
+ getFlatColumns: memo(
110
+ () => [true],
111
+ () => {
112
+ return [
113
+ column as Column<TGenerics>,
114
+ ...column.columns?.flatMap(d => d.getFlatColumns()),
115
+ ]
116
+ },
117
+ {
118
+ key: process.env.NODE_ENV === 'production' && 'column.getFlatColumns',
119
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
120
+ }
121
+ ),
122
+ getLeafColumns: memo(
123
+ () => [instance._getOrderColumnsFn()],
124
+ orderColumns => {
125
+ if (column.columns?.length) {
126
+ let leafColumns = column.columns.flatMap(column =>
127
+ column.getLeafColumns()
128
+ )
129
+
130
+ return orderColumns(leafColumns)
131
+ }
132
+
133
+ return [column as Column<TGenerics>]
134
+ },
135
+ {
136
+ key: process.env.NODE_ENV === 'production' && 'column.getLeafColumns',
137
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
138
+ }
139
+ ),
140
+ }
141
+
142
+ column = instance._features.reduce((obj, feature) => {
143
+ return Object.assign(obj, feature.createColumn?.(column, instance))
144
+ }, column)
145
+
146
+ // Yes, we have to convert instance to uknown, because we know more than the compiler here.
147
+ return column as Column<TGenerics>
148
+ }
@@ -1,24 +1,40 @@
1
1
  import {
2
2
  Column,
3
- CoreHeader,
4
3
  Header,
5
4
  HeaderGroup,
6
5
  TableGenerics,
7
6
  TableInstance,
8
7
  } from '../types'
9
8
  import { memo } from '../utils'
9
+ import { TableFeature } from './instance'
10
+
11
+ export type CoreHeaderGroup<TGenerics extends TableGenerics> = {
12
+ id: string
13
+ depth: number
14
+ headers: Header<TGenerics>[]
15
+ }
16
+
17
+ export type CoreHeader<TGenerics extends TableGenerics> = {
18
+ id: string
19
+ index: number
20
+ depth: number
21
+ column: Column<TGenerics>
22
+ headerGroup: HeaderGroup<TGenerics>
23
+ subHeaders: Header<TGenerics>[]
24
+ colSpan: number
25
+ rowSpan: number
26
+ getLeafHeaders: () => Header<TGenerics>[]
27
+ isPlaceholder: boolean
28
+ placeholderId?: string
29
+ renderHeader: (options?: {
30
+ renderPlaceholder?: boolean
31
+ }) => string | null | TGenerics['Rendered']
32
+ renderFooter: (options?: {
33
+ renderPlaceholder?: boolean
34
+ }) => string | null | TGenerics['Rendered']
35
+ }
10
36
 
11
37
  export type HeadersInstance<TGenerics extends TableGenerics> = {
12
- createHeader: (
13
- column: Column<TGenerics>,
14
- options: {
15
- id?: string
16
- isPlaceholder?: boolean
17
- placeholderId?: string
18
- index: number
19
- depth: number
20
- }
21
- ) => Header<TGenerics>
22
38
  getHeaderGroups: () => HeaderGroup<TGenerics>[]
23
39
  getLeftHeaderGroups: () => HeaderGroup<TGenerics>[]
24
40
  getCenterHeaderGroups: () => HeaderGroup<TGenerics>[]
@@ -38,79 +54,78 @@ export type HeadersInstance<TGenerics extends TableGenerics> = {
38
54
  getLeftLeafHeaders: () => Header<TGenerics>[]
39
55
  getCenterLeafHeaders: () => Header<TGenerics>[]
40
56
  getRightLeafHeaders: () => Header<TGenerics>[]
41
-
42
- getHeader: (id: string) => Header<TGenerics>
43
57
  }
44
58
 
45
59
  //
46
60
 
47
- export const Headers = {
48
- createInstance: <TGenerics extends TableGenerics>(
49
- instance: TableInstance<TGenerics>
50
- ): HeadersInstance<TGenerics> => {
51
- return {
52
- createHeader: (
53
- column: Column<TGenerics>,
54
- options: {
55
- id?: string
56
- isPlaceholder?: boolean
57
- placeholderId?: string
58
- index: number
59
- depth: number
60
- }
61
- ) => {
62
- const id = options.id ?? column.id
63
-
64
- let header: CoreHeader<TGenerics> = {
65
- id,
66
- column,
67
- index: options.index,
68
- isPlaceholder: options.isPlaceholder,
69
- placeholderId: options.placeholderId,
70
- depth: options.depth,
71
- subHeaders: [],
72
- colSpan: 0,
73
- rowSpan: 0,
74
- headerGroup: null!,
75
- getLeafHeaders: (): Header<TGenerics>[] => {
76
- const leafHeaders: CoreHeader<TGenerics>[] = []
77
-
78
- const recurseHeader = (h: CoreHeader<TGenerics>) => {
79
- if (h.subHeaders && h.subHeaders.length) {
80
- h.subHeaders.map(recurseHeader)
81
- }
82
- leafHeaders.push(h)
83
- }
84
-
85
- recurseHeader(header)
86
-
87
- return leafHeaders as Header<TGenerics>[]
88
- },
89
- renderHeader: () =>
90
- column.columnDef.header
91
- ? instance._render(column.columnDef.header, {
92
- instance,
93
- header: header as Header<TGenerics>,
94
- column,
95
- })
96
- : null,
97
- renderFooter: () =>
98
- column.columnDef.footer
99
- ? instance._render(column.columnDef.footer, {
100
- instance,
101
- header: header as Header<TGenerics>,
102
- column,
103
- })
104
- : null,
61
+ function createHeader<TGenerics extends TableGenerics>(
62
+ instance: TableInstance<TGenerics>,
63
+ column: Column<TGenerics>,
64
+ options: {
65
+ id?: string
66
+ isPlaceholder?: boolean
67
+ placeholderId?: string
68
+ index: number
69
+ depth: number
70
+ }
71
+ ) {
72
+ const id = options.id ?? column.id
73
+
74
+ let header: CoreHeader<TGenerics> = {
75
+ id,
76
+ column,
77
+ index: options.index,
78
+ isPlaceholder: !!options.isPlaceholder,
79
+ placeholderId: options.placeholderId,
80
+ depth: options.depth,
81
+ subHeaders: [],
82
+ colSpan: 0,
83
+ rowSpan: 0,
84
+ headerGroup: null!,
85
+ getLeafHeaders: (): Header<TGenerics>[] => {
86
+ const leafHeaders: CoreHeader<TGenerics>[] = []
87
+
88
+ const recurseHeader = (h: CoreHeader<TGenerics>) => {
89
+ if (h.subHeaders && h.subHeaders.length) {
90
+ h.subHeaders.map(recurseHeader)
105
91
  }
92
+ leafHeaders.push(h)
93
+ }
106
94
 
107
- instance._features.forEach(feature => {
108
- Object.assign(header, feature.createHeader?.(header, instance))
109
- })
95
+ recurseHeader(header)
96
+
97
+ return leafHeaders as Header<TGenerics>[]
98
+ },
99
+ renderHeader: () =>
100
+ column.columnDef.header
101
+ ? instance._render(column.columnDef.header, {
102
+ instance,
103
+ header: header as Header<TGenerics>,
104
+ column,
105
+ })
106
+ : null,
107
+ renderFooter: () =>
108
+ column.columnDef.footer
109
+ ? instance._render(column.columnDef.footer, {
110
+ instance,
111
+ header: header as Header<TGenerics>,
112
+ column,
113
+ })
114
+ : null,
115
+ }
110
116
 
111
- return header as Header<TGenerics>
112
- },
117
+ instance._features.forEach(feature => {
118
+ Object.assign(header, feature.createHeader?.(header, instance))
119
+ })
120
+
121
+ return header as Header<TGenerics>
122
+ }
113
123
 
124
+ export const Headers: TableFeature = {
125
+ createInstance: <TGenerics extends TableGenerics>(
126
+ instance: TableInstance<TGenerics>
127
+ ): HeadersInstance<TGenerics> => {
128
+ return {
114
129
  // Header Groups
115
130
 
116
131
  getHeaderGroups: memo(
@@ -401,24 +416,6 @@ export const Headers = {
401
416
  instance.options.debugAll ?? instance.options.debugHeaders,
402
417
  }
403
418
  ),
404
-
405
- getHeader: (id: string) => {
406
- const header = [
407
- ...instance.getFlatHeaders(),
408
- ...instance.getCenterFlatHeaders(),
409
- ...instance.getLeftFlatHeaders(),
410
- ...instance.getRightFlatHeaders(),
411
- ].find(d => d.id === id)
412
-
413
- if (!header) {
414
- if (process.env.NODE_ENV !== 'production') {
415
- console.warn(`Could not find header with id: ${id}`)
416
- }
417
- throw new Error()
418
- }
419
-
420
- return header
421
- },
422
419
  }
423
420
  },
424
421
  }
@@ -492,7 +489,7 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
492
489
  latestPendingParentHeader.subHeaders.push(headerToGroup)
493
490
  } else {
494
491
  // This is a new header. Let's create it
495
- const header = instance.createHeader(column, {
492
+ const header = createHeader(instance, column, {
496
493
  id: [headerFamily, depth, column.id, headerToGroup?.id]
497
494
  .filter(Boolean)
498
495
  .join('_'),
@@ -523,7 +520,7 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
523
520
  }
524
521
 
525
522
  const bottomHeaders = columnsToGroup.map((column, index) =>
526
- instance.createHeader(column, {
523
+ createHeader(instance, column, {
527
524
  depth: maxDepth,
528
525
  index,
529
526
  })
@@ -537,7 +534,9 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
537
534
  // return !headerGroup.headers.every(header => header.isPlaceholder)
538
535
  // })
539
536
 
540
- const recurseHeadersForSpans = (headers: Header<TGenerics>[]) => {
537
+ const recurseHeadersForSpans = (
538
+ headers: Header<TGenerics>[]
539
+ ): { colSpan: number; rowSpan: number }[] => {
541
540
  const filteredHeaders = headers.filter(header =>
542
541
  header.column.getIsVisible()
543
542
  )
@@ -563,8 +562,8 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
563
562
  const minChildRowSpan = Math.min(...childRowSpans)
564
563
  rowSpan = rowSpan + minChildRowSpan
565
564
 
566
- header.colSpan = colSpan > 0 ? colSpan : undefined
567
- header.rowSpan = rowSpan > 0 ? rowSpan : undefined
565
+ header.colSpan = colSpan
566
+ header.rowSpan = rowSpan
568
567
 
569
568
  return { colSpan, rowSpan }
570
569
  })