@tanstack/react-table 0.0.1-alpha.8 → 8.0.0-alpha.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 (107) hide show
  1. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +112 -0
  2. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  3. package/build/cjs/aggregationTypes.js +130 -0
  4. package/build/cjs/aggregationTypes.js.map +1 -0
  5. package/build/cjs/core.js +519 -0
  6. package/build/cjs/core.js.map +1 -0
  7. package/build/cjs/createTable.js +103 -0
  8. package/build/cjs/createTable.js.map +1 -0
  9. package/build/cjs/features/ColumnSizing.js +331 -0
  10. package/build/cjs/features/ColumnSizing.js.map +1 -0
  11. package/build/cjs/features/Expanding.js +234 -0
  12. package/build/cjs/features/Expanding.js.map +1 -0
  13. package/build/cjs/features/Filters.js +396 -0
  14. package/build/cjs/features/Filters.js.map +1 -0
  15. package/build/cjs/features/Grouping.js +228 -0
  16. package/build/cjs/features/Grouping.js.map +1 -0
  17. package/build/cjs/features/Headers.js +486 -0
  18. package/build/cjs/features/Headers.js.map +1 -0
  19. package/build/cjs/features/Ordering.js +83 -0
  20. package/build/cjs/features/Ordering.js.map +1 -0
  21. package/build/cjs/features/Pinning.js +163 -0
  22. package/build/cjs/features/Pinning.js.map +1 -0
  23. package/build/cjs/features/Sorting.js +269 -0
  24. package/build/cjs/features/Sorting.js.map +1 -0
  25. package/build/cjs/features/Visibility.js +160 -0
  26. package/build/cjs/features/Visibility.js.map +1 -0
  27. package/build/cjs/filterTypes.js +172 -0
  28. package/build/cjs/filterTypes.js.map +1 -0
  29. package/build/cjs/index.js +30 -0
  30. package/build/cjs/index.js.map +1 -0
  31. package/build/cjs/sortTypes.js +121 -0
  32. package/build/cjs/sortTypes.js.map +1 -0
  33. package/build/cjs/utils/columnFilterRowsFn.js +130 -0
  34. package/build/cjs/utils/columnFilterRowsFn.js.map +1 -0
  35. package/build/cjs/utils/expandRowsFn.js +38 -0
  36. package/build/cjs/utils/expandRowsFn.js.map +1 -0
  37. package/build/cjs/utils/globalFilterRowsFn.js +100 -0
  38. package/build/cjs/utils/globalFilterRowsFn.js.map +1 -0
  39. package/build/cjs/utils/groupRowsFn.js +154 -0
  40. package/build/cjs/utils/groupRowsFn.js.map +1 -0
  41. package/build/cjs/utils/sortRowsFn.js +93 -0
  42. package/build/cjs/utils/sortRowsFn.js.map +1 -0
  43. package/build/cjs/utils.js +143 -0
  44. package/build/cjs/utils.js.map +1 -0
  45. package/build/esm/index.js +3722 -0
  46. package/build/esm/index.js.map +1 -0
  47. package/build/stats-html.html +2689 -0
  48. package/build/stats-react.json +747 -0
  49. package/build/types/aggregationTypes.d.ts +22 -0
  50. package/build/types/core.d.ts +126 -0
  51. package/build/types/createTable.d.ts +35 -0
  52. package/build/types/features/ColumnSizing.d.ts +73 -0
  53. package/build/types/features/Expanding.d.ts +52 -0
  54. package/build/types/features/Filters.d.ts +93 -0
  55. package/build/types/features/Grouping.d.ts +82 -0
  56. package/build/types/features/Headers.d.ts +41 -0
  57. package/build/types/features/Ordering.d.ts +19 -0
  58. package/build/types/features/Pinning.d.ts +39 -0
  59. package/build/types/features/Sorting.d.ts +75 -0
  60. package/build/types/features/Visibility.d.ts +47 -0
  61. package/build/types/filterTypes.d.ts +50 -0
  62. package/build/types/index.d.ts +7 -0
  63. package/build/types/sortTypes.d.ts +17 -0
  64. package/build/types/types.d.ts +124 -0
  65. package/build/types/utils/columnFilterRowsFn.d.ts +2 -0
  66. package/build/types/utils/expandRowsFn.d.ts +2 -0
  67. package/build/types/utils/globalFilterRowsFn.d.ts +2 -0
  68. package/build/types/utils/groupRowsFn.d.ts +2 -0
  69. package/build/types/utils/sortRowsFn.d.ts +2 -0
  70. package/build/types/utils.d.ts +24 -0
  71. package/{dist/react-table.development.js → build/umd/index.development.js} +372 -29
  72. package/build/umd/index.development.js.map +1 -0
  73. package/build/umd/index.production.js +12 -0
  74. package/build/umd/index.production.js.map +1 -0
  75. package/package.json +9 -94
  76. package/src/core.tsx +43 -5
  77. package/src/createTable.tsx +1 -1
  78. package/src/features/ColumnSizing.ts +482 -0
  79. package/src/features/Filters.ts +1 -1
  80. package/src/features/Headers.ts +43 -6
  81. package/src/features/{withPagination.ts → withPagination.oldts} +0 -0
  82. package/src/features/{withRowSelection.ts → withRowSelection.oldts} +0 -0
  83. package/src/types.ts +35 -6
  84. package/src/utils.tsx +8 -2
  85. package/dist/react-table.development.js.map +0 -1
  86. package/dist/react-table.production.min.js +0 -2
  87. package/dist/react-table.production.min.js.map +0 -1
  88. package/lib/index.js +0 -65
  89. package/src/features/notest/useAbsoluteLayout.test.js +0 -152
  90. package/src/features/notest/useBlockLayout.test.js +0 -158
  91. package/src/features/notest/useColumnOrder.test.js +0 -186
  92. package/src/features/notest/useExpanded.test.js +0 -125
  93. package/src/features/notest/useFilters.test.js +0 -393
  94. package/src/features/notest/useFiltersAndRowSelect.test.js +0 -256
  95. package/src/features/notest/useFlexLayout.test.js +0 -152
  96. package/src/features/notest/useGroupBy.test.js +0 -259
  97. package/src/features/notest/usePagination.test.js +0 -231
  98. package/src/features/notest/useResizeColumns.test.js +0 -229
  99. package/src/features/notest/useRowSelect.test.js +0 -250
  100. package/src/features/notest/useRowState.test.js +0 -178
  101. package/src/features/tests/Visibility.test.tsx +0 -225
  102. package/src/features/tests/__snapshots__/Visibility.test.tsx.snap +0 -390
  103. package/src/features/tests/withSorting.notest.tsx +0 -341
  104. package/src/features/withColumnResizing.ts +0 -281
  105. package/src/test-utils/makeTestData.ts +0 -41
  106. package/src/tests/__snapshots__/core.test.tsx.snap +0 -148
  107. package/src/tests/core.test.tsx +0 -241
@@ -0,0 +1,482 @@
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 HeaderResizerProps = {
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
+ getHeaderResizerProps: <TGetter extends Getter<HeaderResizerProps>>(
76
+ columnId: string,
77
+ userProps?: TGetter
78
+ ) => undefined | PropGetterValue<HeaderResizerProps, 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
+ resetSize: () => void
98
+ }
99
+
100
+ export type ColumnSizingHeader<
101
+ TData,
102
+ TValue,
103
+ TFilterFns,
104
+ TSortingFns,
105
+ TAggregationFns
106
+ > = {
107
+ getCanResize: () => boolean
108
+ getIsResizing: () => boolean
109
+ getResizerProps: <TGetter extends Getter<HeaderResizerProps>>(
110
+ userProps?: TGetter
111
+ ) => undefined | PropGetterValue<HeaderResizerProps, TGetter>
112
+ resetSize: () => void
113
+ }
114
+
115
+ //
116
+
117
+ export const defaultColumnSizing = {
118
+ width: 150,
119
+ minWidth: 20,
120
+ maxWidth: Number.MAX_SAFE_INTEGER,
121
+ }
122
+
123
+ export function getInitialState(): ColumnSizingTableState {
124
+ return {
125
+ columnSizing: {},
126
+ columnSizingInfo: {
127
+ startOffset: null,
128
+ startSize: null,
129
+ deltaOffset: null,
130
+ deltaPercentage: null,
131
+ isResizingColumn: false,
132
+ columnSizingStart: [],
133
+ },
134
+ }
135
+ }
136
+
137
+ export function getDefaultOptions<
138
+ TData,
139
+ TValue,
140
+ TFilterFns,
141
+ TSortingFns,
142
+ TAggregationFns
143
+ >(
144
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
145
+ ): ColumnSizingDefaultOptions {
146
+ return {
147
+ columnResizeMode: 'onEnd',
148
+ onColumnSizingChange: makeStateUpdater('columnSizing', instance),
149
+ onColumnSizingInfoChange: makeStateUpdater('columnSizingInfo', instance),
150
+ }
151
+ }
152
+
153
+ export function getInstance<
154
+ TData,
155
+ TValue,
156
+ TFilterFns,
157
+ TSortingFns,
158
+ TAggregationFns
159
+ >(
160
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
161
+ ): ColumnSizingInstance<
162
+ TData,
163
+ TValue,
164
+ TFilterFns,
165
+ TSortingFns,
166
+ TAggregationFns
167
+ > {
168
+ return {
169
+ setColumnSizing: updater =>
170
+ instance.options.onColumnSizingChange?.(
171
+ updater,
172
+ functionalUpdate(updater, instance.getState().columnSizing)
173
+ ),
174
+ setColumnSizingInfo: updater =>
175
+ instance.options.onColumnSizingInfoChange?.(
176
+ updater,
177
+ functionalUpdate(updater, instance.getState().columnSizingInfo)
178
+ ),
179
+ resetColumnSizing: () => {
180
+ instance.setColumnSizing(instance.initialState.columnSizing ?? {})
181
+ },
182
+ resetHeaderSizeInfo: () => {
183
+ instance.setColumnSizingInfo(instance.initialState.columnSizingInfo ?? {})
184
+ },
185
+ resetColumnSize: columnId => {
186
+ instance.setColumnSizing(({ [columnId]: _, ...rest }) => {
187
+ return rest
188
+ })
189
+ },
190
+ resetHeaderSize: headerId => {
191
+ const header = instance.getHeader(headerId)
192
+
193
+ if (!header) {
194
+ return
195
+ }
196
+
197
+ return instance.resetColumnSize(header.column.id)
198
+ },
199
+ getHeaderCanResize: headerId => {
200
+ const header = instance.getHeader(headerId)
201
+
202
+ if (!header) {
203
+ throw new Error()
204
+ }
205
+
206
+ return instance.getColumnCanResize(header.column.id)
207
+ },
208
+ getColumnCanResize: columnId => {
209
+ const column = instance.getColumn(columnId)
210
+
211
+ if (!column) {
212
+ throw new Error()
213
+ }
214
+
215
+ return (
216
+ column.enableResizing ??
217
+ instance.options.enableColumnResizing ??
218
+ column.defaultCanResize ??
219
+ true
220
+ )
221
+ },
222
+ getColumnIsResizing: columnId => {
223
+ const column = instance.getColumn(columnId)
224
+
225
+ if (!column) {
226
+ throw new Error()
227
+ }
228
+
229
+ return instance.getState().columnSizingInfo.isResizingColumn === columnId
230
+ },
231
+ getHeaderIsResizing: headerId => {
232
+ const header = instance.getHeader(headerId)
233
+
234
+ if (!header) {
235
+ throw new Error()
236
+ }
237
+
238
+ return instance.getColumnIsResizing(header.column.id)
239
+ },
240
+ getHeaderResizerProps: (headerId, userProps) => {
241
+ const header = instance.getHeader(headerId)
242
+
243
+ if (!header) {
244
+ return
245
+ }
246
+
247
+ const column = instance.getColumn(header.column.id)
248
+
249
+ if (!column) {
250
+ return
251
+ }
252
+
253
+ const canResize = column.getCanResize()
254
+
255
+ const onResizeStart = (e: ReactMouseEvent | ReactTouchEvent) => {
256
+ if (isTouchStartEvent(e)) {
257
+ // lets not respond to multiple touches (e.g. 2 or 3 fingers)
258
+ if (e.touches && e.touches.length > 1) {
259
+ return
260
+ }
261
+ }
262
+
263
+ const columnSizingStart: [string, number][] = header
264
+ .getLeafHeaders()
265
+ .map(d => [d.column.id, d.getWidth()])
266
+
267
+ const clientX = isTouchStartEvent(e)
268
+ ? Math.round(e.touches[0].clientX)
269
+ : e.clientX
270
+
271
+ const updateOffset = (
272
+ eventType: 'move' | 'end',
273
+ clientXPos?: number
274
+ ) => {
275
+ if (typeof clientXPos !== 'number') {
276
+ return
277
+ }
278
+
279
+ let newColumnSizing: ColumnSizing = {}
280
+
281
+ instance.setColumnSizingInfo(old => {
282
+ const deltaOffset = clientXPos - (old?.startOffset ?? 0)
283
+ const deltaPercentage = Math.max(
284
+ deltaOffset / (old?.startSize ?? 0),
285
+ -0.999999
286
+ )
287
+
288
+ old.columnSizingStart.forEach(([columnId, headerWidth]) => {
289
+ newColumnSizing[columnId] = Math.max(
290
+ headerWidth + headerWidth * deltaPercentage,
291
+ 0
292
+ )
293
+ })
294
+
295
+ return {
296
+ ...old,
297
+ deltaOffset,
298
+ deltaPercentage,
299
+ }
300
+ })
301
+
302
+ if (
303
+ instance.options.columnResizeMode === 'onChange' ||
304
+ eventType === 'end'
305
+ ) {
306
+ instance.setColumnSizing(old => ({
307
+ ...old,
308
+ ...newColumnSizing,
309
+ }))
310
+ }
311
+ }
312
+
313
+ const onMove = (clientXPos?: number) => updateOffset('move', clientXPos)
314
+
315
+ const onEnd = (clientXPos?: number) => {
316
+ updateOffset('end', clientXPos)
317
+
318
+ instance.setColumnSizingInfo(old => ({
319
+ ...old,
320
+ isResizingColumn: false,
321
+ startOffset: null,
322
+ startSize: null,
323
+ deltaOffset: null,
324
+ deltaPercentage: null,
325
+ columnSizingStart: [],
326
+ }))
327
+ }
328
+
329
+ const mouseEvents = {
330
+ moveHandler: (e: MouseEvent) => onMove(e.clientX),
331
+ upHandler: (e: MouseEvent) => {
332
+ document.removeEventListener('mousemove', mouseEvents.moveHandler)
333
+ document.removeEventListener('mouseup', mouseEvents.upHandler)
334
+ onEnd(e.clientX)
335
+ },
336
+ }
337
+
338
+ const touchEvents = {
339
+ moveHandler: (e: TouchEvent) => {
340
+ if (e.cancelable) {
341
+ e.preventDefault()
342
+ e.stopPropagation()
343
+ }
344
+ onMove(e.touches[0].clientX)
345
+ return false
346
+ },
347
+ upHandler: (e: TouchEvent) => {
348
+ document.removeEventListener('touchmove', touchEvents.moveHandler)
349
+ document.removeEventListener('touchend', touchEvents.upHandler)
350
+ if (e.cancelable) {
351
+ e.preventDefault()
352
+ e.stopPropagation()
353
+ }
354
+ onEnd(e.touches[0].clientX)
355
+ },
356
+ }
357
+
358
+ const passiveIfSupported = passiveEventSupported()
359
+ ? { passive: false }
360
+ : false
361
+
362
+ if (isTouchStartEvent(e)) {
363
+ document.addEventListener(
364
+ 'touchmove',
365
+ touchEvents.moveHandler,
366
+ passiveIfSupported
367
+ )
368
+ document.addEventListener(
369
+ 'touchend',
370
+ touchEvents.upHandler,
371
+ passiveIfSupported
372
+ )
373
+ } else {
374
+ document.addEventListener(
375
+ 'mousemove',
376
+ mouseEvents.moveHandler,
377
+ passiveIfSupported
378
+ )
379
+ document.addEventListener(
380
+ 'mouseup',
381
+ mouseEvents.upHandler,
382
+ passiveIfSupported
383
+ )
384
+ }
385
+
386
+ instance.setColumnSizingInfo(old => ({
387
+ ...old,
388
+ startOffset: clientX,
389
+ startSize: header.getWidth(),
390
+ deltaOffset: 0,
391
+ deltaPercentage: 0,
392
+ columnSizingStart,
393
+ isResizingColumn: header.column.id,
394
+ }))
395
+ }
396
+
397
+ const initialProps: HeaderResizerProps = canResize
398
+ ? {
399
+ title: 'Toggle Grouping',
400
+ draggable: false,
401
+ role: 'separator',
402
+ onMouseDown: (e: ReactMouseEvent) => {
403
+ e.persist()
404
+ onResizeStart(e)
405
+ },
406
+ onTouchStart: (e: ReactTouchEvent) => {
407
+ e.persist()
408
+ onResizeStart(e)
409
+ },
410
+ }
411
+ : {}
412
+
413
+ return propGetter(initialProps, userProps)
414
+ },
415
+ }
416
+ }
417
+
418
+ export function createColumn<
419
+ TData,
420
+ TValue,
421
+ TFilterFns,
422
+ TSortingFns,
423
+ TAggregationFns
424
+ >(
425
+ column: Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
426
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
427
+ ): ColumnSizingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> {
428
+ return {
429
+ getIsResizing: () => instance.getColumnIsResizing(column.id),
430
+ getCanResize: () => instance.getColumnCanResize(column.id),
431
+ resetSize: () => instance.resetColumnSize(column.id),
432
+ }
433
+ }
434
+
435
+ export function createHeader<
436
+ TData,
437
+ TValue,
438
+ TFilterFns,
439
+ TSortingFns,
440
+ TAggregationFns
441
+ >(
442
+ header: Header<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
443
+ instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
444
+ ): ColumnSizingHeader<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> {
445
+ return {
446
+ getIsResizing: () => instance.getHeaderIsResizing(header.id),
447
+ getCanResize: () => instance.getHeaderCanResize(header.id),
448
+ getResizerProps: userProps =>
449
+ instance.getHeaderResizerProps(header.id, userProps),
450
+ resetSize: () => instance.resetHeaderSize(header.id),
451
+ }
452
+ }
453
+
454
+ let passiveSupported: boolean | null = null
455
+ export function passiveEventSupported() {
456
+ if (typeof passiveSupported === 'boolean') return passiveSupported
457
+
458
+ let supported = false
459
+ try {
460
+ const options = {
461
+ get passive() {
462
+ supported = true
463
+ return false
464
+ },
465
+ }
466
+
467
+ const noop = () => {}
468
+
469
+ window.addEventListener('test', noop, options)
470
+ window.removeEventListener('test', noop)
471
+ } catch (err) {
472
+ supported = false
473
+ }
474
+ passiveSupported = supported
475
+ return passiveSupported
476
+ }
477
+
478
+ function isTouchStartEvent(
479
+ e: ReactTouchEvent | ReactMouseEvent
480
+ ): e is ReactTouchEvent {
481
+ return e.type === 'touchstart'
482
+ }
@@ -438,7 +438,7 @@ export function getInstance<
438
438
  setColumnFilters: (updater: Updater<ColumnFiltersState>) => {
439
439
  const leafColumns = instance.getAllLeafColumns()
440
440
 
441
- const updateFn = (old?: ColumnFiltersState) => {
441
+ const updateFn = (old: ColumnFiltersState) => {
442
442
  return functionalUpdate(updater, old)?.filter(filter => {
443
443
  const column = leafColumns.find(d => d.id === filter.id)
444
444
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Cell,
3
3
  Column,
4
+ CoreHeader,
4
5
  FooterGroupProps,
5
6
  FooterProps,
6
7
  Getter,
@@ -14,6 +15,8 @@ import {
14
15
  } from '../types'
15
16
  import { propGetter, memo, flexRender } from '../utils'
16
17
 
18
+ import * as ColumnSizing from './ColumnSizing'
19
+
17
20
  export type HeadersRow<
18
21
  TData,
19
22
  TValue,
@@ -319,7 +322,7 @@ export function getInstance<
319
322
  ) => {
320
323
  const id = options.id ?? column.id
321
324
 
322
- let header: Header<
325
+ let header: CoreHeader<
323
326
  TData,
324
327
  TValue,
325
328
  TFilterFns,
@@ -338,7 +341,7 @@ export function getInstance<
338
341
  let sum = 0
339
342
 
340
343
  const recurse = (
341
- header: Header<
344
+ header: CoreHeader<
342
345
  TData,
343
346
  TValue,
344
347
  TFilterFns,
@@ -364,7 +367,7 @@ export function getInstance<
364
367
  TSortingFns,
365
368
  TAggregationFns
366
369
  >[] => {
367
- const leafHeaders: Header<
370
+ const leafHeaders: CoreHeader<
368
371
  TData,
369
372
  TValue,
370
373
  TFilterFns,
@@ -373,7 +376,13 @@ export function getInstance<
373
376
  >[] = []
374
377
 
375
378
  const recurseHeader = (
376
- h: Header<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
379
+ h: CoreHeader<
380
+ TData,
381
+ TValue,
382
+ TFilterFns,
383
+ TSortingFns,
384
+ TAggregationFns
385
+ >
377
386
  ) => {
378
387
  if (h.subHeaders && h.subHeaders.length) {
379
388
  h.subHeaders.map(recurseHeader)
@@ -382,7 +391,14 @@ export function getInstance<
382
391
  }
383
392
 
384
393
  recurseHeader(header)
385
- return leafHeaders
394
+
395
+ return leafHeaders as Header<
396
+ TData,
397
+ TValue,
398
+ TFilterFns,
399
+ TSortingFns,
400
+ TAggregationFns
401
+ >[]
386
402
  },
387
403
  getHeaderProps: userProps =>
388
404
  instance.getHeaderProps(header.id, userProps)!,
@@ -392,7 +408,28 @@ export function getInstance<
392
408
  renderFooter: () => flexRender(column.footer, { header, column }),
393
409
  }
394
410
 
395
- return header
411
+ header = Object.assign(
412
+ header,
413
+ ColumnSizing.createHeader(
414
+ header as Header<
415
+ TData,
416
+ TValue,
417
+ TFilterFns,
418
+ TSortingFns,
419
+ TAggregationFns
420
+ >,
421
+ instance
422
+ )
423
+ )
424
+
425
+ // Yes, we have to convert instance to uknown, because we know more than the compiler here.
426
+ return header as Header<
427
+ TData,
428
+ TValue,
429
+ TFilterFns,
430
+ TSortingFns,
431
+ TAggregationFns
432
+ >
396
433
  },
397
434
 
398
435
  // Header Groups
package/src/types.ts CHANGED
@@ -56,6 +56,14 @@ import {
56
56
  ExpandedTableState,
57
57
  } from './features/Expanding'
58
58
  import { Overwrite } from './utils'
59
+ import {
60
+ ColumnSizingColumn,
61
+ ColumnSizingColumnDef,
62
+ ColumnSizingHeader,
63
+ ColumnSizingInstance,
64
+ ColumnSizingOptions,
65
+ ColumnSizingTableState,
66
+ } from './features/ColumnSizing'
59
67
 
60
68
  // declare global {
61
69
  // const process.env.NODE_ENV !== 'production': boolean
@@ -81,6 +89,13 @@ export type ReactTable<
81
89
  FiltersInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
82
90
  SortingInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
83
91
  GroupingInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
92
+ ColumnSizingInstance<
93
+ TData,
94
+ TValue,
95
+ TFilterFns,
96
+ TSortingFns,
97
+ TAggregationFns
98
+ > &
84
99
  ExpandedInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
85
100
 
86
101
  export type Renderable<TProps> =
@@ -98,9 +113,10 @@ export type Options<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
98
113
  FiltersOptions<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
99
114
  SortingOptions<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
100
115
  GroupingOptions<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
101
- ExpandedOptions<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
116
+ ExpandedOptions<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
117
+ ColumnSizingOptions
102
118
 
103
- export type Updater<T> = T | ((old?: T) => T)
119
+ export type Updater<T> = T | ((old: T) => T)
104
120
  export type OnChangeFn<T> = (updaterOrValue: Updater<T>, value: T) => void
105
121
 
106
122
  export type TableState = VisibilityTableState &
@@ -109,7 +125,8 @@ export type TableState = VisibilityTableState &
109
125
  FiltersTableState &
110
126
  SortingTableState &
111
127
  ExpandedTableState &
112
- GroupingTableState
128
+ GroupingTableState &
129
+ ColumnSizingTableState
113
130
 
114
131
  export type Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
115
132
  CoreRow<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
@@ -139,7 +156,8 @@ export type ColumnDef<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
139
156
  ColumnPinningColumnDef &
140
157
  FiltersColumnDef<TFilterFns> &
141
158
  SortingColumnDef<TSortingFns> &
142
- GroupingColumnDef<TAggregationFns>
159
+ GroupingColumnDef<TAggregationFns> &
160
+ ColumnSizingColumnDef
143
161
 
144
162
  export type Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
145
163
  ColumnDef<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
@@ -148,7 +166,8 @@ export type Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
148
166
  ColumnPinningColumn &
149
167
  FiltersColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
150
168
  SortingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
151
- GroupingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
169
+ GroupingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
170
+ ColumnSizingColumn<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
152
171
 
153
172
  export type Cell<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
154
173
  id: string
@@ -161,7 +180,17 @@ export type Cell<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
161
180
  renderCell: () => React.ReactNode
162
181
  }
163
182
 
164
- export type Header<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> = {
183
+ export type Header<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> =
184
+ CoreHeader<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> &
185
+ ColumnSizingHeader<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
186
+
187
+ export type CoreHeader<
188
+ TData,
189
+ TValue,
190
+ TFilterFns,
191
+ TSortingFns,
192
+ TAggregationFns
193
+ > = {
165
194
  id: string
166
195
  depth: number
167
196
  column: Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
package/src/utils.tsx CHANGED
@@ -1,5 +1,11 @@
1
1
  import React from 'react'
2
- import { Getter, NoInfer, PropGetterValue, Renderable } from './types'
2
+ import {
3
+ Getter,
4
+ NoInfer,
5
+ PropGetterValue,
6
+ Renderable,
7
+ TableState,
8
+ } from './types'
3
9
 
4
10
  export type IsAny<T> = 0 extends 1 & T ? true : false
5
11
  export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
@@ -26,7 +32,7 @@ export function noop() {
26
32
  //
27
33
  }
28
34
 
29
- export function makeStateUpdater(key: string, instance: unknown) {
35
+ export function makeStateUpdater(key: keyof TableState, instance: unknown) {
30
36
  return (updater: Updater<any, any>) => {
31
37
  ;(instance as any).setState(<TTableState,>(old: TTableState) => {
32
38
  return {