@tanstack/table-core 8.0.0-alpha.64 → 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 (96) hide show
  1. package/build/cjs/core.js +1 -0
  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/Columns.js +7 -7
  6. package/build/cjs/features/Columns.js.map +1 -1
  7. package/build/cjs/features/Filters.js +153 -77
  8. package/build/cjs/features/Filters.js.map +1 -1
  9. package/build/cjs/features/Headers.js +16 -16
  10. package/build/cjs/features/Headers.js.map +1 -1
  11. package/build/cjs/features/Ordering.js +1 -1
  12. package/build/cjs/features/Ordering.js.map +1 -1
  13. package/build/cjs/features/Pagination.js +1 -1
  14. package/build/cjs/features/Pagination.js.map +1 -1
  15. package/build/cjs/features/Pinning.js +6 -6
  16. package/build/cjs/features/Pinning.js.map +1 -1
  17. package/build/cjs/features/RowSelection.js +5 -5
  18. package/build/cjs/features/RowSelection.js.map +1 -1
  19. package/build/cjs/features/Sorting.js +3 -3
  20. package/build/cjs/features/Sorting.js.map +1 -1
  21. package/build/cjs/features/Visibility.js +2 -2
  22. package/build/cjs/features/Visibility.js.map +1 -1
  23. package/build/cjs/filterFns.js +51 -108
  24. package/build/cjs/filterFns.js.map +1 -1
  25. package/build/cjs/index.js +4 -4
  26. package/build/cjs/utils/filterRowsUtils.js +21 -0
  27. package/build/cjs/utils/filterRowsUtils.js.map +1 -1
  28. package/build/cjs/utils/getCoreRowModelAsync.js +1 -1
  29. package/build/cjs/utils/getCoreRowModelAsync.js.map +1 -1
  30. package/build/cjs/utils/getCoreRowModelSync.js +1 -1
  31. package/build/cjs/utils/getCoreRowModelSync.js.map +1 -1
  32. package/build/cjs/utils/getExpandedRowModel.js +1 -1
  33. package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
  34. package/build/cjs/utils/getFilteredRowModelSync.js +130 -0
  35. package/build/cjs/utils/getFilteredRowModelSync.js.map +1 -0
  36. package/build/cjs/utils/getGroupedRowModel.js +1 -1
  37. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  38. package/build/cjs/utils/getPaginationRowModel.js +1 -1
  39. package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
  40. package/build/cjs/utils/getSortedRowModelSync.js +1 -1
  41. package/build/cjs/utils/getSortedRowModelSync.js.map +1 -1
  42. package/build/cjs/utils.js +2 -6
  43. package/build/cjs/utils.js.map +1 -1
  44. package/build/esm/index.js +422 -446
  45. package/build/esm/index.js.map +1 -1
  46. package/build/stats-html.html +1 -1
  47. package/build/stats-react.json +363 -395
  48. package/build/types/features/Filters.d.ts +24 -15
  49. package/build/types/filterFns.d.ts +10 -52
  50. package/build/types/index.d.ts +1 -2
  51. package/build/types/types.d.ts +2 -2
  52. package/build/types/utils/filterRowsUtils.d.ts +1 -0
  53. package/build/types/utils/{getColumnFilteredRowModelAsync.d.ts → getFilteredRowModelAsync.d.ts} +1 -1
  54. package/build/types/utils/getFilteredRowModelSync.d.ts +2 -0
  55. package/build/types/utils.d.ts +2 -2
  56. package/build/umd/index.development.js +424 -447
  57. package/build/umd/index.development.js.map +1 -1
  58. package/build/umd/index.production.js +1 -1
  59. package/build/umd/index.production.js.map +1 -1
  60. package/package.json +2 -1
  61. package/src/core.ts +1 -0
  62. package/src/features/Cells.ts +3 -1
  63. package/src/features/Columns.ts +11 -7
  64. package/src/features/Filters.ts +202 -94
  65. package/src/features/Headers.ts +16 -16
  66. package/src/features/Ordering.ts +1 -1
  67. package/src/features/Pagination.ts +1 -1
  68. package/src/features/Pinning.ts +10 -6
  69. package/src/features/RowSelection.ts +9 -6
  70. package/src/features/Sorting.ts +3 -5
  71. package/src/features/Visibility.ts +3 -2
  72. package/src/filterFns.ts +74 -147
  73. package/src/index.ts +1 -2
  74. package/src/types.ts +2 -0
  75. package/src/utils/filterRowsUtils.ts +24 -0
  76. package/src/utils/getCoreRowModelAsync.ts +1 -1
  77. package/src/utils/getCoreRowModelSync.ts +1 -1
  78. package/src/utils/getExpandedRowModel.ts +1 -1
  79. package/src/utils/getFilteredRowModelAsync.ts +49 -0
  80. package/src/utils/getFilteredRowModelSync.ts +150 -0
  81. package/src/utils/getGroupedRowModel.ts +1 -1
  82. package/src/utils/getPaginationRowModel.ts +1 -1
  83. package/src/utils/getSortedRowModelAsync.ts +1 -1
  84. package/src/utils/getSortedRowModelSync.ts +1 -1
  85. package/src/utils.ts +2 -4
  86. package/build/cjs/utils/getColumnFilteredRowModelSync.js +0 -115
  87. package/build/cjs/utils/getColumnFilteredRowModelSync.js.map +0 -1
  88. package/build/cjs/utils/getGlobalFilteredRowModelSync.js +0 -91
  89. package/build/cjs/utils/getGlobalFilteredRowModelSync.js.map +0 -1
  90. package/build/types/utils/getColumnFilteredRowModelSync.d.ts +0 -2
  91. package/build/types/utils/getGlobalFilteredRowModelAsync.d.ts +0 -4
  92. package/build/types/utils/getGlobalFilteredRowModelSync.d.ts +0 -2
  93. package/src/utils/getColumnFilteredRowModelAsync.ts +0 -118
  94. package/src/utils/getColumnFilteredRowModelSync.ts +0 -102
  95. package/src/utils/getGlobalFilteredRowModelAsync.ts +0 -96
  96. 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.64",
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
@@ -144,6 +144,7 @@ export function createTableInstance<TGenerics extends TableGenerics>(
144
144
  Promise.resolve()
145
145
  .then(() => {
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
  ),
@@ -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
  }
@@ -16,6 +16,7 @@ import {
16
16
  memo,
17
17
  Overwrite,
18
18
  } from '../utils'
19
+ import { filterRows } from '../utils/filterRowsUtils'
19
20
 
20
21
  export type FiltersTableState = {
21
22
  columnFilters: ColumnFiltersState
@@ -31,17 +32,19 @@ export type ColumnFilter = {
31
32
  value: unknown
32
33
  }
33
34
 
34
- /*
35
- 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.
36
- */
37
-
38
35
  export type FilterFn<TGenerics extends TableGenerics> = {
39
- (rows: Row<TGenerics>[], columnIds: string[], filterValue: any): any
36
+ (row: Row<TGenerics>, columnId: string, filterValue: any): boolean
37
+ resolveFilterValue?: TransformFilterValueFn<TGenerics>
40
38
  autoRemove?: ColumnFilterAutoRemoveTestFn<TGenerics>
41
39
  }
42
40
 
41
+ export type TransformFilterValueFn<TGenerics extends TableGenerics> = (
42
+ value: any,
43
+ column?: Column<TGenerics>
44
+ ) => unknown
45
+
43
46
  export type ColumnFilterAutoRemoveTestFn<TGenerics extends TableGenerics> = (
44
- value: unknown,
47
+ value: any,
45
48
  column?: Column<TGenerics>
46
49
  ) => boolean
47
50
 
@@ -60,6 +63,7 @@ export type FiltersColumnDef<TGenerics extends TableGenerics> = {
60
63
  filterFn?: FilterFnOption<Overwrite<TGenerics, { Value: any }>>
61
64
  enableColumnFilter?: boolean
62
65
  enableGlobalFilter?: boolean
66
+ enableFaceting?: boolean
63
67
  }
64
68
 
65
69
  export type FiltersColumn<TGenerics extends TableGenerics> = {
@@ -70,31 +74,33 @@ export type FiltersColumn<TGenerics extends TableGenerics> = {
70
74
  getColumnIsFiltered: () => boolean
71
75
  getColumnFilterValue: () => unknown
72
76
  setColumnFilterValue: (updater: Updater<any>) => void
73
- getPreFilteredRows: () => Row<TGenerics>[] | undefined
74
- getPreFilteredUniqueValues: () => Map<any, number>
75
- 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>[]>
76
85
  }
77
86
 
78
87
  export type FiltersOptions<TGenerics extends TableGenerics> = {
88
+ enableFilters?: boolean
89
+ manualFiltering?: boolean
79
90
  filterFromLeafRows?: boolean
80
91
  filterFns?: TGenerics['FilterFns']
81
92
 
82
93
  // Column
83
- manualColumnFiltering?: boolean
84
94
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
85
95
  enableColumnFilters?: boolean
86
- getColumnFilteredRowModel?: (
96
+ getFilteredRowModel?: (
87
97
  instance: TableInstance<TGenerics>
88
98
  ) => () => RowModel<TGenerics>
89
99
 
90
100
  // Global
91
- manualGlobalFiltering?: boolean
92
101
  globalFilterFn?: FilterFnOption<TGenerics>
93
102
  onGlobalFilterChange?: OnChangeFn<any>
94
103
  enableGlobalFilter?: boolean
95
- getGlobalFilteredRowModel?: (
96
- instance: TableInstance<TGenerics>
97
- ) => () => RowModel<TGenerics>
98
104
  getColumnCanGlobalFilter?: (column: Column<TGenerics>) => boolean
99
105
  }
100
106
 
@@ -107,15 +113,16 @@ export type FiltersInstance<TGenerics extends TableGenerics> = {
107
113
  setColumnFilterValue: (columnId: string, updater: Updater<any>) => void
108
114
  resetColumnFilters: () => void
109
115
  getColumnCanColumnFilter: (columnId: string) => boolean
116
+ getColumnFacetedRowModel: (columnId: string) => RowModel<TGenerics>
110
117
 
111
118
  getColumnIsFiltered: (columnId: string) => boolean
112
119
  getColumnFilterValue: (columnId: string) => unknown
113
120
  getColumnFilterIndex: (columnId: string) => number
114
121
 
115
122
  // Column Filters
116
- getPreColumnFilteredRowModel: () => RowModel<TGenerics>
117
- getColumnFilteredRowModel: () => RowModel<TGenerics>
118
- _getColumnFilteredRowModel?: () => RowModel<TGenerics>
123
+ getPreFilteredRowModel: () => RowModel<TGenerics>
124
+ getFilteredRowModel: () => RowModel<TGenerics>
125
+ _getFilteredRowModel?: () => RowModel<TGenerics>
119
126
 
120
127
  // Global Filters
121
128
  setGlobalFilter: (updater: Updater<any>) => void
@@ -123,9 +130,9 @@ export type FiltersInstance<TGenerics extends TableGenerics> = {
123
130
  getGlobalAutoFilterFn: () => FilterFn<TGenerics> | undefined
124
131
  getGlobalFilterFn: () => FilterFn<TGenerics> | undefined
125
132
  getColumnCanGlobalFilter: (columnId: string) => boolean
126
- getPreGlobalFilteredRowModel: () => RowModel<TGenerics>
127
- getGlobalFilteredRowModel: () => RowModel<TGenerics>
128
- _getGlobalFilteredRowModel?: () => RowModel<TGenerics>
133
+ getGlobalFacetedRowModel: () => RowModel<TGenerics>
134
+ getGlobalFacetedUniqueValues: () => Map<any, number>
135
+ getGlobalFacetedMinMaxValues: () => [number, number]
129
136
  }
130
137
 
131
138
  //
@@ -171,46 +178,6 @@ export const Filters: TableFeature = {
171
178
  column: Column<TGenerics>,
172
179
  instance: TableInstance<TGenerics>
173
180
  ): FiltersColumn<TGenerics> => {
174
- const getFacetInfo = memo(
175
- () => [column.getPreFilteredRows()],
176
- (rows = []) => {
177
- let preFilteredUniqueValues = new Map<any, number>()
178
-
179
- let preFilteredMinMaxValues: [any, any] = [
180
- rows[0]?.values[column.id] ?? null,
181
- rows[0]?.values[column.id] ?? null,
182
- ]
183
-
184
- for (let i = 0; i < rows.length; i++) {
185
- const value = rows[i]?.values[column.id]
186
-
187
- if (preFilteredUniqueValues.has(value)) {
188
- preFilteredUniqueValues.set(
189
- value,
190
- (preFilteredUniqueValues.get(value) ?? 0) + 1
191
- )
192
- } else {
193
- preFilteredUniqueValues.set(value, 1)
194
- }
195
-
196
- if (value < preFilteredMinMaxValues[0]) {
197
- preFilteredMinMaxValues[0] = value
198
- } else if (value > preFilteredMinMaxValues[1]) {
199
- preFilteredMinMaxValues[1] = value
200
- }
201
- }
202
-
203
- return {
204
- preFilteredUniqueValues,
205
- preFilteredMinMaxValues,
206
- }
207
- },
208
- {
209
- key: 'column.getFacetInfo',
210
- debug: () => instance.options.debugAll ?? instance.options.debugColumns,
211
- }
212
- )
213
-
214
181
  return {
215
182
  filterFn: column.filterFn,
216
183
  getCanColumnFilter: () => instance.getColumnCanColumnFilter(column.id),
@@ -220,9 +187,68 @@ export const Filters: TableFeature = {
220
187
  getColumnFilterValue: () => instance.getColumnFilterValue(column.id),
221
188
  setColumnFilterValue: val =>
222
189
  instance.setColumnFilterValue(column.id, val),
223
- getPreFilteredUniqueValues: () => getFacetInfo().preFilteredUniqueValues,
224
- getPreFilteredMinMaxValues: () => getFacetInfo().preFilteredMinMaxValues,
225
- 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: {},
226
252
  }
227
253
  },
228
254
 
@@ -240,7 +266,7 @@ export const Filters: TableFeature = {
240
266
  }
241
267
 
242
268
  if (typeof value === 'number') {
243
- return filterFns.betweenNumberRange
269
+ return filterFns.inNumberRange
244
270
  }
245
271
 
246
272
  if (value !== null && typeof value === 'object') {
@@ -253,6 +279,15 @@ export const Filters: TableFeature = {
253
279
 
254
280
  return filterFns.weakEquals
255
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
+ },
256
291
  getGlobalAutoFilterFn: () => {
257
292
  return filterFns.includesString
258
293
  },
@@ -280,8 +315,6 @@ export const Filters: TableFeature = {
280
315
  const { filterFns: userFilterFns, globalFilterFn: globalFilterFn } =
281
316
  instance.options
282
317
 
283
- debugger
284
-
285
318
  return isFunction(globalFilterFn)
286
319
  ? globalFilterFn
287
320
  : globalFilterFn === 'auto'
@@ -334,6 +367,7 @@ export const Filters: TableFeature = {
334
367
  return (
335
368
  (column.enableColumnFilter ?? true) &&
336
369
  (instance.options.enableColumnFilters ?? true) &&
370
+ (instance.options.enableFilters ?? true) &&
337
371
  !!column.accessorFn
338
372
  )
339
373
  },
@@ -348,6 +382,7 @@ export const Filters: TableFeature = {
348
382
  return (
349
383
  (column.enableGlobalFilter ?? true) &&
350
384
  (instance.options.enableGlobalFilter ?? true) &&
385
+ (instance.options.enableFilters ?? true) &&
351
386
  (instance.options.getColumnCanGlobalFilter?.(column) ?? true) &&
352
387
  !!column.accessorFn
353
388
  )
@@ -422,44 +457,76 @@ export const Filters: TableFeature = {
422
457
  instance.setColumnFilters(instance.initialState?.columnFilters ?? [])
423
458
  },
424
459
 
425
- getPreColumnFilteredRowModel: () => instance.getCoreRowModel(),
426
- getColumnFilteredRowModel: () => {
460
+ getPreFilteredRowModel: () => instance.getCoreRowModel(),
461
+ getFilteredRowModel: () => {
427
462
  if (
428
- !instance._getColumnFilteredRowModel &&
429
- instance.options.getColumnFilteredRowModel
463
+ !instance._getFilteredRowModel &&
464
+ instance.options.getFilteredRowModel
430
465
  ) {
431
- instance._getColumnFilteredRowModel =
432
- instance.options.getColumnFilteredRowModel(instance)
466
+ instance._getFilteredRowModel =
467
+ instance.options.getFilteredRowModel(instance)
433
468
  }
434
469
 
435
470
  if (
436
- instance.options.manualColumnFiltering ||
437
- !instance._getColumnFilteredRowModel
471
+ instance.options.manualFiltering ||
472
+ !instance._getFilteredRowModel
438
473
  ) {
439
- return instance.getPreColumnFilteredRowModel()
474
+ return instance.getPreFilteredRowModel()
440
475
  }
441
476
 
442
- return instance._getColumnFilteredRowModel()
477
+ return instance._getFilteredRowModel()
443
478
  },
444
- getPreGlobalFilteredRowModel: () => instance.getColumnFilteredRowModel(),
445
- getGlobalFilteredRowModel: () => {
446
- if (
447
- !instance._getGlobalFilteredRowModel &&
448
- instance.options.getGlobalFilteredRowModel
449
- ) {
450
- instance._getGlobalFilteredRowModel =
451
- instance.options.getGlobalFilteredRowModel(instance)
452
- }
453
479
 
454
- if (
455
- instance.options.manualGlobalFiltering ||
456
- !instance._getGlobalFilteredRowModel
457
- ) {
458
- return instance.getPreGlobalFilteredRowModel()
459
- }
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
+ }
460
492
 
461
- return instance._getGlobalFilteredRowModel()
462
- },
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
+ ),
463
530
  }
464
531
  },
465
532
  }
@@ -477,3 +544,44 @@ export function shouldAutoRemoveFilter<TGenerics extends TableGenerics>(
477
544
  (typeof value === 'string' && !value)
478
545
  )
479
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
+ }
@@ -163,7 +163,7 @@ export const Headers = {
163
163
  return headerGroups
164
164
  },
165
165
  {
166
- key: 'getHeaderGroups',
166
+ key: process.env.NODE_ENV === 'production' && 'getHeaderGroups',
167
167
  debug: () =>
168
168
  instance.options.debugAll ?? instance.options.debugHeaders,
169
169
  }
@@ -183,7 +183,7 @@ export const Headers = {
183
183
  return buildHeaderGroups(allColumns, leafColumns, instance, 'center')
184
184
  },
185
185
  {
186
- key: 'getCenterHeaderGroups',
186
+ key: process.env.NODE_ENV === 'production' && 'getCenterHeaderGroups',
187
187
  debug: () =>
188
188
  instance.options.debugAll ?? instance.options.debugHeaders,
189
189
  }
@@ -200,7 +200,7 @@ export const Headers = {
200
200
  return buildHeaderGroups(allColumns, leafColumns, instance, 'left')
201
201
  },
202
202
  {
203
- key: 'getLeftHeaderGroups',
203
+ key: process.env.NODE_ENV === 'production' && 'getLeftHeaderGroups',
204
204
  debug: () =>
205
205
  instance.options.debugAll ?? instance.options.debugHeaders,
206
206
  }
@@ -217,7 +217,7 @@ export const Headers = {
217
217
  return buildHeaderGroups(allColumns, leafColumns, instance, 'right')
218
218
  },
219
219
  {
220
- key: 'getRightHeaderGroups',
220
+ key: process.env.NODE_ENV === 'production' && 'getRightHeaderGroups',
221
221
  debug: () =>
222
222
  instance.options.debugAll ?? instance.options.debugHeaders,
223
223
  }
@@ -231,7 +231,7 @@ export const Headers = {
231
231
  return [...headerGroups].reverse()
232
232
  },
233
233
  {
234
- key: 'getFooterGroups',
234
+ key: process.env.NODE_ENV === 'production' && 'getFooterGroups',
235
235
  debug: () =>
236
236
  instance.options.debugAll ?? instance.options.debugHeaders,
237
237
  }
@@ -243,7 +243,7 @@ export const Headers = {
243
243
  return [...headerGroups].reverse()
244
244
  },
245
245
  {
246
- key: 'getLeftFooterGroups',
246
+ key: process.env.NODE_ENV === 'production' && 'getLeftFooterGroups',
247
247
  debug: () =>
248
248
  instance.options.debugAll ?? instance.options.debugHeaders,
249
249
  }
@@ -255,7 +255,7 @@ export const Headers = {
255
255
  return [...headerGroups].reverse()
256
256
  },
257
257
  {
258
- key: 'getCenterFooterGroups',
258
+ key: process.env.NODE_ENV === 'production' && 'getCenterFooterGroups',
259
259
  debug: () =>
260
260
  instance.options.debugAll ?? instance.options.debugHeaders,
261
261
  }
@@ -267,7 +267,7 @@ export const Headers = {
267
267
  return [...headerGroups].reverse()
268
268
  },
269
269
  {
270
- key: 'getRightFooterGroups',
270
+ key: process.env.NODE_ENV === 'production' && 'getRightFooterGroups',
271
271
  debug: () =>
272
272
  instance.options.debugAll ?? instance.options.debugHeaders,
273
273
  }
@@ -285,7 +285,7 @@ export const Headers = {
285
285
  .flat()
286
286
  },
287
287
  {
288
- key: 'getFlatHeaders',
288
+ key: process.env.NODE_ENV === 'production' && 'getFlatHeaders',
289
289
  debug: () =>
290
290
  instance.options.debugAll ?? instance.options.debugHeaders,
291
291
  }
@@ -301,7 +301,7 @@ export const Headers = {
301
301
  .flat()
302
302
  },
303
303
  {
304
- key: 'getLeftFlatHeaders',
304
+ key: process.env.NODE_ENV === 'production' && 'getLeftFlatHeaders',
305
305
  debug: () =>
306
306
  instance.options.debugAll ?? instance.options.debugHeaders,
307
307
  }
@@ -317,7 +317,7 @@ export const Headers = {
317
317
  .flat()
318
318
  },
319
319
  {
320
- key: 'getCenterFlatHeaders',
320
+ key: process.env.NODE_ENV === 'production' && 'getCenterFlatHeaders',
321
321
  debug: () =>
322
322
  instance.options.debugAll ?? instance.options.debugHeaders,
323
323
  }
@@ -333,7 +333,7 @@ export const Headers = {
333
333
  .flat()
334
334
  },
335
335
  {
336
- key: 'getRightFlatHeaders',
336
+ key: process.env.NODE_ENV === 'production' && 'getRightFlatHeaders',
337
337
  debug: () =>
338
338
  instance.options.debugAll ?? instance.options.debugHeaders,
339
339
  }
@@ -347,7 +347,7 @@ export const Headers = {
347
347
  return flatHeaders.filter(header => !header.subHeaders?.length)
348
348
  },
349
349
  {
350
- key: 'getCenterLeafHeaders',
350
+ key: process.env.NODE_ENV === 'production' && 'getCenterLeafHeaders',
351
351
  debug: () =>
352
352
  instance.options.debugAll ?? instance.options.debugHeaders,
353
353
  }
@@ -359,7 +359,7 @@ export const Headers = {
359
359
  return flatHeaders.filter(header => !header.subHeaders?.length)
360
360
  },
361
361
  {
362
- key: 'getLeftLeafHeaders',
362
+ key: process.env.NODE_ENV === 'production' && 'getLeftLeafHeaders',
363
363
  debug: () =>
364
364
  instance.options.debugAll ?? instance.options.debugHeaders,
365
365
  }
@@ -371,7 +371,7 @@ export const Headers = {
371
371
  return flatHeaders.filter(header => !header.subHeaders?.length)
372
372
  },
373
373
  {
374
- key: 'getRightLeafHeaders',
374
+ key: process.env.NODE_ENV === 'production' && 'getRightLeafHeaders',
375
375
  debug: () =>
376
376
  instance.options.debugAll ?? instance.options.debugHeaders,
377
377
  }
@@ -395,7 +395,7 @@ export const Headers = {
395
395
  .flat()
396
396
  },
397
397
  {
398
- key: 'getLeafHeaders',
398
+ key: process.env.NODE_ENV === 'production' && 'getLeafHeaders',
399
399
  debug: () =>
400
400
  instance.options.debugAll ?? instance.options.debugHeaders,
401
401
  }
@@ -100,7 +100,7 @@ export const Ordering: TableFeature = {
100
100
  return orderColumns(orderedColumns, grouping, groupedColumnMode)
101
101
  },
102
102
  {
103
- key: 'getOrderColumnsFn',
103
+ key: process.env.NODE_ENV === 'production' && 'getOrderColumnsFn',
104
104
  // debug: () => instance.options.debugAll ?? instance.options.debugTable,
105
105
  }
106
106
  ),