@tanstack/table-core 8.0.0-alpha.62 → 8.0.0-alpha.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/build/cjs/core.js +8 -5
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/features/Cells.js +1 -1
  4. package/build/cjs/features/Cells.js.map +1 -1
  5. package/build/cjs/features/ColumnSizing.js +3 -3
  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 +3 -3
  10. package/build/cjs/features/Expanding.js.map +1 -1
  11. package/build/cjs/features/Filters.js +158 -80
  12. package/build/cjs/features/Filters.js.map +1 -1
  13. package/build/cjs/features/Grouping.js +24 -22
  14. package/build/cjs/features/Grouping.js.map +1 -1
  15. package/build/cjs/features/Headers.js +16 -16
  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 +17 -78
  22. package/build/cjs/features/Pinning.js.map +1 -1
  23. package/build/cjs/features/RowSelection.js +8 -8
  24. package/build/cjs/features/RowSelection.js.map +1 -1
  25. package/build/cjs/features/Sorting.js +8 -8
  26. package/build/cjs/features/Sorting.js.map +1 -1
  27. package/build/cjs/features/Visibility.js +5 -5
  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 +1 -1
  40. package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
  41. package/build/cjs/utils/getFilteredRowModelSync.js +130 -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 +1 -1
  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 +491 -573
  52. package/build/esm/index.js.map +1 -1
  53. package/build/stats-html.html +1 -1
  54. package/build/stats-react.json +388 -402
  55. package/build/types/features/Expanding.d.ts +2 -7
  56. package/build/types/features/Filters.d.ts +27 -29
  57. package/build/types/features/Grouping.d.ts +3 -11
  58. package/build/types/features/Ordering.d.ts +2 -6
  59. package/build/types/features/Pinning.d.ts +2 -15
  60. package/build/types/features/RowSelection.d.ts +3 -8
  61. package/build/types/features/Sorting.d.ts +2 -8
  62. package/build/types/features/Visibility.d.ts +2 -11
  63. package/build/types/filterFns.d.ts +10 -52
  64. package/build/types/index.d.ts +1 -2
  65. package/build/types/types.d.ts +2 -2
  66. package/build/types/utils/filterRowsUtils.d.ts +1 -0
  67. package/build/types/utils/{getColumnFilteredRowModelAsync.d.ts → getFilteredRowModelAsync.d.ts} +1 -1
  68. package/build/types/utils/getFilteredRowModelSync.d.ts +2 -0
  69. package/build/types/utils.d.ts +2 -2
  70. package/build/umd/index.development.js +494 -574
  71. package/build/umd/index.development.js.map +1 -1
  72. package/build/umd/index.production.js +1 -1
  73. package/build/umd/index.production.js.map +1 -1
  74. package/package.json +2 -1
  75. package/src/core.ts +6 -5
  76. package/src/features/Cells.ts +3 -1
  77. package/src/features/ColumnSizing.ts +2 -1
  78. package/src/features/Columns.ts +11 -7
  79. package/src/features/Expanding.ts +4 -2
  80. package/src/features/Filters.ts +216 -116
  81. package/src/features/Grouping.ts +23 -21
  82. package/src/features/Headers.ts +16 -16
  83. package/src/features/Ordering.ts +7 -9
  84. package/src/features/Pagination.ts +4 -3
  85. package/src/features/Pinning.ts +16 -80
  86. package/src/features/RowSelection.ts +14 -9
  87. package/src/features/Sorting.ts +12 -12
  88. package/src/features/Visibility.ts +7 -4
  89. package/src/filterFns.ts +74 -147
  90. package/src/index.ts +1 -2
  91. package/src/types.ts +2 -0
  92. package/src/utils/filterRowsUtils.ts +24 -0
  93. package/src/utils/getCoreRowModelAsync.ts +1 -1
  94. package/src/utils/getCoreRowModelSync.ts +1 -1
  95. package/src/utils/getExpandedRowModel.ts +1 -1
  96. package/src/utils/getFilteredRowModelAsync.ts +49 -0
  97. package/src/utils/getFilteredRowModelSync.ts +150 -0
  98. package/src/utils/getGroupedRowModel.ts +1 -1
  99. package/src/utils/getPaginationRowModel.ts +1 -1
  100. package/src/utils/getSortedRowModelAsync.ts +1 -1
  101. package/src/utils/getSortedRowModelSync.ts +1 -1
  102. package/src/utils.ts +2 -4
  103. package/build/cjs/utils/getColumnFilteredRowModelSync.js +0 -115
  104. package/build/cjs/utils/getColumnFilteredRowModelSync.js.map +0 -1
  105. package/build/cjs/utils/getGlobalFilteredRowModelSync.js +0 -91
  106. package/build/cjs/utils/getGlobalFilteredRowModelSync.js.map +0 -1
  107. package/build/types/utils/getColumnFilteredRowModelSync.d.ts +0 -2
  108. package/build/types/utils/getGlobalFilteredRowModelAsync.d.ts +0 -4
  109. package/build/types/utils/getGlobalFilteredRowModelSync.d.ts +0 -2
  110. package/src/utils/getColumnFilteredRowModelAsync.ts +0 -118
  111. package/src/utils/getColumnFilteredRowModelSync.ts +0 -102
  112. package/src/utils/getGlobalFilteredRowModelAsync.ts +0 -96
  113. package/src/utils/getGlobalFilteredRowModelSync.ts +0 -79
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/table-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "8.0.0-alpha.62",
4
+ "version": "8.0.0-alpha.65",
5
5
  "description": "Hooks for building lightweight, fast and extendable datagrids for React",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/tanstack/react-table#readme",
@@ -28,6 +28,7 @@
28
28
  "main": "build/cjs/index.js",
29
29
  "browser": "build/umd/index.production.min.js",
30
30
  "types": "build/types/index.d.ts",
31
+ "sideEffects": false,
31
32
  "engines": {
32
33
  "node": ">=12"
33
34
  },
package/src/core.ts CHANGED
@@ -116,14 +116,15 @@ export function createTableInstance<TGenerics extends TableGenerics>(
116
116
  coreProgress: 1,
117
117
  }
118
118
 
119
- const initialState = {
119
+ let initialState = {
120
120
  ...coreInitialState,
121
121
  ...(options.initialState ?? {}),
122
- ...instance._features.reduce((obj, feature) => {
123
- return Object.assign(obj, feature.getInitialState?.(options.initialState))
124
- }, {}),
125
122
  } as TableState
126
123
 
124
+ instance._features.forEach(feature => {
125
+ initialState = feature.getInitialState?.(initialState) ?? initialState
126
+ })
127
+
127
128
  const queued: (() => void)[] = []
128
129
  let queuedTimeout = false
129
130
 
@@ -142,8 +143,8 @@ export function createTableInstance<TGenerics extends TableGenerics>(
142
143
  // the current call stack (render, etc) has finished.
143
144
  Promise.resolve()
144
145
  .then(() => {
145
- console.log(queued)
146
146
  while (queued.length) {
147
+ console.log('queue')
147
148
  queued.shift()!()
148
149
  }
149
150
  queuedTimeout = false
@@ -56,7 +56,9 @@ export const Cells = {
56
56
  }, {} as Record<string, Cell<TGenerics>>)
57
57
  },
58
58
  {
59
- key: 'row.getAllCellsByColumnId',
59
+ key:
60
+ process.env.NODE_ENV === 'production' &&
61
+ 'row.getAllCellsByColumnId',
60
62
  debug: () => instance.options.debugAll ?? instance.options.debugRows,
61
63
  }
62
64
  ),
@@ -98,7 +98,7 @@ export const ColumnSizing: TableFeature = {
98
98
  getDefaultColumn: (): ColumnSizingColumnDef => {
99
99
  return defaultColumnSizing
100
100
  },
101
- getInitialState: (): ColumnSizingTableState => {
101
+ getInitialState: (state): ColumnSizingTableState => {
102
102
  return {
103
103
  columnSizing: {},
104
104
  columnSizingInfo: {
@@ -109,6 +109,7 @@ export const ColumnSizing: TableFeature = {
109
109
  isResizingColumn: false,
110
110
  columnSizingStart: [],
111
111
  },
112
+ ...state,
112
113
  }
113
114
  },
114
115
 
@@ -108,7 +108,7 @@ export const Columns = {
108
108
  {
109
109
  debug: () =>
110
110
  instance.options.debugAll ?? instance.options.debugColumns,
111
- key: 'getDefaultColumn',
111
+ key: process.env.NODE_ENV === 'production' && 'getDefaultColumn',
112
112
  }
113
113
  ),
114
114
 
@@ -165,7 +165,9 @@ export const Columns = {
165
165
  ]
166
166
  },
167
167
  {
168
- key: 'column.getFlatColumns',
168
+ key:
169
+ process.env.NODE_ENV === 'production' &&
170
+ 'column.getFlatColumns',
169
171
  debug: () =>
170
172
  instance.options.debugAll ?? instance.options.debugColumns,
171
173
  }
@@ -184,7 +186,9 @@ export const Columns = {
184
186
  return [column as Column<TGenerics>]
185
187
  },
186
188
  {
187
- key: 'column.getLeafColumns',
189
+ key:
190
+ process.env.NODE_ENV === 'production' &&
191
+ 'column.getLeafColumns',
188
192
  debug: () =>
189
193
  instance.options.debugAll ?? instance.options.debugColumns,
190
194
  }
@@ -221,7 +225,7 @@ export const Columns = {
221
225
  return recurseColumns(columnDefs)
222
226
  },
223
227
  {
224
- key: 'getAllColumns',
228
+ key: process.env.NODE_ENV === 'production' && 'getAllColumns',
225
229
  debug: () =>
226
230
  instance.options.debugAll ?? instance.options.debugColumns,
227
231
  }
@@ -235,7 +239,7 @@ export const Columns = {
235
239
  })
236
240
  },
237
241
  {
238
- key: 'getAllFlatColumns',
242
+ key: process.env.NODE_ENV === 'production' && 'getAllFlatColumns',
239
243
  debug: () =>
240
244
  instance.options.debugAll ?? instance.options.debugColumns,
241
245
  }
@@ -250,7 +254,7 @@ export const Columns = {
250
254
  }, {} as Record<string, Column<TGenerics>>)
251
255
  },
252
256
  {
253
- key: 'getAllFlatColumnsById',
257
+ key: process.env.NODE_ENV === 'production' && 'getAllFlatColumnsById',
254
258
  debug: () =>
255
259
  instance.options.debugAll ?? instance.options.debugColumns,
256
260
  }
@@ -265,7 +269,7 @@ export const Columns = {
265
269
  return orderColumns(leafColumns)
266
270
  },
267
271
  {
268
- key: 'getAllLeafColumns',
272
+ key: process.env.NODE_ENV === 'production' && 'getAllLeafColumns',
269
273
  debug: () =>
270
274
  instance.options.debugAll ?? instance.options.debugColumns,
271
275
  }
@@ -5,6 +5,7 @@ import {
5
5
  TableInstance,
6
6
  Row,
7
7
  Updater,
8
+ TableFeature,
8
9
  } from '../types'
9
10
  import { makeStateUpdater } from '../utils'
10
11
 
@@ -57,10 +58,11 @@ export type ExpandedInstance<TGenerics extends TableGenerics> = {
57
58
 
58
59
  //
59
60
 
60
- export const Expanding = {
61
- getInitialState: (): ExpandedTableState => {
61
+ export const Expanding: TableFeature = {
62
+ getInitialState: (state): ExpandedTableState => {
62
63
  return {
63
64
  expanded: {},
65
+ ...state,
64
66
  }
65
67
  },
66
68
 
@@ -7,6 +7,7 @@ import {
7
7
  TableInstance,
8
8
  Row,
9
9
  Updater,
10
+ TableFeature,
10
11
  } from '../types'
11
12
  import {
12
13
  functionalUpdate,
@@ -15,6 +16,7 @@ import {
15
16
  memo,
16
17
  Overwrite,
17
18
  } from '../utils'
19
+ import { filterRows } from '../utils/filterRowsUtils'
18
20
 
19
21
  export type FiltersTableState = {
20
22
  columnFilters: ColumnFiltersState
@@ -30,17 +32,19 @@ export type ColumnFilter = {
30
32
  value: unknown
31
33
  }
32
34
 
33
- /*
34
- A filter function is any function that takes an array of rows and returns an array of rows. Because filter functions can be used for both column and global filters, they are passed an array of columnIds to filter on.
35
- */
36
-
37
35
  export type FilterFn<TGenerics extends TableGenerics> = {
38
- (rows: Row<TGenerics>[], columnIds: string[], filterValue: any): any
36
+ (row: Row<TGenerics>, columnId: string, filterValue: any): boolean
37
+ resolveFilterValue?: TransformFilterValueFn<TGenerics>
39
38
  autoRemove?: ColumnFilterAutoRemoveTestFn<TGenerics>
40
39
  }
41
40
 
41
+ export type TransformFilterValueFn<TGenerics extends TableGenerics> = (
42
+ value: any,
43
+ column?: Column<TGenerics>
44
+ ) => unknown
45
+
42
46
  export type ColumnFilterAutoRemoveTestFn<TGenerics extends TableGenerics> = (
43
- value: unknown,
47
+ value: any,
44
48
  column?: Column<TGenerics>
45
49
  ) => boolean
46
50
 
@@ -57,12 +61,9 @@ export type FilterFnOption<TGenerics extends TableGenerics> =
57
61
 
58
62
  export type FiltersColumnDef<TGenerics extends TableGenerics> = {
59
63
  filterFn?: FilterFnOption<Overwrite<TGenerics, { Value: any }>>
60
- enableAllFilters?: boolean
61
64
  enableColumnFilter?: boolean
62
65
  enableGlobalFilter?: boolean
63
- defaultCanFilter?: boolean
64
- defaultCanColumnFilter?: boolean
65
- defaultCanGlobalFilter?: boolean
66
+ enableFaceting?: boolean
66
67
  }
67
68
 
68
69
  export type FiltersColumn<TGenerics extends TableGenerics> = {
@@ -73,31 +74,34 @@ export type FiltersColumn<TGenerics extends TableGenerics> = {
73
74
  getColumnIsFiltered: () => boolean
74
75
  getColumnFilterValue: () => unknown
75
76
  setColumnFilterValue: (updater: Updater<any>) => void
76
- getPreFilteredRows: () => Row<TGenerics>[] | undefined
77
- getPreFilteredUniqueValues: () => Map<any, number>
78
- getPreFilteredMinMaxValues: () => [any, any]
77
+ getFacetedRowModel: () => RowModel<TGenerics>
78
+ getFacetedUniqueValues: () => Map<any, number>
79
+ getFacetedMinMaxValues: () => [any, any]
80
+ }
81
+
82
+ export type FiltersRow<TGenerics extends TableGenerics> = {
83
+ columnFilterMap: Record<string, boolean>
84
+ subRowsByFacetId: Record<string, Row<TGenerics>[]>
79
85
  }
80
86
 
81
87
  export type FiltersOptions<TGenerics extends TableGenerics> = {
88
+ enableFilters?: boolean
89
+ manualFiltering?: boolean
82
90
  filterFromLeafRows?: boolean
83
91
  filterFns?: TGenerics['FilterFns']
84
- enableFilters?: boolean
92
+
85
93
  // Column
86
- manualColumnFiltering?: boolean
87
94
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
88
95
  enableColumnFilters?: boolean
89
- getColumnFilteredRowModel?: (
96
+ getFilteredRowModel?: (
90
97
  instance: TableInstance<TGenerics>
91
98
  ) => () => RowModel<TGenerics>
99
+
92
100
  // Global
93
- manualGlobalFiltering?: boolean
94
101
  globalFilterFn?: FilterFnOption<TGenerics>
95
102
  onGlobalFilterChange?: OnChangeFn<any>
96
103
  enableGlobalFilter?: boolean
97
- getGlobalFilteredRowModel?: (
98
- instance: TableInstance<TGenerics>
99
- ) => () => RowModel<TGenerics>
100
- getColumnCanGlobalFilterFn?: (column: Column<TGenerics>) => boolean
104
+ getColumnCanGlobalFilter?: (column: Column<TGenerics>) => boolean
101
105
  }
102
106
 
103
107
  export type FiltersInstance<TGenerics extends TableGenerics> = {
@@ -109,15 +113,16 @@ export type FiltersInstance<TGenerics extends TableGenerics> = {
109
113
  setColumnFilterValue: (columnId: string, updater: Updater<any>) => void
110
114
  resetColumnFilters: () => void
111
115
  getColumnCanColumnFilter: (columnId: string) => boolean
116
+ getColumnFacetedRowModel: (columnId: string) => RowModel<TGenerics>
112
117
 
113
118
  getColumnIsFiltered: (columnId: string) => boolean
114
119
  getColumnFilterValue: (columnId: string) => unknown
115
120
  getColumnFilterIndex: (columnId: string) => number
116
121
 
117
122
  // Column Filters
118
- getPreColumnFilteredRowModel: () => RowModel<TGenerics>
119
- getColumnFilteredRowModel: () => RowModel<TGenerics>
120
- _getColumnFilteredRowModel?: () => RowModel<TGenerics>
123
+ getPreFilteredRowModel: () => RowModel<TGenerics>
124
+ getFilteredRowModel: () => RowModel<TGenerics>
125
+ _getFilteredRowModel?: () => RowModel<TGenerics>
121
126
 
122
127
  // Global Filters
123
128
  setGlobalFilter: (updater: Updater<any>) => void
@@ -125,14 +130,14 @@ export type FiltersInstance<TGenerics extends TableGenerics> = {
125
130
  getGlobalAutoFilterFn: () => FilterFn<TGenerics> | undefined
126
131
  getGlobalFilterFn: () => FilterFn<TGenerics> | undefined
127
132
  getColumnCanGlobalFilter: (columnId: string) => boolean
128
- getPreGlobalFilteredRowModel: () => RowModel<TGenerics>
129
- getGlobalFilteredRowModel: () => RowModel<TGenerics>
130
- _getGlobalFilteredRowModel?: () => RowModel<TGenerics>
133
+ getGlobalFacetedRowModel: () => RowModel<TGenerics>
134
+ getGlobalFacetedUniqueValues: () => Map<any, number>
135
+ getGlobalFacetedMinMaxValues: () => [number, number]
131
136
  }
132
137
 
133
138
  //
134
139
 
135
- export const Filters = {
140
+ export const Filters: TableFeature = {
136
141
  getDefaultColumn: <
137
142
  TGenerics extends TableGenerics
138
143
  >(): FiltersColumnDef<TGenerics> => {
@@ -141,12 +146,13 @@ export const Filters = {
141
146
  }
142
147
  },
143
148
 
144
- getInitialState: (): FiltersTableState => {
149
+ getInitialState: (state): FiltersTableState => {
145
150
  return {
146
151
  columnFilters: [],
147
152
  globalFilter: undefined,
148
153
  columnFiltersProgress: 1,
149
154
  globalFilterProgress: 1,
155
+ ...state,
150
156
  }
151
157
  },
152
158
 
@@ -158,7 +164,7 @@ export const Filters = {
158
164
  onGlobalFilterChange: makeStateUpdater('globalFilter', instance),
159
165
  filterFromLeafRows: true,
160
166
  globalFilterFn: 'auto',
161
- getColumnCanGlobalFilterFn: column => {
167
+ getColumnCanGlobalFilter: column => {
162
168
  const value = instance
163
169
  .getCoreRowModel()
164
170
  .flatRows[0]?.getAllCellsByColumnId()[column.id]?.value
@@ -172,46 +178,6 @@ export const Filters = {
172
178
  column: Column<TGenerics>,
173
179
  instance: TableInstance<TGenerics>
174
180
  ): FiltersColumn<TGenerics> => {
175
- const getFacetInfo = memo(
176
- () => [column.getPreFilteredRows()],
177
- (rows = []) => {
178
- let preFilteredUniqueValues = new Map<any, number>()
179
-
180
- let preFilteredMinMaxValues: [any, any] = [
181
- rows[0]?.values[column.id] ?? null,
182
- rows[0]?.values[column.id] ?? null,
183
- ]
184
-
185
- for (let i = 0; i < rows.length; i++) {
186
- const value = rows[i]?.values[column.id]
187
-
188
- if (preFilteredUniqueValues.has(value)) {
189
- preFilteredUniqueValues.set(
190
- value,
191
- (preFilteredUniqueValues.get(value) ?? 0) + 1
192
- )
193
- } else {
194
- preFilteredUniqueValues.set(value, 1)
195
- }
196
-
197
- if (value < preFilteredMinMaxValues[0]) {
198
- preFilteredMinMaxValues[0] = value
199
- } else if (value > preFilteredMinMaxValues[1]) {
200
- preFilteredMinMaxValues[1] = value
201
- }
202
- }
203
-
204
- return {
205
- preFilteredUniqueValues,
206
- preFilteredMinMaxValues,
207
- }
208
- },
209
- {
210
- key: 'column.getFacetInfo',
211
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
212
- }
213
- )
214
-
215
181
  return {
216
182
  filterFn: column.filterFn,
217
183
  getCanColumnFilter: () => instance.getColumnCanColumnFilter(column.id),
@@ -221,9 +187,68 @@ export const Filters = {
221
187
  getColumnFilterValue: () => instance.getColumnFilterValue(column.id),
222
188
  setColumnFilterValue: val =>
223
189
  instance.setColumnFilterValue(column.id, val),
224
- getPreFilteredUniqueValues: () => getFacetInfo().preFilteredUniqueValues,
225
- getPreFilteredMinMaxValues: () => getFacetInfo().preFilteredMinMaxValues,
226
- getPreFilteredRows: () => undefined,
190
+ getFacetedRowModel: memo(
191
+ () => [
192
+ instance.getPreFilteredRowModel(),
193
+ instance.getState().columnFilters,
194
+ instance.getState().globalFilter,
195
+ // Include this to force the filtered facet info to be calculated
196
+ instance.getFilteredRowModel(),
197
+ ],
198
+ (rowModel, columnFilters, globalFilter, _) => {
199
+ if (!columnFilters?.length && !globalFilter) {
200
+ return rowModel
201
+ }
202
+
203
+ return filterRows(
204
+ rowModel.rows,
205
+ [
206
+ ...columnFilters.map(d => d.id).filter(d => d !== column.id),
207
+ globalFilter ? '__global__' : undefined,
208
+ ].filter(Boolean) as string[],
209
+ instance
210
+ )
211
+ },
212
+ {
213
+ key:
214
+ process.env.NODE_ENV === 'production' &&
215
+ 'getFacetedRowModel_' + column.id,
216
+ debug: () =>
217
+ instance.options.debugAll ?? instance.options.debugColumns,
218
+ }
219
+ ),
220
+ getFacetedUniqueValues: memo(
221
+ () => [column.getFacetedRowModel()],
222
+ facetedRowModel => getRowModelUniqueValues(facetedRowModel, column.id),
223
+ {
224
+ key:
225
+ process.env.NODE_ENV === 'production' &&
226
+ 'column.getFacetedUniqueValues',
227
+ debug: () =>
228
+ instance.options.debugAll ?? instance.options.debugColumns,
229
+ }
230
+ ),
231
+ getFacetedMinMaxValues: memo(
232
+ () => [column.getFacetedRowModel()],
233
+ facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),
234
+ {
235
+ key:
236
+ process.env.NODE_ENV === 'production' &&
237
+ 'column.getFacetedMinMaxValues',
238
+ debug: () =>
239
+ instance.options.debugAll ?? instance.options.debugColumns,
240
+ }
241
+ ),
242
+ }
243
+ },
244
+
245
+ createRow: <TGenerics extends TableGenerics>(
246
+ row: Row<TGenerics>,
247
+ instance: TableInstance<TGenerics>
248
+ ): FiltersRow<TGenerics> => {
249
+ return {
250
+ columnFilterMap: {},
251
+ subRowsByFacetId: {},
227
252
  }
228
253
  },
229
254
 
@@ -241,7 +266,7 @@ export const Filters = {
241
266
  }
242
267
 
243
268
  if (typeof value === 'number') {
244
- return filterFns.betweenNumberRange
269
+ return filterFns.inNumberRange
245
270
  }
246
271
 
247
272
  if (value !== null && typeof value === 'object') {
@@ -254,6 +279,15 @@ export const Filters = {
254
279
 
255
280
  return filterFns.weakEquals
256
281
  },
282
+ getColumnFacetedRowModel: columnId => {
283
+ const column = instance.getColumn(columnId)
284
+
285
+ if (!column) {
286
+ throw new Error()
287
+ }
288
+
289
+ return column.getFacetedRowModel()
290
+ },
257
291
  getGlobalAutoFilterFn: () => {
258
292
  return filterFns.includesString
259
293
  },
@@ -331,12 +365,9 @@ export const Filters = {
331
365
  }
332
366
 
333
367
  return (
334
- column.enableAllFilters ??
335
- column.enableColumnFilter ??
336
- instance.options.enableFilters ??
337
- instance.options.enableColumnFilters ??
338
- column.defaultCanColumnFilter ??
339
- column.defaultCanFilter ??
368
+ (column.enableColumnFilter ?? true) &&
369
+ (instance.options.enableColumnFilters ?? true) &&
370
+ (instance.options.enableFilters ?? true) &&
340
371
  !!column.accessorFn
341
372
  )
342
373
  },
@@ -349,15 +380,11 @@ export const Filters = {
349
380
  }
350
381
 
351
382
  return (
352
- ((instance.options.enableFilters ??
353
- instance.options.enableGlobalFilter ??
354
- column.enableAllFilters ??
355
- column.enableGlobalFilter ??
356
- column.defaultCanGlobalFilter ??
357
- column.defaultCanFilter ??
358
- !!column.accessorFn) &&
359
- instance.options.getColumnCanGlobalFilterFn?.(column)) ??
360
- true
383
+ (column.enableGlobalFilter ?? true) &&
384
+ (instance.options.enableGlobalFilter ?? true) &&
385
+ (instance.options.enableFilters ?? true) &&
386
+ (instance.options.getColumnCanGlobalFilter?.(column) ?? true) &&
387
+ !!column.accessorFn
361
388
  )
362
389
  },
363
390
 
@@ -430,44 +457,76 @@ export const Filters = {
430
457
  instance.setColumnFilters(instance.initialState?.columnFilters ?? [])
431
458
  },
432
459
 
433
- getPreColumnFilteredRowModel: () => instance.getCoreRowModel(),
434
- getColumnFilteredRowModel: () => {
460
+ getPreFilteredRowModel: () => instance.getCoreRowModel(),
461
+ getFilteredRowModel: () => {
435
462
  if (
436
- !instance._getColumnFilteredRowModel &&
437
- instance.options.getColumnFilteredRowModel
463
+ !instance._getFilteredRowModel &&
464
+ instance.options.getFilteredRowModel
438
465
  ) {
439
- instance._getColumnFilteredRowModel =
440
- instance.options.getColumnFilteredRowModel(instance)
466
+ instance._getFilteredRowModel =
467
+ instance.options.getFilteredRowModel(instance)
441
468
  }
442
469
 
443
470
  if (
444
- instance.options.manualColumnFiltering ||
445
- !instance._getColumnFilteredRowModel
471
+ instance.options.manualFiltering ||
472
+ !instance._getFilteredRowModel
446
473
  ) {
447
- return instance.getPreColumnFilteredRowModel()
474
+ return instance.getPreFilteredRowModel()
448
475
  }
449
476
 
450
- return instance._getColumnFilteredRowModel()
477
+ return instance._getFilteredRowModel()
451
478
  },
452
- getPreGlobalFilteredRowModel: () => instance.getColumnFilteredRowModel(),
453
- getGlobalFilteredRowModel: () => {
454
- if (
455
- !instance._getGlobalFilteredRowModel &&
456
- instance.options.getGlobalFilteredRowModel
457
- ) {
458
- instance._getGlobalFilteredRowModel =
459
- instance.options.getGlobalFilteredRowModel(instance)
460
- }
461
479
 
462
- if (
463
- instance.options.manualGlobalFiltering ||
464
- !instance._getGlobalFilteredRowModel
465
- ) {
466
- return instance.getPreGlobalFilteredRowModel()
467
- }
480
+ getGlobalFacetedRowModel: memo(
481
+ () => [
482
+ instance.getPreFilteredRowModel(),
483
+ instance.getState().columnFilters,
484
+ instance.getState().globalFilter,
485
+ // Include this to force the filtered facet info to be calculated
486
+ instance.getFilteredRowModel(),
487
+ ],
488
+ (rowModel, columnFilters, globalFilter, _) => {
489
+ if (!columnFilters?.length && !globalFilter) {
490
+ return rowModel
491
+ }
468
492
 
469
- return instance._getGlobalFilteredRowModel()
470
- },
493
+ return filterRows(
494
+ rowModel.rows,
495
+ columnFilters.map(d => d.id),
496
+ instance
497
+ )
498
+ },
499
+ {
500
+ key:
501
+ process.env.NODE_ENV === 'production' && 'getGlobalFacetedRowModel',
502
+ debug: () =>
503
+ instance.options.debugAll ?? instance.options.debugColumns,
504
+ }
505
+ ),
506
+ getGlobalFacetedUniqueValues: memo(
507
+ () => [instance.getGlobalFacetedRowModel()],
508
+ facetedRowModel =>
509
+ getRowModelUniqueValues(facetedRowModel, '__global__'),
510
+ {
511
+ key:
512
+ process.env.NODE_ENV === 'production' &&
513
+ 'getGlobalFacetedUniqueValues',
514
+ debug: () =>
515
+ instance.options.debugAll ?? instance.options.debugColumns,
516
+ }
517
+ ),
518
+ getGlobalFacetedMinMaxValues: memo(
519
+ () => [instance.getGlobalFacetedRowModel()],
520
+ facetedRowModel =>
521
+ getRowModelMinMaxValues(facetedRowModel, '__global__'),
522
+ {
523
+ key:
524
+ process.env.NODE_ENV === 'production' &&
525
+ 'getGlobalFacetedMinMaxValues',
526
+ debug: () =>
527
+ instance.options.debugAll ?? instance.options.debugColumns,
528
+ }
529
+ ),
471
530
  }
472
531
  },
473
532
  }
@@ -485,3 +544,44 @@ export function shouldAutoRemoveFilter<TGenerics extends TableGenerics>(
485
544
  (typeof value === 'string' && !value)
486
545
  )
487
546
  }
547
+
548
+ export function getRowModelMinMaxValues<TGenerics extends TableGenerics>(
549
+ rowModel: RowModel<TGenerics>,
550
+ columnId: string
551
+ ) {
552
+ let facetedMinMaxValues: [any, any] = [
553
+ rowModel.flatRows[0]?.values[columnId] ?? null,
554
+ rowModel.flatRows[0]?.values[columnId] ?? null,
555
+ ]
556
+
557
+ for (let i = 0; i < rowModel.flatRows.length; i++) {
558
+ const value = rowModel.flatRows[i]?.values[columnId]
559
+
560
+ if (value < facetedMinMaxValues[0]) {
561
+ facetedMinMaxValues[0] = value
562
+ } else if (value > facetedMinMaxValues[1]) {
563
+ facetedMinMaxValues[1] = value
564
+ }
565
+ }
566
+
567
+ return facetedMinMaxValues
568
+ }
569
+
570
+ export function getRowModelUniqueValues<TGenerics extends TableGenerics>(
571
+ rowModel: RowModel<TGenerics>,
572
+ columnId: string
573
+ ) {
574
+ let facetedUniqueValues = new Map<any, number>()
575
+
576
+ for (let i = 0; i < rowModel.flatRows.length; i++) {
577
+ const value = rowModel.flatRows[i]?.values[columnId]
578
+
579
+ if (facetedUniqueValues.has(value)) {
580
+ facetedUniqueValues.set(value, (facetedUniqueValues.get(value) ?? 0) + 1)
581
+ } else {
582
+ facetedUniqueValues.set(value, 1)
583
+ }
584
+ }
585
+
586
+ return facetedUniqueValues
587
+ }