@tanstack/react-table 8.0.0-alpha.9 → 8.0.0-beta.0

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
package/src/core.tsx DELETED
@@ -1,763 +0,0 @@
1
- import {
2
- flattenBy,
3
- functionalUpdate,
4
- propGetter,
5
- memo,
6
- flexRender,
7
- RequiredKeys,
8
- } from './utils'
9
-
10
- import {
11
- Updater,
12
- PropGetterValue,
13
- Options,
14
- TableState,
15
- ColumnDef,
16
- Row,
17
- Column,
18
- Cell,
19
- Header,
20
- AccessorFn,
21
- HeaderRenderProps,
22
- TableProps,
23
- TableBodyProps,
24
- PropGetter,
25
- Getter,
26
- RowProps,
27
- CellProps,
28
- TableInstance,
29
- RowValues,
30
- Renderable,
31
- Please_use_the_create_table_column_utilities_to_define_columns,
32
- PartialGenerics,
33
- } from './types'
34
-
35
- import * as Visibility from './features/Visibility'
36
- import * as Ordering from './features/Ordering'
37
- import * as Pinning from './features/Pinning'
38
- import * as Headers from './features/Headers'
39
- import * as Filters from './features/Filters'
40
- import * as Sorting from './features/Sorting'
41
- import * as Grouping from './features/Grouping'
42
- import * as Expanding from './features/Expanding'
43
- import * as ColumnSizing from './features/ColumnSizing'
44
- import * as Pagination from './features/Pagination'
45
- import * as RowSelection from './features/RowSelection'
46
- import { RowModel } from '.'
47
-
48
- const features = [
49
- Visibility,
50
- Ordering,
51
- Pinning,
52
- Headers,
53
- Filters,
54
- Sorting,
55
- Grouping,
56
- Expanding,
57
- ColumnSizing,
58
- Pagination,
59
- RowSelection,
60
- ]
61
-
62
- export type CoreOptions<TGenerics extends PartialGenerics> = {
63
- data: TGenerics['Row'][]
64
- columns: ColumnDef<TGenerics>[]
65
- state: Partial<TableState>
66
- onStateChange: (updater: Updater<TableState>) => void
67
- debugAll?: boolean
68
- debugTable?: boolean
69
- debugHeaders?: boolean
70
- debugColumns?: boolean
71
- debugRows?: boolean
72
- defaultColumn?: Partial<ColumnDef<TGenerics>>
73
- initialState?: Partial<TableState>
74
- getSubRows?: (
75
- originalRow: TGenerics['Row'],
76
- index: number
77
- ) => TGenerics['Row'][]
78
- getRowId?: (
79
- originalRow: TGenerics['Row'],
80
- index: number,
81
- parent?: Row<TGenerics>
82
- ) => string
83
- autoResetAll?: boolean
84
- }
85
-
86
- export type TableCore<TGenerics extends PartialGenerics> = {
87
- initialState: TableState
88
- reset: () => void
89
- options: RequiredKeys<Options<TGenerics>, 'state'>
90
- setOptions: (newOptions: Updater<Options<TGenerics>>) => void
91
- getRowId: (
92
- _: TGenerics['Row'],
93
- index: number,
94
- parent?: Row<TGenerics>
95
- ) => string
96
- getState: () => TableState
97
- setState: (updater: Updater<TableState>) => void
98
- getDefaultColumn: () => Partial<ColumnDef<TGenerics>>
99
- getColumnDefs: () => ColumnDef<TGenerics>[]
100
- createColumn: (
101
- columnDef: ColumnDef<TGenerics>,
102
- depth: number,
103
- parent?: Column<TGenerics>
104
- ) => Column<TGenerics>
105
- getAllColumns: () => Column<TGenerics>[]
106
- getAllFlatColumns: () => Column<TGenerics>[]
107
- getAllFlatColumnsById: () => Record<string, Column<TGenerics>>
108
- getAllLeafColumns: () => Column<TGenerics>[]
109
- getColumn: (columnId: string) => Column<TGenerics>
110
- getColumnWidth: (columnId: string) => number
111
- getTotalWidth: () => number
112
- createCell: (
113
- row: Row<TGenerics>,
114
- column: Column<TGenerics>,
115
- value: any
116
- ) => Cell<TGenerics>
117
- createRow: (
118
- id: string,
119
- original: TGenerics['Row'] | undefined,
120
- rowIndex: number,
121
- depth: number,
122
- values: Record<string, any>
123
- ) => Row<TGenerics>
124
- getCoreRowModel: () => RowModel<TGenerics>
125
- getRowModel: () => RowModel<TGenerics>
126
- getRow: (id: string) => Row<TGenerics>
127
- getCell: (rowId: string, columnId: string) => Cell<TGenerics>
128
- getTableProps: PropGetter<TableProps>
129
- getTableBodyProps: PropGetter<TableBodyProps>
130
- getRowProps: <TGetter extends Getter<RowProps>>(
131
- rowId: string,
132
- userProps?: TGetter
133
- ) => undefined | PropGetterValue<RowProps, TGetter>
134
- getCellProps: <TGetter extends Getter<CellProps>>(
135
- rowId: string,
136
- columnId: string,
137
- userProps?: TGetter
138
- ) => undefined | PropGetterValue<CellProps, TGetter>
139
- getTableWidth: () => number
140
- getLeftTableWidth: () => number
141
- getCenterTableWidth: () => number
142
- getRightTableWidth: () => number
143
- }
144
-
145
- export type CoreRow<TGenerics extends PartialGenerics> = {
146
- id: string
147
- index: number
148
- original?: TGenerics['Row']
149
- depth: number
150
- values: RowValues
151
- leafRows: Row<TGenerics>[]
152
- subRows: Row<TGenerics>[]
153
- getRowProps: PropGetter<RowProps>
154
- originalSubRows?: TGenerics['Row'][]
155
- getAllCells: () => Cell<TGenerics>[]
156
- getAllCellsByColumnId: () => Record<string, Cell<TGenerics>>
157
- }
158
-
159
- export type CoreColumnDef<TGenerics extends PartialGenerics> = {
160
- id: string
161
- accessorKey?: string & keyof TGenerics['Row']
162
- accessorFn?: AccessorFn<TGenerics['Row']>
163
- header?:
164
- | string
165
- | Renderable<{
166
- instance: TableInstance<TGenerics>
167
- header: Header<TGenerics>
168
- column: Column<TGenerics>
169
- }>
170
- width?: number
171
- minWidth?: number
172
- maxWidth?: number
173
- columns?: ColumnDef<TGenerics>[]
174
- footer?: Renderable<{
175
- instance: TableInstance<TGenerics>
176
- header: Header<TGenerics>
177
- column: Column<TGenerics>
178
- }>
179
- cell?: Renderable<{
180
- instance: TableInstance<TGenerics>
181
- row: Row<TGenerics>
182
- column: Column<TGenerics>
183
- cell: Cell<TGenerics>
184
- value: TGenerics['Value']
185
- }>
186
- defaultIsVisible?: boolean
187
- [Please_use_the_create_table_column_utilities_to_define_columns]: true
188
- }
189
-
190
- export type CoreColumn<TGenerics extends PartialGenerics> = {
191
- id: string
192
- depth: number
193
- accessorFn?: AccessorFn<TGenerics['Row']>
194
- columnDef: ColumnDef<TGenerics>
195
- getWidth: () => number
196
- columns: Column<TGenerics>[]
197
- parent?: Column<TGenerics>
198
- getFlatColumns: () => Column<TGenerics>[]
199
- getLeafColumns: () => Column<TGenerics>[]
200
- }
201
-
202
- export function createTableInstance<TGenerics extends PartialGenerics>(
203
- options: Options<TGenerics>
204
- ): TableInstance<TGenerics> {
205
- if (options.debugAll || options.debugTable) {
206
- console.info('Creating React Table Instance...')
207
- }
208
-
209
- let instance = {} as TableInstance<TGenerics>
210
-
211
- let listeners: (() => void)[] = []
212
-
213
- const defaultOptions = features.reduce((obj, feature) => {
214
- return Object.assign(obj, (feature as any).getDefaultOptions?.(instance))
215
- }, {})
216
-
217
- const buildOptions = (options: Options<TGenerics>) => ({
218
- ...defaultOptions,
219
- ...options,
220
- })
221
-
222
- instance.options = buildOptions(options)
223
-
224
- const initialState = {
225
- ...features.reduce((obj, feature) => {
226
- return Object.assign(obj, (feature as any).getInitialState?.())
227
- }, {}),
228
- ...(options.initialState ?? {}),
229
- } as TableState
230
-
231
- const finalInstance: TableInstance<TGenerics> = {
232
- ...instance,
233
- ...features.reduce((obj, feature) => {
234
- return Object.assign(obj, (feature as any).getInstance?.(instance))
235
- }, {}),
236
- initialState,
237
- reset: () => {
238
- instance.setState(instance.initialState)
239
- },
240
- setOptions: updater => {
241
- instance.options = buildOptions(
242
- functionalUpdate(updater, instance.options)
243
- )
244
- },
245
-
246
- getRowId: (_: TGenerics['Row'], index: number, parent?: Row<TGenerics>) =>
247
- `${parent ? [parent.id, index].join('.') : index}`,
248
-
249
- getState: () => {
250
- return instance.options.state as TableState
251
- },
252
-
253
- setState: (updater: Updater<TableState>) => {
254
- instance.options.onStateChange?.(updater)
255
- },
256
-
257
- getDefaultColumn: memo(
258
- () => [instance.options.defaultColumn],
259
- defaultColumn => {
260
- defaultColumn = (defaultColumn ?? {}) as Partial<ColumnDef<TGenerics>>
261
-
262
- return {
263
- header: (props: HeaderRenderProps<Header<TGenerics>>) =>
264
- props.header.column.id,
265
- footer: (props: HeaderRenderProps<Header<TGenerics>>) =>
266
- props.header.column.id,
267
- cell: ({ value = '' }: { value: any }): JSX.Element =>
268
- typeof value === 'boolean' ? value.toString() : value,
269
- ...features.reduce((obj, feature) => {
270
- return Object.assign(obj, (feature as any).getDefaultColumn?.())
271
- }, {}),
272
- ...defaultColumn,
273
- } as Partial<ColumnDef<TGenerics>>
274
- },
275
- {
276
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
277
- key: 'getDefaultColumn',
278
- }
279
- ),
280
-
281
- getColumnDefs: () => instance.options.columns,
282
-
283
- createColumn: (columnDef, depth: number, parent) => {
284
- const defaultColumn = instance.getDefaultColumn()
285
-
286
- let id =
287
- columnDef.id ??
288
- columnDef.accessorKey ??
289
- (typeof columnDef.header === 'string' ? columnDef.header : undefined)
290
-
291
- let accessorFn: AccessorFn<TGenerics['Row']> | undefined
292
-
293
- if (columnDef.accessorFn) {
294
- accessorFn = columnDef.accessorFn
295
- } else if (columnDef.accessorKey) {
296
- accessorFn = (originalRow?: TGenerics['Row']) =>
297
- (originalRow as any)[columnDef.accessorKey]
298
- }
299
-
300
- if (!id) {
301
- if (process.env.NODE_ENV !== 'production') {
302
- throw new Error(
303
- columnDef.accessorFn
304
- ? `Columns require an id when using an accessorFn`
305
- : `Columns require an id when using a non-string header`
306
- )
307
- }
308
- throw new Error()
309
- }
310
-
311
- let column: CoreColumn<TGenerics> = {
312
- ...ColumnSizing.defaultColumnSizing,
313
- ...defaultColumn,
314
- ...columnDef,
315
- id: `${id}`,
316
- accessorFn,
317
- parent: parent as any,
318
- depth,
319
- columnDef,
320
- columns: [],
321
- getWidth: () => instance.getColumnWidth(column.id),
322
- getFlatColumns: memo(
323
- () => [true],
324
- () => {
325
- return [
326
- column as Column<TGenerics>,
327
- ...column.columns?.flatMap(d => d.getFlatColumns()),
328
- ]
329
- },
330
- {
331
- key: 'column.getFlatColumns',
332
- debug: () =>
333
- instance.options.debugAll ?? instance.options.debugColumns,
334
- }
335
- ),
336
- getLeafColumns: memo(
337
- () => [instance.getOrderColumnsFn()],
338
- orderColumns => {
339
- if (column.columns?.length) {
340
- let leafColumns = column.columns.flatMap(column =>
341
- column.getLeafColumns()
342
- )
343
-
344
- return orderColumns(leafColumns)
345
- }
346
-
347
- return [column as Column<TGenerics>]
348
- },
349
- {
350
- key: 'column.getLeafColumns',
351
- debug: () =>
352
- instance.options.debugAll ?? instance.options.debugColumns,
353
- }
354
- ),
355
- }
356
-
357
- column = features.reduce((obj, feature) => {
358
- return Object.assign(
359
- obj,
360
- (feature as any).createColumn?.(column, instance)
361
- )
362
- }, column)
363
-
364
- // Yes, we have to convert instance to uknown, because we know more than the compiler here.
365
- return column as Column<TGenerics>
366
- },
367
-
368
- getAllColumns: memo(
369
- () => [instance.getColumnDefs()],
370
- columnDefs => {
371
- const recurseColumns = (
372
- columnDefs: ColumnDef<TGenerics>[],
373
- parent?: Column<TGenerics>,
374
- depth = 0
375
- ): Column<TGenerics>[] => {
376
- return columnDefs.map(columnDef => {
377
- const column = instance.createColumn(columnDef, depth, parent)
378
-
379
- column.columns = columnDef.columns
380
- ? recurseColumns(columnDef.columns, column, depth + 1)
381
- : []
382
-
383
- return column
384
- })
385
- }
386
-
387
- return recurseColumns(columnDefs)
388
- },
389
- {
390
- key: 'getAllColumns',
391
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
392
- }
393
- ),
394
-
395
- getAllFlatColumns: memo(
396
- () => [instance.getAllColumns()],
397
- allColumns => {
398
- return allColumns.flatMap(column => {
399
- return column.getFlatColumns()
400
- })
401
- },
402
- {
403
- key: 'getAllFlatColumns',
404
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
405
- }
406
- ),
407
-
408
- getAllFlatColumnsById: memo(
409
- () => [instance.getAllFlatColumns()],
410
- flatColumns => {
411
- return flatColumns.reduce((acc, column) => {
412
- acc[column.id] = column
413
- return acc
414
- }, {} as Record<string, Column<TGenerics>>)
415
- },
416
- {
417
- key: 'getAllFlatColumnsById',
418
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
419
- }
420
- ),
421
-
422
- getAllLeafColumns: memo(
423
- () => [instance.getAllColumns(), instance.getOrderColumnsFn()],
424
- (allColumns, orderColumns) => {
425
- let leafColumns = allColumns.flatMap(column => column.getLeafColumns())
426
- return orderColumns(leafColumns)
427
- },
428
- {
429
- key: 'getAllLeafColumns',
430
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
431
- }
432
- ),
433
-
434
- getColumn: columnId => {
435
- const column = instance.getAllFlatColumnsById()[columnId]
436
-
437
- if (!column) {
438
- if (process.env.NODE_ENV !== 'production') {
439
- console.warn(
440
- `[React Table] Column with id ${columnId} does not exist.`
441
- )
442
- }
443
- throw new Error()
444
- }
445
-
446
- return column
447
- },
448
-
449
- getColumnWidth: (columnId: string) => {
450
- const column = instance.getColumn(columnId)
451
-
452
- if (!column) {
453
- throw new Error()
454
- }
455
-
456
- const columnSize = instance.getState().columnSizing[column.id]
457
-
458
- return Math.min(
459
- Math.max(
460
- column.minWidth ?? ColumnSizing.defaultColumnSizing.minWidth,
461
- columnSize ?? column.width ?? ColumnSizing.defaultColumnSizing.width
462
- ),
463
- column.maxWidth ?? ColumnSizing.defaultColumnSizing.maxWidth
464
- )
465
- },
466
-
467
- createCell: (row, column, value) => {
468
- const cell: Cell<TGenerics> = {
469
- id: `${row.id}_${column.id}`,
470
- rowId: row.id,
471
- columnId: column.id,
472
- row,
473
- column,
474
- value,
475
- getCellProps: userProps =>
476
- instance.getCellProps(row.id, column.id, userProps)!,
477
- renderCell: () =>
478
- flexRender(column.cell, { instance, column, row, cell, value }),
479
- }
480
-
481
- features.forEach(feature => {
482
- Object.assign(
483
- cell,
484
- (feature as any).createCell?.(
485
- cell as Cell<TGenerics> & Grouping.GroupingCell,
486
- column,
487
- row as Row<TGenerics>,
488
- instance
489
- )
490
- )
491
- }, {})
492
-
493
- return cell
494
- },
495
-
496
- createRow: (id, original, rowIndex, depth, values) => {
497
- let row: CoreRow<TGenerics> = {
498
- id,
499
- index: rowIndex,
500
- original,
501
- depth,
502
- values,
503
- subRows: [],
504
- leafRows: [],
505
- getRowProps: userProps => instance.getRowProps(row.id, userProps)!,
506
- getAllCells: undefined!,
507
- getAllCellsByColumnId: undefined!,
508
- }
509
-
510
- row.getAllCells = memo(
511
- () => [instance.getAllLeafColumns()],
512
- leafColumns => {
513
- return leafColumns.map(column => {
514
- return instance.createCell(
515
- row as Row<TGenerics>,
516
- column,
517
- row.values[column.id]
518
- )
519
- })
520
- },
521
- {
522
- key: process.env.NODE_ENV !== 'production' ? 'row.getAllCells' : '',
523
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
524
- }
525
- )
526
-
527
- row.getAllCellsByColumnId = memo(
528
- () => [row.getAllCells()],
529
- allCells => {
530
- return allCells.reduce((acc, cell) => {
531
- acc[cell.columnId] = cell
532
- return acc
533
- }, {} as Record<string, Cell<TGenerics>>)
534
- },
535
- {
536
- key: 'row.getAllCellsByColumnId',
537
- debug: () => instance.options.debugAll ?? instance.options.debugRows,
538
- }
539
- )
540
-
541
- for (let i = 0; i < features.length; i++) {
542
- const feature = features[i]
543
- Object.assign(row, (feature as any).createRow?.(row, instance))
544
- }
545
-
546
- return row as Row<TGenerics>
547
- },
548
-
549
- getCoreRowModel: memo(
550
- () => [instance.options.data],
551
- (
552
- data
553
- ): {
554
- rows: Row<TGenerics>[]
555
- flatRows: Row<TGenerics>[]
556
- rowsById: Record<string, Row<TGenerics>>
557
- } => {
558
- // Access the row model using initial columns
559
- const rows: Row<TGenerics>[] = []
560
- const flatRows: Row<TGenerics>[] = []
561
- const rowsById: Record<string, Row<TGenerics>> = {}
562
-
563
- const leafColumns = instance.getAllLeafColumns()
564
-
565
- const accessRow = (
566
- originalRow: TGenerics['Row'],
567
- rowIndex: number,
568
- depth = 0,
569
- parentRows: Row<TGenerics>[],
570
- parent?: Row<TGenerics>
571
- ) => {
572
- const id = instance.getRowId(originalRow, rowIndex, parent)
573
-
574
- if (!id) {
575
- if (process.env.NODE_ENV !== 'production') {
576
- throw new Error(`getRowId expected an ID, but got ${id}`)
577
- }
578
- }
579
-
580
- const values: Record<string, any> = {}
581
-
582
- for (let i = 0; i < leafColumns.length; i++) {
583
- const column = leafColumns[i]
584
- if (column && column.accessorFn) {
585
- values[column.id] = column.accessorFn(originalRow, rowIndex)
586
- }
587
- }
588
-
589
- // Make the row
590
- const row = instance.createRow(
591
- id,
592
- originalRow,
593
- rowIndex,
594
- depth,
595
- values
596
- )
597
-
598
- // Push instance row into the parentRows array
599
- parentRows.push(row)
600
- // Keep track of every row in a flat array
601
- flatRows.push(row)
602
- // Also keep track of every row by its ID
603
- rowsById[id] = row
604
-
605
- // Get the original subrows
606
- if (instance.options.getSubRows) {
607
- const originalSubRows = instance.options.getSubRows(
608
- originalRow,
609
- rowIndex
610
- )
611
-
612
- // Then recursively access them
613
- if (originalSubRows?.length) {
614
- row.originalSubRows = originalSubRows
615
- const subRows: Row<TGenerics>[] = []
616
-
617
- for (let i = 0; i < row.originalSubRows.length; i++) {
618
- accessRow(
619
- row.originalSubRows[i] as TGenerics['Row'],
620
- i,
621
- depth + 1,
622
- subRows,
623
- row
624
- )
625
- }
626
- // Keep the new subRows array on the row
627
- row.subRows = subRows
628
- row.leafRows = flattenBy(subRows, d => d.leafRows)
629
- }
630
- }
631
- }
632
-
633
- for (let i = 0; i < data.length; i++) {
634
- accessRow(data[i] as TGenerics['Row'], i, 0, rows)
635
- }
636
-
637
- return { rows, flatRows, rowsById }
638
- },
639
- {
640
- key: 'getRowModel',
641
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
642
- onChange: () => {
643
- instance._notifyRowSelectionReset()
644
- instance._notifyFiltersReset()
645
- },
646
- }
647
- ),
648
-
649
- // The final calls start at the bottom of the model,
650
- // expanded rows, which then work their way up
651
-
652
- getRowModel: () => {
653
- return instance.getPaginationRowModel()
654
- },
655
-
656
- getRow: (id: string) => {
657
- const row = instance.getRowModel().rowsById[id]
658
-
659
- if (!row) {
660
- if (process.env.NODE_ENV !== 'production') {
661
- throw new Error(`getRow expected an ID, but got ${id}`)
662
- }
663
- throw new Error()
664
- }
665
-
666
- return row
667
- },
668
-
669
- getCell: (rowId: string, columnId: string) => {
670
- const row = instance.getRow(rowId)
671
-
672
- if (!row) {
673
- if (process.env.NODE_ENV !== 'production') {
674
- throw new Error(`[React Table] could not find row with id ${rowId}`)
675
- }
676
- throw new Error()
677
- }
678
-
679
- const cell = row.getAllCellsByColumnId()[columnId]
680
-
681
- if (!cell) {
682
- if (process.env.NODE_ENV !== 'production') {
683
- throw new Error(
684
- `[React Table] could not find cell ${columnId} in row ${rowId}`
685
- )
686
- }
687
- throw new Error()
688
- }
689
-
690
- return cell
691
- },
692
-
693
- getTableProps: userProps => {
694
- return propGetter(
695
- {
696
- role: 'table',
697
- },
698
- userProps
699
- )
700
- },
701
-
702
- getTableBodyProps: userProps => {
703
- return propGetter(
704
- {
705
- role: 'rowgroup',
706
- },
707
- userProps
708
- )
709
- },
710
-
711
- getRowProps: (rowId, userProps) => {
712
- const row = instance.getRow(rowId)
713
- if (!row) {
714
- return
715
- }
716
-
717
- return propGetter(
718
- {
719
- key: row.id,
720
- role: 'row',
721
- },
722
- userProps
723
- )
724
- },
725
-
726
- getCellProps: (rowId, columnId, userProps) => {
727
- const cell = instance.getCell(rowId, columnId)
728
-
729
- if (!cell) {
730
- return
731
- }
732
-
733
- return propGetter(
734
- {
735
- key: cell.id,
736
- role: 'gridcell',
737
- },
738
- userProps
739
- )
740
- },
741
-
742
- getTableWidth: () =>
743
- instance.getHeaderGroups()[0]?.headers.reduce((sum, header) => {
744
- return sum + header.getWidth()
745
- }, 0) ?? 0,
746
- getLeftTableWidth: () =>
747
- instance.getLeftHeaderGroups()[0]?.headers.reduce((sum, header) => {
748
- return sum + header.getWidth()
749
- }, 0) ?? 0,
750
- getCenterTableWidth: () =>
751
- instance.getCenterHeaderGroups()[0]?.headers.reduce((sum, header) => {
752
- return sum + header.getWidth()
753
- }, 0) ?? 0,
754
- getRightTableWidth: () =>
755
- instance.getRightHeaderGroups()[0]?.headers.reduce((sum, header) => {
756
- return sum + header.getWidth()
757
- }, 0) ?? 0,
758
- }
759
-
760
- instance = Object.assign(instance, finalInstance)
761
-
762
- return instance
763
- }