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

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/aggregationFns.ts +123 -0
  105. package/src/core/cell.ts +48 -0
  106. package/src/core/column.ts +147 -0
  107. package/src/core/headers.ts +575 -0
  108. package/src/core/instance.ts +359 -0
  109. package/src/core/row.ts +85 -0
  110. package/src/createTable.ts +188 -0
  111. package/src/features/ColumnSizing.ts +170 -185
  112. package/src/features/Expanding.ts +120 -194
  113. package/src/features/Filters.ts +299 -381
  114. package/src/features/Grouping.ts +158 -220
  115. package/src/features/Ordering.ts +24 -25
  116. package/src/features/Pagination.ts +88 -73
  117. package/src/features/Pinning.ts +186 -63
  118. package/src/features/RowSelection.ts +107 -245
  119. package/src/features/Sorting.ts +125 -225
  120. package/src/features/Visibility.ts +116 -132
  121. package/src/filterFns.ts +135 -0
  122. package/src/index.ts +29 -0
  123. package/src/{sortTypes.ts → sortingFns.ts} +63 -85
  124. package/src/types.ts +62 -168
  125. package/src/utils/filterRowsUtils.ts +112 -0
  126. package/src/utils/getCoreRowModel.ts +84 -0
  127. package/src/utils/getExpandedRowModel.ts +54 -0
  128. package/src/utils/getFacetedMinMaxValues.ts +40 -0
  129. package/src/utils/getFacetedRowModel.ts +50 -0
  130. package/src/utils/getFacetedUniqueValues.ts +37 -0
  131. package/src/utils/getFilteredRowModel.ts +159 -0
  132. package/src/utils/getGroupedRowModel.ts +175 -0
  133. package/src/utils/getPaginationRowModel.ts +48 -0
  134. package/src/utils/getSortedRowModel.ts +116 -0
  135. package/src/utils.ts +126 -0
  136. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +0 -112
  137. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  138. package/build/cjs/aggregationTypes.js +0 -130
  139. package/build/cjs/aggregationTypes.js.map +0 -1
  140. package/build/cjs/core.js +0 -545
  141. package/build/cjs/core.js.map +0 -1
  142. package/build/cjs/features/Headers.js +0 -630
  143. package/build/cjs/features/Headers.js.map +0 -1
  144. package/build/cjs/filterTypes.js +0 -172
  145. package/build/cjs/filterTypes.js.map +0 -1
  146. package/build/cjs/sortTypes.js +0 -122
  147. package/build/cjs/sortTypes.js.map +0 -1
  148. package/build/cjs/types.js +0 -22
  149. package/build/cjs/types.js.map +0 -1
  150. package/build/cjs/utils/columnFilterRowsFn.js +0 -131
  151. package/build/cjs/utils/columnFilterRowsFn.js.map +0 -1
  152. package/build/cjs/utils/expandRowsFn.js +0 -38
  153. package/build/cjs/utils/expandRowsFn.js.map +0 -1
  154. package/build/cjs/utils/globalFilterRowsFn.js +0 -101
  155. package/build/cjs/utils/globalFilterRowsFn.js.map +0 -1
  156. package/build/cjs/utils/groupRowsFn.js +0 -155
  157. package/build/cjs/utils/groupRowsFn.js.map +0 -1
  158. package/build/cjs/utils/paginateRowsFn.js +0 -44
  159. package/build/cjs/utils/paginateRowsFn.js.map +0 -1
  160. package/build/cjs/utils/sortRowsFn.js +0 -94
  161. package/build/cjs/utils/sortRowsFn.js.map +0 -1
  162. package/build/types/aggregationTypes.d.ts +0 -22
  163. package/build/types/core.d.ts +0 -105
  164. package/build/types/features/Headers.d.ts +0 -43
  165. package/build/types/filterTypes.d.ts +0 -50
  166. package/build/types/sortTypes.d.ts +0 -18
  167. package/build/types/utils/columnFilterRowsFn.d.ts +0 -2
  168. package/build/types/utils/expandRowsFn.d.ts +0 -2
  169. package/build/types/utils/globalFilterRowsFn.d.ts +0 -2
  170. package/build/types/utils/groupRowsFn.d.ts +0 -2
  171. package/build/types/utils/paginateRowsFn.d.ts +0 -2
  172. package/build/types/utils/sortRowsFn.d.ts +0 -2
  173. package/src/.DS_Store +0 -0
  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,260 @@ 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?: (instance: TableInstance<any>) => () => RowModel<any>
106
+
79
107
  // Column
80
108
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
81
- autoResetColumnFilters?: boolean
82
109
  enableColumnFilters?: boolean
83
- columnFilterRowsFn?: (
84
- instance: TableInstance<TGenerics>,
85
- coreRowModel: RowModel<TGenerics>
86
- ) => RowModel<TGenerics>
110
+
87
111
  // Global
88
- globalFilterType?: FilterType<TGenerics>
112
+ globalFilterFn?: FilterFnOption<TGenerics>
89
113
  onGlobalFilterChange?: OnChangeFn<any>
90
- enableGlobalFilters?: boolean
91
- autoResetGlobalFilter?: boolean
92
114
  enableGlobalFilter?: boolean
93
- globalFilterRowsFn?: (
115
+ getColumnCanGlobalFilter?: (column: Column<TGenerics>) => boolean
116
+
117
+ // Faceting
118
+ getFacetedRowModel?: (
94
119
  instance: TableInstance<TGenerics>,
95
- rowModel: RowModel<TGenerics>
96
- ) => RowModel<TGenerics>
97
- getColumnCanGlobalFilterFn?: (column: Column<TGenerics>) => boolean
120
+ columnId: string
121
+ ) => () => RowModel<TGenerics>
122
+ getFacetedUniqueValues?: (
123
+ instance: TableInstance<TGenerics>,
124
+ columnId: string
125
+ ) => () => Map<any, number>
126
+ getFacetedMinMaxValues?: (
127
+ instance: TableInstance<TGenerics>,
128
+ columnId: string
129
+ ) => () => undefined | [number, number]
98
130
  }
99
131
 
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
-
132
+ export type FiltersInstance<TGenerics extends TableGenerics> = {
106
133
  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
134
 
116
- // All
117
- getPreFilteredRowModel: () => RowModel<TGenerics>
135
+ resetColumnFilters: (defaultState?: boolean) => void
118
136
 
119
137
  // Column Filters
120
- getPreColumnFilteredRowModel: () => RowModel<TGenerics>
121
- getColumnFilteredRowModel: () => RowModel<TGenerics>
138
+ getPreFilteredRowModel: () => RowModel<TGenerics>
139
+ getFilteredRowModel: () => RowModel<TGenerics>
140
+ _getFilteredRowModel?: () => RowModel<TGenerics>
122
141
 
123
142
  // Global Filters
124
143
  setGlobalFilter: (updater: Updater<any>) => void
125
- resetGlobalFilter: () => void
144
+ resetGlobalFilter: (defaultState?: boolean) => void
126
145
  getGlobalAutoFilterFn: () => FilterFn<TGenerics> | undefined
127
146
  getGlobalFilterFn: () => FilterFn<TGenerics> | undefined
128
- getColumnCanGlobalFilter: (columnId: string) => boolean
129
- getPreGlobalFilteredRowModel: () => RowModel<TGenerics>
130
- getGlobalFilteredRowModel: () => RowModel<TGenerics>
147
+ getGlobalFacetedRowModel: () => RowModel<TGenerics>
148
+ _getGlobalFacetedRowModel?: () => RowModel<TGenerics>
149
+ getGlobalFacetedUniqueValues: () => Map<any, number>
150
+ _getGlobalFacetedUniqueValues?: () => Map<any, number>
151
+ getGlobalFacetedMinMaxValues: () => undefined | [number, number]
152
+ _getGlobalFacetedMinMaxValues?: () => undefined | [number, number]
131
153
  }
132
154
 
133
155
  //
134
156
 
135
- export function getDefaultColumn<
136
- TGenerics extends PartialGenerics
137
- >(): FiltersColumnDef<TGenerics> {
138
- return {
139
- filterType: 'auto',
140
- }
141
- }
157
+ export const Filters: TableFeature = {
158
+ getDefaultColumnDef: <
159
+ TGenerics extends TableGenerics
160
+ >(): FiltersColumnDef<TGenerics> => {
161
+ return {
162
+ filterFn: 'auto',
163
+ }
164
+ },
142
165
 
143
- export const Filters = {
144
- getInitialState: (): FiltersTableState => {
166
+ getInitialState: (state): FiltersTableState => {
145
167
  return {
146
168
  columnFilters: [],
147
169
  globalFilter: undefined,
170
+ // filtersProgress: 1,
171
+ // facetProgress: {},
172
+ ...state,
148
173
  }
149
174
  },
150
175
 
151
- getDefaultOptions: <TGenerics extends PartialGenerics>(
176
+ getDefaultOptions: <TGenerics extends TableGenerics>(
152
177
  instance: TableInstance<TGenerics>
153
178
  ): FiltersOptions<TGenerics> => {
154
179
  return {
155
180
  onColumnFiltersChange: makeStateUpdater('columnFilters', instance),
156
181
  onGlobalFilterChange: makeStateUpdater('globalFilter', instance),
157
- autoResetColumnFilters: true,
158
- filterFromChildrenUp: true,
159
- autoResetGlobalFilter: true,
160
- globalFilterType: 'auto',
161
- getColumnCanGlobalFilterFn: column => {
182
+ filterFromLeafRows: false,
183
+ globalFilterFn: 'auto',
184
+ getColumnCanGlobalFilter: column => {
162
185
  const value = instance
163
186
  .getCoreRowModel()
164
- .flatRows[0]?.getAllCellsByColumnId()[column.id]?.value
187
+ .flatRows[0]?._getAllCellsByColumnId()
188
+ [column.id]?.getValue()
165
189
 
166
190
  return typeof value === 'string'
167
191
  },
168
192
  }
169
193
  },
170
194
 
171
- createColumn: <TGenerics extends PartialGenerics>(
195
+ createColumn: <TGenerics extends TableGenerics>(
172
196
  column: Column<TGenerics>,
173
197
  instance: TableInstance<TGenerics>
174
198
  ): 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
199
  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 => {
200
+ filterFn: column.filterFn,
201
+ getAutoFilterFn: () => {
258
202
  const firstRow = instance.getCoreRowModel().flatRows[0]
259
203
 
260
- const value = firstRow?.values[columnId]
204
+ const value = firstRow?.getValue(column.id)
261
205
 
262
206
  if (typeof value === 'string') {
263
- return filterTypes.includesString
207
+ return filterFns.includesString
264
208
  }
265
209
 
266
210
  if (typeof value === 'number') {
267
- return filterTypes.betweenNumberRange
211
+ return filterFns.inNumberRange
212
+ }
213
+
214
+ if (typeof value === 'boolean') {
215
+ return filterFns.equals
268
216
  }
269
217
 
270
218
  if (value !== null && typeof value === 'object') {
271
- return filterTypes.equals
219
+ return filterFns.equals
272
220
  }
273
221
 
274
222
  if (Array.isArray(value)) {
275
- return filterTypes.arrIncludes
223
+ return filterFns.arrIncludes
276
224
  }
277
225
 
278
- return filterTypes.weakEquals
279
- },
280
- getGlobalAutoFilterFn: () => {
281
- return filterTypes.includesString
226
+ return filterFns.weakEquals
282
227
  },
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
228
+ getFilterFn: () => {
229
+ const userFilterFns = instance.options.filterFns
230
+
231
+ return isFunction(column.filterFn)
232
+ ? column.filterFn
233
+ : column.filterFn === 'auto'
234
+ ? column.getAutoFilterFn()
235
+ : (userFilterFns as Record<string, any>)?.[
236
+ column.filterFn as string
297
237
  ] ??
298
- (filterTypes[
299
- column.filterType as BuiltInFilterType
238
+ (filterFns[
239
+ column.filterFn as BuiltInFilterFn
300
240
  ] as FilterFn<TGenerics>)
301
241
  },
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
-
242
+ getCanFilter: () => {
362
243
  return (
363
- column.enableAllFilters ??
364
- column.enableColumnFilter ??
365
- instance.options.enableFilters ??
366
- instance.options.enableColumnFilters ??
367
- column.defaultCanFilter ??
368
- column.defaultCanColumnFilter ??
244
+ (column.columnDef.enableColumnFilter ?? true) &&
245
+ (instance.options.enableColumnFilters ?? true) &&
246
+ (instance.options.enableFilters ?? true) &&
369
247
  !!column.accessorFn
370
248
  )
371
249
  },
372
250
 
373
- getColumnCanGlobalFilter: columnId => {
374
- const column = instance.getColumn(columnId)
375
-
376
- if (!column) {
377
- throw new Error()
378
- }
379
-
251
+ getCanGlobalFilter: () => {
380
252
  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
253
+ (column.columnDef.enableGlobalFilter ?? true) &&
254
+ (instance.options.enableGlobalFilter ?? true) &&
255
+ (instance.options.enableFilters ?? true) &&
256
+ (instance.options.getColumnCanGlobalFilter?.(column) ?? true) &&
257
+ !!column.accessorFn
390
258
  )
391
259
  },
392
260
 
393
- getColumnIsFiltered: columnId =>
394
- instance.getColumnFilterIndex(columnId) > -1,
261
+ getIsFiltered: () => column.getFilterIndex() > -1,
395
262
 
396
- getColumnFilterValue: columnId =>
397
- instance.getState().columnFilters?.find(d => d.id === columnId)?.value,
263
+ getFilterValue: () =>
264
+ instance.getState().columnFilters?.find(d => d.id === column.id)?.value,
398
265
 
399
- getColumnFilterIndex: columnId =>
400
- instance.getState().columnFilters?.findIndex(d => d.id === columnId) ??
266
+ getFilterIndex: () =>
267
+ instance.getState().columnFilters?.findIndex(d => d.id === column.id) ??
401
268
  -1,
402
269
 
403
- setColumnFilterValue: (columnId, value) => {
404
- if (!columnId) return
405
-
270
+ setFilterValue: value => {
406
271
  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)
272
+ const filterFn = column.getFilterFn()
273
+ const previousfilter = old?.find(d => d.id === column.id)
420
274
 
421
275
  const newFilter = functionalUpdate(
422
276
  value,
@@ -431,15 +285,15 @@ export const Filters = {
431
285
  column
432
286
  )
433
287
  ) {
434
- return old?.filter(d => d.id !== columnId) ?? []
288
+ return old?.filter(d => d.id !== column.id) ?? []
435
289
  }
436
290
 
437
- const newFilterObj = { id: columnId, value: newFilter }
291
+ const newFilterObj = { id: column.id, value: newFilter }
438
292
 
439
293
  if (previousfilter) {
440
294
  return (
441
295
  old?.map(d => {
442
- if (d.id === columnId) {
296
+ if (d.id === column.id) {
443
297
  return newFilterObj
444
298
  }
445
299
  return d
@@ -454,105 +308,169 @@ export const Filters = {
454
308
  return [newFilterObj]
455
309
  })
456
310
  },
311
+ _getFacetedRowModel:
312
+ instance.options.getFacetedRowModel &&
313
+ instance.options.getFacetedRowModel(instance, column.id),
314
+ getFacetedRowModel: () => {
315
+ if (!column._getFacetedRowModel) {
316
+ return instance.getPreFilteredRowModel()
317
+ }
457
318
 
458
- resetColumnFilters: () => {
459
- instance.setColumnFilters(instance.initialState?.columnFilters ?? [])
319
+ return column._getFacetedRowModel()
460
320
  },
321
+ _getFacetedUniqueValues:
322
+ instance.options.getFacetedUniqueValues &&
323
+ instance.options.getFacetedUniqueValues(instance, column.id),
324
+ getFacetedUniqueValues: () => {
325
+ if (!column._getFacetedUniqueValues) {
326
+ return new Map()
327
+ }
461
328
 
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
- }
329
+ return column._getFacetedUniqueValues()
330
+ },
331
+ _getFacetedMinMaxValues:
332
+ instance.options.getFacetedMinMaxValues &&
333
+ instance.options.getFacetedMinMaxValues(instance, column.id),
334
+ getFacetedMinMaxValues: () => {
335
+ if (!column._getFacetedMinMaxValues) {
336
+ return undefined
337
+ }
475
338
 
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
- )
339
+ return column._getFacetedMinMaxValues()
340
+ },
341
+ // () => [column.getFacetedRowModel()],
342
+ // facetedRowModel => getRowModelMinMaxValues(facetedRowModel, column.id),
343
+ }
344
+ },
489
345
 
490
- // This essentially enables faceted filter options to be built easily
491
- // using every column's preFilteredRows value
346
+ createRow: <TGenerics extends TableGenerics>(
347
+ row: Row<TGenerics>,
348
+ instance: TableInstance<TGenerics>
349
+ ): FiltersRow<TGenerics> => {
350
+ return {
351
+ columnFilters: {},
352
+ columnFiltersMeta: {},
353
+ }
354
+ },
492
355
 
493
- nonFilteredColumns.forEach(column => {
494
- column.getPreFilteredRows = () => columnFilteredRowModel.rows
356
+ createInstance: <TGenerics extends TableGenerics>(
357
+ instance: TableInstance<TGenerics>
358
+ ): FiltersInstance<TGenerics> => {
359
+ return {
360
+ getGlobalAutoFilterFn: () => {
361
+ return filterFns.includesString
362
+ },
363
+
364
+ getGlobalFilterFn: () => {
365
+ const { filterFns: userFilterFns, globalFilterFn: globalFilterFn } =
366
+ instance.options
367
+
368
+ return isFunction(globalFilterFn)
369
+ ? globalFilterFn
370
+ : globalFilterFn === 'auto'
371
+ ? instance.getGlobalAutoFilterFn()
372
+ : (userFilterFns as Record<string, any>)?.[
373
+ globalFilterFn as string
374
+ ] ??
375
+ (filterFns[
376
+ globalFilterFn as BuiltInFilterFn
377
+ ] as FilterFn<TGenerics>)
378
+ },
379
+
380
+ setColumnFilters: (updater: Updater<ColumnFiltersState>) => {
381
+ const leafColumns = instance.getAllLeafColumns()
382
+
383
+ const updateFn = (old: ColumnFiltersState) => {
384
+ return functionalUpdate(updater, old)?.filter(filter => {
385
+ const column = leafColumns.find(d => d.id === filter.id)
386
+
387
+ if (column) {
388
+ const filterFn = column.getFilterFn()
389
+
390
+ if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
391
+ return false
392
+ }
393
+ }
394
+
395
+ return true
495
396
  })
397
+ }
398
+
399
+ instance.options.onColumnFiltersChange?.(updateFn)
400
+ },
401
+
402
+ setGlobalFilter: updater => {
403
+ instance.options.onGlobalFilterChange?.(updater)
404
+ },
405
+
406
+ resetGlobalFilter: defaultState => {
407
+ instance.setGlobalFilter(
408
+ defaultState ? undefined : instance.initialState.globalFilter
409
+ )
410
+ },
411
+
412
+ resetColumnFilters: defaultState => {
413
+ instance.setColumnFilters(
414
+ defaultState ? [] : instance.initialState?.columnFilters ?? []
415
+ )
416
+ },
496
417
 
497
- return columnFilteredRowModel
498
- },
499
- {
500
- key: 'getColumnFilteredRowModel',
501
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
418
+ getPreFilteredRowModel: () => instance.getCoreRowModel(),
419
+ _getFilteredRowModel:
420
+ instance.options.getFilteredRowModel &&
421
+ instance.options.getFilteredRowModel(instance),
422
+ getFilteredRowModel: () => {
423
+ if (
424
+ instance.options.manualFiltering ||
425
+ !instance._getFilteredRowModel
426
+ ) {
427
+ return instance.getPreFilteredRowModel()
502
428
  }
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
429
 
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
- )
430
+ return instance._getFilteredRowModel()
431
+ },
533
432
 
534
- // This essentially enables faceted filter options to be built easily
535
- // using every column's preFilteredRows value
433
+ _getGlobalFacetedRowModel:
434
+ instance.options.getFacetedRowModel &&
435
+ instance.options.getFacetedRowModel(instance, '__global__'),
536
436
 
537
- nonFilteredColumns.forEach(column => {
538
- column.getPreFilteredRows = () => globalFilteredRowModel.rows
539
- })
437
+ getGlobalFacetedRowModel: () => {
438
+ if (
439
+ instance.options.manualFiltering ||
440
+ !instance._getGlobalFacetedRowModel
441
+ ) {
442
+ return instance.getPreFilteredRowModel()
443
+ }
444
+
445
+ return instance._getGlobalFacetedRowModel()
446
+ },
540
447
 
541
- return globalFilteredRowModel
542
- },
543
- {
544
- key: 'getGlobalFilteredRowModel',
545
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
546
- onChange: () => {
547
- instance._notifySortingReset()
548
- },
448
+ _getGlobalFacetedUniqueValues:
449
+ instance.options.getFacetedUniqueValues &&
450
+ instance.options.getFacetedUniqueValues(instance, '__global__'),
451
+ getGlobalFacetedUniqueValues: () => {
452
+ if (!instance._getGlobalFacetedUniqueValues) {
453
+ return new Map()
549
454
  }
550
- ),
455
+
456
+ return instance._getGlobalFacetedUniqueValues()
457
+ },
458
+
459
+ _getGlobalFacetedMinMaxValues:
460
+ instance.options.getFacetedMinMaxValues &&
461
+ instance.options.getFacetedMinMaxValues(instance, '__global__'),
462
+ getGlobalFacetedMinMaxValues: () => {
463
+ if (!instance._getGlobalFacetedMinMaxValues) {
464
+ return
465
+ }
466
+
467
+ return instance._getGlobalFacetedMinMaxValues()
468
+ },
551
469
  }
552
470
  },
553
471
  }
554
472
 
555
- export function shouldAutoRemoveFilter<TGenerics extends PartialGenerics>(
473
+ export function shouldAutoRemoveFilter<TGenerics extends TableGenerics>(
556
474
  filterFn?: FilterFn<TGenerics>,
557
475
  value?: any,
558
476
  column?: Column<TGenerics>