@tanstack/table-core 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 (186) hide show
  1. package/build/cjs/aggregationFns.js +120 -0
  2. package/build/cjs/aggregationFns.js.map +1 -0
  3. package/build/cjs/core/cell.js +40 -0
  4. package/build/cjs/core/cell.js.map +1 -0
  5. package/build/cjs/core/column.js +88 -0
  6. package/build/cjs/core/column.js.map +1 -0
  7. package/build/cjs/core/headers.js +403 -0
  8. package/build/cjs/core/headers.js.map +1 -0
  9. package/build/cjs/core/instance.js +255 -0
  10. package/build/cjs/core/instance.js.map +1 -0
  11. package/build/cjs/core/row.js +77 -0
  12. package/build/cjs/core/row.js.map +1 -0
  13. package/build/cjs/createTable.js +36 -29
  14. package/build/cjs/createTable.js.map +1 -1
  15. package/build/cjs/features/ColumnSizing.js +157 -189
  16. package/build/cjs/features/ColumnSizing.js.map +1 -1
  17. package/build/cjs/features/Expanding.js +103 -155
  18. package/build/cjs/features/Expanding.js.map +1 -1
  19. package/build/cjs/features/Filters.js +155 -304
  20. package/build/cjs/features/Filters.js.map +1 -1
  21. package/build/cjs/features/Grouping.js +97 -157
  22. package/build/cjs/features/Grouping.js.map +1 -1
  23. package/build/cjs/features/Ordering.js +30 -41
  24. package/build/cjs/features/Ordering.js.map +1 -1
  25. package/build/cjs/features/Pagination.js +102 -105
  26. package/build/cjs/features/Pagination.js.map +1 -1
  27. package/build/cjs/features/Pinning.js +131 -89
  28. package/build/cjs/features/Pinning.js.map +1 -1
  29. package/build/cjs/features/RowSelection.js +138 -267
  30. package/build/cjs/features/RowSelection.js.map +1 -1
  31. package/build/cjs/features/Sorting.js +82 -167
  32. package/build/cjs/features/Sorting.js.map +1 -1
  33. package/build/cjs/features/Visibility.js +69 -115
  34. package/build/cjs/features/Visibility.js.map +1 -1
  35. package/build/cjs/filterFns.js +107 -0
  36. package/build/cjs/filterFns.js.map +1 -0
  37. package/build/cjs/index.js +36 -23
  38. package/build/cjs/index.js.map +1 -1
  39. package/build/cjs/sortingFns.js +124 -0
  40. package/build/cjs/sortingFns.js.map +1 -0
  41. package/build/cjs/utils/filterRowsUtils.js +117 -0
  42. package/build/cjs/utils/filterRowsUtils.js.map +1 -0
  43. package/build/cjs/utils/getCoreRowModel.js +79 -0
  44. package/build/cjs/utils/getCoreRowModel.js.map +1 -0
  45. package/build/cjs/utils/getExpandedRowModel.js +57 -0
  46. package/build/cjs/utils/getExpandedRowModel.js.map +1 -0
  47. package/build/cjs/utils/getFacetedMinMaxValues.js +54 -0
  48. package/build/cjs/utils/getFacetedMinMaxValues.js.map +1 -0
  49. package/build/cjs/utils/getFacetedRowModel.js +50 -0
  50. package/build/cjs/utils/getFacetedRowModel.js.map +1 -0
  51. package/build/cjs/utils/getFacetedUniqueValues.js +48 -0
  52. package/build/cjs/utils/getFacetedUniqueValues.js.map +1 -0
  53. package/build/cjs/utils/getFilteredRowModel.js +139 -0
  54. package/build/cjs/utils/getFilteredRowModel.js.map +1 -0
  55. package/build/cjs/utils/getGroupedRowModel.js +161 -0
  56. package/build/cjs/utils/getGroupedRowModel.js.map +1 -0
  57. package/build/cjs/utils/getPaginationRowModel.js +61 -0
  58. package/build/cjs/utils/getPaginationRowModel.js.map +1 -0
  59. package/build/cjs/utils/getSortedRowModel.js +110 -0
  60. package/build/cjs/utils/getSortedRowModel.js.map +1 -0
  61. package/build/cjs/utils.js +38 -107
  62. package/build/cjs/utils.js.map +1 -1
  63. package/build/esm/index.js +2976 -3853
  64. package/build/esm/index.js.map +1 -1
  65. package/build/stats-html.html +1 -1
  66. package/build/stats-react.json +586 -408
  67. package/build/types/aggregationFns.d.ts +13 -0
  68. package/build/types/core/cell.d.ts +9 -0
  69. package/build/types/core/column.d.ts +40 -0
  70. package/build/types/core/headers.d.ts +46 -0
  71. package/build/types/core/instance.d.ts +57 -0
  72. package/build/types/core/row.d.ts +15 -0
  73. package/build/types/createTable.d.ts +47 -26
  74. package/build/types/features/ColumnSizing.d.ts +32 -44
  75. package/build/types/features/Expanding.d.ts +15 -26
  76. package/build/types/features/Filters.d.ts +64 -63
  77. package/build/types/features/Grouping.d.ts +32 -46
  78. package/build/types/features/Ordering.d.ts +7 -10
  79. package/build/types/features/Pagination.d.ts +16 -15
  80. package/build/types/features/Pinning.d.ts +16 -17
  81. package/build/types/features/RowSelection.d.ts +13 -33
  82. package/build/types/features/Sorting.d.ts +25 -44
  83. package/build/types/features/Visibility.d.ts +16 -25
  84. package/build/types/filterFns.d.ts +13 -0
  85. package/build/types/index.d.ts +16 -10
  86. package/build/types/sortingFns.d.ts +11 -0
  87. package/build/types/types.d.ts +37 -122
  88. package/build/types/utils/filterRowsUtils.d.ts +4 -0
  89. package/build/types/utils/getCoreRowModel.d.ts +2 -0
  90. package/build/types/utils/getExpandedRowModel.d.ts +7 -0
  91. package/build/types/utils/getFacetedMinMaxValues.d.ts +2 -0
  92. package/build/types/utils/getFacetedRowModel.d.ts +2 -0
  93. package/build/types/utils/getFacetedUniqueValues.d.ts +2 -0
  94. package/build/types/utils/getFilteredRowModel.d.ts +2 -0
  95. package/build/types/utils/getGroupedRowModel.d.ts +2 -0
  96. package/build/types/utils/getPaginationRowModel.d.ts +4 -0
  97. package/build/types/utils/getSortedRowModel.d.ts +2 -0
  98. package/build/types/utils.d.ts +7 -11
  99. package/build/umd/index.development.js +3024 -3893
  100. package/build/umd/index.development.js.map +1 -1
  101. package/build/umd/index.production.js +1 -1
  102. package/build/umd/index.production.js.map +1 -1
  103. package/package.json +9 -10
  104. package/src/.DS_Store +0 -0
  105. package/src/aggregationFns.ts +123 -0
  106. package/src/core/cell.ts +48 -0
  107. package/src/core/column.ts +147 -0
  108. package/src/core/headers.ts +575 -0
  109. package/src/core/instance.ts +361 -0
  110. package/src/core/row.ts +85 -0
  111. package/src/createTable.ts +188 -0
  112. package/src/features/ColumnSizing.ts +170 -185
  113. package/src/features/Expanding.ts +122 -194
  114. package/src/features/Filters.ts +301 -381
  115. package/src/features/Grouping.ts +160 -220
  116. package/src/features/Ordering.ts +24 -25
  117. package/src/features/Pagination.ts +90 -73
  118. package/src/features/Pinning.ts +186 -63
  119. package/src/features/RowSelection.ts +107 -245
  120. package/src/features/Sorting.ts +127 -225
  121. package/src/features/Visibility.ts +116 -132
  122. package/src/filterFns.ts +135 -0
  123. package/src/index.ts +29 -0
  124. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  125. package/src/types.ts +62 -168
  126. package/src/utils/filterRowsUtils.ts +112 -0
  127. package/src/utils/getCoreRowModel.ts +84 -0
  128. package/src/utils/getExpandedRowModel.ts +54 -0
  129. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  130. package/src/utils/getFacetedRowModel.ts +50 -0
  131. package/src/utils/getFacetedUniqueValues.ts +37 -0
  132. package/src/utils/getFilteredRowModel.ts +159 -0
  133. package/src/utils/getGroupedRowModel.ts +175 -0
  134. package/src/utils/getPaginationRowModel.ts +48 -0
  135. package/src/utils/getSortedRowModel.ts +116 -0
  136. package/src/utils.ts +126 -0
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  138. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  139. package/build/cjs/aggregationTypes.js +0 -130
  140. package/build/cjs/aggregationTypes.js.map +0 -1
  141. package/build/cjs/core.js +0 -545
  142. package/build/cjs/core.js.map +0 -1
  143. package/build/cjs/features/Headers.js +0 -630
  144. package/build/cjs/features/Headers.js.map +0 -1
  145. package/build/cjs/filterTypes.js +0 -172
  146. package/build/cjs/filterTypes.js.map +0 -1
  147. package/build/cjs/sortTypes.js +0 -122
  148. package/build/cjs/sortTypes.js.map +0 -1
  149. package/build/cjs/types.js +0 -22
  150. package/build/cjs/types.js.map +0 -1
  151. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  152. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  153. package/build/cjs/utils/expandRowsFn.js +0 -38
  154. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  155. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  156. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  157. package/build/cjs/utils/groupRowsFn.js +0 -155
  158. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  159. package/build/cjs/utils/paginateRowsFn.js +0 -44
  160. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  161. package/build/cjs/utils/sortRowsFn.js +0 -94
  162. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  163. package/build/types/aggregationTypes.d.ts +0 -22
  164. package/build/types/core.d.ts +0 -105
  165. package/build/types/features/Headers.d.ts +0 -43
  166. package/build/types/filterTypes.d.ts +0 -50
  167. package/build/types/sortTypes.d.ts +0 -18
  168. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  169. package/build/types/utils/expandRowsFn.d.ts +0 -2
  170. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  171. package/build/types/utils/groupRowsFn.d.ts +0 -2
  172. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  173. package/build/types/utils/sortRowsFn.d.ts +0 -2
  174. package/src/aggregationTypes.ts +0 -115
  175. package/src/core.tsx +0 -763
  176. package/src/createTable.tsx +0 -137
  177. package/src/features/Headers.ts +0 -747
  178. package/src/filterTypes.ts +0 -188
  179. package/src/index.tsx +0 -23
  180. package/src/utils/columnFilterRowsFn.ts +0 -113
  181. package/src/utils/expandRowsFn.ts +0 -30
  182. package/src/utils/globalFilterRowsFn.ts +0 -89
  183. package/src/utils/groupRowsFn.ts +0 -170
  184. package/src/utils/paginateRowsFn.ts +0 -28
  185. package/src/utils/sortRowsFn.ts +0 -95
  186. package/src/utils.tsx +0 -221
@@ -1,15 +1,13 @@
1
- import { MouseEvent, TouchEvent } from 'react'
2
1
  import { RowModel } from '..'
2
+ import { TableFeature } from '../core/instance'
3
3
  import {
4
- Getter,
5
4
  OnChangeFn,
6
- PartialGenerics,
7
- PropGetterValue,
5
+ TableGenerics,
8
6
  TableInstance,
9
7
  Row,
10
8
  Updater,
11
9
  } from '../types'
12
- import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
10
+ import { makeStateUpdater } from '../utils'
13
11
 
14
12
  export type ExpandedStateList = Record<string, boolean>
15
13
  export type ExpandedState = true | Record<string, boolean>
@@ -21,82 +19,69 @@ export type ExpandedRow = {
21
19
  toggleExpanded: (expanded?: boolean) => void
22
20
  getIsExpanded: () => boolean
23
21
  getCanExpand: () => boolean
24
- getToggleExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
25
- userProps?: TGetter
26
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
22
+ getToggleExpandedHandler: () => () => void
27
23
  }
28
24
 
29
- export type ExpandedOptions<TGenerics extends PartialGenerics> = {
25
+ export type ExpandedOptions<TGenerics extends TableGenerics> = {
26
+ manualExpanding?: boolean
30
27
  onExpandedChange?: OnChangeFn<ExpandedState>
31
28
  autoResetExpanded?: boolean
32
- enableExpanded?: boolean
33
- expandRowsFn?: (
34
- instance: TableInstance<TGenerics>,
35
- rowModel: RowModel<TGenerics>
36
- ) => RowModel<TGenerics>
37
- expandSubRows?: boolean
38
- defaultCanExpand?: boolean
29
+ enableExpanding?: boolean
30
+ getExpandedRowModel?: (
31
+ instance: TableInstance<TGenerics>
32
+ ) => () => RowModel<TGenerics>
39
33
  getIsRowExpanded?: (row: Row<TGenerics>) => boolean
40
34
  getRowCanExpand?: (row: Row<TGenerics>) => boolean
41
35
  paginateExpandedRows?: boolean
42
36
  }
43
37
 
44
- export type ToggleExpandedProps = {
45
- title?: string
46
- onClick?: (event: MouseEvent | TouchEvent) => void
47
- }
48
-
49
- export type ExpandedInstance<TGenerics extends PartialGenerics> = {
50
- _notifyExpandedReset: () => void
38
+ export type ExpandedInstance<TGenerics extends TableGenerics> = {
39
+ _autoResetExpanded: () => void
51
40
  setExpanded: (updater: Updater<ExpandedState>) => void
52
- toggleRowExpanded: (rowId: string, expanded?: boolean) => void
53
41
  toggleAllRowsExpanded: (expanded?: boolean) => void
54
- resetExpanded: () => void
55
- getRowCanExpand: (rowId: string) => boolean
56
- getIsRowExpanded: (rowId: string) => boolean
57
- getToggleExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
58
- rowId: string,
59
- userProps?: TGetter
60
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
61
- getToggleAllRowsExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
62
- userProps?: TGetter
63
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
42
+ resetExpanded: (defaultState?: boolean) => void
43
+ getCanSomeRowsExpand: () => boolean
44
+ getToggleAllRowsExpandedHandler: () => (event: unknown) => void
45
+ getIsSomeRowsExpanded: () => boolean
64
46
  getIsAllRowsExpanded: () => boolean
65
47
  getExpandedDepth: () => number
66
48
  getExpandedRowModel: () => RowModel<TGenerics>
49
+ _getExpandedRowModel?: () => RowModel<TGenerics>
67
50
  getPreExpandedRowModel: () => RowModel<TGenerics>
68
51
  }
69
52
 
70
53
  //
71
54
 
72
- export const Expanding = {
73
- getInitialState: (): ExpandedTableState => {
55
+ export const Expanding: TableFeature = {
56
+ getInitialState: (state): ExpandedTableState => {
74
57
  return {
75
58
  expanded: {},
59
+ ...state,
76
60
  }
77
61
  },
78
62
 
79
- getDefaultOptions: <TGenerics extends PartialGenerics>(
63
+ getDefaultOptions: <TGenerics extends TableGenerics>(
80
64
  instance: TableInstance<TGenerics>
81
65
  ): ExpandedOptions<TGenerics> => {
82
66
  return {
83
67
  onExpandedChange: makeStateUpdater('expanded', instance),
84
68
  autoResetExpanded: true,
85
- getIsRowExpanded: row => !!(row?.original as { expanded?: any }).expanded,
86
- expandSubRows: true,
87
69
  paginateExpandedRows: true,
88
70
  }
89
71
  },
90
72
 
91
- getInstance: <TGenerics extends PartialGenerics>(
73
+ createInstance: <TGenerics extends TableGenerics>(
92
74
  instance: TableInstance<TGenerics>
93
75
  ): ExpandedInstance<TGenerics> => {
94
76
  let registered = false
77
+ let queued = false
95
78
 
96
79
  return {
97
- _notifyExpandedReset: () => {
80
+ _autoResetExpanded: () => {
98
81
  if (!registered) {
99
- registered = true
82
+ instance._queue(() => {
83
+ registered = true
84
+ })
100
85
  return
101
86
  }
102
87
 
@@ -108,47 +93,15 @@ export const Expanding = {
108
93
  instance.options.autoResetAll === true ||
109
94
  instance.options.autoResetExpanded
110
95
  ) {
111
- instance.resetExpanded()
96
+ if (queued) return
97
+ queued = true
98
+ instance._queue(() => {
99
+ instance.resetExpanded()
100
+ queued = false
101
+ })
112
102
  }
113
103
  },
114
- setExpanded: updater =>
115
- instance.options.onExpandedChange?.(
116
- updater,
117
- functionalUpdate(updater, instance.getState().expanded)
118
- ),
119
- toggleRowExpanded: (rowId, expanded) => {
120
- if (!rowId) return
121
-
122
- instance.setExpanded(old => {
123
- const exists = old === true ? true : !!old?.[rowId]
124
-
125
- let oldExpanded: ExpandedStateList = {}
126
-
127
- if (old === true) {
128
- Object.keys(instance.getRowModel().rowsById).forEach(rowId => {
129
- oldExpanded[rowId] = true
130
- })
131
- } else {
132
- oldExpanded = old
133
- }
134
-
135
- expanded = expanded ?? !exists
136
-
137
- if (!exists && expanded) {
138
- return {
139
- ...oldExpanded,
140
- [rowId]: true,
141
- }
142
- }
143
-
144
- if (exists && !expanded) {
145
- const { [rowId]: _, ...rest } = oldExpanded
146
- return rest
147
- }
148
-
149
- return old
150
- })
151
- },
104
+ setExpanded: updater => instance.options.onExpandedChange?.(updater),
152
105
  toggleAllRowsExpanded: expanded => {
153
106
  if (expanded ?? !instance.getIsAllRowsExpanded()) {
154
107
  instance.setExpanded(true)
@@ -156,93 +109,38 @@ export const Expanding = {
156
109
  instance.setExpanded({})
157
110
  }
158
111
  },
159
- resetExpanded: () => {
160
- instance.setExpanded(instance.initialState?.expanded ?? {})
161
- },
162
- getIsRowExpanded: rowId => {
163
- const row = instance.getRow(rowId)
164
-
165
- if (!row) {
166
- if (process.env.NODE_ENV !== 'production') {
167
- console.warn(
168
- `[ReactTable] getIsRowExpanded: no row found with id ${rowId}`
169
- )
170
- }
171
- throw new Error()
172
- }
173
-
174
- const expanded = instance.getState().expanded
175
-
176
- return !!(
177
- instance.options.getIsRowExpanded?.(row) ??
178
- (expanded || expanded?.[rowId])
112
+ resetExpanded: defaultState => {
113
+ instance.setExpanded(
114
+ defaultState ? {} : instance.initialState?.expanded ?? {}
179
115
  )
180
116
  },
181
- getRowCanExpand: rowId => {
182
- const row = instance.getRow(rowId)
183
-
184
- if (!row) {
185
- if (process.env.NODE_ENV !== 'production') {
186
- console.warn(
187
- `[ReactTable] getRowCanExpand: no row found with id ${rowId}`
188
- )
189
- }
190
- throw new Error()
191
- }
192
-
193
- return (
194
- instance.options.getRowCanExpand?.(row) ??
195
- instance.options.enableExpanded ??
196
- instance.options.defaultCanExpand ??
197
- !!row.subRows?.length
198
- )
117
+ getCanSomeRowsExpand: () => {
118
+ return instance.getRowModel().flatRows.some(row => row.getCanExpand())
199
119
  },
200
- getToggleExpandedProps: (rowId, userProps) => {
201
- const row = instance.getRow(rowId)
202
-
203
- if (!row) {
204
- return
205
- }
206
-
207
- const canExpand = instance.getRowCanExpand(rowId)
208
-
209
- const initialProps: ToggleExpandedProps = {
210
- title: canExpand ? 'Toggle Expanded' : undefined,
211
- onClick: canExpand
212
- ? (e: MouseEvent | TouchEvent) => {
213
- e.persist()
214
- instance.toggleRowExpanded(rowId)
215
- }
216
- : undefined,
120
+ getToggleAllRowsExpandedHandler: () => {
121
+ return (e: unknown) => {
122
+ ;(e as any).persist?.()
123
+ instance.toggleAllRowsExpanded()
217
124
  }
218
-
219
- return propGetter(initialProps, userProps)
220
125
  },
221
- getToggleAllRowsExpandedProps: userProps => {
222
- const initialProps: ToggleExpandedProps = {
223
- title: 'Toggle All Expanded',
224
- onClick: (e: MouseEvent | TouchEvent) => {
225
- e.persist()
226
- instance.toggleAllRowsExpanded()
227
- },
228
- }
229
-
230
- return propGetter(initialProps, userProps)
126
+ getIsSomeRowsExpanded: () => {
127
+ const expanded = instance.getState().expanded
128
+ return expanded === true || Object.values(expanded).some(Boolean)
231
129
  },
232
130
  getIsAllRowsExpanded: () => {
233
131
  const expanded = instance.getState().expanded
234
132
 
235
133
  // If expanded is true, save some cycles and return true
236
- if (expanded === true) {
237
- return true
134
+ if (typeof expanded === 'boolean') {
135
+ return expanded === true
136
+ }
137
+
138
+ if (!Object.keys(expanded).length) {
139
+ return false
238
140
  }
239
141
 
240
142
  // If any row is not expanded, return false
241
- if (
242
- Object.keys(instance.getRowModel().rowsById).some(
243
- id => !instance.getIsRowExpanded(id)
244
- )
245
- ) {
143
+ if (instance.getRowModel().flatRows.some(row => row.getIsExpanded())) {
246
144
  return false
247
145
  }
248
146
 
@@ -264,56 +162,86 @@ export const Expanding = {
264
162
 
265
163
  return maxDepth
266
164
  },
267
- getExpandedRowModel: memo(
268
- () => [
269
- instance.getState().expanded,
270
- instance.getGroupedRowModel(),
271
- instance.options.expandRowsFn,
272
- instance.options.paginateExpandedRows,
273
- ],
274
- (expanded, rowModel, expandRowsFn, paginateExpandedRows) => {
275
- if (
276
- !expandRowsFn ||
277
- // Do not expand if rows are not included in pagination
278
- !paginateExpandedRows ||
279
- !Object.keys(expanded ?? {}).length
280
- ) {
281
- return rowModel
282
- }
165
+ getPreExpandedRowModel: () => instance.getGroupedRowModel(),
166
+ getExpandedRowModel: () => {
167
+ if (
168
+ !instance._getExpandedRowModel &&
169
+ instance.options.getExpandedRowModel
170
+ ) {
171
+ instance._getExpandedRowModel =
172
+ instance.options.getExpandedRowModel(instance)
173
+ }
283
174
 
284
- return expandRowsFn(instance, rowModel)
285
- },
286
- {
287
- key: 'getExpandedRowModel',
288
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
289
- onChange: () => {
290
- instance._notifyPageIndexReset()
291
- },
175
+ if (
176
+ instance.options.manualExpanding ||
177
+ !instance._getExpandedRowModel
178
+ ) {
179
+ return instance.getPreExpandedRowModel()
292
180
  }
293
- ),
294
181
 
295
- getPreExpandedRowModel: () => instance.getGroupedRowModel(),
182
+ return instance._getExpandedRowModel()
183
+ },
296
184
  }
297
185
  },
298
186
 
299
- createRow: <TGenerics extends PartialGenerics>(
187
+ createRow: <TGenerics extends TableGenerics>(
300
188
  row: Row<TGenerics>,
301
189
  instance: TableInstance<TGenerics>
302
190
  ): ExpandedRow => {
303
191
  return {
304
- toggleExpanded: expanded =>
305
- void instance.toggleRowExpanded(row.id, expanded),
306
- getIsExpanded: () => instance.getIsRowExpanded(row.id),
307
- getCanExpand: () => row.subRows && !!row.subRows.length,
308
- getToggleExpandedProps: userProps => {
309
- const initialProps: ToggleExpandedProps = {
310
- title: 'Toggle Row Expanded',
311
- onClick: (e: MouseEvent | TouchEvent) => {
312
- e.stopPropagation()
313
- instance.toggleRowExpanded(row.id)
314
- },
192
+ toggleExpanded: expanded => {
193
+ instance.setExpanded(old => {
194
+ const exists = old === true ? true : !!old?.[row.id]
195
+
196
+ let oldExpanded: ExpandedStateList = {}
197
+
198
+ if (old === true) {
199
+ Object.keys(instance.getRowModel().rowsById).forEach(rowId => {
200
+ oldExpanded[rowId] = true
201
+ })
202
+ } else {
203
+ oldExpanded = old
204
+ }
205
+
206
+ expanded = expanded ?? !exists
207
+
208
+ if (!exists && expanded) {
209
+ return {
210
+ ...oldExpanded,
211
+ [row.id]: true,
212
+ }
213
+ }
214
+
215
+ if (exists && !expanded) {
216
+ const { [row.id]: _, ...rest } = oldExpanded
217
+ return rest
218
+ }
219
+
220
+ return old
221
+ })
222
+ },
223
+ getIsExpanded: () => {
224
+ const expanded = instance.getState().expanded
225
+
226
+ return !!(
227
+ instance.options.getIsRowExpanded?.(row) ??
228
+ (expanded === true || expanded?.[row.id])
229
+ )
230
+ },
231
+ getCanExpand: () => {
232
+ return (
233
+ (instance.options.getRowCanExpand?.(row) ?? true) &&
234
+ (instance.options.enableExpanding ?? true) &&
235
+ !!row.subRows?.length
236
+ )
237
+ },
238
+ getToggleExpandedHandler: () => {
239
+ const canExpand = row.getCanExpand()
240
+
241
+ return () => {
242
+ if (!canExpand) return
243
+ row.toggleExpanded()
315
244
  }
316
- return propGetter(initialProps, userProps)
317
245
  },
318
246
  }
319
247
  },