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