@tanstack/table-core 8.0.0-alpha.63 → 8.0.0-alpha.67
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/core.js +7 -4
- package/build/cjs/core.js.map +1 -1
- package/build/cjs/features/Cells.js +2 -2
- package/build/cjs/features/Cells.js.map +1 -1
- package/build/cjs/features/ColumnSizing.js +68 -143
- package/build/cjs/features/ColumnSizing.js.map +1 -1
- package/build/cjs/features/Columns.js +7 -7
- package/build/cjs/features/Columns.js.map +1 -1
- package/build/cjs/features/Expanding.js +52 -90
- package/build/cjs/features/Expanding.js.map +1 -1
- package/build/cjs/features/Filters.js +213 -191
- package/build/cjs/features/Filters.js.map +1 -1
- package/build/cjs/features/Grouping.js +54 -80
- package/build/cjs/features/Grouping.js.map +1 -1
- package/build/cjs/features/Headers.js +16 -40
- package/build/cjs/features/Headers.js.map +1 -1
- package/build/cjs/features/Ordering.js +6 -5
- package/build/cjs/features/Ordering.js.map +1 -1
- package/build/cjs/features/Pagination.js +5 -5
- package/build/cjs/features/Pagination.js.map +1 -1
- package/build/cjs/features/Pinning.js +82 -168
- package/build/cjs/features/Pinning.js.map +1 -1
- package/build/cjs/features/RowSelection.js +67 -119
- package/build/cjs/features/RowSelection.js.map +1 -1
- package/build/cjs/features/Sorting.js +41 -91
- package/build/cjs/features/Sorting.js.map +1 -1
- package/build/cjs/features/Visibility.js +20 -43
- package/build/cjs/features/Visibility.js.map +1 -1
- package/build/cjs/filterFns.js +51 -108
- package/build/cjs/filterFns.js.map +1 -1
- package/build/cjs/index.js +5 -4
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/utils/filterRowsUtils.js +21 -0
- package/build/cjs/utils/filterRowsUtils.js.map +1 -1
- package/build/cjs/utils/getCoreRowModelAsync.js +1 -1
- package/build/cjs/utils/getCoreRowModelAsync.js.map +1 -1
- package/build/cjs/utils/getCoreRowModelSync.js +1 -1
- package/build/cjs/utils/getCoreRowModelSync.js.map +1 -1
- package/build/cjs/utils/getExpandedRowModel.js +2 -2
- package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
- package/build/cjs/utils/getFilteredRowModelSync.js +125 -0
- package/build/cjs/utils/getFilteredRowModelSync.js.map +1 -0
- package/build/cjs/utils/getGroupedRowModel.js +1 -1
- package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
- package/build/cjs/utils/getPaginationRowModel.js +1 -1
- package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
- package/build/cjs/utils/getSortedRowModelSync.js +3 -3
- package/build/cjs/utils/getSortedRowModelSync.js.map +1 -1
- package/build/cjs/utils.js +2 -6
- package/build/cjs/utils.js.map +1 -1
- package/build/esm/index.js +899 -1357
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +404 -418
- package/build/types/features/ColumnSizing.d.ts +2 -13
- package/build/types/features/Expanding.d.ts +3 -13
- package/build/types/features/Filters.d.ts +38 -42
- package/build/types/features/Grouping.d.ts +3 -18
- package/build/types/features/Ordering.d.ts +2 -6
- package/build/types/features/Pinning.d.ts +2 -19
- package/build/types/features/RowSelection.d.ts +4 -15
- package/build/types/features/Sorting.d.ts +5 -22
- package/build/types/features/Visibility.d.ts +2 -15
- package/build/types/filterFns.d.ts +10 -52
- package/build/types/index.d.ts +1 -2
- package/build/types/types.d.ts +2 -4
- package/build/types/utils/filterRowsUtils.d.ts +1 -0
- package/build/types/utils/{getColumnFilteredRowModelAsync.d.ts → getFilteredRowModelAsync.d.ts} +1 -1
- package/build/types/utils/getFilteredRowModelSync.d.ts +2 -0
- package/build/types/utils.d.ts +2 -2
- package/build/umd/index.development.js +867 -1323
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -1
- package/src/core.ts +5 -5
- package/src/features/Cells.ts +4 -2
- package/src/features/ColumnSizing.ts +69 -126
- package/src/features/Columns.ts +12 -7
- package/src/features/Expanding.ts +62 -107
- package/src/features/Filters.ts +293 -243
- package/src/features/Grouping.ts +59 -81
- package/src/features/Headers.ts +18 -40
- package/src/features/Ordering.ts +7 -9
- package/src/features/Pagination.ts +4 -3
- package/src/features/Pinning.ts +77 -164
- package/src/features/RowSelection.ts +76 -123
- package/src/features/Sorting.ts +48 -106
- package/src/features/Visibility.ts +25 -52
- package/src/filterFns.ts +74 -147
- package/src/index.ts +1 -2
- package/src/types.ts +2 -2
- package/src/utils/filterRowsUtils.ts +24 -0
- package/src/utils/getCoreRowModelAsync.ts +1 -1
- package/src/utils/getCoreRowModelSync.ts +1 -1
- package/src/utils/getExpandedRowModel.ts +2 -2
- package/src/utils/getFilteredRowModelAsync.ts +157 -0
- package/src/utils/getFilteredRowModelSync.ts +141 -0
- package/src/utils/getGroupedRowModel.ts +1 -1
- package/src/utils/getPaginationRowModel.ts +1 -1
- package/src/utils/getSortedRowModelAsync.ts +1 -1
- package/src/utils/getSortedRowModelSync.ts +4 -4
- package/src/utils.ts +2 -4
- package/build/cjs/utils/getColumnFilteredRowModelSync.js +0 -115
- package/build/cjs/utils/getColumnFilteredRowModelSync.js.map +0 -1
- package/build/cjs/utils/getGlobalFilteredRowModelSync.js +0 -91
- package/build/cjs/utils/getGlobalFilteredRowModelSync.js.map +0 -1
- package/build/types/utils/getColumnFilteredRowModelSync.d.ts +0 -2
- package/build/types/utils/getGlobalFilteredRowModelAsync.d.ts +0 -4
- package/build/types/utils/getGlobalFilteredRowModelSync.d.ts +0 -2
- package/src/utils/getColumnFilteredRowModelAsync.ts +0 -118
- package/src/utils/getColumnFilteredRowModelSync.ts +0 -102
- package/src/utils/getGlobalFilteredRowModelAsync.ts +0 -96
- package/src/utils/getGlobalFilteredRowModelSync.ts +0 -79
package/src/filterFns.ts
CHANGED
|
@@ -1,179 +1,95 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
arrIncludesSome,
|
|
11
|
-
equals,
|
|
12
|
-
weakEquals,
|
|
13
|
-
betweenNumberRange,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type BuiltInFilterFn = keyof typeof filterFns
|
|
17
|
-
|
|
18
|
-
function includesString<TGenerics extends TableGenerics>(
|
|
19
|
-
rows: Row<TGenerics>[],
|
|
20
|
-
columnIds: string[],
|
|
21
|
-
filterValue: unknown
|
|
22
|
-
) {
|
|
23
|
-
const search = String(filterValue).toLowerCase()
|
|
24
|
-
|
|
25
|
-
rows = rows.filter(row => {
|
|
26
|
-
return columnIds.some(id => {
|
|
27
|
-
return String(row.values[id]).toLowerCase().includes(search)
|
|
28
|
-
})
|
|
29
|
-
})
|
|
30
|
-
return rows
|
|
1
|
+
import { FilterFn } from './features/Filters'
|
|
2
|
+
|
|
3
|
+
const includesString: FilterFn<any> = (
|
|
4
|
+
row,
|
|
5
|
+
columnId: string,
|
|
6
|
+
filterValue: string
|
|
7
|
+
) => {
|
|
8
|
+
const search = filterValue.toLowerCase()
|
|
9
|
+
return row.values[columnId].toLowerCase().includes(search)
|
|
31
10
|
}
|
|
32
11
|
|
|
33
12
|
includesString.autoRemove = (val: any) => testFalsey(val)
|
|
34
13
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
filterValue:
|
|
39
|
-
) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
rows = rows.filter(row => {
|
|
43
|
-
return columnIds.some(id => {
|
|
44
|
-
return String(row.values[id]).includes(search)
|
|
45
|
-
})
|
|
46
|
-
})
|
|
47
|
-
return rows
|
|
14
|
+
const includesStringSensitive: FilterFn<any> = (
|
|
15
|
+
row,
|
|
16
|
+
columnId: string,
|
|
17
|
+
filterValue: string
|
|
18
|
+
) => {
|
|
19
|
+
return row.values[columnId].includes(filterValue)
|
|
48
20
|
}
|
|
49
21
|
|
|
50
22
|
includesStringSensitive.autoRemove = (val: any) => testFalsey(val)
|
|
51
23
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
filterValue:
|
|
56
|
-
) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return rows.filter(row => {
|
|
60
|
-
return columnIds.some(id => {
|
|
61
|
-
const rowValue = row.values[id]
|
|
62
|
-
return rowValue !== undefined
|
|
63
|
-
? String(rowValue).toLowerCase() === search
|
|
64
|
-
: true
|
|
65
|
-
})
|
|
66
|
-
})
|
|
24
|
+
const equalsString: FilterFn<any> = (
|
|
25
|
+
row,
|
|
26
|
+
columnId: string,
|
|
27
|
+
filterValue: string
|
|
28
|
+
) => {
|
|
29
|
+
return row.values[columnId].toLowerCase() === filterValue.toLowerCase()
|
|
67
30
|
}
|
|
68
31
|
|
|
69
32
|
equalsString.autoRemove = (val: any) => testFalsey(val)
|
|
70
33
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
34
|
+
const arrIncludes: FilterFn<any> = (
|
|
35
|
+
row,
|
|
36
|
+
columnId: string,
|
|
74
37
|
filterValue: unknown
|
|
75
|
-
) {
|
|
76
|
-
|
|
77
|
-
return rows.filter(row => {
|
|
78
|
-
return columnIds.some(id => {
|
|
79
|
-
const rowValue = row.values[id]
|
|
80
|
-
return rowValue !== undefined ? String(rowValue) === search : true
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
equalsStringSensitive.autoRemove = (val: any) => testFalsey(val)
|
|
86
|
-
|
|
87
|
-
function arrIncludes<TGenerics extends TableGenerics>(
|
|
88
|
-
rows: Row<TGenerics>[],
|
|
89
|
-
columnIds: string[],
|
|
90
|
-
filterValue: unknown
|
|
91
|
-
) {
|
|
92
|
-
return rows.filter(row => {
|
|
93
|
-
return columnIds.some(id => {
|
|
94
|
-
const rowValue = row.values[id]
|
|
95
|
-
return rowValue.includes(filterValue)
|
|
96
|
-
})
|
|
97
|
-
})
|
|
38
|
+
) => {
|
|
39
|
+
return row.values[columnId].includes(filterValue)
|
|
98
40
|
}
|
|
99
41
|
|
|
100
42
|
arrIncludes.autoRemove = (val: any) => testFalsey(val) || !val?.length
|
|
101
43
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
44
|
+
const arrIncludesAll: FilterFn<any> = (
|
|
45
|
+
row,
|
|
46
|
+
columnId: string,
|
|
105
47
|
filterValue: unknown[]
|
|
106
|
-
) {
|
|
107
|
-
return
|
|
108
|
-
return columnIds.some(id => {
|
|
109
|
-
const rowValue = row.values[id]
|
|
110
|
-
return (
|
|
111
|
-
rowValue &&
|
|
112
|
-
rowValue.length &&
|
|
113
|
-
filterValue.every(val => rowValue.includes(val))
|
|
114
|
-
)
|
|
115
|
-
})
|
|
116
|
-
})
|
|
48
|
+
) => {
|
|
49
|
+
return !filterValue.some(val => !row.values[columnId].includes(val))
|
|
117
50
|
}
|
|
118
51
|
|
|
119
52
|
arrIncludesAll.autoRemove = (val: any) => testFalsey(val) || !val?.length
|
|
120
53
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
54
|
+
const arrIncludesSome: FilterFn<any> = (
|
|
55
|
+
row,
|
|
56
|
+
columnId: string,
|
|
124
57
|
filterValue: unknown[]
|
|
125
|
-
) {
|
|
126
|
-
return
|
|
127
|
-
return columnIds.some(id => {
|
|
128
|
-
const rowValue = row.values[id]
|
|
129
|
-
return (
|
|
130
|
-
rowValue &&
|
|
131
|
-
rowValue.length &&
|
|
132
|
-
filterValue.some(val => rowValue.includes(val))
|
|
133
|
-
)
|
|
134
|
-
})
|
|
135
|
-
})
|
|
58
|
+
) => {
|
|
59
|
+
return filterValue.some(val => row.values[columnId].includes(val))
|
|
136
60
|
}
|
|
137
61
|
|
|
138
62
|
arrIncludesSome.autoRemove = (val: any) => testFalsey(val) || !val?.length
|
|
139
63
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
columnIds: string[],
|
|
143
|
-
filterValue: unknown
|
|
144
|
-
) {
|
|
145
|
-
return rows.filter(row => {
|
|
146
|
-
return columnIds.some(id => {
|
|
147
|
-
const rowValue = row.values[id]
|
|
148
|
-
return rowValue === filterValue
|
|
149
|
-
})
|
|
150
|
-
})
|
|
64
|
+
const equals: FilterFn<any> = (row, columnId: string, filterValue: unknown) => {
|
|
65
|
+
return row.values[columnId] === filterValue
|
|
151
66
|
}
|
|
152
67
|
|
|
153
68
|
equals.autoRemove = (val: any) => testFalsey(val)
|
|
154
69
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
70
|
+
const weakEquals: FilterFn<any> = (
|
|
71
|
+
row,
|
|
72
|
+
columnId: string,
|
|
158
73
|
filterValue: unknown
|
|
159
|
-
) {
|
|
160
|
-
return
|
|
161
|
-
return columnIds.some(id => {
|
|
162
|
-
const rowValue = row.values[id]
|
|
163
|
-
// eslint-disable-next-line eqeqeq
|
|
164
|
-
return rowValue == filterValue
|
|
165
|
-
})
|
|
166
|
-
})
|
|
74
|
+
) => {
|
|
75
|
+
return row.values[columnId] == filterValue
|
|
167
76
|
}
|
|
168
77
|
|
|
169
78
|
weakEquals.autoRemove = (val: any) => testFalsey(val)
|
|
170
79
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
filterValue: [
|
|
175
|
-
) {
|
|
176
|
-
let [
|
|
80
|
+
const inNumberRange: FilterFn<any> = (
|
|
81
|
+
row,
|
|
82
|
+
columnId: string,
|
|
83
|
+
filterValue: [number, number]
|
|
84
|
+
) => {
|
|
85
|
+
let [min, max] = filterValue
|
|
86
|
+
|
|
87
|
+
const rowValue = row.values[columnId]
|
|
88
|
+
return rowValue >= min && rowValue <= max
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
inNumberRange.resolveFilterValue = (val: [any, any]) => {
|
|
92
|
+
let [unsafeMin, unsafeMax] = val
|
|
177
93
|
|
|
178
94
|
let parsedMin =
|
|
179
95
|
typeof unsafeMin !== 'number' ? parseFloat(unsafeMin as string) : unsafeMin
|
|
@@ -190,17 +106,28 @@ function betweenNumberRange<TGenerics extends TableGenerics>(
|
|
|
190
106
|
max = temp
|
|
191
107
|
}
|
|
192
108
|
|
|
193
|
-
return
|
|
194
|
-
return columnIds.some(id => {
|
|
195
|
-
const rowValue = row.values[id]
|
|
196
|
-
return rowValue >= min && rowValue <= max
|
|
197
|
-
})
|
|
198
|
-
})
|
|
109
|
+
return [min, max] as const
|
|
199
110
|
}
|
|
200
111
|
|
|
201
|
-
|
|
112
|
+
inNumberRange.autoRemove = (val: any) =>
|
|
202
113
|
testFalsey(val) || (testFalsey(val[0]) && testFalsey(val[1]))
|
|
203
114
|
|
|
115
|
+
// Export
|
|
116
|
+
|
|
117
|
+
export const filterFns = {
|
|
118
|
+
includesString,
|
|
119
|
+
includesStringSensitive,
|
|
120
|
+
equalsString,
|
|
121
|
+
arrIncludes,
|
|
122
|
+
arrIncludesAll,
|
|
123
|
+
arrIncludesSome,
|
|
124
|
+
equals,
|
|
125
|
+
weakEquals,
|
|
126
|
+
inNumberRange,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type BuiltInFilterFn = keyof typeof filterFns
|
|
130
|
+
|
|
204
131
|
// Utils
|
|
205
132
|
|
|
206
133
|
function testFalsey(val: any) {
|
package/src/index.ts
CHANGED
|
@@ -17,8 +17,7 @@ export * from './features/Expanding'
|
|
|
17
17
|
export * from './utils'
|
|
18
18
|
export * from './utils/getCoreRowModelSync'
|
|
19
19
|
export * from './utils/getCoreRowModelAsync'
|
|
20
|
-
export * from './utils/
|
|
21
|
-
export * from './utils/getGlobalFilteredRowModelSync'
|
|
20
|
+
export * from './utils/getFilteredRowModelSync'
|
|
22
21
|
export * from './utils/getSortedRowModelSync'
|
|
23
22
|
export * from './utils/getGroupedRowModel'
|
|
24
23
|
export * from './utils/getExpandedRowModel'
|
package/src/types.ts
CHANGED
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
FiltersColumnDef,
|
|
29
29
|
FiltersInstance,
|
|
30
30
|
FiltersOptions,
|
|
31
|
+
FiltersRow,
|
|
31
32
|
FiltersTableState,
|
|
32
33
|
} from './features/Filters'
|
|
33
34
|
import {
|
|
@@ -167,6 +168,7 @@ export type Row<TGenerics extends TableGenerics> = CoreRow<TGenerics> &
|
|
|
167
168
|
CellsRow<TGenerics> &
|
|
168
169
|
VisibilityRow<TGenerics> &
|
|
169
170
|
ColumnPinningRow<TGenerics> &
|
|
171
|
+
FiltersRow<TGenerics> &
|
|
170
172
|
GroupingRow &
|
|
171
173
|
RowSelectionRow &
|
|
172
174
|
ExpandedRow
|
|
@@ -226,8 +228,6 @@ export type CoreHeader<TGenerics extends TableGenerics> = {
|
|
|
226
228
|
index: number
|
|
227
229
|
depth: number
|
|
228
230
|
column: Column<TGenerics>
|
|
229
|
-
getStart: () => number
|
|
230
|
-
getSize: () => number
|
|
231
231
|
headerGroup: HeaderGroup<TGenerics>
|
|
232
232
|
subHeaders: Header<TGenerics>[]
|
|
233
233
|
colSpan?: number
|
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
import { TableGenerics, Row, RowModel, TableInstance } from '../types'
|
|
2
2
|
|
|
3
|
+
export function filterRows<TGenerics extends TableGenerics>(
|
|
4
|
+
rows: Row<TGenerics>[],
|
|
5
|
+
columnIds: string[],
|
|
6
|
+
instance: TableInstance<TGenerics>
|
|
7
|
+
) {
|
|
8
|
+
const filterRowImpl = (rowsToFilter: Row<TGenerics>[]) => {
|
|
9
|
+
// Horizontally filter rows through each column
|
|
10
|
+
return rowsToFilter.filter(row => {
|
|
11
|
+
for (let i = 0; i < columnIds.length; i++) {
|
|
12
|
+
if (row.columnFilterMap[columnIds[i]] === false) {
|
|
13
|
+
return false
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return true
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (instance.options.filterFromLeafRows) {
|
|
21
|
+
return filterRowModelFromLeafs(rows, filterRowImpl, instance)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return filterRowModelFromRoot(rows, filterRowImpl, instance)
|
|
25
|
+
}
|
|
26
|
+
|
|
3
27
|
export function filterRowModelFromLeafs<TGenerics extends TableGenerics>(
|
|
4
28
|
rowsToFilter: Row<TGenerics>[],
|
|
5
29
|
filterRows: (
|
|
@@ -88,7 +88,7 @@ export function getCoreRowModelAsync<TGenerics extends TableGenerics>(opts?: {
|
|
|
88
88
|
accessRows(data)
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
|
-
key: 'getRowModel',
|
|
91
|
+
key: process.env.NODE_ENV === 'development' && 'getRowModel',
|
|
92
92
|
initialSync: opts?.initialSync,
|
|
93
93
|
onProgress: progress => {
|
|
94
94
|
instance.setState(old => ({ ...old, coreProgress: progress }))
|
|
@@ -94,7 +94,7 @@ export function getCoreRowModelSync<TGenerics extends TableGenerics>(): (
|
|
|
94
94
|
return { rows, flatRows, rowsById }
|
|
95
95
|
},
|
|
96
96
|
{
|
|
97
|
-
key: 'getRowModel',
|
|
97
|
+
key: process.env.NODE_ENV === 'development' && 'getRowModel',
|
|
98
98
|
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
99
99
|
onChange: () => {
|
|
100
100
|
instance.queue(() => {
|
|
@@ -24,7 +24,7 @@ export function getExpandedRowModel<TGenerics extends TableGenerics>(): (
|
|
|
24
24
|
return expandRows(rowModel, instance)
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
key: 'getExpandedRowModel',
|
|
27
|
+
key: process.env.NODE_ENV === 'development' && 'getExpandedRowModel',
|
|
28
28
|
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
29
29
|
}
|
|
30
30
|
)
|
|
@@ -42,7 +42,7 @@ export function expandRows<TGenerics extends TableGenerics>(
|
|
|
42
42
|
if (
|
|
43
43
|
instance.options.expandSubRows &&
|
|
44
44
|
row.subRows?.length &&
|
|
45
|
-
|
|
45
|
+
row.getIsExpanded()
|
|
46
46
|
) {
|
|
47
47
|
row.subRows.forEach(handleRow)
|
|
48
48
|
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { ResolvedColumnFilter } from '../features/Filters'
|
|
2
|
+
import { TableInstance, RowModel, TableGenerics, Row } from '../types'
|
|
3
|
+
import { incrementalMemo } from '../utils'
|
|
4
|
+
import { filterRows } from './filterRowsUtils'
|
|
5
|
+
|
|
6
|
+
export function getFilteredRowModelAsync<
|
|
7
|
+
TGenerics extends TableGenerics
|
|
8
|
+
>(opts?: {
|
|
9
|
+
initialSync?: boolean
|
|
10
|
+
}): (instance: TableInstance<TGenerics>) => () => RowModel<TGenerics> {
|
|
11
|
+
return instance =>
|
|
12
|
+
incrementalMemo(
|
|
13
|
+
() => [
|
|
14
|
+
instance.getPreFilteredRowModel(),
|
|
15
|
+
instance.getState().columnFilters,
|
|
16
|
+
instance.getState().globalFilter,
|
|
17
|
+
],
|
|
18
|
+
(rowModel): RowModel<TGenerics> => {
|
|
19
|
+
return {
|
|
20
|
+
rows: rowModel.rows.slice(),
|
|
21
|
+
flatRows: [],
|
|
22
|
+
rowsById: rowModel.rowsById,
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
(rowModel, columnFilters, globalFilter) => rowModelRef => scheduleTask => {
|
|
26
|
+
if (
|
|
27
|
+
!rowModel.rows.length ||
|
|
28
|
+
(!columnFilters?.length && !globalFilter)
|
|
29
|
+
) {
|
|
30
|
+
rowModelRef.current = rowModel
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const resolvedColumnFilters: ResolvedColumnFilter<TGenerics>[] = []
|
|
35
|
+
const resolvedGlobalFilters: ResolvedColumnFilter<TGenerics>[] = []
|
|
36
|
+
|
|
37
|
+
;(columnFilters ?? []).forEach(d => {
|
|
38
|
+
const column = instance.getColumn(d.id)
|
|
39
|
+
|
|
40
|
+
if (!column) {
|
|
41
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
42
|
+
console.warn(
|
|
43
|
+
`Table: Could not find a column to filter with columnId: ${d.id}`
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const filterFn = column.getFilterFn()!
|
|
49
|
+
|
|
50
|
+
if (!filterFn) {
|
|
51
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
52
|
+
console.warn(
|
|
53
|
+
`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
return
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
resolvedColumnFilters.push({
|
|
60
|
+
id: d.id,
|
|
61
|
+
filterFn,
|
|
62
|
+
resolvedValue: filterFn.resolveFilterValue?.(d.value) ?? d.value,
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const filterableIds = columnFilters.map(d => d.id)
|
|
67
|
+
|
|
68
|
+
const globalFilterFn = instance.getGlobalFilterFn()
|
|
69
|
+
|
|
70
|
+
const globallyFilterableColumns = instance
|
|
71
|
+
.getAllLeafColumns()
|
|
72
|
+
.filter(column => column.getCanGlobalFilter())
|
|
73
|
+
|
|
74
|
+
if (
|
|
75
|
+
globalFilter &&
|
|
76
|
+
globalFilterFn &&
|
|
77
|
+
globallyFilterableColumns.length
|
|
78
|
+
) {
|
|
79
|
+
filterableIds.push('__global__')
|
|
80
|
+
|
|
81
|
+
globallyFilterableColumns.forEach(column => {
|
|
82
|
+
resolvedGlobalFilters.push({
|
|
83
|
+
id: column.id,
|
|
84
|
+
filterFn: globalFilterFn,
|
|
85
|
+
resolvedValue:
|
|
86
|
+
globalFilterFn.resolveFilterValue?.(globalFilter) ??
|
|
87
|
+
globalFilter,
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Flag the prefiltered row model with each filter state
|
|
93
|
+
for (let j = 0; j < rowModel.flatRows.length; j++) {
|
|
94
|
+
const row = rowModel.flatRows[j]
|
|
95
|
+
|
|
96
|
+
row.columnFilterMap = {}
|
|
97
|
+
|
|
98
|
+
if (resolvedColumnFilters.length) {
|
|
99
|
+
for (let i = 0; i < resolvedColumnFilters.length; i++) {
|
|
100
|
+
const columnFilter = resolvedColumnFilters[i]
|
|
101
|
+
|
|
102
|
+
// Tag the row with the column filter state
|
|
103
|
+
row.columnFilterMap[columnFilter.id] = columnFilter.filterFn(
|
|
104
|
+
row,
|
|
105
|
+
columnFilter.id,
|
|
106
|
+
columnFilter.resolvedValue
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (resolvedGlobalFilters.length) {
|
|
112
|
+
let hit = false
|
|
113
|
+
|
|
114
|
+
for (let i = 0; i < resolvedGlobalFilters.length; i++) {
|
|
115
|
+
const globalFilter = resolvedGlobalFilters[i]
|
|
116
|
+
// Tag the row with the first truthy global filter state
|
|
117
|
+
if (
|
|
118
|
+
globalFilter.filterFn(
|
|
119
|
+
row,
|
|
120
|
+
globalFilter.id,
|
|
121
|
+
globalFilter.resolvedValue
|
|
122
|
+
)
|
|
123
|
+
) {
|
|
124
|
+
hit = true
|
|
125
|
+
row.columnFilterMap.__global__ = true
|
|
126
|
+
break
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (row.columnFilterMap.__global__ !== true) {
|
|
131
|
+
row.columnFilterMap.__global__ = false
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Filter final rows using all of the active filters
|
|
137
|
+
return filterRows(rowModel.rows, filterableIds, instance)
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
key:
|
|
141
|
+
process.env.NODE_ENV === 'production' && 'getFilteredRowModelAsync',
|
|
142
|
+
initialSync: opts?.initialSync,
|
|
143
|
+
onProgress: progress => {
|
|
144
|
+
instance.setState(old => ({
|
|
145
|
+
...old,
|
|
146
|
+
columnFiltersProgress: progress,
|
|
147
|
+
}))
|
|
148
|
+
},
|
|
149
|
+
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
150
|
+
onChange: () => {
|
|
151
|
+
instance.queue(() => {
|
|
152
|
+
instance._autoResetPageIndex()
|
|
153
|
+
})
|
|
154
|
+
},
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ColumnFilter,
|
|
3
|
+
FilterFn,
|
|
4
|
+
ResolvedColumnFilter,
|
|
5
|
+
} from '../features/Filters'
|
|
6
|
+
import { TableInstance, RowModel, TableGenerics, Row } from '../types'
|
|
7
|
+
import { memo } from '../utils'
|
|
8
|
+
import { filterRows } from './filterRowsUtils'
|
|
9
|
+
|
|
10
|
+
export function getFilteredRowModelSync<TGenerics extends TableGenerics>(): (
|
|
11
|
+
instance: TableInstance<TGenerics>
|
|
12
|
+
) => () => RowModel<TGenerics> {
|
|
13
|
+
return instance =>
|
|
14
|
+
memo(
|
|
15
|
+
() => [
|
|
16
|
+
instance.getPreFilteredRowModel(),
|
|
17
|
+
instance.getState().columnFilters,
|
|
18
|
+
instance.getState().globalFilter,
|
|
19
|
+
],
|
|
20
|
+
(rowModel, columnFilters, globalFilter) => {
|
|
21
|
+
if (
|
|
22
|
+
!rowModel.rows.length ||
|
|
23
|
+
(!columnFilters?.length && !globalFilter)
|
|
24
|
+
) {
|
|
25
|
+
return rowModel
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const resolvedColumnFilters: ResolvedColumnFilter<TGenerics>[] = []
|
|
29
|
+
const resolvedGlobalFilters: ResolvedColumnFilter<TGenerics>[] = []
|
|
30
|
+
|
|
31
|
+
;(columnFilters ?? []).forEach(d => {
|
|
32
|
+
const column = instance.getColumn(d.id)
|
|
33
|
+
|
|
34
|
+
if (!column) {
|
|
35
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
36
|
+
console.warn(
|
|
37
|
+
`Table: Could not find a column to filter with columnId: ${d.id}`
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const filterFn = column.getFilterFn()
|
|
43
|
+
|
|
44
|
+
if (!filterFn) {
|
|
45
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
46
|
+
console.warn(
|
|
47
|
+
`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
resolvedColumnFilters.push({
|
|
54
|
+
id: d.id,
|
|
55
|
+
filterFn,
|
|
56
|
+
resolvedValue: filterFn.resolveFilterValue?.(d.value) ?? d.value,
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
const filterableIds = columnFilters.map(d => d.id)
|
|
61
|
+
|
|
62
|
+
const globalFilterFn = instance.getGlobalFilterFn()
|
|
63
|
+
|
|
64
|
+
const globallyFilterableColumns = instance
|
|
65
|
+
.getAllLeafColumns()
|
|
66
|
+
.filter(column => column.getCanGlobalFilter())
|
|
67
|
+
|
|
68
|
+
if (
|
|
69
|
+
globalFilter &&
|
|
70
|
+
globalFilterFn &&
|
|
71
|
+
globallyFilterableColumns.length
|
|
72
|
+
) {
|
|
73
|
+
filterableIds.push('__global__')
|
|
74
|
+
|
|
75
|
+
globallyFilterableColumns.forEach(column => {
|
|
76
|
+
resolvedGlobalFilters.push({
|
|
77
|
+
id: column.id,
|
|
78
|
+
filterFn: globalFilterFn,
|
|
79
|
+
resolvedValue:
|
|
80
|
+
globalFilterFn.resolveFilterValue?.(globalFilter) ??
|
|
81
|
+
globalFilter,
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Flag the prefiltered row model with each filter state
|
|
87
|
+
for (let j = 0; j < rowModel.flatRows.length; j++) {
|
|
88
|
+
const row = rowModel.flatRows[j]
|
|
89
|
+
|
|
90
|
+
row.columnFilterMap = {}
|
|
91
|
+
|
|
92
|
+
if (resolvedColumnFilters.length) {
|
|
93
|
+
for (let i = 0; i < resolvedColumnFilters.length; i++) {
|
|
94
|
+
const columnFilter = resolvedColumnFilters[i]
|
|
95
|
+
|
|
96
|
+
// Tag the row with the column filter state
|
|
97
|
+
row.columnFilterMap[columnFilter.id] = columnFilter.filterFn(
|
|
98
|
+
row,
|
|
99
|
+
columnFilter.id,
|
|
100
|
+
columnFilter.resolvedValue
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (resolvedGlobalFilters.length) {
|
|
106
|
+
for (let i = 0; i < resolvedGlobalFilters.length; i++) {
|
|
107
|
+
const globalFilter = resolvedGlobalFilters[i]
|
|
108
|
+
// Tag the row with the first truthy global filter state
|
|
109
|
+
if (
|
|
110
|
+
globalFilter.filterFn(
|
|
111
|
+
row,
|
|
112
|
+
globalFilter.id,
|
|
113
|
+
globalFilter.resolvedValue
|
|
114
|
+
)
|
|
115
|
+
) {
|
|
116
|
+
row.columnFilterMap.__global__ = true
|
|
117
|
+
break
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (row.columnFilterMap.__global__ !== true) {
|
|
122
|
+
row.columnFilterMap.__global__ = false
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Filter final rows using all of the active filters
|
|
128
|
+
return filterRows(rowModel.rows, filterableIds, instance)
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
key:
|
|
132
|
+
process.env.NODE_ENV === 'development' && 'getFilteredRowModelSync',
|
|
133
|
+
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
134
|
+
onChange: () => {
|
|
135
|
+
instance.queue(() => {
|
|
136
|
+
instance._autoResetPageIndex()
|
|
137
|
+
})
|
|
138
|
+
},
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
}
|
|
@@ -161,7 +161,7 @@ export function getGroupedRowModelSync<TGenerics extends TableGenerics>(): (
|
|
|
161
161
|
}
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
|
-
key: 'getGroupedRowModel',
|
|
164
|
+
key: process.env.NODE_ENV === 'development' && 'getGroupedRowModel',
|
|
165
165
|
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
166
166
|
onChange: () => {
|
|
167
167
|
instance.queue(() => {
|
|
@@ -41,7 +41,7 @@ export function getPaginationRowModel<TGenerics extends TableGenerics>(opts?: {
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
key: 'getPaginationRowModel',
|
|
44
|
+
key: process.env.NODE_ENV === 'development' && 'getPaginationRowModel',
|
|
45
45
|
debug: () => instance.options.debugAll ?? instance.options.debugTable,
|
|
46
46
|
}
|
|
47
47
|
)
|