@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.
Files changed (114) hide show
  1. package/build/cjs/core.js +7 -4
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/features/Cells.js +2 -2
  4. package/build/cjs/features/Cells.js.map +1 -1
  5. package/build/cjs/features/ColumnSizing.js +68 -143
  6. package/build/cjs/features/ColumnSizing.js.map +1 -1
  7. package/build/cjs/features/Columns.js +7 -7
  8. package/build/cjs/features/Columns.js.map +1 -1
  9. package/build/cjs/features/Expanding.js +52 -90
  10. package/build/cjs/features/Expanding.js.map +1 -1
  11. package/build/cjs/features/Filters.js +213 -191
  12. package/build/cjs/features/Filters.js.map +1 -1
  13. package/build/cjs/features/Grouping.js +54 -80
  14. package/build/cjs/features/Grouping.js.map +1 -1
  15. package/build/cjs/features/Headers.js +16 -40
  16. package/build/cjs/features/Headers.js.map +1 -1
  17. package/build/cjs/features/Ordering.js +6 -5
  18. package/build/cjs/features/Ordering.js.map +1 -1
  19. package/build/cjs/features/Pagination.js +5 -5
  20. package/build/cjs/features/Pagination.js.map +1 -1
  21. package/build/cjs/features/Pinning.js +82 -168
  22. package/build/cjs/features/Pinning.js.map +1 -1
  23. package/build/cjs/features/RowSelection.js +67 -119
  24. package/build/cjs/features/RowSelection.js.map +1 -1
  25. package/build/cjs/features/Sorting.js +41 -91
  26. package/build/cjs/features/Sorting.js.map +1 -1
  27. package/build/cjs/features/Visibility.js +20 -43
  28. package/build/cjs/features/Visibility.js.map +1 -1
  29. package/build/cjs/filterFns.js +51 -108
  30. package/build/cjs/filterFns.js.map +1 -1
  31. package/build/cjs/index.js +5 -4
  32. package/build/cjs/index.js.map +1 -1
  33. package/build/cjs/utils/filterRowsUtils.js +21 -0
  34. package/build/cjs/utils/filterRowsUtils.js.map +1 -1
  35. package/build/cjs/utils/getCoreRowModelAsync.js +1 -1
  36. package/build/cjs/utils/getCoreRowModelAsync.js.map +1 -1
  37. package/build/cjs/utils/getCoreRowModelSync.js +1 -1
  38. package/build/cjs/utils/getCoreRowModelSync.js.map +1 -1
  39. package/build/cjs/utils/getExpandedRowModel.js +2 -2
  40. package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
  41. package/build/cjs/utils/getFilteredRowModelSync.js +125 -0
  42. package/build/cjs/utils/getFilteredRowModelSync.js.map +1 -0
  43. package/build/cjs/utils/getGroupedRowModel.js +1 -1
  44. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  45. package/build/cjs/utils/getPaginationRowModel.js +1 -1
  46. package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
  47. package/build/cjs/utils/getSortedRowModelSync.js +3 -3
  48. package/build/cjs/utils/getSortedRowModelSync.js.map +1 -1
  49. package/build/cjs/utils.js +2 -6
  50. package/build/cjs/utils.js.map +1 -1
  51. package/build/esm/index.js +899 -1357
  52. package/build/esm/index.js.map +1 -1
  53. package/build/stats-html.html +1 -1
  54. package/build/stats-react.json +404 -418
  55. package/build/types/features/ColumnSizing.d.ts +2 -13
  56. package/build/types/features/Expanding.d.ts +3 -13
  57. package/build/types/features/Filters.d.ts +38 -42
  58. package/build/types/features/Grouping.d.ts +3 -18
  59. package/build/types/features/Ordering.d.ts +2 -6
  60. package/build/types/features/Pinning.d.ts +2 -19
  61. package/build/types/features/RowSelection.d.ts +4 -15
  62. package/build/types/features/Sorting.d.ts +5 -22
  63. package/build/types/features/Visibility.d.ts +2 -15
  64. package/build/types/filterFns.d.ts +10 -52
  65. package/build/types/index.d.ts +1 -2
  66. package/build/types/types.d.ts +2 -4
  67. package/build/types/utils/filterRowsUtils.d.ts +1 -0
  68. package/build/types/utils/{getColumnFilteredRowModelAsync.d.ts → getFilteredRowModelAsync.d.ts} +1 -1
  69. package/build/types/utils/getFilteredRowModelSync.d.ts +2 -0
  70. package/build/types/utils.d.ts +2 -2
  71. package/build/umd/index.development.js +867 -1323
  72. package/build/umd/index.development.js.map +1 -1
  73. package/build/umd/index.production.js +1 -1
  74. package/build/umd/index.production.js.map +1 -1
  75. package/package.json +2 -1
  76. package/src/core.ts +5 -5
  77. package/src/features/Cells.ts +4 -2
  78. package/src/features/ColumnSizing.ts +69 -126
  79. package/src/features/Columns.ts +12 -7
  80. package/src/features/Expanding.ts +62 -107
  81. package/src/features/Filters.ts +293 -243
  82. package/src/features/Grouping.ts +59 -81
  83. package/src/features/Headers.ts +18 -40
  84. package/src/features/Ordering.ts +7 -9
  85. package/src/features/Pagination.ts +4 -3
  86. package/src/features/Pinning.ts +77 -164
  87. package/src/features/RowSelection.ts +76 -123
  88. package/src/features/Sorting.ts +48 -106
  89. package/src/features/Visibility.ts +25 -52
  90. package/src/filterFns.ts +74 -147
  91. package/src/index.ts +1 -2
  92. package/src/types.ts +2 -2
  93. package/src/utils/filterRowsUtils.ts +24 -0
  94. package/src/utils/getCoreRowModelAsync.ts +1 -1
  95. package/src/utils/getCoreRowModelSync.ts +1 -1
  96. package/src/utils/getExpandedRowModel.ts +2 -2
  97. package/src/utils/getFilteredRowModelAsync.ts +157 -0
  98. package/src/utils/getFilteredRowModelSync.ts +141 -0
  99. package/src/utils/getGroupedRowModel.ts +1 -1
  100. package/src/utils/getPaginationRowModel.ts +1 -1
  101. package/src/utils/getSortedRowModelAsync.ts +1 -1
  102. package/src/utils/getSortedRowModelSync.ts +4 -4
  103. package/src/utils.ts +2 -4
  104. package/build/cjs/utils/getColumnFilteredRowModelSync.js +0 -115
  105. package/build/cjs/utils/getColumnFilteredRowModelSync.js.map +0 -1
  106. package/build/cjs/utils/getGlobalFilteredRowModelSync.js +0 -91
  107. package/build/cjs/utils/getGlobalFilteredRowModelSync.js.map +0 -1
  108. package/build/types/utils/getColumnFilteredRowModelSync.d.ts +0 -2
  109. package/build/types/utils/getGlobalFilteredRowModelAsync.d.ts +0 -4
  110. package/build/types/utils/getGlobalFilteredRowModelSync.d.ts +0 -2
  111. package/src/utils/getColumnFilteredRowModelAsync.ts +0 -118
  112. package/src/utils/getColumnFilteredRowModelSync.ts +0 -102
  113. package/src/utils/getGlobalFilteredRowModelAsync.ts +0 -96
  114. package/src/utils/getGlobalFilteredRowModelSync.ts +0 -79
package/src/filterFns.ts CHANGED
@@ -1,179 +1,95 @@
1
- import { TableGenerics, Row } from './types'
2
-
3
- export const filterFns = {
4
- includesString,
5
- includesStringSensitive,
6
- equalsString,
7
- equalsStringSensitive,
8
- arrIncludes,
9
- arrIncludesAll,
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
- function includesStringSensitive<TGenerics extends TableGenerics>(
36
- rows: Row<TGenerics>[],
37
- columnIds: string[],
38
- filterValue: unknown
39
- ) {
40
- const search = String(filterValue)
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
- function equalsString<TGenerics extends TableGenerics>(
53
- rows: Row<TGenerics>[],
54
- columnIds: string[],
55
- filterValue: unknown
56
- ) {
57
- const search = String(filterValue).toLowerCase()
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
- function equalsStringSensitive<TGenerics extends TableGenerics>(
72
- rows: Row<TGenerics>[],
73
- columnIds: string[],
34
+ const arrIncludes: FilterFn<any> = (
35
+ row,
36
+ columnId: string,
74
37
  filterValue: unknown
75
- ) {
76
- const search = String(filterValue)
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
- function arrIncludesAll<TGenerics extends TableGenerics>(
103
- rows: Row<TGenerics>[],
104
- columnIds: string[],
44
+ const arrIncludesAll: FilterFn<any> = (
45
+ row,
46
+ columnId: string,
105
47
  filterValue: unknown[]
106
- ) {
107
- return rows.filter(row => {
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
- function arrIncludesSome<TGenerics extends TableGenerics>(
122
- rows: Row<TGenerics>[],
123
- columnIds: string[],
54
+ const arrIncludesSome: FilterFn<any> = (
55
+ row,
56
+ columnId: string,
124
57
  filterValue: unknown[]
125
- ) {
126
- return rows.filter(row => {
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
- function equals<TGenerics extends TableGenerics>(
141
- rows: Row<TGenerics>[],
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
- function weakEquals<TGenerics extends TableGenerics>(
156
- rows: Row<TGenerics>[],
157
- columnIds: string[],
70
+ const weakEquals: FilterFn<any> = (
71
+ row,
72
+ columnId: string,
158
73
  filterValue: unknown
159
- ) {
160
- return rows.filter(row => {
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
- function betweenNumberRange<TGenerics extends TableGenerics>(
172
- rows: Row<TGenerics>[],
173
- columnIds: string[],
174
- filterValue: [unknown, unknown]
175
- ) {
176
- let [unsafeMin, unsafeMax] = filterValue || []
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 rows.filter(row => {
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
- betweenNumberRange.autoRemove = (val: any) =>
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/getColumnFilteredRowModelSync'
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
- instance.getIsRowExpanded(row.id)
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
  )