@tanstack/react-table 8.0.0-alpha.2 → 8.0.0-alpha.22

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