@tanstack/table-core 8.0.0-alpha.9 → 8.0.0-beta.0

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 (186) hide show
  1. package/build/cjs/aggregationFns.js +120 -0
  2. package/build/cjs/aggregationFns.js.map +1 -0
  3. package/build/cjs/core/cell.js +40 -0
  4. package/build/cjs/core/cell.js.map +1 -0
  5. package/build/cjs/core/column.js +88 -0
  6. package/build/cjs/core/column.js.map +1 -0
  7. package/build/cjs/core/headers.js +403 -0
  8. package/build/cjs/core/headers.js.map +1 -0
  9. package/build/cjs/core/instance.js +255 -0
  10. package/build/cjs/core/instance.js.map +1 -0
  11. package/build/cjs/core/row.js +77 -0
  12. package/build/cjs/core/row.js.map +1 -0
  13. package/build/cjs/createTable.js +36 -29
  14. package/build/cjs/createTable.js.map +1 -1
  15. package/build/cjs/features/ColumnSizing.js +157 -189
  16. package/build/cjs/features/ColumnSizing.js.map +1 -1
  17. package/build/cjs/features/Expanding.js +103 -155
  18. package/build/cjs/features/Expanding.js.map +1 -1
  19. package/build/cjs/features/Filters.js +155 -304
  20. package/build/cjs/features/Filters.js.map +1 -1
  21. package/build/cjs/features/Grouping.js +97 -157
  22. package/build/cjs/features/Grouping.js.map +1 -1
  23. package/build/cjs/features/Ordering.js +30 -41
  24. package/build/cjs/features/Ordering.js.map +1 -1
  25. package/build/cjs/features/Pagination.js +102 -105
  26. package/build/cjs/features/Pagination.js.map +1 -1
  27. package/build/cjs/features/Pinning.js +131 -89
  28. package/build/cjs/features/Pinning.js.map +1 -1
  29. package/build/cjs/features/RowSelection.js +138 -267
  30. package/build/cjs/features/RowSelection.js.map +1 -1
  31. package/build/cjs/features/Sorting.js +82 -167
  32. package/build/cjs/features/Sorting.js.map +1 -1
  33. package/build/cjs/features/Visibility.js +69 -115
  34. package/build/cjs/features/Visibility.js.map +1 -1
  35. package/build/cjs/filterFns.js +107 -0
  36. package/build/cjs/filterFns.js.map +1 -0
  37. package/build/cjs/index.js +36 -23
  38. package/build/cjs/index.js.map +1 -1
  39. package/build/cjs/sortingFns.js +124 -0
  40. package/build/cjs/sortingFns.js.map +1 -0
  41. package/build/cjs/utils/filterRowsUtils.js +117 -0
  42. package/build/cjs/utils/filterRowsUtils.js.map +1 -0
  43. package/build/cjs/utils/getCoreRowModel.js +79 -0
  44. package/build/cjs/utils/getCoreRowModel.js.map +1 -0
  45. package/build/cjs/utils/getExpandedRowModel.js +57 -0
  46. package/build/cjs/utils/getExpandedRowModel.js.map +1 -0
  47. package/build/cjs/utils/getFacetedMinMaxValues.js +54 -0
  48. package/build/cjs/utils/getFacetedMinMaxValues.js.map +1 -0
  49. package/build/cjs/utils/getFacetedRowModel.js +50 -0
  50. package/build/cjs/utils/getFacetedRowModel.js.map +1 -0
  51. package/build/cjs/utils/getFacetedUniqueValues.js +48 -0
  52. package/build/cjs/utils/getFacetedUniqueValues.js.map +1 -0
  53. package/build/cjs/utils/getFilteredRowModel.js +139 -0
  54. package/build/cjs/utils/getFilteredRowModel.js.map +1 -0
  55. package/build/cjs/utils/getGroupedRowModel.js +161 -0
  56. package/build/cjs/utils/getGroupedRowModel.js.map +1 -0
  57. package/build/cjs/utils/getPaginationRowModel.js +61 -0
  58. package/build/cjs/utils/getPaginationRowModel.js.map +1 -0
  59. package/build/cjs/utils/getSortedRowModel.js +110 -0
  60. package/build/cjs/utils/getSortedRowModel.js.map +1 -0
  61. package/build/cjs/utils.js +38 -107
  62. package/build/cjs/utils.js.map +1 -1
  63. package/build/esm/index.js +2976 -3853
  64. package/build/esm/index.js.map +1 -1
  65. package/build/stats-html.html +1 -1
  66. package/build/stats-react.json +586 -408
  67. package/build/types/aggregationFns.d.ts +13 -0
  68. package/build/types/core/cell.d.ts +9 -0
  69. package/build/types/core/column.d.ts +40 -0
  70. package/build/types/core/headers.d.ts +46 -0
  71. package/build/types/core/instance.d.ts +57 -0
  72. package/build/types/core/row.d.ts +15 -0
  73. package/build/types/createTable.d.ts +47 -26
  74. package/build/types/features/ColumnSizing.d.ts +32 -44
  75. package/build/types/features/Expanding.d.ts +15 -26
  76. package/build/types/features/Filters.d.ts +64 -63
  77. package/build/types/features/Grouping.d.ts +32 -46
  78. package/build/types/features/Ordering.d.ts +7 -10
  79. package/build/types/features/Pagination.d.ts +16 -15
  80. package/build/types/features/Pinning.d.ts +16 -17
  81. package/build/types/features/RowSelection.d.ts +13 -33
  82. package/build/types/features/Sorting.d.ts +25 -44
  83. package/build/types/features/Visibility.d.ts +16 -25
  84. package/build/types/filterFns.d.ts +13 -0
  85. package/build/types/index.d.ts +16 -10
  86. package/build/types/sortingFns.d.ts +11 -0
  87. package/build/types/types.d.ts +37 -122
  88. package/build/types/utils/filterRowsUtils.d.ts +4 -0
  89. package/build/types/utils/getCoreRowModel.d.ts +2 -0
  90. package/build/types/utils/getExpandedRowModel.d.ts +7 -0
  91. package/build/types/utils/getFacetedMinMaxValues.d.ts +2 -0
  92. package/build/types/utils/getFacetedRowModel.d.ts +2 -0
  93. package/build/types/utils/getFacetedUniqueValues.d.ts +2 -0
  94. package/build/types/utils/getFilteredRowModel.d.ts +2 -0
  95. package/build/types/utils/getGroupedRowModel.d.ts +2 -0
  96. package/build/types/utils/getPaginationRowModel.d.ts +4 -0
  97. package/build/types/utils/getSortedRowModel.d.ts +2 -0
  98. package/build/types/utils.d.ts +7 -11
  99. package/build/umd/index.development.js +3024 -3893
  100. package/build/umd/index.development.js.map +1 -1
  101. package/build/umd/index.production.js +1 -1
  102. package/build/umd/index.production.js.map +1 -1
  103. package/package.json +9 -10
  104. package/src/.DS_Store +0 -0
  105. package/src/aggregationFns.ts +123 -0
  106. package/src/core/cell.ts +48 -0
  107. package/src/core/column.ts +147 -0
  108. package/src/core/headers.ts +575 -0
  109. package/src/core/instance.ts +361 -0
  110. package/src/core/row.ts +85 -0
  111. package/src/createTable.ts +188 -0
  112. package/src/features/ColumnSizing.ts +170 -185
  113. package/src/features/Expanding.ts +122 -194
  114. package/src/features/Filters.ts +301 -381
  115. package/src/features/Grouping.ts +160 -220
  116. package/src/features/Ordering.ts +24 -25
  117. package/src/features/Pagination.ts +90 -73
  118. package/src/features/Pinning.ts +186 -63
  119. package/src/features/RowSelection.ts +107 -245
  120. package/src/features/Sorting.ts +127 -225
  121. package/src/features/Visibility.ts +116 -132
  122. package/src/filterFns.ts +135 -0
  123. package/src/index.ts +29 -0
  124. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  125. package/src/types.ts +62 -168
  126. package/src/utils/filterRowsUtils.ts +112 -0
  127. package/src/utils/getCoreRowModel.ts +84 -0
  128. package/src/utils/getExpandedRowModel.ts +54 -0
  129. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  130. package/src/utils/getFacetedRowModel.ts +50 -0
  131. package/src/utils/getFacetedUniqueValues.ts +37 -0
  132. package/src/utils/getFilteredRowModel.ts +159 -0
  133. package/src/utils/getGroupedRowModel.ts +175 -0
  134. package/src/utils/getPaginationRowModel.ts +48 -0
  135. package/src/utils/getSortedRowModel.ts +116 -0
  136. package/src/utils.ts +126 -0
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  138. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  139. package/build/cjs/aggregationTypes.js +0 -130
  140. package/build/cjs/aggregationTypes.js.map +0 -1
  141. package/build/cjs/core.js +0 -545
  142. package/build/cjs/core.js.map +0 -1
  143. package/build/cjs/features/Headers.js +0 -630
  144. package/build/cjs/features/Headers.js.map +0 -1
  145. package/build/cjs/filterTypes.js +0 -172
  146. package/build/cjs/filterTypes.js.map +0 -1
  147. package/build/cjs/sortTypes.js +0 -122
  148. package/build/cjs/sortTypes.js.map +0 -1
  149. package/build/cjs/types.js +0 -22
  150. package/build/cjs/types.js.map +0 -1
  151. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  152. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  153. package/build/cjs/utils/expandRowsFn.js +0 -38
  154. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  155. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  156. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  157. package/build/cjs/utils/groupRowsFn.js +0 -155
  158. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  159. package/build/cjs/utils/paginateRowsFn.js +0 -44
  160. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  161. package/build/cjs/utils/sortRowsFn.js +0 -94
  162. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  163. package/build/types/aggregationTypes.d.ts +0 -22
  164. package/build/types/core.d.ts +0 -105
  165. package/build/types/features/Headers.d.ts +0 -43
  166. package/build/types/filterTypes.d.ts +0 -50
  167. package/build/types/sortTypes.d.ts +0 -18
  168. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  169. package/build/types/utils/expandRowsFn.d.ts +0 -2
  170. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  171. package/build/types/utils/groupRowsFn.d.ts +0 -2
  172. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  173. package/build/types/utils/sortRowsFn.d.ts +0 -2
  174. package/src/aggregationTypes.ts +0 -115
  175. package/src/core.tsx +0 -763
  176. package/src/createTable.tsx +0 -137
  177. package/src/features/Headers.ts +0 -747
  178. package/src/filterTypes.ts +0 -188
  179. package/src/index.tsx +0 -23
  180. package/src/utils/columnFilterRowsFn.ts +0 -113
  181. package/src/utils/expandRowsFn.ts +0 -30
  182. package/src/utils/globalFilterRowsFn.ts +0 -89
  183. package/src/utils/groupRowsFn.ts +0 -170
  184. package/src/utils/paginateRowsFn.ts +0 -28
  185. package/src/utils/sortRowsFn.ts +0 -95
  186. package/src/utils.tsx +0 -221
@@ -1,9 +1,10 @@
1
1
  import { RowModel } from '..'
2
- import { BuiltInFilterType, filterTypes } from '../filterTypes'
2
+ import { TableFeature } from '../core/instance'
3
+ import { BuiltInFilterFn, filterFns } from '../filterFns'
3
4
  import {
4
5
  Column,
5
6
  OnChangeFn,
6
- PartialGenerics,
7
+ TableGenerics,
7
8
  TableInstance,
8
9
  Row,
9
10
  Updater,
@@ -16,407 +17,262 @@ import {
16
17
  Overwrite,
17
18
  } from '../utils'
18
19
 
20
+ export type FiltersTableState = {
21
+ columnFilters: ColumnFiltersState
22
+ globalFilter: any
23
+ }
24
+
25
+ export type ColumnFiltersState = ColumnFilter[]
26
+
19
27
  export type ColumnFilter = {
20
28
  id: string
21
29
  value: unknown
22
30
  }
23
31
 
24
- export type ColumnFiltersState = ColumnFilter[]
32
+ export type ResolvedColumnFilter<TGenerics extends TableGenerics> = {
33
+ id: string
34
+ resolvedValue: unknown
35
+ filterFn: FilterFn<TGenerics>
36
+ }
37
+
38
+ export type FilterFn<TGenerics extends TableGenerics> = {
39
+ (
40
+ row: Row<TGenerics>,
41
+ columnId: string,
42
+ filterValue: any,
43
+ addMeta: (meta: TGenerics['FilterMeta']) => void
44
+ ): boolean
25
45
 
26
- export type FilterFn<TGenerics extends PartialGenerics> = {
27
- (rows: Row<TGenerics>[], columnIds: string[], filterValue: any): any
46
+ resolveFilterValue?: TransformFilterValueFn<TGenerics>
28
47
  autoRemove?: ColumnFilterAutoRemoveTestFn<TGenerics>
29
48
  }
30
49
 
31
- export type ColumnFilterAutoRemoveTestFn<TGenerics extends PartialGenerics> = (
32
- value: unknown,
50
+ export type TransformFilterValueFn<TGenerics extends TableGenerics> = (
51
+ value: any,
52
+ column?: Column<TGenerics>
53
+ ) => unknown
54
+
55
+ export type ColumnFilterAutoRemoveTestFn<TGenerics extends TableGenerics> = (
56
+ value: any,
33
57
  column?: Column<TGenerics>
34
58
  ) => boolean
35
59
 
36
- export type CustomFilterTypes<TGenerics extends PartialGenerics> = Record<
60
+ export type CustomFilterFns<TGenerics extends TableGenerics> = Record<
37
61
  string,
38
62
  FilterFn<TGenerics>
39
63
  >
40
64
 
41
- export type FiltersTableState = {
42
- columnFilters: ColumnFiltersState
43
- globalFilter: any
44
- }
45
-
46
- export type FilterType<TGenerics extends PartialGenerics> =
65
+ export type FilterFnOption<TGenerics extends TableGenerics> =
47
66
  | 'auto'
48
- | BuiltInFilterType
49
- | TGenerics['FilterFns']
67
+ | BuiltInFilterFn
68
+ | keyof TGenerics['FilterFns']
50
69
  | FilterFn<TGenerics>
51
70
 
52
- export type FiltersColumnDef<TGenerics extends PartialGenerics> = {
53
- filterType?: FilterType<Overwrite<TGenerics, { Value: any }>>
54
- enableAllFilters?: boolean
71
+ export type FiltersColumnDef<TGenerics extends TableGenerics> = {
72
+ filterFn?: FilterFnOption<Overwrite<TGenerics, { Value: any }>>
55
73
  enableColumnFilter?: boolean
56
74
  enableGlobalFilter?: boolean
57
- defaultCanFilter?: boolean
58
- defaultCanColumnFilter?: boolean
59
- defaultCanGlobalFilter?: boolean
60
75
  }
61
76
 
62
- export type FiltersColumn<TGenerics extends PartialGenerics> = {
63
- filterType: FilterType<Overwrite<TGenerics, { Value: any }>>
64
- getCanColumnFilter: () => boolean
77
+ export type FiltersColumn<TGenerics extends TableGenerics> = {
78
+ filterFn: FilterFnOption<Overwrite<TGenerics, { Value: any }>>
79
+ getAutoFilterFn: () => FilterFn<TGenerics> | undefined
80
+ getFilterFn: () => FilterFn<TGenerics> | undefined
81
+ setFilterValue: (updater: Updater<any>) => void
82
+ getCanFilter: () => boolean
65
83
  getCanGlobalFilter: () => boolean
66
- getColumnFilterIndex: () => number
67
- getIsColumnFiltered: () => boolean
68
- getColumnFilterValue: () => unknown
69
- setColumnFilterValue: (value: any) => void
70
- getPreFilteredRows: () => Row<TGenerics>[] | undefined
71
- getPreFilteredUniqueValues: () => Map<any, number>
72
- getPreFilteredMinMaxValues: () => [any, any]
84
+ getFacetedRowModel: () => RowModel<TGenerics>
85
+ _getFacetedRowModel?: () => RowModel<TGenerics>
86
+ getIsFiltered: () => boolean
87
+ getFilterValue: () => unknown
88
+ getFilterIndex: () => number
89
+ getFacetedUniqueValues: () => Map<any, number>
90
+ _getFacetedUniqueValues?: () => Map<any, number>
91
+ getFacetedMinMaxValues: () => undefined | [number, number]
92
+ _getFacetedMinMaxValues?: () => undefined | [number, number]
73
93
  }
74
94
 
75
- export type FiltersOptions<TGenerics extends PartialGenerics> = {
76
- filterFromChildrenUp?: boolean
77
- filterTypes?: TGenerics['FilterFns']
95
+ export type FiltersRow<TGenerics extends TableGenerics> = {
96
+ columnFilters: Record<string, boolean>
97
+ columnFiltersMeta: Record<string, TGenerics['FilterMeta']>
98
+ }
99
+
100
+ export type FiltersOptions<TGenerics extends TableGenerics> = {
78
101
  enableFilters?: boolean
102
+ manualFiltering?: boolean
103
+ filterFromLeafRows?: boolean
104
+ filterFns?: TGenerics['FilterFns']
105
+ getFilteredRowModel?: (
106
+ instance: TableInstance<TGenerics>
107
+ ) => () => RowModel<TGenerics>
108
+
79
109
  // Column
80
110
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
81
- autoResetColumnFilters?: boolean
82
111
  enableColumnFilters?: boolean
83
- columnFilterRowsFn?: (
84
- instance: TableInstance<TGenerics>,
85
- coreRowModel: RowModel<TGenerics>
86
- ) => RowModel<TGenerics>
112
+
87
113
  // Global
88
- globalFilterType?: FilterType<TGenerics>
114
+ globalFilterFn?: FilterFnOption<TGenerics>
89
115
  onGlobalFilterChange?: OnChangeFn<any>
90
- enableGlobalFilters?: boolean
91
- autoResetGlobalFilter?: boolean
92
116
  enableGlobalFilter?: boolean
93
- globalFilterRowsFn?: (
117
+ getColumnCanGlobalFilter?: (column: Column<TGenerics>) => boolean
118
+
119
+ // Faceting
120
+ getFacetedRowModel?: (
121
+ instance: TableInstance<TGenerics>,
122
+ columnId: string
123
+ ) => () => RowModel<TGenerics>
124
+ getFacetedUniqueValues?: (
125
+ instance: TableInstance<TGenerics>,
126
+ columnId: string
127
+ ) => () => Map<any, number>
128
+ getFacetedMinMaxValues?: (
94
129
  instance: TableInstance<TGenerics>,
95
- rowModel: RowModel<TGenerics>
96
- ) => RowModel<TGenerics>
97
- getColumnCanGlobalFilterFn?: (column: Column<TGenerics>) => boolean
130
+ columnId: string
131
+ ) => () => undefined | [number, number]
98
132
  }
99
133
 
100
- export type FiltersInstance<TGenerics extends PartialGenerics> = {
101
- _notifyFiltersReset: () => void
102
- getColumnAutoFilterFn: (columnId: string) => FilterFn<TGenerics> | undefined
103
-
104
- getColumnFilterFn: (columnId: string) => FilterFn<TGenerics> | undefined
105
-
134
+ export type FiltersInstance<TGenerics extends TableGenerics> = {
106
135
  setColumnFilters: (updater: Updater<ColumnFiltersState>) => void
107
- setColumnFilterValue: (columnId: string, value: any) => void
108
- resetColumnFilters: () => void
109
- getColumnCanColumnFilter: (columnId: string) => boolean
110
- getColumnCanGlobalFilterFn?: (column: Column<TGenerics>) => boolean
111
-
112
- getColumnIsFiltered: (columnId: string) => boolean
113
- getColumnFilterValue: (columnId: string) => unknown
114
- getColumnFilterIndex: (columnId: string) => number
115
136
 
116
- // All
117
- getPreFilteredRowModel: () => RowModel<TGenerics>
137
+ resetColumnFilters: (defaultState?: boolean) => void
118
138
 
119
139
  // Column Filters
120
- getPreColumnFilteredRowModel: () => RowModel<TGenerics>
121
- getColumnFilteredRowModel: () => RowModel<TGenerics>
140
+ getPreFilteredRowModel: () => RowModel<TGenerics>
141
+ getFilteredRowModel: () => RowModel<TGenerics>
142
+ _getFilteredRowModel?: () => RowModel<TGenerics>
122
143
 
123
144
  // Global Filters
124
145
  setGlobalFilter: (updater: Updater<any>) => void
125
- resetGlobalFilter: () => void
146
+ resetGlobalFilter: (defaultState?: boolean) => void
126
147
  getGlobalAutoFilterFn: () => FilterFn<TGenerics> | undefined
127
148
  getGlobalFilterFn: () => FilterFn<TGenerics> | undefined
128
- getColumnCanGlobalFilter: (columnId: string) => boolean
129
- getPreGlobalFilteredRowModel: () => RowModel<TGenerics>
130
- getGlobalFilteredRowModel: () => RowModel<TGenerics>
149
+ getGlobalFacetedRowModel: () => RowModel<TGenerics>
150
+ _getGlobalFacetedRowModel?: () => RowModel<TGenerics>
151
+ getGlobalFacetedUniqueValues: () => Map<any, number>
152
+ _getGlobalFacetedUniqueValues?: () => Map<any, number>
153
+ getGlobalFacetedMinMaxValues: () => undefined | [number, number]
154
+ _getGlobalFacetedMinMaxValues?: () => undefined | [number, number]
131
155
  }
132
156
 
133
157
  //
134
158
 
135
- export function getDefaultColumn<
136
- TGenerics extends PartialGenerics
137
- >(): FiltersColumnDef<TGenerics> {
138
- return {
139
- filterType: 'auto',
140
- }
141
- }
159
+ export const Filters: TableFeature = {
160
+ getDefaultColumnDef: <
161
+ TGenerics extends TableGenerics
162
+ >(): FiltersColumnDef<TGenerics> => {
163
+ return {
164
+ filterFn: 'auto',
165
+ }
166
+ },
142
167
 
143
- export const Filters = {
144
- getInitialState: (): FiltersTableState => {
168
+ getInitialState: (state): FiltersTableState => {
145
169
  return {
146
170
  columnFilters: [],
147
171
  globalFilter: undefined,
172
+ // filtersProgress: 1,
173
+ // facetProgress: {},
174
+ ...state,
148
175
  }
149
176
  },
150
177
 
151
- getDefaultOptions: <TGenerics extends PartialGenerics>(
178
+ getDefaultOptions: <TGenerics extends TableGenerics>(
152
179
  instance: TableInstance<TGenerics>
153
180
  ): FiltersOptions<TGenerics> => {
154
181
  return {
155
182
  onColumnFiltersChange: makeStateUpdater('columnFilters', instance),
156
183
  onGlobalFilterChange: makeStateUpdater('globalFilter', instance),
157
- autoResetColumnFilters: true,
158
- filterFromChildrenUp: true,
159
- autoResetGlobalFilter: true,
160
- globalFilterType: 'auto',
161
- getColumnCanGlobalFilterFn: column => {
184
+ filterFromLeafRows: false,
185
+ globalFilterFn: 'auto',
186
+ getColumnCanGlobalFilter: column => {
162
187
  const value = instance
163
188
  .getCoreRowModel()
164
- .flatRows[0]?.getAllCellsByColumnId()[column.id]?.value
189
+ .flatRows[0]?._getAllCellsByColumnId()
190
+ [column.id]?.getValue()
165
191
 
166
192
  return typeof value === 'string'
167
193
  },
168
194
  }
169
195
  },
170
196
 
171
- createColumn: <TGenerics extends PartialGenerics>(
197
+ createColumn: <TGenerics extends TableGenerics>(
172
198
  column: Column<TGenerics>,
173
199
  instance: TableInstance<TGenerics>
174
200
  ): 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
- return {
216
- filterType: column.filterType,
217
- getCanColumnFilter: () => instance.getColumnCanColumnFilter(column.id),
218
- getCanGlobalFilter: () => instance.getColumnCanGlobalFilter(column.id),
219
- getColumnFilterIndex: () => instance.getColumnFilterIndex(column.id),
220
- getIsColumnFiltered: () => instance.getColumnIsFiltered(column.id),
221
- getColumnFilterValue: () => instance.getColumnFilterValue(column.id),
222
- setColumnFilterValue: val =>
223
- instance.setColumnFilterValue(column.id, val),
224
- getPreFilteredUniqueValues: () => getFacetInfo().preFilteredUniqueValues,
225
- getPreFilteredMinMaxValues: () => getFacetInfo().preFilteredMinMaxValues,
226
- getPreFilteredRows: () => undefined,
227
- }
228
- },
229
-
230
- getInstance: <TGenerics extends PartialGenerics>(
231
- instance: TableInstance<TGenerics>
232
- ): FiltersInstance<TGenerics> => {
233
- let registered = false
234
-
235
201
  return {
236
- _notifyFiltersReset: () => {
237
- if (!registered) {
238
- registered = true
239
- return
240
- }
241
-
242
- if (instance.options.autoResetAll === false) {
243
- return
244
- }
245
-
246
- if (instance.options.autoResetAll === true) {
247
- instance.resetSorting()
248
- } else {
249
- if (instance.options.autoResetColumnFilters) {
250
- instance.resetColumnFilters()
251
- }
252
- if (instance.options.autoResetGlobalFilter) {
253
- instance.resetGlobalFilter()
254
- }
255
- }
256
- },
257
- getColumnAutoFilterFn: columnId => {
202
+ filterFn: column.filterFn,
203
+ getAutoFilterFn: () => {
258
204
  const firstRow = instance.getCoreRowModel().flatRows[0]
259
205
 
260
- const value = firstRow?.values[columnId]
206
+ const value = firstRow?.getValue(column.id)
261
207
 
262
208
  if (typeof value === 'string') {
263
- return filterTypes.includesString
209
+ return filterFns.includesString
264
210
  }
265
211
 
266
212
  if (typeof value === 'number') {
267
- return filterTypes.betweenNumberRange
213
+ return filterFns.inNumberRange
214
+ }
215
+
216
+ if (typeof value === 'boolean') {
217
+ return filterFns.equals
268
218
  }
269
219
 
270
220
  if (value !== null && typeof value === 'object') {
271
- return filterTypes.equals
221
+ return filterFns.equals
272
222
  }
273
223
 
274
224
  if (Array.isArray(value)) {
275
- return filterTypes.arrIncludes
225
+ return filterFns.arrIncludes
276
226
  }
277
227
 
278
- return filterTypes.weakEquals
279
- },
280
- getGlobalAutoFilterFn: () => {
281
- return filterTypes.includesString
228
+ return filterFns.weakEquals
282
229
  },
283
- getColumnFilterFn: columnId => {
284
- const column = instance.getColumn(columnId)
285
- const userFilterTypes = instance.options.filterTypes
286
-
287
- if (!column) {
288
- throw new Error()
289
- }
290
-
291
- return isFunction(column.filterType)
292
- ? column.filterType
293
- : column.filterType === 'auto'
294
- ? instance.getColumnAutoFilterFn(columnId)
295
- : (userFilterTypes as Record<string, any>)?.[
296
- column.filterType as string
230
+ getFilterFn: () => {
231
+ const userFilterFns = instance.options.filterFns
232
+
233
+ return isFunction(column.filterFn)
234
+ ? column.filterFn
235
+ : column.filterFn === 'auto'
236
+ ? column.getAutoFilterFn()
237
+ : (userFilterFns as Record<string, any>)?.[
238
+ column.filterFn as string
297
239
  ] ??
298
- (filterTypes[
299
- column.filterType as BuiltInFilterType
240
+ (filterFns[
241
+ column.filterFn as BuiltInFilterFn
300
242
  ] as FilterFn<TGenerics>)
301
243
  },
302
-
303
- getGlobalFilterFn: () => {
304
- const { filterTypes: userFilterTypes, globalFilterType } =
305
- instance.options
306
-
307
- return isFunction(globalFilterType)
308
- ? globalFilterType
309
- : globalFilterType === 'auto'
310
- ? instance.getGlobalAutoFilterFn()
311
- : (userFilterTypes as Record<string, any>)?.[
312
- globalFilterType as string
313
- ] ??
314
- (filterTypes[
315
- globalFilterType as BuiltInFilterType
316
- ] as FilterFn<TGenerics>)
317
- },
318
-
319
- setColumnFilters: (updater: Updater<ColumnFiltersState>) => {
320
- const leafColumns = instance.getAllLeafColumns()
321
-
322
- const updateFn = (old: ColumnFiltersState) => {
323
- return functionalUpdate(updater, old)?.filter(filter => {
324
- const column = leafColumns.find(d => d.id === filter.id)
325
-
326
- if (column) {
327
- const filterFn = instance.getColumnFilterFn(column.id)
328
-
329
- if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
330
- return false
331
- }
332
- }
333
-
334
- return true
335
- })
336
- }
337
-
338
- instance.options.onColumnFiltersChange?.(
339
- updateFn,
340
- updateFn(instance.getState().columnFilters)
341
- )
342
- },
343
-
344
- setGlobalFilter: updater => {
345
- instance.options.onGlobalFilterChange?.(
346
- updater,
347
- functionalUpdate(updater, instance.getState().globalFilter)
348
- )
349
- },
350
-
351
- resetGlobalFilter: () => {
352
- instance.setGlobalFilter(undefined)
353
- },
354
-
355
- getColumnCanColumnFilter: columnId => {
356
- const column = instance.getColumn(columnId)
357
-
358
- if (!column) {
359
- throw new Error()
360
- }
361
-
244
+ getCanFilter: () => {
362
245
  return (
363
- column.enableAllFilters ??
364
- column.enableColumnFilter ??
365
- instance.options.enableFilters ??
366
- instance.options.enableColumnFilters ??
367
- column.defaultCanFilter ??
368
- column.defaultCanColumnFilter ??
246
+ (column.columnDef.enableColumnFilter ?? true) &&
247
+ (instance.options.enableColumnFilters ?? true) &&
248
+ (instance.options.enableFilters ?? true) &&
369
249
  !!column.accessorFn
370
250
  )
371
251
  },
372
252
 
373
- getColumnCanGlobalFilter: columnId => {
374
- const column = instance.getColumn(columnId)
375
-
376
- if (!column) {
377
- throw new Error()
378
- }
379
-
253
+ getCanGlobalFilter: () => {
380
254
  return (
381
- ((instance.options.enableFilters ??
382
- instance.options.enableGlobalFilter ??
383
- column.enableAllFilters ??
384
- column.enableGlobalFilter ??
385
- column.defaultCanFilter ??
386
- column.defaultCanGlobalFilter ??
387
- !!column.accessorFn) &&
388
- instance.options.getColumnCanGlobalFilterFn?.(column)) ??
389
- true
255
+ (column.columnDef.enableGlobalFilter ?? true) &&
256
+ (instance.options.enableGlobalFilter ?? true) &&
257
+ (instance.options.enableFilters ?? true) &&
258
+ (instance.options.getColumnCanGlobalFilter?.(column) ?? true) &&
259
+ !!column.accessorFn
390
260
  )
391
261
  },
392
262
 
393
- getColumnIsFiltered: columnId =>
394
- instance.getColumnFilterIndex(columnId) > -1,
263
+ getIsFiltered: () => column.getFilterIndex() > -1,
395
264
 
396
- getColumnFilterValue: columnId =>
397
- instance.getState().columnFilters?.find(d => d.id === columnId)?.value,
265
+ getFilterValue: () =>
266
+ instance.getState().columnFilters?.find(d => d.id === column.id)?.value,
398
267
 
399
- getColumnFilterIndex: columnId =>
400
- instance.getState().columnFilters?.findIndex(d => d.id === columnId) ??
268
+ getFilterIndex: () =>
269
+ instance.getState().columnFilters?.findIndex(d => d.id === column.id) ??
401
270
  -1,
402
271
 
403
- setColumnFilterValue: (columnId, value) => {
404
- if (!columnId) return
405
-
272
+ setFilterValue: value => {
406
273
  instance.setColumnFilters(old => {
407
- const column = instance.getColumn(columnId)
408
-
409
- if (!column) {
410
- if (process.env.NODE_ENV !== 'production') {
411
- console.warn(
412
- `React-Table: Could not find a column with id: ${columnId}`
413
- )
414
- }
415
- throw new Error()
416
- }
417
-
418
- const filterFn = instance.getColumnFilterFn(column.id)
419
- const previousfilter = old?.find(d => d.id === columnId)
274
+ const filterFn = column.getFilterFn()
275
+ const previousfilter = old?.find(d => d.id === column.id)
420
276
 
421
277
  const newFilter = functionalUpdate(
422
278
  value,
@@ -431,15 +287,15 @@ export const Filters = {
431
287
  column
432
288
  )
433
289
  ) {
434
- return old?.filter(d => d.id !== columnId) ?? []
290
+ return old?.filter(d => d.id !== column.id) ?? []
435
291
  }
436
292
 
437
- const newFilterObj = { id: columnId, value: newFilter }
293
+ const newFilterObj = { id: column.id, value: newFilter }
438
294
 
439
295
  if (previousfilter) {
440
296
  return (
441
297
  old?.map(d => {
442
- if (d.id === columnId) {
298
+ if (d.id === column.id) {
443
299
  return newFilterObj
444
300
  }
445
301
  return d
@@ -454,105 +310,169 @@ export const Filters = {
454
310
  return [newFilterObj]
455
311
  })
456
312
  },
313
+ _getFacetedRowModel:
314
+ instance.options.getFacetedRowModel &&
315
+ instance.options.getFacetedRowModel(instance, column.id),
316
+ getFacetedRowModel: () => {
317
+ if (!column._getFacetedRowModel) {
318
+ return instance.getPreFilteredRowModel()
319
+ }
457
320
 
458
- resetColumnFilters: () => {
459
- instance.setColumnFilters(instance.initialState?.columnFilters ?? [])
321
+ return column._getFacetedRowModel()
460
322
  },
323
+ _getFacetedUniqueValues:
324
+ instance.options.getFacetedUniqueValues &&
325
+ instance.options.getFacetedUniqueValues(instance, column.id),
326
+ getFacetedUniqueValues: () => {
327
+ if (!column._getFacetedUniqueValues) {
328
+ return new Map()
329
+ }
461
330
 
462
- getPreFilteredRowModel: () => instance.getCoreRowModel(),
463
- getPreColumnFilteredRowModel: () => instance.getCoreRowModel(),
464
- getColumnFilteredRowModel: memo(
465
- () => [
466
- instance.getState().columnFilters,
467
- instance.getCoreRowModel(),
468
- instance.options.columnFilterRowsFn,
469
- ],
470
- (columnFilters, rowModel, columnFiltersFn) => {
471
- const columnFilteredRowModel = (() => {
472
- if (!columnFilters?.length || !columnFiltersFn) {
473
- return rowModel
474
- }
331
+ return column._getFacetedUniqueValues()
332
+ },
333
+ _getFacetedMinMaxValues:
334
+ instance.options.getFacetedMinMaxValues &&
335
+ instance.options.getFacetedMinMaxValues(instance, column.id),
336
+ getFacetedMinMaxValues: () => {
337
+ if (!column._getFacetedMinMaxValues) {
338
+ return undefined
339
+ }
475
340
 
476
- return columnFiltersFn(instance as any, rowModel)
477
- })()
478
-
479
- // Now that each filtered column has it's partially filtered rows,
480
- // lets assign the final filtered rows to all of the other columns
481
- const nonFilteredColumns = instance
482
- .getAllLeafColumns()
483
- .filter(
484
- column =>
485
- !instance
486
- .getState()
487
- .columnFilters?.find(d => d.id === column.id)
488
- )
341
+ return column._getFacetedMinMaxValues()
342
+ },
343
+ // () => [column.getFacetedRowModel()],
344
+ // facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),
345
+ }
346
+ },
347
+
348
+ createRow: <TGenerics extends TableGenerics>(
349
+ row: Row<TGenerics>,
350
+ instance: TableInstance<TGenerics>
351
+ ): FiltersRow<TGenerics> => {
352
+ return {
353
+ columnFilters: {},
354
+ columnFiltersMeta: {},
355
+ }
356
+ },
357
+
358
+ createInstance: <TGenerics extends TableGenerics>(
359
+ instance: TableInstance<TGenerics>
360
+ ): FiltersInstance<TGenerics> => {
361
+ return {
362
+ getGlobalAutoFilterFn: () => {
363
+ return filterFns.includesString
364
+ },
365
+
366
+ getGlobalFilterFn: () => {
367
+ const { filterFns: userFilterFns, globalFilterFn: globalFilterFn } =
368
+ instance.options
489
369
 
490
- // This essentially enables faceted filter options to be built easily
491
- // using every column's preFilteredRows value
370
+ return isFunction(globalFilterFn)
371
+ ? globalFilterFn
372
+ : globalFilterFn === 'auto'
373
+ ? instance.getGlobalAutoFilterFn()
374
+ : (userFilterFns as Record<string, any>)?.[
375
+ globalFilterFn as string
376
+ ] ??
377
+ (filterFns[
378
+ globalFilterFn as BuiltInFilterFn
379
+ ] as FilterFn<TGenerics>)
380
+ },
381
+
382
+ setColumnFilters: (updater: Updater<ColumnFiltersState>) => {
383
+ const leafColumns = instance.getAllLeafColumns()
384
+
385
+ const updateFn = (old: ColumnFiltersState) => {
386
+ return functionalUpdate(updater, old)?.filter(filter => {
387
+ const column = leafColumns.find(d => d.id === filter.id)
388
+
389
+ if (column) {
390
+ const filterFn = column.getFilterFn()
391
+
392
+ if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
393
+ return false
394
+ }
395
+ }
492
396
 
493
- nonFilteredColumns.forEach(column => {
494
- column.getPreFilteredRows = () => columnFilteredRowModel.rows
397
+ return true
495
398
  })
399
+ }
400
+
401
+ instance.options.onColumnFiltersChange?.(updateFn)
402
+ },
496
403
 
497
- return columnFilteredRowModel
498
- },
499
- {
500
- key: 'getColumnFilteredRowModel',
501
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
404
+ setGlobalFilter: updater => {
405
+ instance.options.onGlobalFilterChange?.(updater)
406
+ },
407
+
408
+ resetGlobalFilter: defaultState => {
409
+ instance.setGlobalFilter(
410
+ defaultState ? undefined : instance.initialState.globalFilter
411
+ )
412
+ },
413
+
414
+ resetColumnFilters: defaultState => {
415
+ instance.setColumnFilters(
416
+ defaultState ? [] : instance.initialState?.columnFilters ?? []
417
+ )
418
+ },
419
+
420
+ getPreFilteredRowModel: () => instance.getCoreRowModel(),
421
+ _getFilteredRowModel:
422
+ instance.options.getFilteredRowModel &&
423
+ instance.options.getFilteredRowModel(instance),
424
+ getFilteredRowModel: () => {
425
+ if (
426
+ instance.options.manualFiltering ||
427
+ !instance._getFilteredRowModel
428
+ ) {
429
+ return instance.getPreFilteredRowModel()
502
430
  }
503
- ),
504
- getPreGlobalFilteredRowModel: () => instance.getColumnFilteredRowModel(),
505
- getGlobalFilteredRowModel: memo(
506
- () => [
507
- instance.getState().globalFilter,
508
- instance.getColumnFilteredRowModel(),
509
- instance.options.globalFilterRowsFn,
510
- ],
511
- (globalFilterValue, columnFilteredRowModel, globalFiltersFn) => {
512
- const globalFilteredRowModel = (() => {
513
- if (!globalFiltersFn || !globalFilterValue) {
514
- return columnFilteredRowModel
515
- }
516
431
 
517
- return globalFiltersFn(
518
- instance as TableInstance<TGenerics>,
519
- columnFilteredRowModel
520
- )
521
- })()
522
-
523
- // Now that each filtered column has it's partially filtered rows,
524
- // lets assign the final filtered rows to all of the other columns
525
- const nonFilteredColumns = instance
526
- .getAllLeafColumns()
527
- .filter(
528
- column =>
529
- !instance
530
- .getState()
531
- .columnFilters?.find(d => d.id === column.id)
532
- )
432
+ return instance._getFilteredRowModel()
433
+ },
533
434
 
534
- // This essentially enables faceted filter options to be built easily
535
- // using every column's preFilteredRows value
435
+ _getGlobalFacetedRowModel:
436
+ instance.options.getFacetedRowModel &&
437
+ instance.options.getFacetedRowModel(instance, '__global__'),
536
438
 
537
- nonFilteredColumns.forEach(column => {
538
- column.getPreFilteredRows = () => globalFilteredRowModel.rows
539
- })
439
+ getGlobalFacetedRowModel: () => {
440
+ if (
441
+ instance.options.manualFiltering ||
442
+ !instance._getGlobalFacetedRowModel
443
+ ) {
444
+ return instance.getPreFilteredRowModel()
445
+ }
446
+
447
+ return instance._getGlobalFacetedRowModel()
448
+ },
540
449
 
541
- return globalFilteredRowModel
542
- },
543
- {
544
- key: 'getGlobalFilteredRowModel',
545
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
546
- onChange: () => {
547
- instance._notifySortingReset()
548
- },
450
+ _getGlobalFacetedUniqueValues:
451
+ instance.options.getFacetedUniqueValues &&
452
+ instance.options.getFacetedUniqueValues(instance, '__global__'),
453
+ getGlobalFacetedUniqueValues: () => {
454
+ if (!instance._getGlobalFacetedUniqueValues) {
455
+ return new Map()
549
456
  }
550
- ),
457
+
458
+ return instance._getGlobalFacetedUniqueValues()
459
+ },
460
+
461
+ _getGlobalFacetedMinMaxValues:
462
+ instance.options.getFacetedMinMaxValues &&
463
+ instance.options.getFacetedMinMaxValues(instance, '__global__'),
464
+ getGlobalFacetedMinMaxValues: () => {
465
+ if (!instance._getGlobalFacetedMinMaxValues) {
466
+ return
467
+ }
468
+
469
+ return instance._getGlobalFacetedMinMaxValues()
470
+ },
551
471
  }
552
472
  },
553
473
  }
554
474
 
555
- export function shouldAutoRemoveFilter<TGenerics extends PartialGenerics>(
475
+ export function shouldAutoRemoveFilter<TGenerics extends TableGenerics>(
556
476
  filterFn?: FilterFn<TGenerics>,
557
477
  value?: any,
558
478
  column?: Column<TGenerics>