@tanstack/table-core 8.0.0-alpha.10

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