@tanstack/react-table 8.0.0-alpha.1 → 8.0.0-alpha.11

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 (96) 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 +67 -12
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/esm/index.js +30 -3346
  6. package/build/esm/index.js.map +1 -1
  7. package/build/stats-html.html +1 -1
  8. package/build/stats-react.json +28 -632
  9. package/build/types/index.d.ts +3 -7
  10. package/build/umd/index.development.js +37 -3348
  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 +56 -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 -493
  19. package/build/cjs/core.js.map +0 -1
  20. package/build/cjs/createTable.js +0 -103
  21. package/build/cjs/createTable.js.map +0 -1
  22. package/build/cjs/features/Expanding.js +0 -234
  23. package/build/cjs/features/Expanding.js.map +0 -1
  24. package/build/cjs/features/Filters.js +0 -396
  25. package/build/cjs/features/Filters.js.map +0 -1
  26. package/build/cjs/features/Grouping.js +0 -228
  27. package/build/cjs/features/Grouping.js.map +0 -1
  28. package/build/cjs/features/Headers.js +0 -483
  29. package/build/cjs/features/Headers.js.map +0 -1
  30. package/build/cjs/features/Ordering.js +0 -83
  31. package/build/cjs/features/Ordering.js.map +0 -1
  32. package/build/cjs/features/Pinning.js +0 -163
  33. package/build/cjs/features/Pinning.js.map +0 -1
  34. package/build/cjs/features/Sorting.js +0 -269
  35. package/build/cjs/features/Sorting.js.map +0 -1
  36. package/build/cjs/features/Visibility.js +0 -160
  37. package/build/cjs/features/Visibility.js.map +0 -1
  38. package/build/cjs/filterTypes.js +0 -172
  39. package/build/cjs/filterTypes.js.map +0 -1
  40. package/build/cjs/sortTypes.js +0 -121
  41. package/build/cjs/sortTypes.js.map +0 -1
  42. package/build/cjs/utils/columnFilterRowsFn.js +0 -130
  43. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  44. package/build/cjs/utils/expandRowsFn.js +0 -38
  45. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  46. package/build/cjs/utils/globalFilterRowsFn.js +0 -100
  47. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  48. package/build/cjs/utils/groupRowsFn.js +0 -154
  49. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  50. package/build/cjs/utils/sortRowsFn.js +0 -93
  51. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  52. package/build/cjs/utils.js +0 -143
  53. package/build/cjs/utils.js.map +0 -1
  54. package/build/types/aggregationTypes.d.ts +0 -22
  55. package/build/types/core.d.ts +0 -122
  56. package/build/types/createTable.d.ts +0 -35
  57. package/build/types/features/Expanding.d.ts +0 -52
  58. package/build/types/features/Filters.d.ts +0 -93
  59. package/build/types/features/Grouping.d.ts +0 -82
  60. package/build/types/features/Headers.d.ts +0 -41
  61. package/build/types/features/Ordering.d.ts +0 -19
  62. package/build/types/features/Pinning.d.ts +0 -39
  63. package/build/types/features/Sorting.d.ts +0 -75
  64. package/build/types/features/Visibility.d.ts +0 -47
  65. package/build/types/filterTypes.d.ts +0 -50
  66. package/build/types/sortTypes.d.ts +0 -17
  67. package/build/types/types.d.ts +0 -122
  68. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  69. package/build/types/utils/expandRowsFn.d.ts +0 -2
  70. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  71. package/build/types/utils/groupRowsFn.d.ts +0 -2
  72. package/build/types/utils/sortRowsFn.d.ts +0 -2
  73. package/build/types/utils.d.ts +0 -24
  74. package/src/aggregationTypes.ts +0 -115
  75. package/src/core.tsx +0 -1194
  76. package/src/createTable.tsx +0 -181
  77. package/src/features/Expanding.ts +0 -388
  78. package/src/features/Filters.ts +0 -707
  79. package/src/features/Grouping.ts +0 -451
  80. package/src/features/Headers.ts +0 -907
  81. package/src/features/Ordering.ts +0 -134
  82. package/src/features/Pinning.ts +0 -213
  83. package/src/features/Sorting.ts +0 -487
  84. package/src/features/Visibility.ts +0 -281
  85. package/src/features/withColumnResizing.oldts +0 -281
  86. package/src/features/withPagination.oldts +0 -208
  87. package/src/features/withRowSelection.oldts +0 -467
  88. package/src/filterTypes.ts +0 -251
  89. package/src/sortTypes.ts +0 -159
  90. package/src/types.ts +0 -285
  91. package/src/utils/columnFilterRowsFn.ts +0 -162
  92. package/src/utils/expandRowsFn.ts +0 -53
  93. package/src/utils/globalFilterRowsFn.ts +0 -129
  94. package/src/utils/groupRowsFn.ts +0 -196
  95. package/src/utils/sortRowsFn.ts +0 -115
  96. package/src/utils.tsx +0 -243
@@ -1,162 +0,0 @@
1
- import { ReactTable, Row, RowModel } from '../types'
2
- import { ColumnFiltersState } from '../features/Filters'
3
- import { Options } from '..'
4
-
5
- export const columnFilterRowsFn: Options<
6
- any,
7
- any,
8
- {},
9
- {},
10
- {}
11
- >['columnFilterRowsFn'] = <
12
- TData,
13
- TValue,
14
- TFilterFns,
15
- TSortingFns,
16
- TAggregationFns
17
- >(
18
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
19
- columnFilters: ColumnFiltersState,
20
- rowModel: RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
21
- ): RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
22
- const newFilteredFlatRows: Row<
23
- TData,
24
- TValue,
25
- TFilterFns,
26
- TSortingFns,
27
- TAggregationFns
28
- >[] = []
29
- const newFilteredRowsById: Record<
30
- string,
31
- Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
32
- > = {}
33
-
34
- const filterFromChildrenUp = instance.options.filterFromChildrenUp
35
-
36
- const filterRows = (
37
- rowsToFilter: Row<
38
- TData,
39
- TValue,
40
- TFilterFns,
41
- TSortingFns,
42
- TAggregationFns
43
- >[],
44
- depth: number
45
- ) => {
46
- columnFilters.forEach(({ id: columnId, value: filterValue }) => {
47
- // Find the columnFilters column
48
- const column = instance.getColumn(columnId)
49
-
50
- if (!column) {
51
- if (process.env.NODE_ENV !== 'production') {
52
- console.warn(
53
- `React-Table: Could not find a column with id: ${columnId}`
54
- )
55
- }
56
- throw new Error()
57
- }
58
-
59
- if (depth === 0) {
60
- const preFilteredRows = [...rowsToFilter]
61
- column.getPreFilteredRows = () => preFilteredRows
62
- }
63
-
64
- const filterFn = instance.getColumnFilterFn(column.id)
65
-
66
- if (!filterFn) {
67
- if (process.env.NODE_ENV !== 'production') {
68
- console.warn(
69
- `Could not find a valid 'column.filterType' for column with the ID: ${column.id}.`
70
- )
71
- }
72
- return
73
- }
74
-
75
- // Pass the rows, id, filterValue and column to the filterFn
76
- // to get the filtered rows back
77
- rowsToFilter = filterFn(rowsToFilter, [columnId], filterValue)
78
- })
79
-
80
- return rowsToFilter
81
- }
82
-
83
- if (filterFromChildrenUp) {
84
- const recurseFilterRows = (
85
- rowsToFilter: Row<
86
- TData,
87
- TValue,
88
- TFilterFns,
89
- TSortingFns,
90
- TAggregationFns
91
- >[],
92
- depth = 0
93
- ) => {
94
- // Filter from children up
95
- rowsToFilter = rowsToFilter.filter(row => {
96
- if (!row.subRows?.length) {
97
- return true
98
- }
99
-
100
- row.subRows = recurseFilterRows(row.subRows, depth + 1)
101
-
102
- return row.subRows.length
103
- })
104
-
105
- rowsToFilter = filterRows(rowsToFilter, depth)
106
-
107
- // Apply the filter to any subRows
108
- rowsToFilter.forEach(row => {
109
- newFilteredFlatRows.push(row)
110
- newFilteredRowsById[row.id] = row
111
- })
112
-
113
- return rowsToFilter
114
- }
115
-
116
- return {
117
- rows: recurseFilterRows(rowModel.rows),
118
- flatRows: newFilteredFlatRows,
119
- rowsById: newFilteredRowsById,
120
- }
121
- }
122
-
123
- // Filters top level and nested rows
124
- const recurseFilterRows = (
125
- rowsToFilter: Row<
126
- TData,
127
- TValue,
128
- TFilterFns,
129
- TSortingFns,
130
- TAggregationFns
131
- >[],
132
- depth = 0
133
- ) => {
134
- // Filter from parents downward
135
- rowsToFilter = filterRows(rowsToFilter, depth)
136
-
137
- // Apply the filter to any subRows
138
- // We technically could do this recursively in the above loop,
139
- // but that would severely hinder the API for the user, since they
140
- // would be required to do that recursion in some scenarios
141
- rowsToFilter.forEach(row => {
142
- newFilteredFlatRows.push(row)
143
- newFilteredRowsById[row.id] = row
144
-
145
- if (!filterFromChildrenUp) {
146
- if (!row.subRows?.length) {
147
- return
148
- }
149
-
150
- row.subRows = recurseFilterRows(row.subRows, depth + 1)
151
- }
152
- })
153
-
154
- return rowsToFilter
155
- }
156
-
157
- return {
158
- rows: recurseFilterRows(rowModel.rows),
159
- flatRows: newFilteredFlatRows,
160
- rowsById: newFilteredRowsById,
161
- }
162
- }
@@ -1,53 +0,0 @@
1
- import { ReactTable, Row, RowModel } from '../types'
2
- import { Options } from '../types'
3
- import { ExpandedState } from '../features/Expanding'
4
-
5
- export const expandRowsFn: Options<any, any, {}, {}, {}>['expandRowsFn'] = <
6
- TData,
7
- TValue,
8
- TFilterFns,
9
- TSortingFns,
10
- TAggregationFns
11
- >(
12
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
13
- _expandedState: ExpandedState,
14
- sortedRowModel: RowModel<
15
- TData,
16
- TValue,
17
- TFilterFns,
18
- TSortingFns,
19
- TAggregationFns
20
- >
21
- ): RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
22
- const expandedRows: Row<
23
- TData,
24
- TValue,
25
- TFilterFns,
26
- TSortingFns,
27
- TAggregationFns
28
- >[] = []
29
-
30
- const { expandSubRows } = instance.options
31
-
32
- const handleRow = (
33
- row: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
34
- ) => {
35
- expandedRows.push(row)
36
-
37
- if (
38
- expandSubRows &&
39
- row.subRows?.length &&
40
- instance.getIsRowExpanded(row.id)
41
- ) {
42
- row.subRows.forEach(handleRow)
43
- }
44
- }
45
-
46
- sortedRowModel.rows.forEach(handleRow)
47
-
48
- return {
49
- rows: expandedRows,
50
- flatRows: sortedRowModel.flatRows,
51
- rowsById: sortedRowModel.rowsById,
52
- }
53
- }
@@ -1,129 +0,0 @@
1
- import { Options } from '..'
2
- import { ReactTable, Row, RowModel } from '../types'
3
-
4
- export const globalFilterRowsFn: Options<
5
- any,
6
- any,
7
- {},
8
- {},
9
- {}
10
- >['globalFilterRowsFn'] = <
11
- TData,
12
- TValue,
13
- TFilterFns,
14
- TSortingFns,
15
- TAggregationFns
16
- >(
17
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
18
- globalFilter: any,
19
- rowModel: RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
20
- ): RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
21
- const newFilteredFlatRows: Row<
22
- TData,
23
- TValue,
24
- TFilterFns,
25
- TSortingFns,
26
- TAggregationFns
27
- >[] = []
28
- const newFilteredRowsById: Record<
29
- string,
30
- Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
31
- > = {}
32
-
33
- const filterFromChildrenUp = instance.options.filterFromChildrenUp
34
-
35
- const filterFn = instance.getGlobalFilterFn()
36
-
37
- if (!filterFn) {
38
- if (process.env.NODE_ENV !== 'production') {
39
- console.warn(`Could not find a valid 'globalFilterType'`)
40
- }
41
- return rowModel
42
- }
43
-
44
- const filterableColumns = instance
45
- .getAllLeafColumns()
46
- .filter(column => column.getCanGlobalFilter())
47
-
48
- const filterableColumnIds = filterableColumns.map(d => d.id)
49
-
50
- if (filterFromChildrenUp) {
51
- const recurseFilterRows = (
52
- rowsToFilter: Row<
53
- TData,
54
- TValue,
55
- TFilterFns,
56
- TSortingFns,
57
- TAggregationFns
58
- >[],
59
- depth = 0
60
- ) => {
61
- // Filter from children up
62
- rowsToFilter = rowsToFilter.filter(row => {
63
- if (!row.subRows?.length) {
64
- return true
65
- }
66
-
67
- row.subRows = recurseFilterRows(row.subRows, depth + 1)
68
-
69
- return row.subRows.length
70
- })
71
-
72
- rowsToFilter = filterFn(rowsToFilter, filterableColumnIds, globalFilter)
73
-
74
- // Apply the filter to any subRows
75
- rowsToFilter.forEach(row => {
76
- newFilteredFlatRows.push(row)
77
- newFilteredRowsById[row.id] = row
78
- })
79
-
80
- return rowsToFilter
81
- }
82
-
83
- return {
84
- rows: recurseFilterRows(rowModel.rows),
85
- flatRows: newFilteredFlatRows,
86
- rowsById: newFilteredRowsById,
87
- }
88
- }
89
-
90
- // Filters top level and nested rows
91
- const recurseFilterRows = (
92
- rowsToFilter: Row<
93
- TData,
94
- TValue,
95
- TFilterFns,
96
- TSortingFns,
97
- TAggregationFns
98
- >[],
99
- depth = 0
100
- ) => {
101
- // Filter from parents downward
102
- rowsToFilter = filterFn(rowsToFilter, filterableColumnIds, globalFilter)
103
-
104
- // Apply the filter to any subRows
105
- // We technically could do this recursively in the above loop,
106
- // but that would severely hinder the API for the user, since they
107
- // would be required to do that recursion in some scenarios
108
- rowsToFilter.forEach(row => {
109
- newFilteredFlatRows.push(row)
110
- newFilteredRowsById[row.id] = row
111
-
112
- if (!filterFromChildrenUp) {
113
- if (!row.subRows?.length) {
114
- return
115
- }
116
-
117
- row.subRows = recurseFilterRows(row.subRows, depth + 1)
118
- }
119
- })
120
-
121
- return rowsToFilter
122
- }
123
-
124
- return {
125
- rows: recurseFilterRows(rowModel.rows),
126
- flatRows: newFilteredFlatRows,
127
- rowsById: newFilteredRowsById,
128
- }
129
- }
@@ -1,196 +0,0 @@
1
- import { ReactTable, Row, RowModel } from '../types'
2
- import { Options } from '../types'
3
- import { GroupingState } from '../features/Grouping'
4
- import { flattenBy } from '../utils'
5
-
6
- export const groupRowsFn: Options<any, any, {}, {}, {}>['groupRowsFn'] = <
7
- TData,
8
- TValue,
9
- TFilterFns,
10
- TSortingFns,
11
- TAggregationFns
12
- >(
13
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
14
- groupingState: GroupingState,
15
- sortedRowModel: RowModel<
16
- TData,
17
- TValue,
18
- TFilterFns,
19
- TSortingFns,
20
- TAggregationFns
21
- >
22
- ): RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
23
- // Filter the grouping list down to columns that exist
24
- const existingGrouping = groupingState.filter(columnId =>
25
- instance.getColumn(columnId)
26
- )
27
-
28
- // Find the columns that can or are aggregating
29
- // Uses each column to aggregate rows into a single value
30
- const aggregateRowsToValues = (
31
- leafRows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
32
- groupedRows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
33
- depth: number
34
- ) => {
35
- const values: Record<string, unknown> = {}
36
-
37
- instance.getAllLeafColumns().forEach(column => {
38
- // Don't aggregate columns that are in the grouping
39
- if (existingGrouping.includes(column.id)) {
40
- values[column.id] = groupedRows[0]
41
- ? groupedRows[0].values[column.id]
42
- : null
43
- return
44
- }
45
-
46
- // Aggregate the values
47
- const aggregateFn = instance.getColumnAggregationFn(column.id)
48
-
49
- if (aggregateFn) {
50
- // Get the columnValues to aggregate
51
- const groupedValues = groupedRows.map(row => row.values[column.id])
52
-
53
- // Get the columnValues to aggregate
54
- const leafValues = leafRows.map(row => {
55
- let columnValue = row.values[column.id]
56
-
57
- if (!depth && column.aggregateValue) {
58
- columnValue = column.aggregateValue(columnValue)
59
- }
60
-
61
- return columnValue
62
- })
63
-
64
- values[column.id] = aggregateFn(leafValues, groupedValues)
65
- } else if (column.aggregationType) {
66
- console.info({ column })
67
- throw new Error(
68
- process.env.NODE_ENV !== 'production'
69
- ? `React Table: Invalid column.aggregateType option for column listed above`
70
- : ''
71
- )
72
- } else {
73
- values[column.id] = null
74
- }
75
- })
76
-
77
- return values
78
- }
79
-
80
- const groupedFlatRows: Row<
81
- TData,
82
- TValue,
83
- TFilterFns,
84
- TSortingFns,
85
- TAggregationFns
86
- >[] = []
87
- const groupedRowsById: Record<
88
- string,
89
- Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
90
- > = {}
91
- // const onlyGroupedFlatRows: Row[] = [];
92
- // const onlyGroupedRowsById: Record<RowId, Row> = {};
93
- // const nonGroupedFlatRows: Row[] = [];
94
- // const nonGroupedRowsById: Record<RowId, Row> = {};
95
-
96
- // Recursively group the data
97
- const groupUpRecursively = (
98
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
99
- depth = 0,
100
- parentId: string
101
- ) => {
102
- // This is the last level, just return the rows
103
- if (depth === existingGrouping.length) {
104
- return rows
105
- }
106
-
107
- const columnId = existingGrouping[depth]!
108
-
109
- // Group the rows together for this level
110
- const rowGroupsMap = groupBy(rows, columnId)
111
-
112
- // Peform aggregations for each group
113
- const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map(
114
- ([groupingValue, groupedRows], index) => {
115
- let id = `${columnId}:${groupingValue}`
116
- id = parentId ? `${parentId}>${id}` : id
117
-
118
- // First, Recurse to group sub rows before aggregation
119
- const subRows = groupUpRecursively(groupedRows, depth + 1, id)
120
-
121
- // Flatten the leaf rows of the rows in this group
122
- const leafRows = depth
123
- ? flattenBy(groupedRows, row => row.leafRows)
124
- : groupedRows
125
-
126
- const values = aggregateRowsToValues(leafRows, groupedRows, depth)
127
-
128
- const row = instance.createRow(id, undefined, index, depth, values)
129
-
130
- Object.assign(row, {
131
- groupingColumnId: columnId,
132
- groupingValue,
133
- subRows,
134
- leafRows,
135
- })
136
-
137
- subRows.forEach(subRow => {
138
- groupedFlatRows.push(subRow)
139
- groupedRowsById[subRow.id] = subRow
140
- // if (subRow.getIsGrouped?.()) {
141
- // onlyGroupedFlatRows.push(subRow);
142
- // onlyGroupedRowsById[subRow.id] = subRow;
143
- // } else {
144
- // nonGroupedFlatRows.push(subRow);
145
- // nonGroupedRowsById[subRow.id] = subRow;
146
- // }
147
- })
148
-
149
- return row
150
- }
151
- )
152
-
153
- return aggregatedGroupedRows
154
- }
155
-
156
- const groupedRows = groupUpRecursively(sortedRowModel.rows, 0, '')
157
-
158
- groupedRows.forEach(subRow => {
159
- groupedFlatRows.push(subRow)
160
- groupedRowsById[subRow.id] = subRow
161
- // if (subRow.getIsGrouped?.()) {
162
- // onlyGroupedFlatRows.push(subRow);
163
- // onlyGroupedRowsById[subRow.id] = subRow;
164
- // } else {
165
- // nonGroupedFlatRows.push(subRow);
166
- // nonGroupedRowsById[subRow.id] = subRow;
167
- // }
168
- })
169
-
170
- return {
171
- rows: groupedRows,
172
- flatRows: groupedFlatRows,
173
- rowsById: groupedRowsById,
174
- }
175
- }
176
-
177
- function groupBy<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>(
178
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[],
179
- columnId: string
180
- ) {
181
- const groupMap = new Map<
182
- any,
183
- Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[]
184
- >()
185
-
186
- return rows.reduce((map, row) => {
187
- const resKey = `${row.values[columnId]}`
188
- const previous = map.get(resKey)
189
- if (!previous) {
190
- map.set(resKey, [row])
191
- } else {
192
- map.set(resKey, [...previous, row])
193
- }
194
- return map
195
- }, groupMap)
196
- }
@@ -1,115 +0,0 @@
1
- import { ReactTable, Row, RowModel } from '../types'
2
- import { SortingFn, SortingState } from '../features/Sorting'
3
- import { Options } from '../types'
4
-
5
- export const sortRowsFn: Options<any, any, {}, {}, {}>['sortRowsFn'] = <
6
- TData,
7
- TValue,
8
- TFilterFns,
9
- TSortingFns,
10
- TAggregationFns
11
- >(
12
- instance: ReactTable<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>,
13
- sortingState: SortingState,
14
- rowModel: RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>
15
- ): RowModel<TData, TValue, TFilterFns, TSortingFns, TAggregationFns> => {
16
- const sortedFlatRows: Row<
17
- TData,
18
- TValue,
19
- TFilterFns,
20
- TSortingFns,
21
- TAggregationFns
22
- >[] = []
23
-
24
- // Filter out sortings that correspond to non existing columns
25
- const availableSorting = sortingState.filter(sort =>
26
- instance.getColumnCanSort(sort.id)
27
- )
28
-
29
- const columnInfoById: Record<
30
- string,
31
- {
32
- sortUndefined?: false | -1 | 1
33
- invertSorting?: boolean
34
- sortingFn: SortingFn<
35
- TData,
36
- TValue,
37
- TFilterFns,
38
- TSortingFns,
39
- TAggregationFns
40
- >
41
- }
42
- > = {}
43
-
44
- availableSorting.forEach(sortEntry => {
45
- const column = instance.getColumn(sortEntry.id)!
46
-
47
- columnInfoById[sortEntry.id] = {
48
- sortUndefined: column.sortUndefined,
49
- invertSorting: column.invertSorting,
50
- sortingFn: instance.getColumnSortingFn(sortEntry.id)!,
51
- }
52
- })
53
-
54
- const sortData = (
55
- rows: Row<TData, TValue, TFilterFns, TSortingFns, TAggregationFns>[]
56
- ) => {
57
- // This will also perform a stable sorting using the row index
58
- // if needed.
59
- const sortedData = rows.slice()
60
-
61
- sortedData.sort((rowA, rowB) => {
62
- for (let i = 0; i < availableSorting.length; i += 1) {
63
- const sortEntry = availableSorting[i]!
64
- const columnInfo = columnInfoById[sortEntry.id]!
65
- const isDesc = sortEntry?.desc ?? false
66
-
67
- if (columnInfo.sortUndefined) {
68
- const aValue = rowA.values[sortEntry.id]
69
- const bValue = rowB.values[sortEntry.id]
70
-
71
- const aUndefined = typeof aValue === 'undefined'
72
- const bUndefined = typeof bValue === 'undefined'
73
-
74
- if (aUndefined || bUndefined) {
75
- return aUndefined && bUndefined ? 0 : aUndefined ? 1 : -1
76
- }
77
- }
78
-
79
- // This function should always return in ascending order
80
- let sortInt = columnInfo.sortingFn(rowA, rowB, sortEntry.id)
81
-
82
- if (sortInt !== 0) {
83
- if (isDesc) {
84
- sortInt *= -1
85
- }
86
-
87
- if (columnInfo.invertSorting) {
88
- sortInt *= -1
89
- }
90
-
91
- return sortInt
92
- }
93
- }
94
-
95
- return rowA.index - rowB.index
96
- })
97
-
98
- // If there are sub-rows, sort them
99
- sortedData.forEach(row => {
100
- sortedFlatRows.push(row)
101
- if (!row.subRows || row.subRows.length <= 1) {
102
- return
103
- }
104
- row.subRows = sortData(row.subRows)
105
- })
106
-
107
- return sortedData
108
- }
109
-
110
- return {
111
- rows: sortData(rowModel.rows),
112
- flatRows: sortedFlatRows,
113
- rowsById: rowModel.rowsById,
114
- }
115
- }