@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
@@ -1,651 +0,0 @@
1
- import React, { MouseEvent, TouchEvent } from 'react'
2
- import {
3
- Getter,
4
- OnChangeFn,
5
- PartialGenerics,
6
- PropGetterValue,
7
- TableInstance,
8
- Row,
9
- RowModel,
10
- Updater,
11
- } from '../types'
12
- import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
13
-
14
- export type RowSelectionState = Record<string, boolean>
15
-
16
- export type RowSelectionTableState = {
17
- rowSelection: RowSelectionState
18
- }
19
-
20
- export type RowSelectionOptions<TGenerics extends PartialGenerics> = {
21
- onRowSelectionChange?: OnChangeFn<RowSelectionState>
22
- autoResetRowSelection?: boolean
23
- enableRowSelection?: boolean | ((row: Row<TGenerics>) => boolean)
24
- enableMultiRowSelection?: boolean | ((row: Row<TGenerics>) => boolean)
25
- enableSubRowSelection?: boolean | ((row: Row<TGenerics>) => boolean)
26
- // enableGroupingRowSelection?:
27
- // | boolean
28
- // | ((
29
- // row: Row<TGenerics>
30
- // ) => boolean)
31
- // isAdditiveSelectEvent?: (e: MouseEvent | TouchEvent) => boolean
32
- // isInclusiveSelectEvent?: (e: MouseEvent | TouchEvent) => boolean
33
- // selectRowsFn?: (
34
- // instance: TableInstance<
35
- // TData,
36
- // TValue,
37
- // TFilterFns,
38
- // TSortingFns,
39
- // TAggregationFns
40
- // >,
41
- // rowModel: RowModel<TGenerics>
42
- // ) => RowModel<TGenerics>
43
- }
44
-
45
- type ToggleRowSelectedProps = {
46
- onChange?: (e: MouseEvent | TouchEvent) => void
47
- checked?: boolean
48
- title?: string
49
- indeterminate?: boolean
50
- }
51
-
52
- export type RowSelectionRow = {
53
- getIsSelected: () => boolean
54
- getIsSomeSelected: () => boolean
55
- getCanSelect: () => boolean
56
- getCanMultiSelect: () => boolean
57
- toggleSelected: (value?: boolean) => void
58
- getToggleSelectedProps: <TGetter extends Getter<ToggleRowSelectedProps>>(
59
- userProps?: TGetter
60
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
61
- }
62
-
63
- export type RowSelectionInstance<TGenerics extends PartialGenerics> = {
64
- _notifyRowSelectionReset: () => void
65
- getToggleRowSelectedProps: <TGetter extends Getter<ToggleRowSelectedProps>>(
66
- rowId: string,
67
- userProps?: TGetter
68
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
69
- getToggleAllRowsSelectedProps: <
70
- TGetter extends Getter<ToggleRowSelectedProps>
71
- >(
72
- userProps?: TGetter
73
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
74
- getToggleAllPageRowsSelectedProps: <
75
- TGetter extends Getter<ToggleRowSelectedProps>
76
- >(
77
- userProps?: TGetter
78
- ) => undefined | PropGetterValue<ToggleRowSelectedProps, TGetter>
79
- setRowSelection: (updater: Updater<RowSelectionState>) => void
80
- resetRowSelection: () => void
81
- toggleRowSelected: (rowId: string, value?: boolean) => void
82
- getRowCanSelect: (rowId: string) => boolean
83
- getRowCanSelectSubRows: (rowId: string) => boolean
84
- getRowCanMultiSelect: (rowId: string) => boolean
85
- // getGroupingRowCanSelect: (rowId: string) => boolean
86
- getRowIsSelected: (rowId: string) => boolean
87
- getRowIsSomeSelected: (rowId: string) => boolean
88
- getIsAllRowsSelected: () => boolean
89
- getIsAllPageRowsSelected: () => boolean
90
- getIsSomeRowsSelected: () => boolean
91
- getIsSomePageRowsSelected: () => boolean
92
- toggleAllRowsSelected: (value: boolean) => void
93
- toggleAllPageRowsSelected: (value: boolean) => void
94
- getPreSelectedRowModel: () => RowModel<TGenerics>
95
- getSelectedRowModel: () => RowModel<TGenerics>
96
- getFilteredSelectedRowModel: () => RowModel<TGenerics>
97
- getGroupedSelectedRowModel: () => RowModel<TGenerics>
98
- }
99
-
100
- //
101
-
102
- export function getInitialState(): RowSelectionTableState {
103
- return {
104
- rowSelection: {},
105
- }
106
- }
107
-
108
- export function getDefaultOptions<TGenerics extends PartialGenerics>(
109
- instance: TableInstance<TGenerics>
110
- ): RowSelectionOptions<TGenerics> {
111
- return {
112
- onRowSelectionChange: makeStateUpdater('rowSelection', instance),
113
- autoResetRowSelection: true,
114
- enableRowSelection: true,
115
- enableMultiRowSelection: true,
116
- enableSubRowSelection: true,
117
- // enableGroupingRowSelection: false,
118
- // isAdditiveSelectEvent: (e: MouseEvent | TouchEvent) => !!e.metaKey,
119
- // isInclusiveSelectEvent: (e: MouseEvent | TouchEvent) => !!e.shiftKey,
120
- }
121
- }
122
-
123
- export function getInstance<TGenerics extends PartialGenerics>(
124
- instance: TableInstance<TGenerics>
125
- ): RowSelectionInstance<TGenerics> {
126
- let registered = false
127
-
128
- // const pageRows = instance.getPageRows()
129
-
130
- return {
131
- _notifyRowSelectionReset: () => {
132
- if (!registered) {
133
- registered = true
134
- return
135
- }
136
-
137
- if (instance.options.autoResetAll === false) {
138
- return
139
- }
140
-
141
- if (
142
- instance.options.autoResetAll === true ||
143
- instance.options.autoResetRowSelection
144
- ) {
145
- instance.resetRowSelection()
146
- }
147
- },
148
- setRowSelection: updater =>
149
- instance.options.onRowSelectionChange?.(
150
- updater,
151
- functionalUpdate(updater, instance.getState().rowSelection)
152
- ),
153
- resetRowSelection: () =>
154
- instance.setRowSelection(getInitialState().rowSelection ?? {}),
155
- toggleAllRowsSelected: value => {
156
- instance.setRowSelection(old => {
157
- value =
158
- typeof value !== 'undefined'
159
- ? value
160
- : !instance.getIsAllRowsSelected()
161
-
162
- // Only remove/add the rows that are visible on the screen
163
- // Leave all the other rows that are selected alone.
164
- const rowSelection = Object.assign({}, old)
165
-
166
- const preGroupedFlatRows = instance.getPreGroupedRowModel().flatRows
167
-
168
- // We don't use `mutateRowIsSelected` here for performance reasons.
169
- // All of the rows are flat already, so it wouldn't be worth it
170
- if (value) {
171
- preGroupedFlatRows.forEach(row => {
172
- rowSelection[row.id] = true
173
- })
174
- } else {
175
- preGroupedFlatRows.forEach(row => {
176
- delete rowSelection[row.id]
177
- })
178
- }
179
-
180
- return rowSelection
181
- })
182
- },
183
- toggleAllPageRowsSelected: value =>
184
- instance.setRowSelection(old => {
185
- const selectAll =
186
- typeof value !== 'undefined'
187
- ? value
188
- : !instance.getIsAllPageRowsSelected()
189
-
190
- const rowSelection: RowSelectionState = { ...old }
191
-
192
- instance.getRowModel().rows.forEach(row => {
193
- mutateRowIsSelected(rowSelection, row.id, value, instance)
194
- })
195
-
196
- return rowSelection
197
- }),
198
- toggleRowSelected: (rowId, value) => {
199
- const row = instance.getRow(rowId)
200
- const isSelected = row.getIsSelected()
201
-
202
- instance.setRowSelection(old => {
203
- value = typeof value !== 'undefined' ? value : !isSelected
204
-
205
- if (isSelected === value) {
206
- return old
207
- }
208
-
209
- const selectedRowIds = { ...old }
210
-
211
- mutateRowIsSelected(selectedRowIds, rowId, value, instance)
212
-
213
- return selectedRowIds
214
- })
215
- },
216
- // addRowSelectionRange: rowId => {
217
- // const {
218
- // rows,
219
- // rowsById,
220
- // options: { selectGroupingRows, selectSubRows },
221
- // } = instance
222
-
223
- // const findSelectedRow = (rows: Row[]) => {
224
- // let found
225
- // rows.find(d => {
226
- // if (d.getIsSelected()) {
227
- // found = d
228
- // return true
229
- // }
230
- // const subFound = findSelectedRow(d.subRows || [])
231
- // if (subFound) {
232
- // found = subFound
233
- // return true
234
- // }
235
- // return false
236
- // })
237
- // return found
238
- // }
239
-
240
- // const firstRow = findSelectedRow(rows) || rows[0]
241
- // const lastRow = rowsById[rowId]
242
-
243
- // let include = false
244
- // const selectedRowIds = {}
245
-
246
- // const addRow = (row: Row) => {
247
- // mutateRowIsSelected(selectedRowIds, row.id, true, {
248
- // rowsById,
249
- // selectGroupingRows: selectGroupingRows!,
250
- // selectSubRows: selectSubRows!,
251
- // })
252
- // }
253
-
254
- // instance.rows.forEach(row => {
255
- // const isFirstRow = row.id === firstRow.id
256
- // const isLastRow = row.id === lastRow.id
257
-
258
- // if (isFirstRow || isLastRow) {
259
- // if (!include) {
260
- // include = true
261
- // } else if (include) {
262
- // addRow(row)
263
- // include = false
264
- // }
265
- // }
266
-
267
- // if (include) {
268
- // addRow(row)
269
- // }
270
- // })
271
-
272
- // instance.setRowSelection(selectedRowIds)
273
- // },
274
- getPreSelectedRowModel: () => instance.getCoreRowModel(),
275
- getSelectedRowModel: memo(
276
- () => [instance.getState().rowSelection, instance.getCoreRowModel()],
277
- (rowSelection, rowModel) => {
278
- if (!Object.keys(rowSelection).length) {
279
- return {
280
- rows: [],
281
- flatRows: [],
282
- rowsById: {},
283
- }
284
- }
285
-
286
- return selectRowsFn(instance, rowModel)
287
- },
288
- {
289
- key: 'getSelectedRowModel',
290
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
291
- onChange: () => instance._notifyExpandedReset(),
292
- }
293
- ),
294
-
295
- getFilteredSelectedRowModel: memo(
296
- () => [
297
- instance.getState().rowSelection,
298
- instance.getGlobalFilteredRowModel(),
299
- ],
300
- (rowSelection, rowModel) => {
301
- if (!Object.keys(rowSelection).length) {
302
- return {
303
- rows: [],
304
- flatRows: [],
305
- rowsById: {},
306
- }
307
- }
308
-
309
- return selectRowsFn(instance, rowModel)
310
- },
311
- {
312
- key: 'getFilteredSelectedRowModel',
313
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
314
- onChange: () => instance._notifyExpandedReset(),
315
- }
316
- ),
317
-
318
- getGroupedSelectedRowModel: memo(
319
- () => [instance.getState().rowSelection, instance.getGroupedRowModel()],
320
- (rowSelection, rowModel) => {
321
- if (!Object.keys(rowSelection).length) {
322
- return {
323
- rows: [],
324
- flatRows: [],
325
- rowsById: {},
326
- }
327
- }
328
-
329
- return selectRowsFn(instance, rowModel)
330
- },
331
- {
332
- key: 'getGroupedSelectedRowModel',
333
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
334
- onChange: () => instance._notifyExpandedReset(),
335
- }
336
- ),
337
-
338
- ///
339
-
340
- getRowIsSelected: rowId => {
341
- const { rowSelection } = instance.getState()
342
- const row = instance.getRow(rowId)
343
-
344
- if (!row) {
345
- throw new Error()
346
- }
347
-
348
- return isRowSelected(row, rowSelection, instance) === true
349
- },
350
-
351
- getRowIsSomeSelected: rowId => {
352
- const { rowSelection } = instance.getState()
353
- const row = instance.getRow(rowId)
354
-
355
- if (!row) {
356
- throw new Error()
357
- }
358
-
359
- return isRowSelected(row, rowSelection, instance) === 'some'
360
- },
361
-
362
- getRowCanSelect: rowId => {
363
- const row = instance.getRow(rowId)
364
-
365
- if (!row) {
366
- throw new Error()
367
- }
368
-
369
- if (typeof instance.options.enableRowSelection === 'function') {
370
- return instance.options.enableRowSelection(row)
371
- }
372
-
373
- return instance.options.enableRowSelection ?? true
374
- },
375
-
376
- getRowCanSelectSubRows: rowId => {
377
- const row = instance.getRow(rowId)
378
-
379
- if (!row) {
380
- throw new Error()
381
- }
382
-
383
- if (typeof instance.options.enableSubRowSelection === 'function') {
384
- return instance.options.enableSubRowSelection(row)
385
- }
386
-
387
- return instance.options.enableSubRowSelection ?? true
388
- },
389
-
390
- getRowCanMultiSelect: rowId => {
391
- const row = instance.getRow(rowId)
392
-
393
- if (!row) {
394
- throw new Error()
395
- }
396
-
397
- if (typeof instance.options.enableMultiRowSelection === 'function') {
398
- return instance.options.enableMultiRowSelection(row)
399
- }
400
-
401
- return instance.options.enableMultiRowSelection ?? true
402
- },
403
-
404
- // getGroupingRowCanSelect: rowId => {
405
- // const row = instance.getRow(rowId)
406
-
407
- // if (!row) {
408
- // throw new Error()
409
- // }
410
-
411
- // if (typeof instance.options.enableGroupingRowSelection === 'function') {
412
- // return instance.options.enableGroupingRowSelection(row)
413
- // }
414
-
415
- // return instance.options.enableGroupingRowSelection ?? false
416
- // },
417
-
418
- getIsAllRowsSelected: () => {
419
- const preFilteredFlatRows =
420
- instance.getPreGlobalFilteredRowModel().flatRows
421
- const { rowSelection } = instance.getState()
422
-
423
- let isAllRowsSelected = Boolean(
424
- preFilteredFlatRows.length && Object.keys(rowSelection).length
425
- )
426
-
427
- if (isAllRowsSelected) {
428
- if (preFilteredFlatRows.some(row => !rowSelection[row.id])) {
429
- isAllRowsSelected = false
430
- }
431
- }
432
-
433
- return isAllRowsSelected
434
- },
435
-
436
- getIsAllPageRowsSelected: () => {
437
- const paginationFlatRows = instance.getPaginationRowModel().flatRows
438
- const { rowSelection } = instance.getState()
439
-
440
- let isAllPageRowsSelected = !!paginationFlatRows.length
441
-
442
- if (
443
- isAllPageRowsSelected &&
444
- paginationFlatRows.some(row => !rowSelection[row.id])
445
- ) {
446
- isAllPageRowsSelected = false
447
- }
448
-
449
- return isAllPageRowsSelected
450
- },
451
-
452
- getIsSomeRowsSelected: () => {
453
- return (
454
- !instance.getIsAllRowsSelected() &&
455
- !!Object.keys(instance.getState().rowSelection ?? {}).length
456
- )
457
- },
458
-
459
- getIsSomePageRowsSelected: () => {
460
- const paginationFlatRows = instance.getPaginationRowModel().flatRows
461
- return instance.getIsAllPageRowsSelected()
462
- ? false
463
- : !!paginationFlatRows?.length
464
- },
465
-
466
- getToggleRowSelectedProps: (rowId, userProps) => {
467
- const row = instance.getRow(rowId)
468
-
469
- const isSelected = row.getIsSelected()
470
- const isSomeSelected = row.getIsSomeSelected()
471
- const canSelect = row.getCanSelect()
472
-
473
- const initialProps: ToggleRowSelectedProps = {
474
- onChange: canSelect
475
- ? (e: MouseEvent | TouchEvent) => {
476
- row.toggleSelected((e.target as HTMLInputElement).checked)
477
- }
478
- : undefined,
479
- checked: isSelected,
480
- title: 'Toggle Row Selected',
481
- indeterminate: isSomeSelected,
482
- // onChange: forInput
483
- // ? (e: Event) => e.stopPropagation()
484
- // : (e: Event) => {
485
- // if (instance.options.isAdditiveSelectEvent(e)) {
486
- // row.toggleSelected()
487
- // } else if (instance.options.isInclusiveSelectEvent(e)) {
488
- // instance.addRowSelectionRange(row.id)
489
- // } else {
490
- // instance.setRowSelection({})
491
- // row.toggleSelected()
492
- // }
493
-
494
- // if (props.onClick) props.onClick(e)
495
- // },
496
- }
497
-
498
- return propGetter(initialProps, userProps)
499
- },
500
-
501
- getToggleAllRowsSelectedProps: userProps => {
502
- const isSomeRowsSelected = instance.getIsSomeRowsSelected()
503
- const isAllRowsSelected = instance.getIsAllRowsSelected()
504
-
505
- const initialProps: ToggleRowSelectedProps = {
506
- onChange: (e: MouseEvent | TouchEvent) => {
507
- instance.toggleAllRowsSelected((e.target as HTMLInputElement).checked)
508
- },
509
- checked: isAllRowsSelected,
510
- title: 'Toggle All Rows Selected',
511
- indeterminate: isSomeRowsSelected,
512
- }
513
-
514
- return propGetter(initialProps, userProps)
515
- },
516
-
517
- getToggleAllPageRowsSelectedProps: userProps => {
518
- const isSomePageRowsSelected = instance.getIsSomePageRowsSelected()
519
- const isAllPageRowsSelected = instance.getIsAllPageRowsSelected()
520
-
521
- const initialProps: ToggleRowSelectedProps = {
522
- onChange: (e: MouseEvent | TouchEvent) => {
523
- instance.toggleAllPageRowsSelected(
524
- (e.target as HTMLInputElement).checked
525
- )
526
- },
527
- checked: isAllPageRowsSelected,
528
- title: 'Toggle All Current Page Rows Selected',
529
- indeterminate: isSomePageRowsSelected,
530
- }
531
-
532
- return propGetter(initialProps, userProps)
533
- },
534
- }
535
- }
536
-
537
- export function createRow<TGenerics extends PartialGenerics>(
538
- row: Row<TGenerics>,
539
- instance: TableInstance<TGenerics>
540
- ): RowSelectionRow {
541
- return {
542
- getIsSelected: () => instance.getRowIsSelected(row.id),
543
- getIsSomeSelected: () => instance.getRowIsSomeSelected(row.id),
544
- toggleSelected: value => instance.toggleRowSelected(row.id, value),
545
- getToggleSelectedProps: userProps =>
546
- instance.getToggleRowSelectedProps(row.id, userProps),
547
- getCanMultiSelect: () => instance.getRowCanMultiSelect(row.id),
548
- getCanSelect: () => instance.getRowCanSelect(row.id),
549
- }
550
- }
551
-
552
- const mutateRowIsSelected = <TGenerics extends PartialGenerics>(
553
- selectedRowIds: Record<string, boolean>,
554
- id: string,
555
- value: boolean,
556
- instance: TableInstance<TGenerics>
557
- ) => {
558
- const row = instance.getRow(id)
559
-
560
- const isGrouped = row.getIsGrouped()
561
-
562
- // if ( // TODO: enforce grouping row selection rules
563
- // !isGrouped ||
564
- // (isGrouped && instance.options.enableGroupingRowSelection)
565
- // ) {
566
- if (value) {
567
- selectedRowIds[id] = true
568
- } else {
569
- delete selectedRowIds[id]
570
- }
571
- // }
572
-
573
- if (row.subRows?.length && instance.getRowCanSelectSubRows(row.id)) {
574
- row.subRows.forEach(row =>
575
- mutateRowIsSelected(selectedRowIds, row.id, value, instance)
576
- )
577
- }
578
- }
579
-
580
- export function selectRowsFn<TGenerics extends PartialGenerics>(
581
- instance: TableInstance<TGenerics>,
582
- rowModel: RowModel<TGenerics>
583
- ): RowModel<TGenerics> {
584
- const rowSelection = instance.getState().rowSelection
585
-
586
- const newSelectedFlatRows: Row<TGenerics>[] = []
587
- const newSelectedRowsById: Record<string, Row<TGenerics>> = {}
588
-
589
- // Filters top level and nested rows
590
- const recurseRows = (rows: Row<TGenerics>[], depth = 0) => {
591
- return rows
592
- .map(row => {
593
- const isSelected = isRowSelected(row, rowSelection, instance) === true
594
-
595
- if (isSelected) {
596
- newSelectedFlatRows.push(row)
597
- newSelectedRowsById[row.id] = row
598
- }
599
-
600
- if (row.subRows?.length) {
601
- row = {
602
- ...row,
603
- subRows: recurseRows(row.subRows, depth + 1),
604
- }
605
- }
606
-
607
- if (isSelected) {
608
- return row
609
- }
610
- })
611
- .filter(Boolean) as Row<TGenerics>[]
612
- }
613
-
614
- return {
615
- rows: recurseRows(rowModel.rows),
616
- flatRows: newSelectedFlatRows,
617
- rowsById: newSelectedRowsById,
618
- }
619
- }
620
-
621
- export function isRowSelected<TGenerics extends PartialGenerics>(
622
- row: Row<TGenerics>,
623
- selection: Record<string, boolean>,
624
- instance: TableInstance<TGenerics>
625
- ): boolean | 'some' {
626
- if (selection[row.id]) {
627
- return true
628
- }
629
-
630
- if (row.subRows && row.subRows.length) {
631
- let allChildrenSelected = true
632
- let someSelected = false
633
-
634
- row.subRows.forEach(subRow => {
635
- // Bail out early if we know both of these
636
- if (someSelected && !allChildrenSelected) {
637
- return
638
- }
639
-
640
- if (isRowSelected(subRow, selection, instance)) {
641
- someSelected = true
642
- } else {
643
- allChildrenSelected = false
644
- }
645
- })
646
-
647
- return allChildrenSelected ? true : someSelected ? 'some' : false
648
- }
649
-
650
- return false
651
- }