@tanstack/react-table 8.0.0-alpha.3 → 8.0.0-alpha.34

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 +0 -78
  2. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  3. package/build/cjs/index.js +99 -12
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/esm/index.js +41 -4686
  6. package/build/esm/index.js.map +1 -1
  7. package/build/stats-html.html +1 -1
  8. package/build/stats-react.json +29 -747
  9. package/build/types/index.d.ts +13 -7
  10. package/build/umd/index.development.js +51 -4688
  11. package/build/umd/index.development.js.map +1 -1
  12. package/build/umd/index.production.js +1 -1
  13. package/build/umd/index.production.js.map +1 -1
  14. package/package.json +4 -1
  15. package/src/index.tsx +107 -7
  16. package/build/cjs/aggregationTypes.js +0 -130
  17. package/build/cjs/aggregationTypes.js.map +0 -1
  18. package/build/cjs/core.js +0 -552
  19. package/build/cjs/core.js.map +0 -1
  20. package/build/cjs/createTable.js +0 -108
  21. package/build/cjs/createTable.js.map +0 -1
  22. package/build/cjs/features/ColumnSizing.js +0 -317
  23. package/build/cjs/features/ColumnSizing.js.map +0 -1
  24. package/build/cjs/features/Expanding.js +0 -255
  25. package/build/cjs/features/Expanding.js.map +0 -1
  26. package/build/cjs/features/Filters.js +0 -445
  27. package/build/cjs/features/Filters.js.map +0 -1
  28. package/build/cjs/features/Grouping.js +0 -249
  29. package/build/cjs/features/Grouping.js.map +0 -1
  30. package/build/cjs/features/Headers.js +0 -549
  31. package/build/cjs/features/Headers.js.map +0 -1
  32. package/build/cjs/features/Ordering.js +0 -86
  33. package/build/cjs/features/Ordering.js.map +0 -1
  34. package/build/cjs/features/Pagination.js +0 -194
  35. package/build/cjs/features/Pagination.js.map +0 -1
  36. package/build/cjs/features/Pinning.js +0 -149
  37. package/build/cjs/features/Pinning.js.map +0 -1
  38. package/build/cjs/features/RowSelection.js +0 -541
  39. package/build/cjs/features/RowSelection.js.map +0 -1
  40. package/build/cjs/features/Sorting.js +0 -327
  41. package/build/cjs/features/Sorting.js.map +0 -1
  42. package/build/cjs/features/Visibility.js +0 -166
  43. package/build/cjs/features/Visibility.js.map +0 -1
  44. package/build/cjs/filterTypes.js +0 -172
  45. package/build/cjs/filterTypes.js.map +0 -1
  46. package/build/cjs/sortTypes.js +0 -122
  47. package/build/cjs/sortTypes.js.map +0 -1
  48. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  49. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  50. package/build/cjs/utils/expandRowsFn.js +0 -38
  51. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  52. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  53. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  54. package/build/cjs/utils/groupRowsFn.js +0 -155
  55. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  56. package/build/cjs/utils/sortRowsFn.js +0 -94
  57. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  58. package/build/cjs/utils.js +0 -146
  59. package/build/cjs/utils.js.map +0 -1
  60. package/build/types/aggregationTypes.d.ts +0 -22
  61. package/build/types/core.d.ts +0 -111
  62. package/build/types/createTable.d.ts +0 -53
  63. package/build/types/features/ColumnSizing.d.ts +0 -67
  64. package/build/types/features/Expanding.d.ts +0 -53
  65. package/build/types/features/Filters.d.ts +0 -98
  66. package/build/types/features/Grouping.d.ts +0 -82
  67. package/build/types/features/Headers.d.ts +0 -41
  68. package/build/types/features/Ordering.d.ts +0 -19
  69. package/build/types/features/Pagination.d.ts +0 -43
  70. package/build/types/features/Pinning.d.ts +0 -39
  71. package/build/types/features/RowSelection.d.ts +0 -66
  72. package/build/types/features/Sorting.d.ts +0 -78
  73. package/build/types/features/Visibility.d.ts +0 -47
  74. package/build/types/filterTypes.d.ts +0 -50
  75. package/build/types/sortTypes.d.ts +0 -18
  76. package/build/types/types.d.ts +0 -127
  77. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  78. package/build/types/utils/expandRowsFn.d.ts +0 -2
  79. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  80. package/build/types/utils/groupRowsFn.d.ts +0 -2
  81. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  82. package/build/types/utils/sortRowsFn.d.ts +0 -2
  83. package/build/types/utils.d.ts +0 -28
  84. package/src/aggregationTypes.ts +0 -115
  85. package/src/core.tsx +0 -1182
  86. package/src/createTable.tsx +0 -241
  87. package/src/features/ColumnSizing.ts +0 -453
  88. package/src/features/Expanding.ts +0 -404
  89. package/src/features/Filters.ts +0 -762
  90. package/src/features/Grouping.ts +0 -466
  91. package/src/features/Headers.ts +0 -912
  92. package/src/features/Ordering.ts +0 -133
  93. package/src/features/Pagination.ts +0 -314
  94. package/src/features/Pinning.ts +0 -200
  95. package/src/features/RowSelection.ts +0 -831
  96. package/src/features/Sorting.ts +0 -547
  97. package/src/features/Visibility.ts +0 -279
  98. package/src/filterTypes.ts +0 -251
  99. package/src/sortTypes.ts +0 -159
  100. package/src/types.ts +0 -331
  101. package/src/utils/columnFilterRowsFn.ts +0 -155
  102. package/src/utils/expandRowsFn.ts +0 -50
  103. package/src/utils/globalFilterRowsFn.ts +0 -122
  104. package/src/utils/groupRowsFn.ts +0 -194
  105. package/src/utils/paginateRowsFn.ts +0 -34
  106. package/src/utils/sortRowsFn.ts +0 -115
  107. package/src/utils.tsx +0 -257
@@ -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
- }