@tanstack/table-core 8.0.0-alpha.65 → 8.0.0-alpha.67

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 (84) hide show
  1. package/build/cjs/core.js +0 -2
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/features/Cells.js +1 -1
  4. package/build/cjs/features/Cells.js.map +1 -1
  5. package/build/cjs/features/ColumnSizing.js +65 -140
  6. package/build/cjs/features/ColumnSizing.js.map +1 -1
  7. package/build/cjs/features/Columns.js +5 -5
  8. package/build/cjs/features/Columns.js.map +1 -1
  9. package/build/cjs/features/Expanding.js +49 -87
  10. package/build/cjs/features/Expanding.js.map +1 -1
  11. package/build/cjs/features/Filters.js +89 -145
  12. package/build/cjs/features/Filters.js.map +1 -1
  13. package/build/cjs/features/Grouping.js +30 -58
  14. package/build/cjs/features/Grouping.js.map +1 -1
  15. package/build/cjs/features/Headers.js +16 -40
  16. package/build/cjs/features/Headers.js.map +1 -1
  17. package/build/cjs/features/Ordering.js +1 -1
  18. package/build/cjs/features/Ordering.js.map +1 -1
  19. package/build/cjs/features/Pagination.js +1 -1
  20. package/build/cjs/features/Pagination.js.map +1 -1
  21. package/build/cjs/features/Pinning.js +70 -95
  22. package/build/cjs/features/Pinning.js.map +1 -1
  23. package/build/cjs/features/RowSelection.js +60 -112
  24. package/build/cjs/features/RowSelection.js.map +1 -1
  25. package/build/cjs/features/Sorting.js +33 -83
  26. package/build/cjs/features/Sorting.js.map +1 -1
  27. package/build/cjs/features/Visibility.js +16 -39
  28. package/build/cjs/features/Visibility.js.map +1 -1
  29. package/build/cjs/utils/getCoreRowModelAsync.js +1 -1
  30. package/build/cjs/utils/getCoreRowModelAsync.js.map +1 -1
  31. package/build/cjs/utils/getCoreRowModelSync.js +1 -1
  32. package/build/cjs/utils/getCoreRowModelSync.js.map +1 -1
  33. package/build/cjs/utils/getExpandedRowModel.js +2 -2
  34. package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
  35. package/build/cjs/utils/getFilteredRowModelSync.js +64 -69
  36. package/build/cjs/utils/getFilteredRowModelSync.js.map +1 -1
  37. package/build/cjs/utils/getGroupedRowModel.js +1 -1
  38. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  39. package/build/cjs/utils/getPaginationRowModel.js +1 -1
  40. package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
  41. package/build/cjs/utils/getSortedRowModelSync.js +3 -3
  42. package/build/cjs/utils/getSortedRowModelSync.js.map +1 -1
  43. package/build/esm/index.js +546 -924
  44. package/build/esm/index.js.map +1 -1
  45. package/build/stats-html.html +1 -1
  46. package/build/stats-react.json +354 -354
  47. package/build/types/features/ColumnSizing.d.ts +2 -13
  48. package/build/types/features/Expanding.d.ts +1 -6
  49. package/build/types/features/Filters.d.ts +12 -14
  50. package/build/types/features/Grouping.d.ts +0 -7
  51. package/build/types/features/Pinning.d.ts +0 -4
  52. package/build/types/features/RowSelection.d.ts +1 -7
  53. package/build/types/features/Sorting.d.ts +3 -14
  54. package/build/types/features/Visibility.d.ts +0 -4
  55. package/build/types/types.d.ts +0 -2
  56. package/build/umd/index.development.js +534 -912
  57. package/build/umd/index.development.js.map +1 -1
  58. package/build/umd/index.production.js +1 -1
  59. package/build/umd/index.production.js.map +1 -1
  60. package/package.json +1 -1
  61. package/src/core.ts +0 -2
  62. package/src/features/Cells.ts +1 -1
  63. package/src/features/ColumnSizing.ts +67 -125
  64. package/src/features/Columns.ts +6 -5
  65. package/src/features/Expanding.ts +58 -105
  66. package/src/features/Filters.ts +122 -172
  67. package/src/features/Grouping.ts +36 -60
  68. package/src/features/Headers.ts +18 -40
  69. package/src/features/Ordering.ts +1 -1
  70. package/src/features/Pagination.ts +1 -1
  71. package/src/features/Pinning.ts +66 -89
  72. package/src/features/RowSelection.ts +63 -115
  73. package/src/features/Sorting.ts +36 -94
  74. package/src/features/Visibility.ts +19 -49
  75. package/src/types.ts +0 -2
  76. package/src/utils/getCoreRowModelAsync.ts +1 -1
  77. package/src/utils/getCoreRowModelSync.ts +1 -1
  78. package/src/utils/getExpandedRowModel.ts +2 -2
  79. package/src/utils/getFilteredRowModelAsync.ts +118 -10
  80. package/src/utils/getFilteredRowModelSync.ts +95 -104
  81. package/src/utils/getGroupedRowModel.ts +1 -1
  82. package/src/utils/getPaginationRowModel.ts +1 -1
  83. package/src/utils/getSortedRowModelAsync.ts +1 -1
  84. package/src/utils/getSortedRowModelSync.ts +4 -4
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/table-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "8.0.0-alpha.65",
4
+ "version": "8.0.0-alpha.67",
5
5
  "description": "Hooks for building lightweight, fast and extendable datagrids for React",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/tanstack/react-table#readme",
package/src/core.ts CHANGED
@@ -144,7 +144,6 @@ export function createTableInstance<TGenerics extends TableGenerics>(
144
144
  Promise.resolve()
145
145
  .then(() => {
146
146
  while (queued.length) {
147
- console.log('queue')
148
147
  queued.shift()!()
149
148
  }
150
149
  queuedTimeout = false
@@ -156,7 +155,6 @@ export function createTableInstance<TGenerics extends TableGenerics>(
156
155
  )
157
156
  }
158
157
  },
159
- // willUpdate: () => {},
160
158
  initialState,
161
159
  reset: () => {
162
160
  instance.setState(instance.initialState)
@@ -42,7 +42,7 @@ export const Cells = {
42
42
  })
43
43
  },
44
44
  {
45
- key: process.env.NODE_ENV !== 'production' ? 'row.getAllCells' : '',
45
+ key: process.env.NODE_ENV === 'development' ? 'row.getAllCells' : '',
46
46
  debug: () => instance.options.debugAll ?? instance.options.debugRows,
47
47
  }
48
48
  ),
@@ -44,19 +44,10 @@ export type ColumnSizingDefaultOptions = {
44
44
  }
45
45
 
46
46
  export type ColumnSizingInstance<TGenerics extends TableGenerics> = {
47
- getColumnSize: (columnId: string) => number
48
- getColumnStart: (columnId: string, position?: ColumnPinningPosition) => number
49
47
  setColumnSizing: (updater: Updater<ColumnSizingState>) => void
50
48
  setColumnSizingInfo: (updater: Updater<ColumnSizingInfoState>) => void
51
49
  resetColumnSizing: () => void
52
- resetColumnSize: (columnId: string) => void
53
- resetHeaderSize: (headerId: string) => void
54
50
  resetHeaderSizeInfo: () => void
55
- getColumnCanResize: (columnId: string) => boolean
56
- getHeaderCanResize: (headerId: string) => boolean
57
- getResizeHandler: (headerId: string) => (event: unknown) => void
58
- getColumnIsResizing: (columnId: string) => boolean
59
- getHeaderIsResizing: (headerId: string) => boolean
60
51
  getTotalSize: () => number
61
52
  getLeftTotalSize: () => number
62
53
  getCenterTotalSize: () => number
@@ -65,7 +56,6 @@ export type ColumnSizingInstance<TGenerics extends TableGenerics> = {
65
56
 
66
57
  export type ColumnSizingColumnDef = {
67
58
  enableResizing?: boolean
68
- defaultCanResize?: boolean
69
59
  size?: number
70
60
  minSize?: number
71
61
  maxSize?: number
@@ -80,10 +70,9 @@ export type ColumnSizingColumn<TGenerics extends TableGenerics> = {
80
70
  }
81
71
 
82
72
  export type ColumnSizingHeader<TGenerics extends TableGenerics> = {
83
- getCanResize: () => boolean
84
- getIsResizing: () => boolean
73
+ getSize: () => number
74
+ getStart: (position?: ColumnPinningPosition) => number
85
75
  getResizeHandler: () => (event: unknown) => void
86
- resetSize: () => void
87
76
  }
88
77
 
89
78
  //
@@ -128,37 +117,7 @@ export const ColumnSizing: TableFeature = {
128
117
  instance: TableInstance<TGenerics>
129
118
  ): ColumnSizingColumn<TGenerics> => {
130
119
  return {
131
- getSize: () => instance.getColumnSize(column.id),
132
- getStart: position => instance.getColumnStart(column.id, position),
133
- getIsResizing: () => instance.getColumnIsResizing(column.id),
134
- getCanResize: () => instance.getColumnCanResize(column.id),
135
- resetSize: () => instance.resetColumnSize(column.id),
136
- }
137
- },
138
-
139
- createHeader: <TGenerics extends TableGenerics>(
140
- header: Header<TGenerics>,
141
- instance: TableInstance<TGenerics>
142
- ): ColumnSizingHeader<TGenerics> => {
143
- return {
144
- getIsResizing: () => instance.getColumnIsResizing(header.column.id),
145
- getCanResize: () => instance.getColumnCanResize(header.column.id),
146
- resetSize: () => instance.resetColumnSize(header.column.id),
147
- getResizeHandler: () => instance.getResizeHandler(header.id),
148
- }
149
- },
150
-
151
- createInstance: <TGenerics extends TableGenerics>(
152
- instance: TableInstance<TGenerics>
153
- ): ColumnSizingInstance<TGenerics> => {
154
- return {
155
- getColumnSize: (columnId: string) => {
156
- const column = instance.getColumn(columnId)
157
-
158
- if (!column) {
159
- throw new Error()
160
- }
161
-
120
+ getSize: () => {
162
121
  const columnSize = instance.getState().columnSizing[column.id]
163
122
 
164
123
  return Math.min(
@@ -169,99 +128,73 @@ export const ColumnSizing: TableFeature = {
169
128
  column.maxSize ?? defaultColumnSizing.maxSize
170
129
  )
171
130
  },
172
- getColumnStart: (columnId, position) => {
173
- const column = instance.getColumn(columnId)
174
-
175
- if (!column) {
176
- throw new Error()
177
- }
178
-
131
+ getStart: position => {
179
132
  const columns = !position
180
133
  ? instance.getVisibleLeafColumns()
181
134
  : position === 'left'
182
135
  ? instance.getLeftVisibleLeafColumns()
183
136
  : instance.getRightVisibleLeafColumns()
184
137
 
185
- const index = columns.findIndex(d => d.id === columnId)
138
+ const index = columns.findIndex(d => d.id === column.id)
186
139
 
187
140
  if (index > 0) {
188
141
  const prevSiblingColumn = columns[index - 1]
189
142
 
190
143
  return (
191
- instance.getColumnStart(prevSiblingColumn.id, position) +
192
- prevSiblingColumn.getSize()
144
+ prevSiblingColumn.getStart(position) + prevSiblingColumn.getSize()
193
145
  )
194
146
  }
195
147
 
196
148
  return 0
197
149
  },
198
- setColumnSizing: updater =>
199
- instance.options.onColumnSizingChange?.(updater),
200
- setColumnSizingInfo: updater =>
201
- instance.options.onColumnSizingInfoChange?.(updater),
202
- resetColumnSizing: () => {
203
- instance.setColumnSizing(instance.initialState.columnSizing ?? {})
204
- },
205
- resetHeaderSizeInfo: () => {
206
- instance.setColumnSizingInfo(
207
- instance.initialState.columnSizingInfo ?? {}
208
- )
209
- },
210
- resetColumnSize: columnId => {
211
- instance.setColumnSizing(({ [columnId]: _, ...rest }) => {
150
+ resetSize: () => {
151
+ instance.setColumnSizing(({ [column.id]: _, ...rest }) => {
212
152
  return rest
213
153
  })
214
154
  },
215
- resetHeaderSize: headerId => {
216
- const header = instance.getHeader(headerId)
217
-
218
- return instance.resetColumnSize(header.column.id)
219
- },
220
- getHeaderCanResize: headerId => {
221
- const header = instance.getHeader(headerId)
222
-
223
- if (!header) {
224
- throw new Error()
225
- }
226
-
227
- return instance.getColumnCanResize(header.column.id)
155
+ getCanResize: () => {
156
+ return (
157
+ (column.enableResizing ?? true) &&
158
+ (instance.options.enableColumnResizing ?? true)
159
+ )
228
160
  },
229
- getColumnCanResize: columnId => {
230
- const column = instance.getColumn(columnId)
231
-
232
- if (!column) {
233
- throw new Error()
234
- }
235
-
161
+ getIsResizing: () => {
236
162
  return (
237
- column.enableResizing ??
238
- instance.options.enableColumnResizing ??
239
- column.defaultCanResize ??
240
- true
163
+ instance.getState().columnSizingInfo.isResizingColumn === column.id
241
164
  )
242
165
  },
243
- getColumnIsResizing: columnId => {
244
- const column = instance.getColumn(columnId)
166
+ }
167
+ },
168
+
169
+ createHeader: <TGenerics extends TableGenerics>(
170
+ header: Header<TGenerics>,
171
+ instance: TableInstance<TGenerics>
172
+ ): ColumnSizingHeader<TGenerics> => {
173
+ return {
174
+ getSize: () => {
175
+ let sum = 0
245
176
 
246
- if (!column) {
247
- throw new Error()
177
+ const recurse = (header: Header<TGenerics>) => {
178
+ if (header.subHeaders.length) {
179
+ header.subHeaders.forEach(recurse)
180
+ } else {
181
+ sum += header.column.getSize() ?? 0
182
+ }
248
183
  }
249
184
 
250
- return (
251
- instance.getState().columnSizingInfo.isResizingColumn === columnId
252
- )
253
- },
254
- getHeaderIsResizing: headerId => {
255
- const header = instance.getHeader(headerId)
185
+ recurse(header)
256
186
 
257
- if (!header) {
258
- throw new Error()
187
+ return sum
188
+ },
189
+ getStart: () => {
190
+ if (header.index > 0) {
191
+ const prevSiblingHeader = header.headerGroup.headers[header.index - 1]
192
+ return prevSiblingHeader.getStart() + prevSiblingHeader.getSize()
259
193
  }
260
194
 
261
- return instance.getColumnIsResizing(header.column.id)
195
+ return 0
262
196
  },
263
- getResizeHandler: (headerId: string) => {
264
- const header = instance.getHeader(headerId)
197
+ getResizeHandler: () => {
265
198
  const column = instance.getColumn(header.column.id)
266
199
  const canResize = column.getCanResize()
267
200
 
@@ -279,12 +212,12 @@ export const ColumnSizing: TableFeature = {
279
212
  }
280
213
  }
281
214
 
282
- const header = headerId ? instance.getHeader(headerId) : undefined
283
-
284
- const startSize = header ? header.getSize() : column.getSize()
215
+ const startSize = column.getSize()
285
216
 
286
217
  const columnSizingStart: [string, number][] = header
287
- ? header.getLeafHeaders().map(d => [d.column.id, d.getSize()])
218
+ ? header
219
+ .getLeafHeaders()
220
+ .map(d => [d.column.id, d.column.getSize()])
288
221
  : [[column.id, column.getSize()]]
289
222
 
290
223
  const clientX = isTouchStartEvent(e)
@@ -384,16 +317,6 @@ export const ColumnSizing: TableFeature = {
384
317
  : false
385
318
 
386
319
  if (isTouchStartEvent(e)) {
387
- document.addEventListener(
388
- 'touchmove',
389
- touchEvents.moveHandler,
390
- passiveIfSupported
391
- )
392
- document.addEventListener(
393
- 'touchend',
394
- touchEvents.upHandler,
395
- passiveIfSupported
396
- )
397
320
  } else {
398
321
  document.addEventListener(
399
322
  'mousemove',
@@ -418,21 +341,40 @@ export const ColumnSizing: TableFeature = {
418
341
  }))
419
342
  }
420
343
  },
344
+ }
345
+ },
346
+
347
+ createInstance: <TGenerics extends TableGenerics>(
348
+ instance: TableInstance<TGenerics>
349
+ ): ColumnSizingInstance<TGenerics> => {
350
+ return {
351
+ setColumnSizing: updater =>
352
+ instance.options.onColumnSizingChange?.(updater),
353
+ setColumnSizingInfo: updater =>
354
+ instance.options.onColumnSizingInfoChange?.(updater),
355
+ resetColumnSizing: () => {
356
+ instance.setColumnSizing(instance.initialState.columnSizing ?? {})
357
+ },
358
+ resetHeaderSizeInfo: () => {
359
+ instance.setColumnSizingInfo(
360
+ instance.initialState.columnSizingInfo ?? {}
361
+ )
362
+ },
421
363
  getTotalSize: () =>
422
364
  instance.getHeaderGroups()[0]?.headers.reduce((sum, header) => {
423
- return sum + header.getSize()
365
+ return sum + header.column.getSize()
424
366
  }, 0) ?? 0,
425
367
  getLeftTotalSize: () =>
426
368
  instance.getLeftHeaderGroups()[0]?.headers.reduce((sum, header) => {
427
- return sum + header.getSize()
369
+ return sum + header.column.getSize()
428
370
  }, 0) ?? 0,
429
371
  getCenterTotalSize: () =>
430
372
  instance.getCenterHeaderGroups()[0]?.headers.reduce((sum, header) => {
431
- return sum + header.getSize()
373
+ return sum + header.column.getSize()
432
374
  }, 0) ?? 0,
433
375
  getRightTotalSize: () =>
434
376
  instance.getRightHeaderGroups()[0]?.headers.reduce((sum, header) => {
435
- return sum + header.getSize()
377
+ return sum + header.column.getSize()
436
378
  }, 0) ?? 0,
437
379
  }
438
380
  },
@@ -108,7 +108,7 @@ export const Columns = {
108
108
  {
109
109
  debug: () =>
110
110
  instance.options.debugAll ?? instance.options.debugColumns,
111
- key: process.env.NODE_ENV === 'production' && 'getDefaultColumn',
111
+ key: process.env.NODE_ENV === 'development' && 'getDefaultColumn',
112
112
  }
113
113
  ),
114
114
 
@@ -225,7 +225,7 @@ export const Columns = {
225
225
  return recurseColumns(columnDefs)
226
226
  },
227
227
  {
228
- key: process.env.NODE_ENV === 'production' && 'getAllColumns',
228
+ key: process.env.NODE_ENV === 'development' && 'getAllColumns',
229
229
  debug: () =>
230
230
  instance.options.debugAll ?? instance.options.debugColumns,
231
231
  }
@@ -239,7 +239,7 @@ export const Columns = {
239
239
  })
240
240
  },
241
241
  {
242
- key: process.env.NODE_ENV === 'production' && 'getAllFlatColumns',
242
+ key: process.env.NODE_ENV === 'development' && 'getAllFlatColumns',
243
243
  debug: () =>
244
244
  instance.options.debugAll ?? instance.options.debugColumns,
245
245
  }
@@ -254,7 +254,8 @@ export const Columns = {
254
254
  }, {} as Record<string, Column<TGenerics>>)
255
255
  },
256
256
  {
257
- key: process.env.NODE_ENV === 'production' && 'getAllFlatColumnsById',
257
+ key:
258
+ process.env.NODE_ENV === 'development' && 'getAllFlatColumnsById',
258
259
  debug: () =>
259
260
  instance.options.debugAll ?? instance.options.debugColumns,
260
261
  }
@@ -269,7 +270,7 @@ export const Columns = {
269
270
  return orderColumns(leafColumns)
270
271
  },
271
272
  {
272
- key: process.env.NODE_ENV === 'production' && 'getAllLeafColumns',
273
+ key: process.env.NODE_ENV === 'development' && 'getAllLeafColumns',
273
274
  debug: () =>
274
275
  instance.options.debugAll ?? instance.options.debugColumns,
275
276
  }
@@ -8,6 +8,7 @@ import {
8
8
  TableFeature,
9
9
  } from '../types'
10
10
  import { makeStateUpdater } from '../utils'
11
+ import { Rows } from './Rows'
11
12
 
12
13
  export type ExpandedStateList = Record<string, boolean>
13
14
  export type ExpandedState = true | Record<string, boolean>
@@ -26,12 +27,11 @@ export type ExpandedOptions<TGenerics extends TableGenerics> = {
26
27
  manualExpanding?: boolean
27
28
  onExpandedChange?: OnChangeFn<ExpandedState>
28
29
  autoResetExpanded?: boolean
29
- enableExpanded?: boolean
30
+ enableExpanding?: boolean
30
31
  getExpandedRowModel?: (
31
32
  instance: TableInstance<TGenerics>
32
33
  ) => () => RowModel<TGenerics>
33
34
  expandSubRows?: boolean
34
- defaultCanExpand?: boolean
35
35
  getIsRowExpanded?: (row: Row<TGenerics>) => boolean
36
36
  getRowCanExpand?: (row: Row<TGenerics>) => boolean
37
37
  paginateExpandedRows?: boolean
@@ -40,13 +40,9 @@ export type ExpandedOptions<TGenerics extends TableGenerics> = {
40
40
  export type ExpandedInstance<TGenerics extends TableGenerics> = {
41
41
  _autoResetExpanded: () => void
42
42
  setExpanded: (updater: Updater<ExpandedState>) => void
43
- toggleRowExpanded: (rowId: string, expanded?: boolean) => void
44
43
  toggleAllRowsExpanded: (expanded?: boolean) => void
45
44
  resetExpanded: () => void
46
- getRowCanExpand: (rowId: string) => boolean
47
45
  getCanSomeRowsExpand: () => boolean
48
- getIsRowExpanded: (rowId: string) => boolean
49
- getToggleExpandedHandler: (rowId: string) => undefined | (() => void)
50
46
  getToggleAllRowsExpandedHandler: () => (event: unknown) => void
51
47
  getIsSomeRowsExpanded: () => boolean
52
48
  getIsAllRowsExpanded: () => boolean
@@ -101,39 +97,6 @@ export const Expanding: TableFeature = {
101
97
  }
102
98
  },
103
99
  setExpanded: updater => instance.options.onExpandedChange?.(updater),
104
- toggleRowExpanded: (rowId, expanded) => {
105
- if (!rowId) return
106
-
107
- instance.setExpanded(old => {
108
- const exists = old === true ? true : !!old?.[rowId]
109
-
110
- let oldExpanded: ExpandedStateList = {}
111
-
112
- if (old === true) {
113
- Object.keys(instance.getRowModel().rowsById).forEach(rowId => {
114
- oldExpanded[rowId] = true
115
- })
116
- } else {
117
- oldExpanded = old
118
- }
119
-
120
- expanded = expanded ?? !exists
121
-
122
- if (!exists && expanded) {
123
- return {
124
- ...oldExpanded,
125
- [rowId]: true,
126
- }
127
- }
128
-
129
- if (exists && !expanded) {
130
- const { [rowId]: _, ...rest } = oldExpanded
131
- return rest
132
- }
133
-
134
- return old
135
- })
136
- },
137
100
  toggleAllRowsExpanded: expanded => {
138
101
  if (expanded ?? !instance.getIsAllRowsExpanded()) {
139
102
  instance.setExpanded(true)
@@ -144,62 +107,8 @@ export const Expanding: TableFeature = {
144
107
  resetExpanded: () => {
145
108
  instance.setExpanded(instance.initialState?.expanded ?? {})
146
109
  },
147
- getIsRowExpanded: rowId => {
148
- const row = instance.getPreExpandedRowModel().rowsById[rowId]
149
-
150
- if (!row) {
151
- if (process.env.NODE_ENV !== 'production') {
152
- console.warn(
153
- `[Table] getIsRowExpanded: no row found with id ${rowId}`
154
- )
155
- }
156
- throw new Error()
157
- }
158
-
159
- const expanded = instance.getState().expanded
160
-
161
- return !!(
162
- instance.options.getIsRowExpanded?.(row) ??
163
- (expanded === true || expanded?.[rowId])
164
- )
165
- },
166
- getRowCanExpand: rowId => {
167
- const row = instance.getRow(rowId)
168
-
169
- if (!row) {
170
- if (process.env.NODE_ENV !== 'production') {
171
- console.warn(
172
- `[Table] getRowCanExpand: no row found with id ${rowId}`
173
- )
174
- }
175
- throw new Error()
176
- }
177
-
178
- return (
179
- instance.options.getRowCanExpand?.(row) ??
180
- instance.options.enableExpanded ??
181
- instance.options.defaultCanExpand ??
182
- !!row.subRows?.length
183
- )
184
- },
185
110
  getCanSomeRowsExpand: () => {
186
- return Object.keys(instance.getRowModel().rowsById).some(id =>
187
- instance.getRowCanExpand(id)
188
- )
189
- },
190
- getToggleExpandedHandler: rowId => {
191
- const row = instance.getRow(rowId)
192
-
193
- if (!row) {
194
- return
195
- }
196
-
197
- const canExpand = instance.getRowCanExpand(rowId)
198
-
199
- return () => {
200
- if (!canExpand) return
201
- instance.toggleRowExpanded(rowId)
202
- }
111
+ return instance.getRowModel().flatRows.some(row => row.getCanExpand())
203
112
  },
204
113
  getToggleAllRowsExpandedHandler: () => {
205
114
  return (e: unknown) => {
@@ -220,11 +129,7 @@ export const Expanding: TableFeature = {
220
129
  }
221
130
 
222
131
  // If any row is not expanded, return false
223
- if (
224
- Object.keys(instance.getRowModel().rowsById).some(
225
- id => !instance.getIsRowExpanded(id)
226
- )
227
- ) {
132
+ if (instance.getRowModel().flatRows.some(row => row.getIsExpanded())) {
228
133
  return false
229
134
  }
230
135
 
@@ -273,12 +178,60 @@ export const Expanding: TableFeature = {
273
178
  instance: TableInstance<TGenerics>
274
179
  ): ExpandedRow => {
275
180
  return {
276
- toggleExpanded: expanded =>
277
- void instance.toggleRowExpanded(row.id, expanded),
278
- getIsExpanded: () => instance.getIsRowExpanded(row.id),
279
- getCanExpand: () => row.subRows && !!row.subRows.length,
280
- getToggleExpandedHandler: () =>
281
- instance.getToggleExpandedHandler(row.id)!,
181
+ toggleExpanded: expanded => {
182
+ instance.setExpanded(old => {
183
+ const exists = old === true ? true : !!old?.[row.id]
184
+
185
+ let oldExpanded: ExpandedStateList = {}
186
+
187
+ if (old === true) {
188
+ Object.keys(instance.getRowModel().rowsById).forEach(rowId => {
189
+ oldExpanded[rowId] = true
190
+ })
191
+ } else {
192
+ oldExpanded = old
193
+ }
194
+
195
+ expanded = expanded ?? !exists
196
+
197
+ if (!exists && expanded) {
198
+ return {
199
+ ...oldExpanded,
200
+ [row.id]: true,
201
+ }
202
+ }
203
+
204
+ if (exists && !expanded) {
205
+ const { [row.id]: _, ...rest } = oldExpanded
206
+ return rest
207
+ }
208
+
209
+ return old
210
+ })
211
+ },
212
+ getIsExpanded: () => {
213
+ const expanded = instance.getState().expanded
214
+
215
+ return !!(
216
+ instance.options.getIsRowExpanded?.(row) ??
217
+ (expanded === true || expanded?.[row.id])
218
+ )
219
+ },
220
+ getCanExpand: () => {
221
+ return (
222
+ (instance.options.getRowCanExpand?.(row) ?? true) &&
223
+ (instance.options.enableExpanding ?? true) &&
224
+ !!row.subRows?.length
225
+ )
226
+ },
227
+ getToggleExpandedHandler: () => {
228
+ const canExpand = row.getCanExpand()
229
+
230
+ return () => {
231
+ if (!canExpand) return
232
+ row.toggleExpanded()
233
+ }
234
+ },
282
235
  }
283
236
  },
284
237
  }