@tanstack/react-table 8.0.0-alpha.1 → 8.0.0-alpha.4

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 (100) hide show
  1. package/build/cjs/core.js +118 -59
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/createTable.js +11 -6
  4. package/build/cjs/createTable.js.map +1 -1
  5. package/build/cjs/features/ColumnSizing.js +317 -0
  6. package/build/cjs/features/ColumnSizing.js.map +1 -0
  7. package/build/cjs/features/Expanding.js +23 -2
  8. package/build/cjs/features/Expanding.js.map +1 -1
  9. package/build/cjs/features/Filters.js +54 -5
  10. package/build/cjs/features/Filters.js.map +1 -1
  11. package/build/cjs/features/Grouping.js +23 -2
  12. package/build/cjs/features/Grouping.js.map +1 -1
  13. package/build/cjs/features/Headers.js +88 -22
  14. package/build/cjs/features/Headers.js.map +1 -1
  15. package/build/cjs/features/Ordering.js +4 -1
  16. package/build/cjs/features/Ordering.js.map +1 -1
  17. package/build/cjs/features/Pagination.js +198 -0
  18. package/build/cjs/features/Pagination.js.map +1 -0
  19. package/build/cjs/features/Pinning.js +0 -14
  20. package/build/cjs/features/Pinning.js.map +1 -1
  21. package/build/cjs/features/RowSelection.js +541 -0
  22. package/build/cjs/features/RowSelection.js.map +1 -0
  23. package/build/cjs/features/Sorting.js +76 -18
  24. package/build/cjs/features/Sorting.js.map +1 -1
  25. package/build/cjs/features/Visibility.js +8 -2
  26. package/build/cjs/features/Visibility.js.map +1 -1
  27. package/build/cjs/index.js +2 -0
  28. package/build/cjs/index.js.map +1 -1
  29. package/build/cjs/sortTypes.js +1 -0
  30. package/build/cjs/sortTypes.js.map +1 -1
  31. package/build/cjs/utils/columnFilterRowsFn.js +3 -2
  32. package/build/cjs/utils/columnFilterRowsFn.js.map +1 -1
  33. package/build/cjs/utils/expandRowsFn.js +2 -2
  34. package/build/cjs/utils/expandRowsFn.js.map +1 -1
  35. package/build/cjs/utils/globalFilterRowsFn.js +3 -2
  36. package/build/cjs/utils/globalFilterRowsFn.js.map +1 -1
  37. package/build/cjs/utils/groupRowsFn.js +4 -3
  38. package/build/cjs/utils/groupRowsFn.js.map +1 -1
  39. package/build/cjs/utils/paginateRowsFn.js +44 -0
  40. package/build/cjs/utils/paginateRowsFn.js.map +1 -0
  41. package/build/cjs/utils/sortRowsFn.js +3 -2
  42. package/build/cjs/utils/sortRowsFn.js.map +1 -1
  43. package/build/cjs/utils.js +6 -3
  44. package/build/cjs/utils.js.map +1 -1
  45. package/build/esm/index.js +1613 -225
  46. package/build/esm/index.js.map +1 -1
  47. package/build/stats-html.html +1 -1
  48. package/build/stats-react.json +363 -217
  49. package/build/types/core.d.ts +14 -25
  50. package/build/types/createTable.d.ts +21 -3
  51. package/build/types/features/ColumnSizing.d.ts +67 -0
  52. package/build/types/features/Expanding.d.ts +2 -1
  53. package/build/types/features/Filters.d.ts +7 -2
  54. package/build/types/features/Grouping.d.ts +2 -2
  55. package/build/types/features/Ordering.d.ts +1 -1
  56. package/build/types/features/Pagination.d.ts +44 -0
  57. package/build/types/features/Pinning.d.ts +3 -3
  58. package/build/types/features/RowSelection.d.ts +66 -0
  59. package/build/types/features/Sorting.d.ts +5 -2
  60. package/build/types/index.d.ts +1 -0
  61. package/build/types/sortTypes.d.ts +5 -4
  62. package/build/types/types.d.ts +13 -8
  63. package/build/types/utils/columnFilterRowsFn.d.ts +2 -2
  64. package/build/types/utils/expandRowsFn.d.ts +2 -2
  65. package/build/types/utils/globalFilterRowsFn.d.ts +2 -2
  66. package/build/types/utils/groupRowsFn.d.ts +2 -2
  67. package/build/types/utils/paginateRowsFn.d.ts +2 -0
  68. package/build/types/utils/sortRowsFn.d.ts +2 -2
  69. package/build/types/utils.d.ts +7 -3
  70. package/build/umd/index.development.js +1613 -224
  71. package/build/umd/index.development.js.map +1 -1
  72. package/build/umd/index.production.js +1 -1
  73. package/build/umd/index.production.js.map +1 -1
  74. package/package.json +1 -1
  75. package/src/core.tsx +252 -265
  76. package/src/createTable.tsx +69 -9
  77. package/src/features/ColumnSizing.ts +453 -0
  78. package/src/features/Expanding.ts +27 -11
  79. package/src/features/Filters.ts +75 -20
  80. package/src/features/Grouping.ts +27 -12
  81. package/src/features/Headers.ts +55 -50
  82. package/src/features/Ordering.ts +2 -3
  83. package/src/features/Pagination.ts +327 -0
  84. package/src/features/Pinning.ts +3 -16
  85. package/src/features/RowSelection.ts +831 -0
  86. package/src/features/Sorting.ts +82 -22
  87. package/src/features/Visibility.ts +2 -4
  88. package/src/index.tsx +1 -0
  89. package/src/sortTypes.ts +1 -1
  90. package/src/types.ts +55 -9
  91. package/src/utils/columnFilterRowsFn.ts +5 -12
  92. package/src/utils/expandRowsFn.ts +2 -5
  93. package/src/utils/globalFilterRowsFn.ts +3 -10
  94. package/src/utils/groupRowsFn.ts +3 -5
  95. package/src/utils/paginateRowsFn.ts +34 -0
  96. package/src/utils/sortRowsFn.ts +5 -5
  97. package/src/utils.tsx +20 -6
  98. package/src/features/withColumnResizing.oldts +0 -281
  99. package/src/features/withPagination.oldts +0 -208
  100. package/src/features/withRowSelection.oldts +0 -467
@@ -1,11 +1,18 @@
1
1
  import * as React from 'react'
2
2
  import { Cell, Column, Row } from '.'
3
3
  import { createTableInstance } from './core'
4
- import { ReactTable, ColumnDef, AccessorFn, Options } from './types'
4
+ import {
5
+ ReactTable,
6
+ ColumnDef,
7
+ AccessorFn,
8
+ Options,
9
+ Renderable,
10
+ Header,
11
+ } from './types'
5
12
  import { Overwrite } from './utils'
6
13
 
7
14
  type TableHelper<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
8
- RowType: <TTData>() => TableHelper<
15
+ RowType<TTData>(): TableHelper<
9
16
  TTData,
10
17
  TValue,
11
18
  TFilterFns,
@@ -36,13 +43,57 @@ type TableHelper<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
36
43
  ) => ColumnDef<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[]
37
44
 
38
45
  createGroup: (
46
+ column: Overwrite<
47
+ ColumnDef<TData, unknown, TFilterFns, TSortingFns, TAggregationFns>,
48
+ | {
49
+ __generated?: never
50
+ accessorFn?: never
51
+ accessorKey?: never
52
+ header: string
53
+ id?: string
54
+ }
55
+ | {
56
+ __generated?: never
57
+ accessorFn?: never
58
+ accessorKey?: never
59
+ id: string
60
+ header?:
61
+ | string
62
+ | Renderable<{
63
+ instance: ReactTable<
64
+ TData,
65
+ TValue,
66
+ TFilterFns,
67
+ TSortingFns,
68
+ TAggregationFns
69
+ >
70
+ header: Header<
71
+ TData,
72
+ TValue,
73
+ TFilterFns,
74
+ TSortingFns,
75
+ TAggregationFns
76
+ >
77
+ column: Column<
78
+ TData,
79
+ TValue,
80
+ TFilterFns,
81
+ TSortingFns,
82
+ TAggregationFns
83
+ >
84
+ }>
85
+ }
86
+ >
87
+ ) => ColumnDef<TData, unknown, TFilterFns, TSortingFns, TAggregationFns>
88
+
89
+ createDisplayColumn: (
39
90
  column: Overwrite<
40
91
  ColumnDef<TData, unknown, TFilterFns, TSortingFns, TAggregationFns>,
41
92
  { __generated?: never; accessorFn?: never; accessorKey?: never }
42
93
  >
43
94
  ) => ColumnDef<TData, unknown, TFilterFns, TSortingFns, TAggregationFns>
44
95
 
45
- createColumn: <TAccessor extends AccessorFn<TData> | keyof TData>(
96
+ createDataColumn: <TAccessor extends AccessorFn<TData> | keyof TData>(
46
97
  accessor: TAccessor,
47
98
  column: TAccessor extends (...args: any[]) => any
48
99
  ? // Accessor Fn
@@ -71,7 +122,12 @@ type TableHelper<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
71
122
  TSortingFns,
72
123
  TAggregationFns
73
124
  >,
74
- { __generated?: never; accessorFn?: never; accessorKey?: never }
125
+ {
126
+ __generated?: never
127
+ accessorFn?: never
128
+ accessorKey?: never
129
+ id?: string
130
+ }
75
131
  >
76
132
  : never
77
133
  ) => ColumnDef<
@@ -124,7 +180,15 @@ export function createTable<
124
180
  SortingFns: () => createTable(),
125
181
  AggregationFns: () => createTable(),
126
182
  createColumns: columns => columns,
127
- createColumn: (accessor, column) => {
183
+ createDisplayColumn: column => ({
184
+ ...column,
185
+ __generated: true,
186
+ }),
187
+ createGroup: column => ({
188
+ ...column,
189
+ __generated: true,
190
+ }),
191
+ createDataColumn: (accessor, column) => {
128
192
  column = {
129
193
  ...column,
130
194
  id: column.id,
@@ -149,10 +213,6 @@ export function createTable<
149
213
 
150
214
  throw new Error('Invalid accessor')
151
215
  },
152
- createGroup: column => ({
153
- ...column,
154
- __generated: true,
155
- }),
156
216
  useTable: <TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
157
217
  options: Options<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
158
218
  ): ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
@@ -0,0 +1,453 @@
1
+ import React, {
2
+ ComponentProps,
3
+ MouseEvent as ReactMouseEvent,
4
+ PropsWithoutRef,
5
+ PropsWithRef,
6
+ TouchEvent as ReactTouchEvent,
7
+ } from 'react'
8
+ import {
9
+ Column,
10
+ Getter,
11
+ Header,
12
+ OnChangeFn,
13
+ PropGetterValue,
14
+ ReactTable,
15
+ Updater,
16
+ } from '../types'
17
+ import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
18
+
19
+ //
20
+
21
+ export type ColumnSizing = Record<string, number>
22
+
23
+ export type ColumnSizingInfoState = {
24
+ startOffset: null | number
25
+ startSize: null | number
26
+ deltaOffset: null | number
27
+ deltaPercentage: null | number
28
+ isResizingColumn: false | string
29
+ columnSizingStart: [string, number][]
30
+ }
31
+
32
+ export type ColumnSizingTableState = {
33
+ columnSizing: ColumnSizing
34
+ columnSizingInfo: ColumnSizingInfoState
35
+ }
36
+
37
+ export type ColumnResizeMode = 'onChange' | 'onEnd'
38
+
39
+ export type ColumnSizingOptions = {
40
+ enableColumnResizing?: boolean
41
+ columnResizeMode?: ColumnResizeMode
42
+ onColumnSizingChange?: OnChangeFn<ColumnSizing>
43
+ onColumnSizingInfoChange?: OnChangeFn<ColumnSizingInfoState>
44
+ }
45
+
46
+ export type ColumnSizingDefaultOptions = {
47
+ columnResizeMode: ColumnResizeMode
48
+ onColumnSizingChange: OnChangeFn<ColumnSizing>
49
+ onColumnSizingInfoChange: OnChangeFn<ColumnSizingInfoState>
50
+ }
51
+
52
+ export type ColumnResizerProps = {
53
+ title?: string
54
+ onMouseDown?: (e: ReactMouseEvent) => void
55
+ onTouchStart?: (e: ReactTouchEvent) => void
56
+ draggable?: boolean
57
+ role?: string
58
+ }
59
+
60
+ export type ColumnSizingInstance<
61
+ TData,
62
+ TValue,
63
+ TFilterFns,
64
+ TSortingFns,
65
+ TAggregationFns
66
+ > = {
67
+ setColumnSizing: (updater: Updater<ColumnSizing>) => void
68
+ setColumnSizingInfo: (updater: Updater<ColumnSizingInfoState>) => void
69
+ resetColumnSizing: () => void
70
+ resetColumnSize: (columnId: string) => void
71
+ resetHeaderSize: (headerId: string) => void
72
+ resetHeaderSizeInfo: () => void
73
+ getColumnCanResize: (columnId: string) => boolean
74
+ getHeaderCanResize: (headerId: string) => boolean
75
+ getColumnResizerProps: <TGetter extends Getter<ColumnResizerProps>>(
76
+ columnId: string,
77
+ userProps?: TGetter
78
+ ) => undefined | PropGetterValue<ColumnResizerProps, TGetter>
79
+ getColumnIsResizing: (columnId: string) => boolean
80
+ getHeaderIsResizing: (headerId: string) => boolean
81
+ }
82
+
83
+ export type ColumnSizingColumnDef = {
84
+ enableResizing?: boolean
85
+ defaultCanResize?: boolean
86
+ }
87
+
88
+ export type ColumnSizingColumn<
89
+ TData,
90
+ TValue,
91
+ TFilterFns,
92
+ TSortingFns,
93
+ TAggregationFns
94
+ > = {
95
+ getCanResize: () => boolean
96
+ getIsResizing: () => boolean
97
+ getResizerProps: <TGetter extends Getter<ColumnResizerProps>>(
98
+ userProps?: TGetter
99
+ ) => undefined | PropGetterValue<ColumnResizerProps, TGetter>
100
+ resetSize: () => void
101
+ }
102
+
103
+ //
104
+
105
+ export const defaultColumnSizing = {
106
+ width: 150,
107
+ minWidth: 20,
108
+ maxWidth: Number.MAX_SAFE_INTEGER,
109
+ }
110
+
111
+ export function getInitialState(): ColumnSizingTableState {
112
+ return {
113
+ columnSizing: {},
114
+ columnSizingInfo: {
115
+ startOffset: null,
116
+ startSize: null,
117
+ deltaOffset: null,
118
+ deltaPercentage: null,
119
+ isResizingColumn: false,
120
+ columnSizingStart: [],
121
+ },
122
+ }
123
+ }
124
+
125
+ export function getDefaultOptions<
126
+ TData,
127
+ TValue,
128
+ TFilterFns,
129
+ TSortingFns,
130
+ TAggregationFns
131
+ >(
132
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
133
+ ): ColumnSizingDefaultOptions {
134
+ return {
135
+ columnResizeMode: 'onEnd',
136
+ onColumnSizingChange: makeStateUpdater('columnSizing', instance),
137
+ onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', instance),
138
+ }
139
+ }
140
+
141
+ export function getInstance<
142
+ TData,
143
+ TValue,
144
+ TFilterFns,
145
+ TSortingFns,
146
+ TAggregationFns
147
+ >(
148
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
149
+ ): ColumnSizingInstance<
150
+ TData,
151
+ TValue,
152
+ TFilterFns,
153
+ TSortingFns,
154
+ TAggregationFns
155
+ > {
156
+ return {
157
+ setColumnSizing: updater =>
158
+ instance.options.onColumnSizingChange?.(
159
+ updater,
160
+ functionalUpdate(updater, instance.getState().columnSizing)
161
+ ),
162
+ setColumnSizingInfo: updater =>
163
+ instance.options.onColumnSizingInfoChange?.(
164
+ updater,
165
+ functionalUpdate(updater, instance.getState().columnSizingInfo)
166
+ ),
167
+ resetColumnSizing: () => {
168
+ instance.setColumnSizing(instance.initialState.columnSizing ?? {})
169
+ },
170
+ resetHeaderSizeInfo: () => {
171
+ instance.setColumnSizingInfo(instance.initialState.columnSizingInfo ?? {})
172
+ },
173
+ resetColumnSize: columnId => {
174
+ instance.setColumnSizing(({ [columnId]: _, ...rest }) => {
175
+ return rest
176
+ })
177
+ },
178
+ resetHeaderSize: headerId => {
179
+ const header = instance.getHeader(headerId)
180
+
181
+ if (!header) {
182
+ return
183
+ }
184
+
185
+ return instance.resetColumnSize(header.column.id)
186
+ },
187
+ getHeaderCanResize: headerId => {
188
+ const header = instance.getHeader(headerId)
189
+
190
+ if (!header) {
191
+ throw new Error()
192
+ }
193
+
194
+ return instance.getColumnCanResize(header.column.id)
195
+ },
196
+ getColumnCanResize: columnId => {
197
+ const column = instance.getColumn(columnId)
198
+
199
+ if (!column) {
200
+ throw new Error()
201
+ }
202
+
203
+ return (
204
+ column.enableResizing ??
205
+ instance.options.enableColumnResizing ??
206
+ column.defaultCanResize ??
207
+ true
208
+ )
209
+ },
210
+ getColumnIsResizing: columnId => {
211
+ const column = instance.getColumn(columnId)
212
+
213
+ if (!column) {
214
+ throw new Error()
215
+ }
216
+
217
+ return instance.getState().columnSizingInfo.isResizingColumn === columnId
218
+ },
219
+ getHeaderIsResizing: headerId => {
220
+ const header = instance.getHeader(headerId)
221
+
222
+ if (!header) {
223
+ throw new Error()
224
+ }
225
+
226
+ return instance.getColumnIsResizing(header.column.id)
227
+ },
228
+ getColumnResizerProps: (headerId, userProps) => {
229
+ const header = instance.getHeader(headerId)
230
+
231
+ if (!header) {
232
+ return
233
+ }
234
+
235
+ const column = instance.getColumn(header.column.id)
236
+
237
+ if (!column) {
238
+ return
239
+ }
240
+
241
+ const canResize = column.getCanResize()
242
+
243
+ const onResizeStart = (e: ReactMouseEvent | ReactTouchEvent) => {
244
+ if (isTouchStartEvent(e)) {
245
+ // lets not respond to multiple touches (e.g. 2 or 3 fingers)
246
+ if (e.touches && e.touches.length > 1) {
247
+ return
248
+ }
249
+ }
250
+
251
+ const columnSizingStart: [string, number][] = header
252
+ .getLeafHeaders()
253
+ .map(d => [d.column.id, d.getWidth()])
254
+
255
+ const clientX = isTouchStartEvent(e)
256
+ ? Math.round(e.touches[0].clientX)
257
+ : e.clientX
258
+
259
+ const updateOffset = (
260
+ eventType: 'move' | 'end',
261
+ clientXPos?: number
262
+ ) => {
263
+ if (typeof clientXPos !== 'number') {
264
+ return
265
+ }
266
+
267
+ let newColumnSizing: ColumnSizing = {}
268
+
269
+ instance.setColumnSizingInfo(old => {
270
+ const deltaOffset = clientXPos - (old?.startOffset ?? 0)
271
+ const deltaPercentage = Math.max(
272
+ deltaOffset / (old?.startSize ?? 0),
273
+ -0.999999
274
+ )
275
+
276
+ old.columnSizingStart.forEach(([columnId, headerWidth]) => {
277
+ newColumnSizing[columnId] = Math.max(
278
+ headerWidth + headerWidth * deltaPercentage,
279
+ 0
280
+ )
281
+ })
282
+
283
+ return {
284
+ ...old,
285
+ deltaOffset,
286
+ deltaPercentage,
287
+ }
288
+ })
289
+
290
+ if (
291
+ instance.options.columnResizeMode === 'onChange' ||
292
+ eventType === 'end'
293
+ ) {
294
+ instance.setColumnSizing(old => ({
295
+ ...old,
296
+ ...newColumnSizing,
297
+ }))
298
+ }
299
+ }
300
+
301
+ const onMove = (clientXPos?: number) => updateOffset('move', clientXPos)
302
+
303
+ const onEnd = (clientXPos?: number) => {
304
+ updateOffset('end', clientXPos)
305
+
306
+ instance.setColumnSizingInfo(old => ({
307
+ ...old,
308
+ isResizingColumn: false,
309
+ startOffset: null,
310
+ startSize: null,
311
+ deltaOffset: null,
312
+ deltaPercentage: null,
313
+ columnSizingStart: [],
314
+ }))
315
+ }
316
+
317
+ const mouseEvents = {
318
+ moveHandler: (e: MouseEvent) => onMove(e.clientX),
319
+ upHandler: (e: MouseEvent) => {
320
+ document.removeEventListener('mousemove', mouseEvents.moveHandler)
321
+ document.removeEventListener('mouseup', mouseEvents.upHandler)
322
+ onEnd(e.clientX)
323
+ },
324
+ }
325
+
326
+ const touchEvents = {
327
+ moveHandler: (e: TouchEvent) => {
328
+ if (e.cancelable) {
329
+ e.preventDefault()
330
+ e.stopPropagation()
331
+ }
332
+ onMove(e.touches[0].clientX)
333
+ return false
334
+ },
335
+ upHandler: (e: TouchEvent) => {
336
+ document.removeEventListener('touchmove', touchEvents.moveHandler)
337
+ document.removeEventListener('touchend', touchEvents.upHandler)
338
+ if (e.cancelable) {
339
+ e.preventDefault()
340
+ e.stopPropagation()
341
+ }
342
+ onEnd(e.touches[0].clientX)
343
+ },
344
+ }
345
+
346
+ const passiveIfSupported = passiveEventSupported()
347
+ ? { passive: false }
348
+ : false
349
+
350
+ if (isTouchStartEvent(e)) {
351
+ document.addEventListener(
352
+ 'touchmove',
353
+ touchEvents.moveHandler,
354
+ passiveIfSupported
355
+ )
356
+ document.addEventListener(
357
+ 'touchend',
358
+ touchEvents.upHandler,
359
+ passiveIfSupported
360
+ )
361
+ } else {
362
+ document.addEventListener(
363
+ 'mousemove',
364
+ mouseEvents.moveHandler,
365
+ passiveIfSupported
366
+ )
367
+ document.addEventListener(
368
+ 'mouseup',
369
+ mouseEvents.upHandler,
370
+ passiveIfSupported
371
+ )
372
+ }
373
+
374
+ instance.setColumnSizingInfo(old => ({
375
+ ...old,
376
+ startOffset: clientX,
377
+ startSize: header.getWidth(),
378
+ deltaOffset: 0,
379
+ deltaPercentage: 0,
380
+ columnSizingStart,
381
+ isResizingColumn: header.column.id,
382
+ }))
383
+ }
384
+
385
+ const initialProps: ColumnResizerProps = canResize
386
+ ? {
387
+ title: 'Toggle Grouping',
388
+ draggable: false,
389
+ role: 'separator',
390
+ onMouseDown: (e: ReactMouseEvent) => {
391
+ e.persist()
392
+ onResizeStart(e)
393
+ },
394
+ onTouchStart: (e: ReactTouchEvent) => {
395
+ e.persist()
396
+ onResizeStart(e)
397
+ },
398
+ }
399
+ : {}
400
+
401
+ return propGetter(initialProps, userProps)
402
+ },
403
+ }
404
+ }
405
+
406
+ export function createColumn<
407
+ TData,
408
+ TValue,
409
+ TFilterFns,
410
+ TSortingFns,
411
+ TAggregationFns
412
+ >(
413
+ column: Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
414
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
415
+ ): ColumnSizingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> {
416
+ return {
417
+ getIsResizing: () => instance.getColumnIsResizing(column.id),
418
+ getCanResize: () => instance.getColumnCanResize(column.id),
419
+ resetSize: () => instance.resetColumnSize(column.id),
420
+ getResizerProps: userProps =>
421
+ instance.getColumnResizerProps(column.id, userProps),
422
+ }
423
+ }
424
+
425
+ let passiveSupported: boolean | null = null
426
+ export function passiveEventSupported() {
427
+ if (typeof passiveSupported === 'boolean') return passiveSupported
428
+
429
+ let supported = false
430
+ try {
431
+ const options = {
432
+ get passive() {
433
+ supported = true
434
+ return false
435
+ },
436
+ }
437
+
438
+ const noop = () => {}
439
+
440
+ window.addEventListener('test', noop, options)
441
+ window.removeEventListener('test', noop)
442
+ } catch (err) {
443
+ supported = false
444
+ }
445
+ passiveSupported = supported
446
+ return passiveSupported
447
+ }
448
+
449
+ function isTouchStartEvent(
450
+ e: ReactTouchEvent | ReactMouseEvent
451
+ ): e is ReactTouchEvent {
452
+ return e.type === 'touchstart'
453
+ }
@@ -43,14 +43,7 @@ export type ExpandedOptions<
43
43
  TSortingFns,
44
44
  TAggregationFns
45
45
  >,
46
- expandedState: ExpandedState,
47
- groupedRowModel: RowModel<
48
- TData,
49
- TValue,
50
- TFilterFns,
51
- TSortingFns,
52
- TAggregationFns
53
- >
46
+ rowModel: RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
54
47
  ) => RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
55
48
  expandSubRows?: boolean
56
49
  defaultCanExpand?: boolean
@@ -75,6 +68,7 @@ export type ExpandedInstance<
75
68
  TSortingFns,
76
69
  TAggregationFns
77
70
  > = {
71
+ _notifyExpandedReset: () => void
78
72
  setExpanded: (updater: Updater<ExpandedState>) => void
79
73
  toggleRowExpanded: (rowId: string, expanded?: boolean) => void
80
74
  toggleAllRowsExpanded: (expanded?: boolean) => void
@@ -170,7 +164,26 @@ export function getInstance<
170
164
  >(
171
165
  instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
172
166
  ): ExpandedInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> {
167
+ let registered = false
168
+
173
169
  return {
170
+ _notifyExpandedReset: () => {
171
+ if (!registered) {
172
+ registered = true
173
+ return
174
+ }
175
+
176
+ if (instance.options.autoResetAll === false) {
177
+ return
178
+ }
179
+
180
+ if (
181
+ instance.options.autoResetAll === true ||
182
+ instance.options.autoResetExpanded
183
+ ) {
184
+ instance.resetExpanded()
185
+ }
186
+ },
174
187
  setExpanded: updater =>
175
188
  instance.options.onExpandedChange?.(
176
189
  updater,
@@ -344,10 +357,13 @@ export function getInstance<
344
357
  if (process.env.NODE_ENV !== 'production' && instance.options.debug)
345
358
  console.info('Expanding...')
346
359
 
347
- return expandRowsFn(instance, expanded, rowModel)
360
+ return expandRowsFn(instance, rowModel)
348
361
  },
349
- 'getExpandedRowModel',
350
- instance.options.debug
362
+ {
363
+ key: 'getExpandedRowModel',
364
+ debug: instance.options.debug,
365
+ onChange: () => instance._notifyPageIndexReset(),
366
+ }
351
367
  ),
352
368
 
353
369
  getPreExpandedRows: () => instance.getGroupedRowModel().rows,