@tanstack/table-core 8.0.0-alpha.9 → 8.0.0-beta.2

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 (186) hide show
  1. package/build/cjs/aggregationFns.js +120 -0
  2. package/build/cjs/aggregationFns.js.map +1 -0
  3. package/build/cjs/core/cell.js +40 -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/core/headers.js +403 -0
  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/createTable.js +36 -29
  14. package/build/cjs/createTable.js.map +1 -1
  15. package/build/cjs/features/ColumnSizing.js +157 -189
  16. package/build/cjs/features/ColumnSizing.js.map +1 -1
  17. package/build/cjs/features/Expanding.js +103 -155
  18. package/build/cjs/features/Expanding.js.map +1 -1
  19. package/build/cjs/features/Filters.js +155 -304
  20. package/build/cjs/features/Filters.js.map +1 -1
  21. package/build/cjs/features/Grouping.js +97 -157
  22. package/build/cjs/features/Grouping.js.map +1 -1
  23. package/build/cjs/features/Ordering.js +30 -41
  24. package/build/cjs/features/Ordering.js.map +1 -1
  25. package/build/cjs/features/Pagination.js +102 -105
  26. package/build/cjs/features/Pagination.js.map +1 -1
  27. package/build/cjs/features/Pinning.js +131 -89
  28. package/build/cjs/features/Pinning.js.map +1 -1
  29. package/build/cjs/features/RowSelection.js +138 -267
  30. package/build/cjs/features/RowSelection.js.map +1 -1
  31. package/build/cjs/features/Sorting.js +82 -167
  32. package/build/cjs/features/Sorting.js.map +1 -1
  33. package/build/cjs/features/Visibility.js +69 -115
  34. package/build/cjs/features/Visibility.js.map +1 -1
  35. package/build/cjs/filterFns.js +107 -0
  36. package/build/cjs/filterFns.js.map +1 -0
  37. package/build/cjs/index.js +36 -23
  38. package/build/cjs/index.js.map +1 -1
  39. package/build/cjs/sortingFns.js +124 -0
  40. package/build/cjs/sortingFns.js.map +1 -0
  41. package/build/cjs/utils/filterRowsUtils.js +117 -0
  42. package/build/cjs/utils/filterRowsUtils.js.map +1 -0
  43. package/build/cjs/utils/getCoreRowModel.js +79 -0
  44. package/build/cjs/utils/getCoreRowModel.js.map +1 -0
  45. package/build/cjs/utils/getExpandedRowModel.js +57 -0
  46. package/build/cjs/utils/getExpandedRowModel.js.map +1 -0
  47. package/build/cjs/utils/getFacetedMinMaxValues.js +54 -0
  48. package/build/cjs/utils/getFacetedMinMaxValues.js.map +1 -0
  49. package/build/cjs/utils/getFacetedRowModel.js +50 -0
  50. package/build/cjs/utils/getFacetedRowModel.js.map +1 -0
  51. package/build/cjs/utils/getFacetedUniqueValues.js +48 -0
  52. package/build/cjs/utils/getFacetedUniqueValues.js.map +1 -0
  53. package/build/cjs/utils/getFilteredRowModel.js +139 -0
  54. package/build/cjs/utils/getFilteredRowModel.js.map +1 -0
  55. package/build/cjs/utils/getGroupedRowModel.js +161 -0
  56. package/build/cjs/utils/getGroupedRowModel.js.map +1 -0
  57. package/build/cjs/utils/getPaginationRowModel.js +61 -0
  58. package/build/cjs/utils/getPaginationRowModel.js.map +1 -0
  59. package/build/cjs/utils/getSortedRowModel.js +110 -0
  60. package/build/cjs/utils/getSortedRowModel.js.map +1 -0
  61. package/build/cjs/utils.js +38 -107
  62. package/build/cjs/utils.js.map +1 -1
  63. package/build/esm/index.js +2976 -3853
  64. package/build/esm/index.js.map +1 -1
  65. package/build/stats-html.html +1 -1
  66. package/build/stats-react.json +586 -408
  67. package/build/types/aggregationFns.d.ts +13 -0
  68. package/build/types/core/cell.d.ts +9 -0
  69. package/build/types/core/column.d.ts +40 -0
  70. package/build/types/core/headers.d.ts +46 -0
  71. package/build/types/core/instance.d.ts +57 -0
  72. package/build/types/core/row.d.ts +15 -0
  73. package/build/types/createTable.d.ts +47 -26
  74. package/build/types/features/ColumnSizing.d.ts +32 -44
  75. package/build/types/features/Expanding.d.ts +15 -26
  76. package/build/types/features/Filters.d.ts +64 -63
  77. package/build/types/features/Grouping.d.ts +32 -46
  78. package/build/types/features/Ordering.d.ts +7 -10
  79. package/build/types/features/Pagination.d.ts +16 -15
  80. package/build/types/features/Pinning.d.ts +16 -17
  81. package/build/types/features/RowSelection.d.ts +13 -33
  82. package/build/types/features/Sorting.d.ts +25 -44
  83. package/build/types/features/Visibility.d.ts +16 -25
  84. package/build/types/filterFns.d.ts +13 -0
  85. package/build/types/index.d.ts +16 -10
  86. package/build/types/sortingFns.d.ts +11 -0
  87. package/build/types/types.d.ts +37 -122
  88. package/build/types/utils/filterRowsUtils.d.ts +4 -0
  89. package/build/types/utils/getCoreRowModel.d.ts +2 -0
  90. package/build/types/utils/getExpandedRowModel.d.ts +7 -0
  91. package/build/types/utils/getFacetedMinMaxValues.d.ts +2 -0
  92. package/build/types/utils/getFacetedRowModel.d.ts +2 -0
  93. package/build/types/utils/getFacetedUniqueValues.d.ts +2 -0
  94. package/build/types/utils/getFilteredRowModel.d.ts +2 -0
  95. package/build/types/utils/getGroupedRowModel.d.ts +2 -0
  96. package/build/types/utils/getPaginationRowModel.d.ts +4 -0
  97. package/build/types/utils/getSortedRowModel.d.ts +2 -0
  98. package/build/types/utils.d.ts +7 -11
  99. package/build/umd/index.development.js +3024 -3893
  100. package/build/umd/index.development.js.map +1 -1
  101. package/build/umd/index.production.js +1 -1
  102. package/build/umd/index.production.js.map +1 -1
  103. package/package.json +9 -10
  104. package/src/aggregationFns.ts +123 -0
  105. package/src/core/cell.ts +48 -0
  106. package/src/core/column.ts +147 -0
  107. package/src/core/headers.ts +575 -0
  108. package/src/core/instance.ts +359 -0
  109. package/src/core/row.ts +85 -0
  110. package/src/createTable.ts +188 -0
  111. package/src/features/ColumnSizing.ts +170 -185
  112. package/src/features/Expanding.ts +120 -194
  113. package/src/features/Filters.ts +299 -381
  114. package/src/features/Grouping.ts +158 -220
  115. package/src/features/Ordering.ts +24 -25
  116. package/src/features/Pagination.ts +88 -73
  117. package/src/features/Pinning.ts +186 -63
  118. package/src/features/RowSelection.ts +107 -245
  119. package/src/features/Sorting.ts +125 -225
  120. package/src/features/Visibility.ts +116 -132
  121. package/src/filterFns.ts +135 -0
  122. package/src/index.ts +29 -0
  123. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  124. package/src/types.ts +62 -168
  125. package/src/utils/filterRowsUtils.ts +112 -0
  126. package/src/utils/getCoreRowModel.ts +84 -0
  127. package/src/utils/getExpandedRowModel.ts +54 -0
  128. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  129. package/src/utils/getFacetedRowModel.ts +50 -0
  130. package/src/utils/getFacetedUniqueValues.ts +37 -0
  131. package/src/utils/getFilteredRowModel.ts +159 -0
  132. package/src/utils/getGroupedRowModel.ts +175 -0
  133. package/src/utils/getPaginationRowModel.ts +48 -0
  134. package/src/utils/getSortedRowModel.ts +116 -0
  135. package/src/utils.ts +126 -0
  136. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  138. package/build/cjs/aggregationTypes.js +0 -130
  139. package/build/cjs/aggregationTypes.js.map +0 -1
  140. package/build/cjs/core.js +0 -545
  141. package/build/cjs/core.js.map +0 -1
  142. package/build/cjs/features/Headers.js +0 -630
  143. package/build/cjs/features/Headers.js.map +0 -1
  144. package/build/cjs/filterTypes.js +0 -172
  145. package/build/cjs/filterTypes.js.map +0 -1
  146. package/build/cjs/sortTypes.js +0 -122
  147. package/build/cjs/sortTypes.js.map +0 -1
  148. package/build/cjs/types.js +0 -22
  149. package/build/cjs/types.js.map +0 -1
  150. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  151. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  152. package/build/cjs/utils/expandRowsFn.js +0 -38
  153. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  154. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  155. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  156. package/build/cjs/utils/groupRowsFn.js +0 -155
  157. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  158. package/build/cjs/utils/paginateRowsFn.js +0 -44
  159. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  160. package/build/cjs/utils/sortRowsFn.js +0 -94
  161. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  162. package/build/types/aggregationTypes.d.ts +0 -22
  163. package/build/types/core.d.ts +0 -105
  164. package/build/types/features/Headers.d.ts +0 -43
  165. package/build/types/filterTypes.d.ts +0 -50
  166. package/build/types/sortTypes.d.ts +0 -18
  167. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  168. package/build/types/utils/expandRowsFn.d.ts +0 -2
  169. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  170. package/build/types/utils/groupRowsFn.d.ts +0 -2
  171. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  172. package/build/types/utils/sortRowsFn.d.ts +0 -2
  173. package/src/.DS_Store +0 -0
  174. package/src/aggregationTypes.ts +0 -115
  175. package/src/core.tsx +0 -763
  176. package/src/createTable.tsx +0 -137
  177. package/src/features/Headers.ts +0 -747
  178. package/src/filterTypes.ts +0 -188
  179. package/src/index.tsx +0 -23
  180. package/src/utils/columnFilterRowsFn.ts +0 -113
  181. package/src/utils/expandRowsFn.ts +0 -30
  182. package/src/utils/globalFilterRowsFn.ts +0 -89
  183. package/src/utils/groupRowsFn.ts +0 -170
  184. package/src/utils/paginateRowsFn.ts +0 -28
  185. package/src/utils/sortRowsFn.ts +0 -95
  186. package/src/utils.tsx +0 -221
@@ -1,747 +0,0 @@
1
- import {
2
- Cell,
3
- Column,
4
- CoreHeader,
5
- FooterGroupProps,
6
- FooterProps,
7
- Getter,
8
- Header,
9
- HeaderGroup,
10
- HeaderGroupProps,
11
- HeaderProps,
12
- PartialGenerics,
13
- PropGetterValue,
14
- TableInstance,
15
- Row,
16
- } from '../types'
17
- import { propGetter, memo, flexRender } from '../utils'
18
- import { ColumnSizing } from './ColumnSizing'
19
-
20
- export type HeadersRow<TGenerics extends PartialGenerics> = {
21
- _getAllVisibleCells: () => Cell<TGenerics>[]
22
- getVisibleCells: () => Cell<TGenerics>[]
23
- getLeftVisibleCells: () => Cell<TGenerics>[]
24
- getCenterVisibleCells: () => Cell<TGenerics>[]
25
- getRightVisibleCells: () => Cell<TGenerics>[]
26
- }
27
-
28
- export type HeadersInstance<TGenerics extends PartialGenerics> = {
29
- createHeader: (
30
- column: Column<TGenerics>,
31
- options: {
32
- id?: string
33
- isPlaceholder?: boolean
34
- placeholderId?: string
35
- depth: number
36
- }
37
- ) => Header<TGenerics>
38
- getHeaderGroups: () => HeaderGroup<TGenerics>[]
39
- getLeftHeaderGroups: () => HeaderGroup<TGenerics>[]
40
- getCenterHeaderGroups: () => HeaderGroup<TGenerics>[]
41
- getRightHeaderGroups: () => HeaderGroup<TGenerics>[]
42
-
43
- getFooterGroups: () => HeaderGroup<TGenerics>[]
44
- getLeftFooterGroups: () => HeaderGroup<TGenerics>[]
45
- getCenterFooterGroups: () => HeaderGroup<TGenerics>[]
46
- getRightFooterGroups: () => HeaderGroup<TGenerics>[]
47
-
48
- getFlatHeaders: () => Header<TGenerics>[]
49
- getLeftFlatHeaders: () => Header<TGenerics>[]
50
- getCenterFlatHeaders: () => Header<TGenerics>[]
51
- getRightFlatHeaders: () => Header<TGenerics>[]
52
-
53
- getLeafHeaders: () => Header<TGenerics>[]
54
- getLeftLeafHeaders: () => Header<TGenerics>[]
55
- getCenterLeafHeaders: () => Header<TGenerics>[]
56
- getRightLeafHeaders: () => Header<TGenerics>[]
57
-
58
- getHeader: (id: string) => Header<TGenerics>
59
-
60
- getHeaderGroupProps: <TGetter extends Getter<HeaderGroupProps>>(
61
- id: string,
62
- userProps?: TGetter
63
- ) => undefined | PropGetterValue<HeaderGroupProps, TGetter>
64
- getFooterGroupProps: <TGetter extends Getter<FooterGroupProps>>(
65
- id: string,
66
- userProps?: TGetter
67
- ) => undefined | PropGetterValue<FooterGroupProps, TGetter>
68
- getHeaderProps: <TGetter extends Getter<HeaderProps>>(
69
- headerId: string,
70
- userProps?: TGetter
71
- ) => undefined | PropGetterValue<HeaderProps, TGetter>
72
- getFooterProps: <TGetter extends Getter<FooterProps>>(
73
- headerId: string,
74
- userProps?: TGetter
75
- ) => undefined | PropGetterValue<FooterProps, TGetter>
76
- getTotalWidth: () => number
77
- }
78
-
79
- //
80
-
81
- export const Headers = {
82
- createRow: <TGenerics extends PartialGenerics>(
83
- row: Row<TGenerics>,
84
- instance: TableInstance<TGenerics>
85
- ): HeadersRow<TGenerics> => {
86
- return {
87
- _getAllVisibleCells: memo(
88
- () => [
89
- row
90
- .getAllCells()
91
- .filter(cell => cell.column.getIsVisible())
92
- .map(d => d.id)
93
- .join('_'),
94
- ],
95
- _ => {
96
- return row.getAllCells().filter(cell => cell.column.getIsVisible())
97
- },
98
- {
99
- key: 'row._getAllVisibleCells',
100
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
101
- }
102
- ),
103
- getVisibleCells: memo(
104
- () => [
105
- row.getLeftVisibleCells(),
106
- row.getCenterVisibleCells(),
107
- row.getRightVisibleCells(),
108
- ],
109
- (left, center, right) => [...left, ...center, ...right],
110
- {
111
- key: 'row.getVisibleCells',
112
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
113
- }
114
- ),
115
- getCenterVisibleCells: memo(
116
- () => [
117
- row._getAllVisibleCells(),
118
- instance.getState().columnPinning.left,
119
- instance.getState().columnPinning.right,
120
- ],
121
- (allCells, left, right) => {
122
- const leftAndRight = [...(left ?? []), ...(right ?? [])]
123
-
124
- return allCells.filter(d => !leftAndRight.includes(d.columnId))
125
- },
126
- {
127
- key: 'row.getCenterVisibleCells',
128
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
129
- }
130
- ),
131
- getLeftVisibleCells: memo(
132
- () => [
133
- row._getAllVisibleCells(),
134
- instance.getState().columnPinning.left,
135
- ,
136
- ],
137
- (allCells, left) => {
138
- const cells = (left ?? [])
139
- .map(columnId => allCells.find(cell => cell.columnId === columnId)!)
140
- .filter(Boolean)
141
-
142
- return cells
143
- },
144
- {
145
- key: 'row.getLeftVisibleCells',
146
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
147
- }
148
- ),
149
- getRightVisibleCells: memo(
150
- () => [
151
- row._getAllVisibleCells(),
152
- instance.getState().columnPinning.right,
153
- ],
154
- (allCells, right) => {
155
- const cells = (right ?? [])
156
- .map(columnId => allCells.find(cell => cell.columnId === columnId)!)
157
- .filter(Boolean)
158
-
159
- return cells
160
- },
161
- {
162
- key: 'row.getRightVisibleCells',
163
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
164
- }
165
- ),
166
- }
167
- },
168
-
169
- getInstance: <TGenerics extends PartialGenerics>(
170
- instance: TableInstance<TGenerics>
171
- ): HeadersInstance<TGenerics> => {
172
- return {
173
- createHeader: (
174
- column: Column<TGenerics>,
175
- options: {
176
- id?: string
177
- isPlaceholder?: boolean
178
- placeholderId?: string
179
- depth: number
180
- }
181
- ) => {
182
- const id = options.id ?? column.id
183
-
184
- let header: CoreHeader<TGenerics> = {
185
- id,
186
- column,
187
- isPlaceholder: options.isPlaceholder,
188
- placeholderId: options.placeholderId,
189
- depth: options.depth,
190
- subHeaders: [],
191
- colSpan: 0,
192
- rowSpan: 0,
193
- getWidth: () => {
194
- let sum = 0
195
-
196
- const recurse = (header: CoreHeader<TGenerics>) => {
197
- if (header.subHeaders.length) {
198
- header.subHeaders.forEach(recurse)
199
- } else {
200
- sum += header.column.getWidth() ?? 0
201
- }
202
- }
203
-
204
- recurse(header)
205
-
206
- return sum
207
- },
208
- getLeafHeaders: (): Header<TGenerics>[] => {
209
- const leafHeaders: CoreHeader<TGenerics>[] = []
210
-
211
- const recurseHeader = (h: CoreHeader<TGenerics>) => {
212
- if (h.subHeaders && h.subHeaders.length) {
213
- h.subHeaders.map(recurseHeader)
214
- }
215
- leafHeaders.push(h)
216
- }
217
-
218
- recurseHeader(header)
219
-
220
- return leafHeaders as Header<TGenerics>[]
221
- },
222
- getHeaderProps: userProps =>
223
- instance.getHeaderProps(header.id, userProps)!,
224
- getFooterProps: userProps =>
225
- instance.getFooterProps(header.id, userProps)!,
226
- renderHeader: () =>
227
- flexRender(column.header, { instance, header, column }),
228
- renderFooter: () =>
229
- flexRender(column.footer, { instance, header, column }),
230
- }
231
-
232
- // Yes, we have to convert instance to unknown, because we know more than the compiler here.
233
- return Object.assign(
234
- header,
235
- ColumnSizing.createHeader(header as Header<TGenerics>, instance)
236
- ) as Header<TGenerics>
237
- },
238
-
239
- // Header Groups
240
-
241
- getHeaderGroups: memo(
242
- () => [
243
- instance.getAllColumns(),
244
- instance.getVisibleLeafColumns(),
245
- instance.getState().columnPinning.left,
246
- instance.getState().columnPinning.right,
247
- ],
248
- (allColumns, leafColumns, left, right) => {
249
- const leftColumns = leafColumns.filter(column =>
250
- left?.includes(column.id)
251
- )
252
- const rightColumns = leafColumns.filter(column =>
253
- right?.includes(column.id)
254
- )
255
- const centerColumns = leafColumns.filter(
256
- column => !left?.includes(column.id) && !right?.includes(column.id)
257
- )
258
- const headerGroups = buildHeaderGroups(
259
- allColumns,
260
- [...leftColumns, ...centerColumns, ...rightColumns],
261
- instance
262
- )
263
-
264
- return headerGroups
265
- },
266
- {
267
- key: 'getHeaderGroups',
268
- debug: () =>
269
- instance.options.debugAll ?? instance.options.debugHeaders,
270
- }
271
- ),
272
-
273
- getCenterHeaderGroups: memo(
274
- () => [
275
- instance.getAllColumns(),
276
- instance.getVisibleLeafColumns(),
277
- instance.getState().columnPinning.left,
278
- instance.getState().columnPinning.right,
279
- ],
280
- (allColumns, leafColumns, left, right) => {
281
- leafColumns = leafColumns.filter(
282
- column => !left?.includes(column.id) && !right?.includes(column.id)
283
- )
284
- return buildHeaderGroups(allColumns, leafColumns, instance, 'center')
285
- },
286
- {
287
- key: 'getCenterHeaderGroups',
288
- debug: () =>
289
- instance.options.debugAll ?? instance.options.debugHeaders,
290
- }
291
- ),
292
-
293
- getLeftHeaderGroups: memo(
294
- () => [
295
- instance.getAllColumns(),
296
- instance.getVisibleLeafColumns(),
297
- instance.getState().columnPinning.left,
298
- ],
299
- (allColumns, leafColumns, left) => {
300
- leafColumns = leafColumns.filter(column => left?.includes(column.id))
301
- return buildHeaderGroups(allColumns, leafColumns, instance, 'left')
302
- },
303
- {
304
- key: 'getLeftHeaderGroups',
305
- debug: () =>
306
- instance.options.debugAll ?? instance.options.debugHeaders,
307
- }
308
- ),
309
-
310
- getRightHeaderGroups: memo(
311
- () => [
312
- instance.getAllColumns(),
313
- instance.getVisibleLeafColumns(),
314
- instance.getState().columnPinning.right,
315
- ],
316
- (allColumns, leafColumns, right) => {
317
- leafColumns = leafColumns.filter(column => right?.includes(column.id))
318
- return buildHeaderGroups(allColumns, leafColumns, instance, 'right')
319
- },
320
- {
321
- key: 'getRightHeaderGroups',
322
- debug: () =>
323
- instance.options.debugAll ?? instance.options.debugHeaders,
324
- }
325
- ),
326
-
327
- // Footer Groups
328
-
329
- getFooterGroups: memo(
330
- () => [instance.getHeaderGroups()],
331
- headerGroups => {
332
- return [...headerGroups].reverse()
333
- },
334
- {
335
- key: 'getFooterGroups',
336
- debug: () =>
337
- instance.options.debugAll ?? instance.options.debugHeaders,
338
- }
339
- ),
340
-
341
- getLeftFooterGroups: memo(
342
- () => [instance.getLeftHeaderGroups()],
343
- headerGroups => {
344
- return [...headerGroups].reverse()
345
- },
346
- {
347
- key: 'getLeftFooterGroups',
348
- debug: () =>
349
- instance.options.debugAll ?? instance.options.debugHeaders,
350
- }
351
- ),
352
-
353
- getCenterFooterGroups: memo(
354
- () => [instance.getCenterHeaderGroups()],
355
- headerGroups => {
356
- return [...headerGroups].reverse()
357
- },
358
- {
359
- key: 'getCenterFooterGroups',
360
- debug: () =>
361
- instance.options.debugAll ?? instance.options.debugHeaders,
362
- }
363
- ),
364
-
365
- getRightFooterGroups: memo(
366
- () => [instance.getRightHeaderGroups()],
367
- headerGroups => {
368
- return [...headerGroups].reverse()
369
- },
370
- {
371
- key: 'getRightFooterGroups',
372
- debug: () =>
373
- instance.options.debugAll ?? instance.options.debugHeaders,
374
- }
375
- ),
376
-
377
- // Flat Headers
378
-
379
- getFlatHeaders: memo(
380
- () => [instance.getHeaderGroups()],
381
- headerGroups => {
382
- return headerGroups
383
- .map(headerGroup => {
384
- return headerGroup.headers
385
- })
386
- .flat()
387
- },
388
- {
389
- key: 'getFlatHeaders',
390
- debug: () =>
391
- instance.options.debugAll ?? instance.options.debugHeaders,
392
- }
393
- ),
394
-
395
- getLeftFlatHeaders: memo(
396
- () => [instance.getLeftHeaderGroups()],
397
- left => {
398
- return left
399
- .map(headerGroup => {
400
- return headerGroup.headers
401
- })
402
- .flat()
403
- },
404
- {
405
- key: 'getLeftFlatHeaders',
406
- debug: () =>
407
- instance.options.debugAll ?? instance.options.debugHeaders,
408
- }
409
- ),
410
-
411
- getCenterFlatHeaders: memo(
412
- () => [instance.getCenterHeaderGroups()],
413
- left => {
414
- return left
415
- .map(headerGroup => {
416
- return headerGroup.headers
417
- })
418
- .flat()
419
- },
420
- {
421
- key: 'getCenterFlatHeaders',
422
- debug: () =>
423
- instance.options.debugAll ?? instance.options.debugHeaders,
424
- }
425
- ),
426
-
427
- getRightFlatHeaders: memo(
428
- () => [instance.getRightHeaderGroups()],
429
- left => {
430
- return left
431
- .map(headerGroup => {
432
- return headerGroup.headers
433
- })
434
- .flat()
435
- },
436
- {
437
- key: 'getRightFlatHeaders',
438
- debug: () =>
439
- instance.options.debugAll ?? instance.options.debugHeaders,
440
- }
441
- ),
442
-
443
- // Leaf Headers
444
-
445
- getCenterLeafHeaders: memo(
446
- () => [instance.getCenterFlatHeaders()],
447
- flatHeaders => {
448
- return flatHeaders.filter(header => !header.subHeaders?.length)
449
- },
450
- {
451
- key: 'getCenterLeafHeaders',
452
- debug: () =>
453
- instance.options.debugAll ?? instance.options.debugHeaders,
454
- }
455
- ),
456
-
457
- getLeftLeafHeaders: memo(
458
- () => [instance.getLeftFlatHeaders()],
459
- flatHeaders => {
460
- return flatHeaders.filter(header => !header.subHeaders?.length)
461
- },
462
- {
463
- key: 'getLeftLeafHeaders',
464
- debug: () =>
465
- instance.options.debugAll ?? instance.options.debugHeaders,
466
- }
467
- ),
468
-
469
- getRightLeafHeaders: memo(
470
- () => [instance.getRightFlatHeaders()],
471
- flatHeaders => {
472
- return flatHeaders.filter(header => !header.subHeaders?.length)
473
- },
474
- {
475
- key: 'getRightLeafHeaders',
476
- debug: () =>
477
- instance.options.debugAll ?? instance.options.debugHeaders,
478
- }
479
- ),
480
-
481
- getLeafHeaders: memo(
482
- () => [
483
- instance.getLeftHeaderGroups(),
484
- instance.getCenterHeaderGroups(),
485
- instance.getRightHeaderGroups(),
486
- ],
487
- (left, center, right) => {
488
- return [
489
- ...(left[0]?.headers ?? []),
490
- ...(center[0]?.headers ?? []),
491
- ...(right[0]?.headers ?? []),
492
- ]
493
- .map(header => {
494
- return header.getLeafHeaders()
495
- })
496
- .flat()
497
- },
498
- {
499
- key: 'getLeafHeaders',
500
- debug: () =>
501
- instance.options.debugAll ?? instance.options.debugHeaders,
502
- }
503
- ),
504
-
505
- getHeader: (id: string) => {
506
- const header = [
507
- ...instance.getFlatHeaders(),
508
- ...instance.getCenterFlatHeaders(),
509
- ...instance.getLeftFlatHeaders(),
510
- ...instance.getRightFlatHeaders(),
511
- ].find(d => d.id === id)
512
-
513
- if (!header) {
514
- if (process.env.NODE_ENV !== 'production') {
515
- console.warn(`Could not find header with id: ${id}`)
516
- }
517
- throw new Error()
518
- }
519
-
520
- return header
521
- },
522
-
523
- getHeaderGroupProps: (id, userProps) => {
524
- const headerGroup = instance.getHeaderGroups().find(d => d.id === id)
525
-
526
- if (!headerGroup) {
527
- return
528
- }
529
-
530
- return propGetter(
531
- {
532
- key: headerGroup.id,
533
- role: 'row',
534
- },
535
- userProps
536
- )
537
- },
538
-
539
- getFooterGroupProps: (id, userProps) => {
540
- const headerGroup = instance.getFooterGroups().find(d => d.id === id)
541
-
542
- if (!headerGroup) {
543
- return
544
- }
545
-
546
- const initialProps = {
547
- key: headerGroup.id,
548
- role: 'row',
549
- }
550
-
551
- return propGetter(initialProps, userProps)
552
- },
553
-
554
- getHeaderProps: (id, userProps) => {
555
- const header = instance.getHeader(id)
556
-
557
- if (!header) {
558
- throw new Error()
559
- }
560
-
561
- const initialProps: HeaderProps = {
562
- key: header.id,
563
- role: 'columnheader',
564
- colSpan: header.colSpan,
565
- rowSpan: header.rowSpan,
566
- }
567
-
568
- return propGetter(initialProps, userProps)
569
- },
570
-
571
- getFooterProps: (id, userProps) => {
572
- const header = instance.getHeader(id)
573
-
574
- const initialProps: FooterProps = {
575
- key: header.id,
576
- role: 'columnfooter',
577
- colSpan: header.colSpan,
578
- rowSpan: header.rowSpan,
579
- }
580
-
581
- return propGetter(initialProps, userProps)
582
- },
583
-
584
- getTotalWidth: () => {
585
- let width = 0
586
-
587
- instance.getVisibleLeafColumns().forEach(column => {
588
- width += column.getWidth() ?? 0
589
- })
590
-
591
- return width
592
- },
593
- }
594
- },
595
- }
596
-
597
- export function buildHeaderGroups<TGenerics extends PartialGenerics>(
598
- allColumns: Column<TGenerics>[],
599
- columnsToGroup: Column<TGenerics>[],
600
- instance: TableInstance<TGenerics>,
601
- headerFamily?: 'center' | 'left' | 'right'
602
- ) {
603
- // Find the max depth of the columns:
604
- // build the leaf column row
605
- // build each buffer row going up
606
- // placeholder for non-existent level
607
- // real column for existing level
608
-
609
- let maxDepth = 0
610
-
611
- const findMaxDepth = (columns: Column<TGenerics>[], depth = 1) => {
612
- maxDepth = Math.max(maxDepth, depth)
613
-
614
- columns
615
- .filter(column => column.getIsVisible())
616
- .forEach(column => {
617
- if (column.columns?.length) {
618
- findMaxDepth(column.columns, depth + 1)
619
- }
620
- }, 0)
621
- }
622
-
623
- findMaxDepth(allColumns)
624
-
625
- let headerGroups: HeaderGroup<TGenerics>[] = []
626
-
627
- const createHeaderGroup = (
628
- headersToGroup: Header<TGenerics>[],
629
- depth: number
630
- ) => {
631
- // The header group we are creating
632
- const headerGroup: HeaderGroup<TGenerics> = {
633
- depth,
634
- id: [headerFamily, `${depth}`].filter(Boolean).join('_'),
635
- headers: [],
636
- getHeaderGroupProps: getterValue =>
637
- instance.getHeaderGroupProps(`${depth}`, getterValue)!,
638
- getFooterGroupProps: getterValue =>
639
- instance.getFooterGroupProps(`${depth}`, getterValue)!,
640
- }
641
-
642
- // The parent columns we're going to scan next
643
- const parentHeaders: Header<TGenerics>[] = []
644
-
645
- // Scan each column for parents
646
- headersToGroup.forEach(headerToGroup => {
647
- // What is the latest (last) parent column?
648
-
649
- const latestParentHeader = [...parentHeaders].reverse()[0]
650
-
651
- const isLeafHeader = headerToGroup.column.depth === headerGroup.depth
652
-
653
- let column: Column<TGenerics>
654
- let isPlaceholder = false
655
-
656
- if (isLeafHeader && headerToGroup.column.parent) {
657
- // The parent header is new
658
- column = headerToGroup.column.parent
659
- } else {
660
- // The parent header is repeated
661
- column = headerToGroup.column
662
- isPlaceholder = true
663
- }
664
-
665
- const header = instance.createHeader(column, {
666
- id: [headerFamily, depth, column.id, headerToGroup?.id]
667
- .filter(Boolean)
668
- .join('_'),
669
- isPlaceholder,
670
- placeholderId: isPlaceholder
671
- ? `${parentHeaders.filter(d => d.column === column).length}`
672
- : undefined,
673
- depth,
674
- })
675
-
676
- if (!latestParentHeader || latestParentHeader.column !== header.column) {
677
- header.subHeaders.push(headerToGroup)
678
- parentHeaders.push(header)
679
- } else {
680
- latestParentHeader.subHeaders.push(headerToGroup)
681
- }
682
-
683
- // if (!headerToGroup.isPlaceholder) {
684
- // headerToGroup.column.header = headerToGroup;
685
- // }
686
-
687
- headerGroup.headers.push(headerToGroup)
688
- })
689
-
690
- headerGroups.push(headerGroup)
691
-
692
- if (depth > 0) {
693
- createHeaderGroup(parentHeaders, depth - 1)
694
- }
695
- }
696
-
697
- const bottomHeaders = columnsToGroup.map(column =>
698
- instance.createHeader(column, {
699
- depth: maxDepth,
700
- })
701
- )
702
-
703
- createHeaderGroup(bottomHeaders, maxDepth - 1)
704
-
705
- headerGroups.reverse()
706
-
707
- // headerGroups = headerGroups.filter(headerGroup => {
708
- // return !headerGroup.headers.every(header => header.isPlaceholder)
709
- // })
710
-
711
- const recurseHeadersForSpans = (headers: Header<TGenerics>[]) => {
712
- const filteredHeaders = headers.filter(header =>
713
- header.column.getIsVisible()
714
- )
715
-
716
- return filteredHeaders.map(header => {
717
- let colSpan = 0
718
- let rowSpan = 0
719
- let childRowSpans = [0]
720
-
721
- if (header.subHeaders && header.subHeaders.length) {
722
- childRowSpans = []
723
-
724
- recurseHeadersForSpans(header.subHeaders).forEach(
725
- ({ colSpan: childColSpan, rowSpan: childRowSpan }) => {
726
- colSpan += childColSpan
727
- childRowSpans.push(childRowSpan)
728
- }
729
- )
730
- } else {
731
- colSpan = 1
732
- }
733
-
734
- const minChildRowSpan = Math.min(...childRowSpans)
735
- rowSpan = rowSpan + minChildRowSpan
736
-
737
- header.colSpan = colSpan > 0 ? colSpan : undefined
738
- header.rowSpan = rowSpan > 0 ? rowSpan : undefined
739
-
740
- return { colSpan, rowSpan }
741
- })
742
- }
743
-
744
- recurseHeadersForSpans(headerGroups[0]?.headers ?? [])
745
-
746
- return headerGroups
747
- }