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

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 (105) hide show
  1. package/build/cjs/aggregationFns.js +50 -51
  2. package/build/cjs/aggregationFns.js.map +1 -1
  3. package/build/cjs/core/cell.js +38 -0
  4. package/build/cjs/core/cell.js.map +1 -0
  5. package/build/cjs/core/column.js +88 -0
  6. package/build/cjs/core/column.js.map +1 -0
  7. package/build/cjs/{features/Headers.js → core/headers.js} +54 -66
  8. package/build/cjs/core/headers.js.map +1 -0
  9. package/build/cjs/core/instance.js +255 -0
  10. package/build/cjs/core/instance.js.map +1 -0
  11. package/build/cjs/core/row.js +77 -0
  12. package/build/cjs/core/row.js.map +1 -0
  13. package/build/cjs/features/ColumnSizing.js.map +1 -1
  14. package/build/cjs/features/Expanding.js +0 -1
  15. package/build/cjs/features/Expanding.js.map +1 -1
  16. package/build/cjs/features/Filters.js +2 -3
  17. package/build/cjs/features/Filters.js.map +1 -1
  18. package/build/cjs/features/Grouping.js +5 -5
  19. package/build/cjs/features/Grouping.js.map +1 -1
  20. package/build/cjs/features/Ordering.js.map +1 -1
  21. package/build/cjs/features/Pagination.js.map +1 -1
  22. package/build/cjs/features/Pinning.js +3 -3
  23. package/build/cjs/features/Pinning.js.map +1 -1
  24. package/build/cjs/features/RowSelection.js.map +1 -1
  25. package/build/cjs/features/Sorting.js.map +1 -1
  26. package/build/cjs/features/Visibility.js +0 -5
  27. package/build/cjs/features/Visibility.js.map +1 -1
  28. package/build/cjs/index.js +9 -6
  29. package/build/cjs/index.js.map +1 -1
  30. package/build/cjs/utils/filterRowsUtils.js +23 -21
  31. package/build/cjs/utils/filterRowsUtils.js.map +1 -1
  32. package/build/cjs/utils/getCoreRowModel.js +9 -8
  33. package/build/cjs/utils/getCoreRowModel.js.map +1 -1
  34. package/build/cjs/utils/getExpandedRowModel.js +2 -2
  35. package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
  36. package/build/cjs/utils/getGroupedRowModel.js +13 -20
  37. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  38. package/build/cjs/utils/getPaginationRowModel.js +1 -1
  39. package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
  40. package/build/esm/index.js +718 -838
  41. package/build/esm/index.js.map +1 -1
  42. package/build/stats-html.html +1 -1
  43. package/build/stats-react.json +403 -380
  44. package/build/types/aggregationFns.d.ts +10 -19
  45. package/build/types/core/cell.d.ts +9 -0
  46. package/build/types/{features/Columns.d.ts → core/column.d.ts} +3 -17
  47. package/build/types/{features/Headers.d.ts → core/headers.d.ts} +26 -11
  48. package/build/types/core/instance.d.ts +57 -0
  49. package/build/types/core/row.d.ts +15 -0
  50. package/build/types/features/ColumnSizing.d.ts +2 -1
  51. package/build/types/features/Expanding.d.ts +2 -2
  52. package/build/types/features/Filters.d.ts +2 -3
  53. package/build/types/features/Grouping.d.ts +8 -9
  54. package/build/types/features/Ordering.d.ts +2 -1
  55. package/build/types/features/Pagination.d.ts +2 -1
  56. package/build/types/features/Pinning.d.ts +2 -1
  57. package/build/types/features/RowSelection.d.ts +2 -1
  58. package/build/types/features/Sorting.d.ts +2 -1
  59. package/build/types/features/Visibility.d.ts +7 -7
  60. package/build/types/index.d.ts +4 -2
  61. package/build/types/sortingFns.d.ts +4 -4
  62. package/build/types/types.d.ts +10 -53
  63. package/build/umd/index.development.js +721 -836
  64. package/build/umd/index.development.js.map +1 -1
  65. package/build/umd/index.production.js +1 -1
  66. package/build/umd/index.production.js.map +1 -1
  67. package/package.json +1 -1
  68. package/src/aggregationFns.ts +44 -40
  69. package/src/core/cell.ts +47 -0
  70. package/src/core/column.ts +148 -0
  71. package/src/{features/Headers.ts → core/headers.ts} +98 -99
  72. package/src/core/instance.ts +361 -0
  73. package/src/core/row.ts +85 -0
  74. package/src/features/ColumnSizing.ts +1 -1
  75. package/src/features/Expanding.ts +1 -4
  76. package/src/features/Filters.ts +2 -7
  77. package/src/features/Grouping.ts +16 -19
  78. package/src/features/Ordering.ts +1 -1
  79. package/src/features/Pagination.ts +1 -1
  80. package/src/features/Pinning.ts +8 -4
  81. package/src/features/RowSelection.ts +1 -1
  82. package/src/features/Sorting.ts +1 -1
  83. package/src/features/Visibility.ts +8 -17
  84. package/src/index.ts +4 -8
  85. package/src/types.ts +9 -61
  86. package/src/utils/filterRowsUtils.ts +4 -2
  87. package/src/utils/getCoreRowModel.ts +4 -2
  88. package/src/utils/getExpandedRowModel.ts +1 -5
  89. package/src/utils/getGroupedRowModel.ts +14 -23
  90. package/build/cjs/core.js +0 -168
  91. package/build/cjs/core.js.map +0 -1
  92. package/build/cjs/features/Cells.js +0 -101
  93. package/build/cjs/features/Cells.js.map +0 -1
  94. package/build/cjs/features/Columns.js +0 -191
  95. package/build/cjs/features/Columns.js.map +0 -1
  96. package/build/cjs/features/Headers.js.map +0 -1
  97. package/build/cjs/features/Rows.js +0 -94
  98. package/build/cjs/features/Rows.js.map +0 -1
  99. package/build/types/core.d.ts +0 -30
  100. package/build/types/features/Cells.d.ts +0 -13
  101. package/build/types/features/Rows.d.ts +0 -28
  102. package/src/core.ts +0 -246
  103. package/src/features/Cells.ts +0 -128
  104. package/src/features/Columns.ts +0 -293
  105. 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.86",
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",
@@ -1,64 +1,53 @@
1
- export const aggregationFns = {
2
- sum,
3
- min,
4
- max,
5
- extent,
6
- mean,
7
- median,
8
- unique,
9
- uniqueCount,
10
- count,
11
- }
1
+ import { AggregationFn } from './features/Grouping'
12
2
 
13
- export type BuiltInAggregationFn = keyof typeof aggregationFns
14
-
15
- function sum(_getLeafValues: () => unknown[], getChildValues: () => unknown[]) {
3
+ const sum: AggregationFn<any> = (columnId, _leafRows, childRows) => {
16
4
  // It's faster to just add the aggregations together instead of
17
5
  // process leaf nodes individually
18
- return getChildValues().reduce(
6
+ return childRows.reduce(
19
7
  (sum: number, next: unknown) => sum + (typeof next === 'number' ? next : 0),
20
8
  0
21
9
  )
22
10
  }
23
11
 
24
- function min(_getLeafValues: () => unknown[], getChildValues: () => unknown[]) {
12
+ const min: AggregationFn<any> = (columnId, _leafRows, childRows) => {
25
13
  let min: number | undefined
26
14
 
27
- for (const value of getChildValues() as number[]) {
15
+ childRows.forEach(row => {
16
+ const value = row.getValue(columnId)
17
+
28
18
  if (
29
19
  value != null &&
30
20
  (min! > value || (min === undefined && value >= value))
31
21
  ) {
32
22
  min = value
33
23
  }
34
- }
24
+ })
35
25
 
36
26
  return min
37
27
  }
38
28
 
39
- function max(_getLeafValues: () => unknown[], getChildValues: () => unknown[]) {
29
+ const max: AggregationFn<any> = (columnId, _leafRows, childRows) => {
40
30
  let max: number | undefined
41
31
 
42
- for (const value of getChildValues() as number[]) {
32
+ childRows.forEach(row => {
33
+ const value = row.getValue(columnId)
43
34
  if (
44
35
  value != null &&
45
36
  (max! < value || (max === undefined && value >= value))
46
37
  ) {
47
38
  max = value
48
39
  }
49
- }
40
+ })
50
41
 
51
42
  return max
52
43
  }
53
44
 
54
- function extent(
55
- _getLeafValues: () => unknown[],
56
- getChildValues: () => unknown[]
57
- ) {
45
+ const extent: AggregationFn<any> = (columnId, _leafRows, childRows) => {
58
46
  let min: number | undefined
59
47
  let max: number | undefined
60
48
 
61
- for (const value of getChildValues() as number[]) {
49
+ childRows.forEach(row => {
50
+ const value = row.getValue(columnId)
62
51
  if (value != null) {
63
52
  if (min === undefined) {
64
53
  if (value >= value) min = max = value
@@ -67,36 +56,37 @@ function extent(
67
56
  if (max! < value) max = value
68
57
  }
69
58
  }
70
- }
59
+ })
71
60
 
72
61
  return [min, max]
73
62
  }
74
63
 
75
- export function mean(getLeafValues: () => unknown[]) {
64
+ const mean: AggregationFn<any> = (columnId, leafRows) => {
76
65
  let count = 0
77
66
  let sum = 0
78
67
 
79
- for (let value of getLeafValues() as number[]) {
68
+ leafRows.forEach(row => {
69
+ let value = row.getValue(columnId)
80
70
  if (value != null && (value = +value) >= value) {
81
71
  ++count, (sum += value)
82
72
  }
83
- }
73
+ })
84
74
 
85
75
  if (count) return sum / count
86
76
 
87
77
  return
88
78
  }
89
79
 
90
- function median(getLeafValues: () => unknown[]) {
91
- const leafValues = getLeafValues()
92
- if (!leafValues.length) {
80
+ const median: AggregationFn<any> = (columnId, leafRows) => {
81
+ if (!leafRows.length) {
93
82
  return
94
83
  }
95
84
 
96
85
  let min = 0
97
86
  let max = 0
98
87
 
99
- leafValues.forEach(value => {
88
+ leafRows.forEach(row => {
89
+ let value = row.getValue(columnId)
100
90
  if (typeof value === 'number') {
101
91
  min = Math.min(min, value)
102
92
  max = Math.max(max, value)
@@ -106,14 +96,28 @@ function median(getLeafValues: () => unknown[]) {
106
96
  return (min + max) / 2
107
97
  }
108
98
 
109
- function unique<T>(getLeafValues: () => T[]) {
110
- return Array.from(new Set(getLeafValues()).values())
99
+ const unique: AggregationFn<any> = (columnId, leafRows) => {
100
+ return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values())
111
101
  }
112
102
 
113
- function uniqueCount(getLeafValues: () => unknown[]) {
114
- return new Set(getLeafValues()).size
103
+ const uniqueCount: AggregationFn<any> = (columnId, leafRows) => {
104
+ return new Set(leafRows.map(d => d.getValue(columnId))).size
115
105
  }
116
106
 
117
- function count(getLeafValues: () => unknown[]) {
118
- return getLeafValues().length
107
+ const count: AggregationFn<any> = (_columnId, leafRows) => {
108
+ return leafRows.length
109
+ }
110
+
111
+ export const aggregationFns = {
112
+ sum,
113
+ min,
114
+ max,
115
+ extent,
116
+ mean,
117
+ median,
118
+ unique,
119
+ uniqueCount,
120
+ count,
119
121
  }
122
+
123
+ export type BuiltInAggregationFn = keyof typeof aggregationFns
@@ -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
  })