@tanstack/table-core 8.0.0-alpha.9 → 8.0.0-beta.2

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/aggregationFns.ts +123 -0
  105. package/src/core/cell.ts +48 -0
  106. package/src/core/column.ts +147 -0
  107. package/src/core/headers.ts +575 -0
  108. package/src/core/instance.ts +359 -0
  109. package/src/core/row.ts +85 -0
  110. package/src/createTable.ts +188 -0
  111. package/src/features/ColumnSizing.ts +170 -185
  112. package/src/features/Expanding.ts +120 -194
  113. package/src/features/Filters.ts +299 -381
  114. package/src/features/Grouping.ts +158 -220
  115. package/src/features/Ordering.ts +24 -25
  116. package/src/features/Pagination.ts +88 -73
  117. package/src/features/Pinning.ts +186 -63
  118. package/src/features/RowSelection.ts +107 -245
  119. package/src/features/Sorting.ts +125 -225
  120. package/src/features/Visibility.ts +116 -132
  121. package/src/filterFns.ts +135 -0
  122. package/src/index.ts +29 -0
  123. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  124. package/src/types.ts +62 -168
  125. package/src/utils/filterRowsUtils.ts +112 -0
  126. package/src/utils/getCoreRowModel.ts +84 -0
  127. package/src/utils/getExpandedRowModel.ts +54 -0
  128. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  129. package/src/utils/getFacetedRowModel.ts +50 -0
  130. package/src/utils/getFacetedUniqueValues.ts +37 -0
  131. package/src/utils/getFilteredRowModel.ts +159 -0
  132. package/src/utils/getGroupedRowModel.ts +175 -0
  133. package/src/utils/getPaginationRowModel.ts +48 -0
  134. package/src/utils/getSortedRowModel.ts +116 -0
  135. package/src/utils.ts +126 -0
  136. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  138. package/build/cjs/aggregationTypes.js +0 -130
  139. package/build/cjs/aggregationTypes.js.map +0 -1
  140. package/build/cjs/core.js +0 -545
  141. package/build/cjs/core.js.map +0 -1
  142. package/build/cjs/features/Headers.js +0 -630
  143. package/build/cjs/features/Headers.js.map +0 -1
  144. package/build/cjs/filterTypes.js +0 -172
  145. package/build/cjs/filterTypes.js.map +0 -1
  146. package/build/cjs/sortTypes.js +0 -122
  147. package/build/cjs/sortTypes.js.map +0 -1
  148. package/build/cjs/types.js +0 -22
  149. package/build/cjs/types.js.map +0 -1
  150. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  151. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  152. package/build/cjs/utils/expandRowsFn.js +0 -38
  153. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  154. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  155. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  156. package/build/cjs/utils/groupRowsFn.js +0 -155
  157. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  158. package/build/cjs/utils/paginateRowsFn.js +0 -44
  159. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  160. package/build/cjs/utils/sortRowsFn.js +0 -94
  161. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  162. package/build/types/aggregationTypes.d.ts +0 -22
  163. package/build/types/core.d.ts +0 -105
  164. package/build/types/features/Headers.d.ts +0 -43
  165. package/build/types/filterTypes.d.ts +0 -50
  166. package/build/types/sortTypes.d.ts +0 -18
  167. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  168. package/build/types/utils/expandRowsFn.d.ts +0 -2
  169. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  170. package/build/types/utils/groupRowsFn.d.ts +0 -2
  171. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  172. package/build/types/utils/sortRowsFn.d.ts +0 -2
  173. package/src/.DS_Store +0 -0
  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,67 @@ 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?: (instance: TableInstance<any>) => () => RowModel<any>
39
31
  getIsRowExpanded?: (row: Row<TGenerics>) => boolean
40
32
  getRowCanExpand?: (row: Row<TGenerics>) => boolean
41
33
  paginateExpandedRows?: boolean
42
34
  }
43
35
 
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
36
+ export type ExpandedInstance<TGenerics extends TableGenerics> = {
37
+ _autoResetExpanded: () => void
51
38
  setExpanded: (updater: Updater<ExpandedState>) => void
52
- toggleRowExpanded: (rowId: string, expanded?: boolean) => void
53
39
  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>
40
+ resetExpanded: (defaultState?: boolean) => void
41
+ getCanSomeRowsExpand: () => boolean
42
+ getToggleAllRowsExpandedHandler: () => (event: unknown) => void
43
+ getIsSomeRowsExpanded: () => boolean
64
44
  getIsAllRowsExpanded: () => boolean
65
45
  getExpandedDepth: () => number
66
46
  getExpandedRowModel: () => RowModel<TGenerics>
47
+ _getExpandedRowModel?: () => RowModel<TGenerics>
67
48
  getPreExpandedRowModel: () => RowModel<TGenerics>
68
49
  }
69
50
 
70
51
  //
71
52
 
72
- export const Expanding = {
73
- getInitialState: (): ExpandedTableState => {
53
+ export const Expanding: TableFeature = {
54
+ getInitialState: (state): ExpandedTableState => {
74
55
  return {
75
56
  expanded: {},
57
+ ...state,
76
58
  }
77
59
  },
78
60
 
79
- getDefaultOptions: <TGenerics extends PartialGenerics>(
61
+ getDefaultOptions: <TGenerics extends TableGenerics>(
80
62
  instance: TableInstance<TGenerics>
81
63
  ): ExpandedOptions<TGenerics> => {
82
64
  return {
83
65
  onExpandedChange: makeStateUpdater('expanded', instance),
84
66
  autoResetExpanded: true,
85
- getIsRowExpanded: row => !!(row?.original as { expanded?: any }).expanded,
86
- expandSubRows: true,
87
67
  paginateExpandedRows: true,
88
68
  }
89
69
  },
90
70
 
91
- getInstance: <TGenerics extends PartialGenerics>(
71
+ createInstance: <TGenerics extends TableGenerics>(
92
72
  instance: TableInstance<TGenerics>
93
73
  ): ExpandedInstance<TGenerics> => {
94
74
  let registered = false
75
+ let queued = false
95
76
 
96
77
  return {
97
- _notifyExpandedReset: () => {
78
+ _autoResetExpanded: () => {
98
79
  if (!registered) {
99
- registered = true
80
+ instance._queue(() => {
81
+ registered = true
82
+ })
100
83
  return
101
84
  }
102
85
 
@@ -108,47 +91,15 @@ export const Expanding = {
108
91
  instance.options.autoResetAll === true ||
109
92
  instance.options.autoResetExpanded
110
93
  ) {
111
- instance.resetExpanded()
94
+ if (queued) return
95
+ queued = true
96
+ instance._queue(() => {
97
+ instance.resetExpanded()
98
+ queued = false
99
+ })
112
100
  }
113
101
  },
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
- },
102
+ setExpanded: updater => instance.options.onExpandedChange?.(updater),
152
103
  toggleAllRowsExpanded: expanded => {
153
104
  if (expanded ?? !instance.getIsAllRowsExpanded()) {
154
105
  instance.setExpanded(true)
@@ -156,93 +107,38 @@ export const Expanding = {
156
107
  instance.setExpanded({})
157
108
  }
158
109
  },
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])
110
+ resetExpanded: defaultState => {
111
+ instance.setExpanded(
112
+ defaultState ? {} : instance.initialState?.expanded ?? {}
179
113
  )
180
114
  },
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
- )
115
+ getCanSomeRowsExpand: () => {
116
+ return instance.getRowModel().flatRows.some(row => row.getCanExpand())
199
117
  },
200
- getToggleExpandedProps: (rowId, userProps) => {
201
- const row = instance.getRow(rowId)
202
-
203
- if (!row) {
204
- return
118
+ getToggleAllRowsExpandedHandler: () => {
119
+ return (e: unknown) => {
120
+ ;(e as any).persist?.()
121
+ instance.toggleAllRowsExpanded()
205
122
  }
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,
217
- }
218
-
219
- return propGetter(initialProps, userProps)
220
123
  },
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)
124
+ getIsSomeRowsExpanded: () => {
125
+ const expanded = instance.getState().expanded
126
+ return expanded === true || Object.values(expanded).some(Boolean)
231
127
  },
232
128
  getIsAllRowsExpanded: () => {
233
129
  const expanded = instance.getState().expanded
234
130
 
235
131
  // If expanded is true, save some cycles and return true
236
- if (expanded === true) {
237
- return true
132
+ if (typeof expanded === 'boolean') {
133
+ return expanded === true
134
+ }
135
+
136
+ if (!Object.keys(expanded).length) {
137
+ return false
238
138
  }
239
139
 
240
140
  // If any row is not expanded, return false
241
- if (
242
- Object.keys(instance.getRowModel().rowsById).some(
243
- id => !instance.getIsRowExpanded(id)
244
- )
245
- ) {
141
+ if (instance.getRowModel().flatRows.some(row => row.getIsExpanded())) {
246
142
  return false
247
143
  }
248
144
 
@@ -264,56 +160,86 @@ export const Expanding = {
264
160
 
265
161
  return maxDepth
266
162
  },
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
- }
163
+ getPreExpandedRowModel: () => instance.getGroupedRowModel(),
164
+ getExpandedRowModel: () => {
165
+ if (
166
+ !instance._getExpandedRowModel &&
167
+ instance.options.getExpandedRowModel
168
+ ) {
169
+ instance._getExpandedRowModel =
170
+ instance.options.getExpandedRowModel(instance)
171
+ }
283
172
 
284
- return expandRowsFn(instance, rowModel)
285
- },
286
- {
287
- key: 'getExpandedRowModel',
288
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
289
- onChange: () => {
290
- instance._notifyPageIndexReset()
291
- },
173
+ if (
174
+ instance.options.manualExpanding ||
175
+ !instance._getExpandedRowModel
176
+ ) {
177
+ return instance.getPreExpandedRowModel()
292
178
  }
293
- ),
294
179
 
295
- getPreExpandedRowModel: () => instance.getGroupedRowModel(),
180
+ return instance._getExpandedRowModel()
181
+ },
296
182
  }
297
183
  },
298
184
 
299
- createRow: <TGenerics extends PartialGenerics>(
185
+ createRow: <TGenerics extends TableGenerics>(
300
186
  row: Row<TGenerics>,
301
187
  instance: TableInstance<TGenerics>
302
188
  ): ExpandedRow => {
303
189
  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
- },
190
+ toggleExpanded: expanded => {
191
+ instance.setExpanded(old => {
192
+ const exists = old === true ? true : !!old?.[row.id]
193
+
194
+ let oldExpanded: ExpandedStateList = {}
195
+
196
+ if (old === true) {
197
+ Object.keys(instance.getRowModel().rowsById).forEach(rowId => {
198
+ oldExpanded[rowId] = true
199
+ })
200
+ } else {
201
+ oldExpanded = old
202
+ }
203
+
204
+ expanded = expanded ?? !exists
205
+
206
+ if (!exists && expanded) {
207
+ return {
208
+ ...oldExpanded,
209
+ [row.id]: true,
210
+ }
211
+ }
212
+
213
+ if (exists && !expanded) {
214
+ const { [row.id]: _, ...rest } = oldExpanded
215
+ return rest
216
+ }
217
+
218
+ return old
219
+ })
220
+ },
221
+ getIsExpanded: () => {
222
+ const expanded = instance.getState().expanded
223
+
224
+ return !!(
225
+ instance.options.getIsRowExpanded?.(row) ??
226
+ (expanded === true || expanded?.[row.id])
227
+ )
228
+ },
229
+ getCanExpand: () => {
230
+ return (
231
+ (instance.options.getRowCanExpand?.(row) ?? true) &&
232
+ (instance.options.enableExpanding ?? true) &&
233
+ !!row.subRows?.length
234
+ )
235
+ },
236
+ getToggleExpandedHandler: () => {
237
+ const canExpand = row.getCanExpand()
238
+
239
+ return () => {
240
+ if (!canExpand) return
241
+ row.toggleExpanded()
315
242
  }
316
- return propGetter(initialProps, userProps)
317
243
  },
318
244
  }
319
245
  },