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