@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.
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +112 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/cjs/aggregationTypes.js +130 -0
- package/build/cjs/aggregationTypes.js.map +1 -0
- package/build/cjs/core.js +519 -0
- package/build/cjs/core.js.map +1 -0
- package/build/cjs/createTable.js +103 -0
- package/build/cjs/createTable.js.map +1 -0
- package/build/cjs/features/ColumnSizing.js +331 -0
- package/build/cjs/features/ColumnSizing.js.map +1 -0
- package/build/cjs/features/Expanding.js +234 -0
- package/build/cjs/features/Expanding.js.map +1 -0
- package/build/cjs/features/Filters.js +396 -0
- package/build/cjs/features/Filters.js.map +1 -0
- package/build/cjs/features/Grouping.js +228 -0
- package/build/cjs/features/Grouping.js.map +1 -0
- package/build/cjs/features/Headers.js +486 -0
- package/build/cjs/features/Headers.js.map +1 -0
- package/build/cjs/features/Ordering.js +83 -0
- package/build/cjs/features/Ordering.js.map +1 -0
- package/build/cjs/features/Pinning.js +163 -0
- package/build/cjs/features/Pinning.js.map +1 -0
- package/build/cjs/features/Sorting.js +269 -0
- package/build/cjs/features/Sorting.js.map +1 -0
- package/build/cjs/features/Visibility.js +160 -0
- package/build/cjs/features/Visibility.js.map +1 -0
- package/build/cjs/filterTypes.js +172 -0
- package/build/cjs/filterTypes.js.map +1 -0
- package/build/cjs/index.js +30 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/sortTypes.js +121 -0
- package/build/cjs/sortTypes.js.map +1 -0
- package/build/cjs/utils/columnFilterRowsFn.js +130 -0
- package/build/cjs/utils/columnFilterRowsFn.js.map +1 -0
- package/build/cjs/utils/expandRowsFn.js +38 -0
- package/build/cjs/utils/expandRowsFn.js.map +1 -0
- package/build/cjs/utils/globalFilterRowsFn.js +100 -0
- package/build/cjs/utils/globalFilterRowsFn.js.map +1 -0
- package/build/cjs/utils/groupRowsFn.js +154 -0
- package/build/cjs/utils/groupRowsFn.js.map +1 -0
- package/build/cjs/utils/sortRowsFn.js +93 -0
- package/build/cjs/utils/sortRowsFn.js.map +1 -0
- package/build/cjs/utils.js +143 -0
- package/build/cjs/utils.js.map +1 -0
- package/build/esm/index.js +3722 -0
- package/build/esm/index.js.map +1 -0
- package/build/stats-html.html +2689 -0
- package/build/stats-react.json +747 -0
- package/build/types/aggregationTypes.d.ts +22 -0
- package/build/types/core.d.ts +126 -0
- package/build/types/createTable.d.ts +35 -0
- package/build/types/features/ColumnSizing.d.ts +73 -0
- package/build/types/features/Expanding.d.ts +52 -0
- package/build/types/features/Filters.d.ts +93 -0
- package/build/types/features/Grouping.d.ts +82 -0
- package/build/types/features/Headers.d.ts +41 -0
- package/build/types/features/Ordering.d.ts +19 -0
- package/build/types/features/Pinning.d.ts +39 -0
- package/build/types/features/Sorting.d.ts +75 -0
- package/build/types/features/Visibility.d.ts +47 -0
- package/build/types/filterTypes.d.ts +50 -0
- package/build/types/index.d.ts +7 -0
- package/build/types/sortTypes.d.ts +17 -0
- package/build/types/types.d.ts +124 -0
- package/build/types/utils/columnFilterRowsFn.d.ts +2 -0
- package/build/types/utils/expandRowsFn.d.ts +2 -0
- package/build/types/utils/globalFilterRowsFn.d.ts +2 -0
- package/build/types/utils/groupRowsFn.d.ts +2 -0
- package/build/types/utils/sortRowsFn.d.ts +2 -0
- package/build/types/utils.d.ts +24 -0
- package/{dist/react-table.development.js → build/umd/index.development.js} +372 -29
- package/build/umd/index.development.js.map +1 -0
- package/build/umd/index.production.js +12 -0
- package/build/umd/index.production.js.map +1 -0
- package/package.json +9 -94
- package/src/core.tsx +43 -5
- package/src/createTable.tsx +1 -1
- package/src/features/ColumnSizing.ts +482 -0
- package/src/features/Filters.ts +1 -1
- package/src/features/Headers.ts +43 -6
- package/src/features/{withPagination.ts → withPagination.oldts} +0 -0
- package/src/features/{withRowSelection.ts → withRowSelection.oldts} +0 -0
- package/src/types.ts +35 -6
- package/src/utils.tsx +8 -2
- package/dist/react-table.development.js.map +0 -1
- package/dist/react-table.production.min.js +0 -2
- package/dist/react-table.production.min.js.map +0 -1
- package/lib/index.js +0 -65
- package/src/features/notest/useAbsoluteLayout.test.js +0 -152
- package/src/features/notest/useBlockLayout.test.js +0 -158
- package/src/features/notest/useColumnOrder.test.js +0 -186
- package/src/features/notest/useExpanded.test.js +0 -125
- package/src/features/notest/useFilters.test.js +0 -393
- package/src/features/notest/useFiltersAndRowSelect.test.js +0 -256
- package/src/features/notest/useFlexLayout.test.js +0 -152
- package/src/features/notest/useGroupBy.test.js +0 -259
- package/src/features/notest/usePagination.test.js +0 -231
- package/src/features/notest/useResizeColumns.test.js +0 -229
- package/src/features/notest/useRowSelect.test.js +0 -250
- package/src/features/notest/useRowState.test.js +0 -178
- package/src/features/tests/Visibility.test.tsx +0 -225
- package/src/features/tests/__snapshots__/Visibility.test.tsx.snap +0 -390
- package/src/features/tests/withSorting.notest.tsx +0 -341
- package/src/features/withColumnResizing.ts +0 -281
- package/src/test-utils/makeTestData.ts +0 -41
- package/src/tests/__snapshots__/core.test.tsx.snap +0 -148
- 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
|
+
}
|
package/src/features/Filters.ts
CHANGED
|
@@ -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
|
|
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
|
|
package/src/features/Headers.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
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
|
|
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 {
|
|
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:
|
|
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 {
|