@tanstack/react-table 8.0.0-alpha.7 → 8.0.0-alpha.72

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 (113) hide show
  1. package/build/cjs/react-table/src/index.js +133 -0
  2. package/build/cjs/react-table/src/index.js.map +1 -0
  3. package/build/cjs/table-core/build/esm/index.js +4049 -0
  4. package/build/cjs/table-core/build/esm/index.js.map +1 -0
  5. package/build/esm/index.js +3357 -4071
  6. package/build/esm/index.js.map +1 -1
  7. package/build/stats-html.html +1 -1
  8. package/build/stats-react.json +24 -783
  9. package/build/types/index.d.ts +16 -8
  10. package/build/umd/index.development.js +3396 -4080
  11. package/build/umd/index.development.js.map +1 -1
  12. package/build/umd/index.production.js +11 -1
  13. package/build/umd/index.production.js.map +1 -1
  14. package/package.json +5 -1
  15. package/src/index.tsx +113 -8
  16. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  17. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  18. package/build/cjs/aggregationTypes.js +0 -130
  19. package/build/cjs/aggregationTypes.js.map +0 -1
  20. package/build/cjs/core.js +0 -552
  21. package/build/cjs/core.js.map +0 -1
  22. package/build/cjs/createTable.js +0 -122
  23. package/build/cjs/createTable.js.map +0 -1
  24. package/build/cjs/features/ColumnSizing.js +0 -317
  25. package/build/cjs/features/ColumnSizing.js.map +0 -1
  26. package/build/cjs/features/Expanding.js +0 -251
  27. package/build/cjs/features/Expanding.js.map +0 -1
  28. package/build/cjs/features/Filters.js +0 -445
  29. package/build/cjs/features/Filters.js.map +0 -1
  30. package/build/cjs/features/Grouping.js +0 -249
  31. package/build/cjs/features/Grouping.js.map +0 -1
  32. package/build/cjs/features/Headers.js +0 -549
  33. package/build/cjs/features/Headers.js.map +0 -1
  34. package/build/cjs/features/Ordering.js +0 -86
  35. package/build/cjs/features/Ordering.js.map +0 -1
  36. package/build/cjs/features/Pagination.js +0 -198
  37. package/build/cjs/features/Pagination.js.map +0 -1
  38. package/build/cjs/features/Pinning.js +0 -149
  39. package/build/cjs/features/Pinning.js.map +0 -1
  40. package/build/cjs/features/RowSelection.js +0 -541
  41. package/build/cjs/features/RowSelection.js.map +0 -1
  42. package/build/cjs/features/Sorting.js +0 -327
  43. package/build/cjs/features/Sorting.js.map +0 -1
  44. package/build/cjs/features/Visibility.js +0 -166
  45. package/build/cjs/features/Visibility.js.map +0 -1
  46. package/build/cjs/filterTypes.js +0 -172
  47. package/build/cjs/filterTypes.js.map +0 -1
  48. package/build/cjs/index.js +0 -32
  49. package/build/cjs/index.js.map +0 -1
  50. package/build/cjs/sortTypes.js +0 -122
  51. package/build/cjs/sortTypes.js.map +0 -1
  52. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  53. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  54. package/build/cjs/utils/expandRowsFn.js +0 -38
  55. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  56. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  57. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  58. package/build/cjs/utils/groupRowsFn.js +0 -155
  59. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  60. package/build/cjs/utils/paginateRowsFn.js +0 -44
  61. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  62. package/build/cjs/utils/sortRowsFn.js +0 -94
  63. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  64. package/build/cjs/utils.js +0 -141
  65. package/build/cjs/utils.js.map +0 -1
  66. package/build/types/aggregationTypes.d.ts +0 -22
  67. package/build/types/core.d.ts +0 -109
  68. package/build/types/createTable.d.ts +0 -52
  69. package/build/types/features/ColumnSizing.d.ts +0 -67
  70. package/build/types/features/Expanding.d.ts +0 -53
  71. package/build/types/features/Filters.d.ts +0 -98
  72. package/build/types/features/Grouping.d.ts +0 -82
  73. package/build/types/features/Headers.d.ts +0 -41
  74. package/build/types/features/Ordering.d.ts +0 -19
  75. package/build/types/features/Pagination.d.ts +0 -44
  76. package/build/types/features/Pinning.d.ts +0 -39
  77. package/build/types/features/RowSelection.d.ts +0 -66
  78. package/build/types/features/Sorting.d.ts +0 -78
  79. package/build/types/features/Visibility.d.ts +0 -47
  80. package/build/types/filterTypes.d.ts +0 -50
  81. package/build/types/sortTypes.d.ts +0 -18
  82. package/build/types/types.d.ts +0 -127
  83. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  84. package/build/types/utils/expandRowsFn.d.ts +0 -2
  85. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  86. package/build/types/utils/groupRowsFn.d.ts +0 -2
  87. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  88. package/build/types/utils/sortRowsFn.d.ts +0 -2
  89. package/build/types/utils.d.ts +0 -24
  90. package/src/aggregationTypes.ts +0 -115
  91. package/src/core.tsx +0 -1091
  92. package/src/createTable.tsx +0 -264
  93. package/src/features/ColumnSizing.ts +0 -453
  94. package/src/features/Expanding.ts +0 -406
  95. package/src/features/Filters.ts +0 -762
  96. package/src/features/Grouping.ts +0 -466
  97. package/src/features/Headers.ts +0 -912
  98. package/src/features/Ordering.ts +0 -133
  99. package/src/features/Pagination.ts +0 -325
  100. package/src/features/Pinning.ts +0 -198
  101. package/src/features/RowSelection.ts +0 -831
  102. package/src/features/Sorting.ts +0 -547
  103. package/src/features/Visibility.ts +0 -279
  104. package/src/filterTypes.ts +0 -251
  105. package/src/sortTypes.ts +0 -159
  106. package/src/types.ts +0 -331
  107. package/src/utils/columnFilterRowsFn.ts +0 -155
  108. package/src/utils/expandRowsFn.ts +0 -50
  109. package/src/utils/globalFilterRowsFn.ts +0 -122
  110. package/src/utils/groupRowsFn.ts +0 -194
  111. package/src/utils/paginateRowsFn.ts +0 -34
  112. package/src/utils/sortRowsFn.ts +0 -115
  113. package/src/utils.tsx +0 -195
@@ -1,279 +0,0 @@
1
- import {
2
- Cell,
3
- Column,
4
- Getter,
5
- OnChangeFn,
6
- PropGetterValue,
7
- ReactTable,
8
- Updater,
9
- } from '../types'
10
- import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
11
-
12
- export type VisibilityOptions = {
13
- onColumnVisibilityChange?: OnChangeFn<VisibilityState>
14
- enableHiding?: boolean
15
- }
16
-
17
- export type VisibilityDefaultOptions = {
18
- onColumnVisibilityChange: OnChangeFn<VisibilityState>
19
- }
20
-
21
- export type VisibilityState = Record<string, boolean>
22
-
23
- export type VisibilityTableState = {
24
- columnVisibility: VisibilityState
25
- }
26
-
27
- export type VisibilityInstance<
28
- TData,
29
- TValue,
30
- TFilterFns,
31
- TSortingFns,
32
- TAggregationFns
33
- > = {
34
- getVisibleFlatColumns: () => Column<
35
- TData,
36
- TValue,
37
- TFilterFns,
38
- TSortingFns,
39
- TAggregationFns
40
- >[]
41
- getVisibleLeafColumns: () => Column<
42
- TData,
43
- TValue,
44
- TFilterFns,
45
- TSortingFns,
46
- TAggregationFns
47
- >[]
48
- setColumnVisibility: (updater: Updater<VisibilityState>) => void
49
- toggleColumnVisibility: (columnId: string, value?: boolean) => void
50
- toggleAllColumnsVisible: (value?: boolean) => void
51
- getColumnIsVisible: (columId: string) => boolean
52
- getColumnCanHide: (columnId: string) => boolean
53
- getIsAllColumnsVisible: () => boolean
54
- getIsSomeColumnsVisible: () => boolean
55
- getToggleAllColumnsVisibilityProps: <
56
- TGetter extends Getter<ToggleAllColumnsVisibilityProps>
57
- >(
58
- userProps?: TGetter
59
- ) => undefined | PropGetterValue<ToggleAllColumnsVisibilityProps, TGetter>
60
- }
61
-
62
- type ToggleVisibilityProps = {}
63
- type ToggleAllColumnsVisibilityProps = {}
64
-
65
- export type VisibilityColumnDef = {
66
- enableHiding?: boolean
67
- defaultCanHide?: boolean
68
- }
69
-
70
- export type VisibilityRow<
71
- TData,
72
- TValue,
73
- TFilterFns,
74
- TSortingFns,
75
- TAggregationFns
76
- > = {
77
- getVisibleCells: () => Cell<
78
- TData,
79
- TValue,
80
- TFilterFns,
81
- TSortingFns,
82
- TAggregationFns
83
- >[]
84
- }
85
-
86
- export type VisibilityColumn = {
87
- getCanHide: () => boolean
88
- getIsVisible: () => boolean
89
- toggleVisibility: (value?: boolean) => void
90
- getToggleVisibilityProps: <TGetter extends Getter<ToggleVisibilityProps>>(
91
- userProps?: TGetter
92
- ) => PropGetterValue<ToggleVisibilityProps, TGetter>
93
- }
94
-
95
- //
96
-
97
- export function getInitialState(): VisibilityTableState {
98
- return {
99
- columnVisibility: {},
100
- }
101
- }
102
-
103
- export function getDefaultOptions<
104
- TData,
105
- TValue,
106
- TFilterFns,
107
- TSortingFns,
108
- TAggregationFns
109
- >(
110
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
111
- ): VisibilityDefaultOptions {
112
- return {
113
- onColumnVisibilityChange: makeStateUpdater('columnVisibility', instance),
114
- }
115
- }
116
-
117
- export function getDefaultColumn() {
118
- return {
119
- defaultIsVisible: true,
120
- }
121
- }
122
-
123
- export function createColumn<
124
- TData,
125
- TValue,
126
- TFilterFns,
127
- TSortingFns,
128
- TAggregationFns
129
- >(
130
- column: Column<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
131
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
132
- ): VisibilityColumn {
133
- return {
134
- getCanHide: () => instance.getColumnCanHide(column.id),
135
- getIsVisible: () => instance.getColumnIsVisible(column.id),
136
- toggleVisibility: value =>
137
- instance.toggleColumnVisibility(column.id, value),
138
- getToggleVisibilityProps: userProps => {
139
- const props: ToggleVisibilityProps = {
140
- type: 'checkbox',
141
- checked: column.getIsVisible?.(),
142
- title: 'Toggle Column Visibility',
143
- onChange: (e: MouseEvent | TouchEvent) => {
144
- column.toggleVisibility?.((e.target as HTMLInputElement).checked)
145
- },
146
- }
147
-
148
- return propGetter(props, userProps)
149
- },
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
- ): VisibilityInstance<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> {
162
- return {
163
- getVisibleFlatColumns: memo(
164
- () => [
165
- instance.getAllFlatColumns(),
166
- instance
167
- .getAllFlatColumns()
168
- .filter(d => d.getIsVisible?.())
169
- .map(d => d.id)
170
- .join('_'),
171
- ],
172
- allFlatColumns => {
173
- return allFlatColumns.filter(d => d.getIsVisible?.())
174
- },
175
- { key: 'getVisibleFlatColumns', debug: instance.options.debug }
176
- ),
177
-
178
- getVisibleLeafColumns: memo(
179
- () => [
180
- instance.getAllLeafColumns(),
181
- instance
182
- .getAllLeafColumns()
183
- .filter(d => d.getIsVisible?.())
184
- .map(d => d.id)
185
- .join('_'),
186
- ],
187
- allFlatColumns => {
188
- return allFlatColumns.filter(d => d.getIsVisible?.())
189
- },
190
- { key: 'getVisibleLeafColumns', debug: instance.options.debug }
191
- ),
192
-
193
- setColumnVisibility: updater =>
194
- instance.options.onColumnVisibilityChange?.(
195
- updater,
196
- functionalUpdate(updater, instance.getState().columnVisibility)
197
- ),
198
-
199
- toggleColumnVisibility: (columnId, value) => {
200
- if (!columnId) return
201
-
202
- if (instance.getColumnCanHide(columnId)) {
203
- instance.setColumnVisibility(old => ({
204
- ...old,
205
- [columnId]: value ?? !instance.getColumnIsVisible(columnId),
206
- }))
207
- }
208
- },
209
-
210
- toggleAllColumnsVisible: value => {
211
- value = value ?? !instance.getIsAllColumnsVisible()
212
-
213
- instance.setColumnVisibility(
214
- instance.getAllLeafColumns().reduce(
215
- (obj, column) => ({
216
- ...obj,
217
- [column.id]: !value ? !column.getCanHide?.() : value,
218
- }),
219
- {}
220
- )
221
- )
222
- },
223
-
224
- getColumnIsVisible: columnId => {
225
- const column = instance.getColumn(columnId)
226
-
227
- if (!column) {
228
- throw new Error()
229
- }
230
-
231
- return (
232
- instance.getState().columnVisibility?.[columnId] ??
233
- column.defaultIsVisible ??
234
- true
235
- )
236
- },
237
-
238
- getColumnCanHide: columnId => {
239
- const column = instance.getColumn(columnId)
240
-
241
- if (!column) {
242
- throw new Error()
243
- }
244
-
245
- return (
246
- instance.options.enableHiding ??
247
- column.enableHiding ??
248
- column.defaultCanHide ??
249
- true
250
- )
251
- },
252
-
253
- getIsAllColumnsVisible: () =>
254
- !instance.getAllLeafColumns().some(column => !column.getIsVisible?.()),
255
-
256
- getIsSomeColumnsVisible: () =>
257
- instance.getAllLeafColumns().some(column => column.getIsVisible?.()),
258
-
259
- getToggleAllColumnsVisibilityProps: userProps => {
260
- const props: ToggleAllColumnsVisibilityProps = {
261
- onChange: (e: MouseEvent) => {
262
- instance.toggleAllColumnsVisible(
263
- (e.target as HTMLInputElement)?.checked
264
- )
265
- },
266
- type: 'checkbox',
267
- title: 'Toggle visibility for all columns',
268
- checked: instance.getIsAllColumnsVisible(),
269
- indeterminate:
270
- !instance.getIsAllColumnsVisible() &&
271
- instance.getIsSomeColumnsVisible()
272
- ? 'indeterminate'
273
- : undefined,
274
- }
275
-
276
- return propGetter(props, userProps)
277
- },
278
- }
279
- }
@@ -1,251 +0,0 @@
1
- import { AccessorFn, Row } from './types'
2
-
3
- export const filterTypes = {
4
- includesString,
5
- includesStringSensitive,
6
- equalsString,
7
- equalsStringSensitive,
8
- arrIncludes,
9
- arrIncludesAll,
10
- equals,
11
- weakEquals,
12
- betweenNumberRange,
13
- }
14
-
15
- export type BuiltInFilterType = keyof typeof filterTypes
16
-
17
- function includesString<
18
- TData,
19
- TValue,
20
- TAccessor extends AccessorFn<TData>,
21
- TFilterFns,
22
- TSortingFns,
23
- TAggregationFns
24
- >(
25
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
26
- columnIds: string[],
27
- filterValue: unknown
28
- ) {
29
- const search = String(filterValue).toLowerCase()
30
-
31
- rows = rows.filter(row => {
32
- return columnIds.some(id => {
33
- return String(row.values[id]).toLowerCase().includes(search)
34
- })
35
- })
36
- return rows
37
- }
38
-
39
- includesString.autoRemove = (val: any) => testFalsey(val)
40
-
41
- function includesStringSensitive<
42
- TData,
43
- TValue,
44
- TAccessor extends AccessorFn<TData>,
45
- TFilterFns,
46
- TSortingFns,
47
- TAggregationFns
48
- >(
49
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
50
- columnIds: string[],
51
- filterValue: unknown
52
- ) {
53
- const search = String(filterValue)
54
-
55
- rows = rows.filter(row => {
56
- return columnIds.some(id => {
57
- return String(row.values[id]).includes(search)
58
- })
59
- })
60
- return rows
61
- }
62
-
63
- includesStringSensitive.autoRemove = (val: any) => testFalsey(val)
64
-
65
- function equalsString<
66
- TData,
67
- TValue,
68
- TAccessor extends AccessorFn<TData>,
69
- TFilterFns,
70
- TSortingFns,
71
- TAggregationFns
72
- >(
73
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
74
- columnIds: string[],
75
- filterValue: unknown
76
- ) {
77
- const search = String(filterValue).toLowerCase()
78
-
79
- return rows.filter(row => {
80
- return columnIds.some(id => {
81
- const rowValue = row.values[id]
82
- return rowValue !== undefined
83
- ? String(rowValue).toLowerCase() === search
84
- : true
85
- })
86
- })
87
- }
88
-
89
- equalsString.autoRemove = (val: any) => testFalsey(val)
90
-
91
- function equalsStringSensitive<
92
- TData,
93
- TValue,
94
- TAccessor extends AccessorFn<TData>,
95
- TFilterFns,
96
- TSortingFns,
97
- TAggregationFns
98
- >(
99
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
100
- columnIds: string[],
101
- filterValue: unknown
102
- ) {
103
- const search = String(filterValue)
104
- return rows.filter(row => {
105
- return columnIds.some(id => {
106
- const rowValue = row.values[id]
107
- return rowValue !== undefined ? String(rowValue) === search : true
108
- })
109
- })
110
- }
111
-
112
- equalsStringSensitive.autoRemove = (val: any) => testFalsey(val)
113
-
114
- function arrIncludes<
115
- TData,
116
- TValue,
117
- TAccessor extends AccessorFn<TData>,
118
- TFilterFns,
119
- TSortingFns,
120
- TAggregationFns
121
- >(
122
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
123
- columnIds: string[],
124
- filterValue: unknown
125
- ) {
126
- return rows.filter(row => {
127
- return columnIds.some(id => {
128
- const rowValue = row.values[id]
129
- return rowValue.includes(filterValue)
130
- })
131
- })
132
- }
133
-
134
- arrIncludes.autoRemove = (val: any) => testFalsey(val) || !val?.length
135
-
136
- function arrIncludesAll<
137
- TData,
138
- TValue,
139
- TAccessor extends AccessorFn<TData>,
140
- TFilterFns,
141
- TSortingFns,
142
- TAggregationFns
143
- >(
144
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
145
- columnIds: string[],
146
- filterValue: unknown[]
147
- ) {
148
- return rows.filter(row => {
149
- return columnIds.some(id => {
150
- const rowValue = row.values[id]
151
- return (
152
- rowValue &&
153
- rowValue.length &&
154
- filterValue.every(val => rowValue.includes(val))
155
- )
156
- })
157
- })
158
- }
159
-
160
- arrIncludesAll.autoRemove = (val: any) => testFalsey(val) || !val?.length
161
-
162
- function equals<
163
- TData,
164
- TValue,
165
- TAccessor extends AccessorFn<TData>,
166
- TFilterFns,
167
- TSortingFns,
168
- TAggregationFns
169
- >(
170
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
171
- columnIds: string[],
172
- filterValue: unknown
173
- ) {
174
- return rows.filter(row => {
175
- return columnIds.some(id => {
176
- const rowValue = row.values[id]
177
- return rowValue === filterValue
178
- })
179
- })
180
- }
181
-
182
- equals.autoRemove = (val: any) => testFalsey(val)
183
-
184
- function weakEquals<
185
- TData,
186
- TValue,
187
- TAccessor extends AccessorFn<TData>,
188
- TFilterFns,
189
- TSortingFns,
190
- TAggregationFns
191
- >(
192
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
193
- columnIds: string[],
194
- filterValue: unknown
195
- ) {
196
- return rows.filter(row => {
197
- return columnIds.some(id => {
198
- const rowValue = row.values[id]
199
- // eslint-disable-next-line eqeqeq
200
- return rowValue == filterValue
201
- })
202
- })
203
- }
204
-
205
- weakEquals.autoRemove = (val: any) => testFalsey(val)
206
-
207
- function betweenNumberRange<
208
- TData,
209
- TValue,
210
- TAccessor extends AccessorFn<TData>,
211
- TFilterFns,
212
- TSortingFns,
213
- TAggregationFns
214
- >(
215
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
216
- columnIds: string[],
217
- filterValue: [unknown, unknown]
218
- ) {
219
- let [unsafeMin, unsafeMax] = filterValue || []
220
-
221
- let parsedMin =
222
- typeof unsafeMin !== 'number' ? parseFloat(unsafeMin as string) : unsafeMin
223
- let parsedMax =
224
- typeof unsafeMax !== 'number' ? parseFloat(unsafeMax as string) : unsafeMax
225
-
226
- let min =
227
- unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin
228
- let max = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax
229
-
230
- if (min > max) {
231
- const temp = min
232
- min = max
233
- max = temp
234
- }
235
-
236
- return rows.filter(row => {
237
- return columnIds.some(id => {
238
- const rowValue = row.values[id]
239
- return rowValue >= min && rowValue <= max
240
- })
241
- })
242
- }
243
-
244
- betweenNumberRange.autoRemove = (val: any) =>
245
- testFalsey(val) || (testFalsey(val[0]) && testFalsey(val[1]))
246
-
247
- // Utils
248
-
249
- function testFalsey(val: any) {
250
- return val === undefined || val === null || val === ''
251
- }
package/src/sortTypes.ts DELETED
@@ -1,159 +0,0 @@
1
- import { Row } from './types'
2
-
3
- export const reSplitAlphaNumeric = /([0-9]+)/gm
4
-
5
- export const sortTypes = {
6
- alphanumeric,
7
- alphanumericCaseSensitive,
8
- text,
9
- textCaseSensitive,
10
- datetime,
11
- basic,
12
- }
13
-
14
- export type BuiltInSortType = keyof typeof sortTypes
15
-
16
- function alphanumeric<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
17
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
18
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
19
- columnId: string
20
- ) {
21
- return compareAlphanumeric(
22
- toString(rowA.values[columnId]).toLowerCase(),
23
- toString(rowB.values[columnId]).toLowerCase()
24
- )
25
- }
26
-
27
- function alphanumericCaseSensitive<
28
- TData,
29
- TValue,
30
- TFilterFns,
31
- TSortingFns,
32
- TAggregationFns
33
- >(
34
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
35
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
36
- columnId: string
37
- ) {
38
- return compareAlphanumeric(
39
- toString(rowA.values[columnId]),
40
- toString(rowB.values[columnId])
41
- )
42
- }
43
-
44
- // Mixed sorting is slow, but very inclusive of many edge cases.
45
- // It handles numbers, mixed alphanumeric combinations, and even
46
- // null, undefined, and Infinity
47
- function compareAlphanumeric(aStr: string, bStr: string) {
48
- // Split on number groups, but keep the delimiter
49
- // Then remove falsey split values
50
- const a = aStr.split(reSplitAlphaNumeric).filter(Boolean)
51
- const b = bStr.split(reSplitAlphaNumeric).filter(Boolean)
52
-
53
- // While
54
- while (a.length && b.length) {
55
- const aa = a.shift()!
56
- const bb = b.shift()!
57
-
58
- const an = parseInt(aa, 10)
59
- const bn = parseInt(bb, 10)
60
-
61
- const combo = [an, bn].sort()
62
-
63
- // Both are string
64
- if (isNaN(combo[0]!)) {
65
- if (aa > bb) {
66
- return 1
67
- }
68
- if (bb > aa) {
69
- return -1
70
- }
71
- continue
72
- }
73
-
74
- // One is a string, one is a number
75
- if (isNaN(combo[1]!)) {
76
- return isNaN(an) ? -1 : 1
77
- }
78
-
79
- // Both are numbers
80
- if (an > bn) {
81
- return 1
82
- }
83
- if (bn > an) {
84
- return -1
85
- }
86
- }
87
-
88
- return a.length - b.length
89
- }
90
-
91
- // The text filter is more basic (less numeric support)
92
- // but is much faster
93
- function text<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
94
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
95
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
96
- columnId: string
97
- ) {
98
- return compareBasic(
99
- toString(rowA.values[columnId]).toLowerCase(),
100
- toString(rowB.values[columnId]).toLowerCase()
101
- )
102
- }
103
-
104
- // The text filter is more basic (less numeric support)
105
- // but is much faster
106
- function textCaseSensitive<
107
- TData,
108
- TValue,
109
- TFilterFns,
110
- TSortingFns,
111
- TAggregationFns
112
- >(
113
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
114
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
115
- columnId: string
116
- ) {
117
- return compareBasic(
118
- toString(rowA.values[columnId]),
119
- toString(rowB.values[columnId])
120
- )
121
- }
122
-
123
- function datetime<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
124
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
125
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
126
- columnId: string
127
- ) {
128
- return compareBasic(
129
- (rowA.values[columnId] as Date).getTime(),
130
- (rowB.values[columnId] as Date).getTime()
131
- )
132
- }
133
-
134
- function basic<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
135
- rowA: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
136
- rowB: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
137
- columnId: string
138
- ) {
139
- return compareBasic(rowA.values[columnId], rowB.values[columnId])
140
- }
141
-
142
- // Utils
143
-
144
- function compareBasic(a: any, b: any) {
145
- return a === b ? 0 : a > b ? 1 : -1
146
- }
147
-
148
- function toString(a: any) {
149
- if (typeof a === 'number') {
150
- if (isNaN(a) || a === Infinity || a === -Infinity) {
151
- return ''
152
- }
153
- return String(a)
154
- }
155
- if (typeof a === 'string') {
156
- return a
157
- }
158
- return ''
159
- }