@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,331 +1,257 @@
1
- import React, { MouseEvent, TouchEvent } from 'react'
2
1
  import { RowModel } from '..'
3
- import { BuiltInAggregationType, aggregationTypes } from '../aggregationTypes'
2
+ import { BuiltInAggregationFn, aggregationFns } from '../aggregationFns'
3
+ import { TableFeature } from '../core/instance'
4
4
  import {
5
5
  Cell,
6
6
  Column,
7
- Getter,
8
7
  OnChangeFn,
9
- PropGetterValue,
10
8
  TableInstance,
11
9
  Row,
12
10
  Updater,
13
- PartialGenerics,
11
+ Renderable,
12
+ TableGenerics,
14
13
  } from '../types'
15
- import {
16
- functionalUpdate,
17
- isFunction,
18
- makeStateUpdater,
19
- memo,
20
- Overwrite,
21
- propGetter,
22
- } from '../utils'
14
+ import { isFunction, makeStateUpdater, Overwrite } from '../utils'
23
15
 
24
16
  export type GroupingState = string[]
25
17
 
26
- export type AggregationFn<TGenerics extends PartialGenerics> = (
27
- leafValues: TGenerics['Row'][],
28
- childValues: TGenerics['Row'][]
18
+ export type GroupingTableState = {
19
+ grouping: GroupingState
20
+ }
21
+
22
+ export type AggregationFn<TGenerics extends TableGenerics> = (
23
+ columnId: string,
24
+ leafRows: Row<TGenerics>[],
25
+ childRows: Row<TGenerics>[]
29
26
  ) => any
30
27
 
31
- export type CustomAggregationTypes<TGenerics extends PartialGenerics> = Record<
28
+ export type CustomAggregationFns<TGenerics extends TableGenerics> = Record<
32
29
  string,
33
30
  AggregationFn<TGenerics>
34
31
  >
35
32
 
36
- export type AggregationType<TGenerics extends PartialGenerics> =
33
+ export type AggregationFnOption<TGenerics extends TableGenerics> =
37
34
  | 'auto'
38
- | BuiltInAggregationType
35
+ | BuiltInAggregationFn
39
36
  | keyof TGenerics['AggregationFns']
40
37
  | AggregationFn<TGenerics>
41
38
 
42
- export type GroupingTableState = {
43
- grouping: GroupingState
44
- }
45
-
46
- export type GroupingColumnDef<TGenerics extends PartialGenerics> = {
47
- aggregationType?: AggregationType<Overwrite<TGenerics, { Value: any }>>
48
- aggregateValue?: (columnValue: unknown) => any
49
- renderAggregatedCell?: () => React.ReactNode
39
+ export type GroupingColumnDef<TGenerics extends TableGenerics> = {
40
+ aggregationFn?: AggregationFnOption<Overwrite<TGenerics, { Value: any }>>
41
+ aggregatedCell?: Renderable<
42
+ TGenerics,
43
+ {
44
+ instance: TableInstance<TGenerics>
45
+ row: Row<TGenerics>
46
+ column: Column<TGenerics>
47
+ cell: Cell<TGenerics>
48
+ getValue: () => TGenerics['Value']
49
+ }
50
+ >
50
51
  enableGrouping?: boolean
51
- defaultCanGroup?: boolean
52
52
  }
53
53
 
54
- export type GroupingColumn<TGenerics extends PartialGenerics> = {
55
- aggregationType?: AggregationType<Overwrite<TGenerics, { Value: any }>>
54
+ export type GroupingColumn<TGenerics extends TableGenerics> = {
55
+ aggregationFn?: AggregationFnOption<Overwrite<TGenerics, { Value: any }>>
56
56
  getCanGroup: () => boolean
57
57
  getIsGrouped: () => boolean
58
58
  getGroupedIndex: () => number
59
59
  toggleGrouping: () => void
60
- getToggleGroupingProps: <TGetter extends Getter<ToggleGroupingProps>>(
61
- userProps?: TGetter
62
- ) => undefined | PropGetterValue<ToggleGroupingProps, TGetter>
60
+ getToggleGroupingHandler: () => () => void
61
+ getAutoAggregationFn: () => AggregationFn<TGenerics> | undefined
62
+ getAggregationFn: () => AggregationFn<TGenerics> | undefined
63
63
  }
64
64
 
65
65
  export type GroupingRow = {
66
66
  groupingColumnId?: string
67
67
  groupingValue?: any
68
68
  getIsGrouped: () => boolean
69
+ _groupingValuesCache: Record<string, any>
69
70
  }
70
71
 
71
- export type GroupingCell = {
72
+ export type GroupingCell<TGenerics extends TableGenerics> = {
72
73
  getIsGrouped: () => boolean
73
74
  getIsPlaceholder: () => boolean
74
75
  getIsAggregated: () => boolean
76
+ renderAggregatedCell: () => string | null | TGenerics['Rendered']
75
77
  }
76
78
 
77
79
  export type ColumnDefaultOptions = {
78
80
  // Column
79
81
  onGroupingChange: OnChangeFn<GroupingState>
80
- autoResetGrouping: boolean
81
82
  enableGrouping: boolean
82
83
  }
83
84
 
84
- export type GroupingOptions<TGenerics extends PartialGenerics> = {
85
- aggregationTypes?: TGenerics['AggregationFns']
85
+ export type GroupingOptions<TGenerics extends TableGenerics> = {
86
+ manualGrouping?: boolean
87
+ aggregationFns?: TGenerics['AggregationFns']
86
88
  onGroupingChange?: OnChangeFn<GroupingState>
87
- autoResetGrouping?: boolean
88
89
  enableGrouping?: boolean
89
- enableGroupingRemoval?: boolean
90
- groupRowsFn?: (
91
- instance: TableInstance<TGenerics>,
92
- rowModel: RowModel<TGenerics>
93
- ) => RowModel<TGenerics>
94
-
90
+ getGroupedRowModel?: (
91
+ instance: TableInstance<TGenerics>
92
+ ) => () => RowModel<TGenerics>
95
93
  groupedColumnMode?: false | 'reorder' | 'remove'
96
94
  }
97
95
 
98
96
  export type GroupingColumnMode = false | 'reorder' | 'remove'
99
97
 
100
- export type ToggleGroupingProps = {
101
- title?: string
102
- onClick?: (event: MouseEvent | TouchEvent) => void
103
- }
104
-
105
- export type GroupingInstance<TGenerics extends PartialGenerics> = {
106
- _notifyGroupingReset: () => void
107
- getColumnAutoAggregationFn: (
108
- columnId: string
109
- ) => AggregationFn<TGenerics> | undefined
110
- getColumnAggregationFn: (
111
- columnId: string
112
- ) => AggregationFn<TGenerics> | undefined
98
+ export type GroupingInstance<TGenerics extends TableGenerics> = {
113
99
  setGrouping: (updater: Updater<GroupingState>) => void
114
- resetGrouping: () => void
115
- toggleColumnGrouping: (columnId: string) => void
116
- getColumnCanGroup: (columnId: string) => boolean
117
- getColumnIsGrouped: (columnId: string) => boolean
118
- getColumnGroupedIndex: (columnId: string) => number
119
- getToggleGroupingProps: <TGetter extends Getter<ToggleGroupingProps>>(
120
- columnId: string,
121
- userProps?: TGetter
122
- ) => undefined | PropGetterValue<ToggleGroupingProps, TGetter>
123
- getRowIsGrouped: (rowId: string) => boolean
100
+ resetGrouping: (defaultState?: boolean) => void
124
101
  getPreGroupedRowModel: () => RowModel<TGenerics>
125
102
  getGroupedRowModel: () => RowModel<TGenerics>
103
+ _getGroupedRowModel?: () => RowModel<TGenerics>
126
104
  }
127
105
 
128
106
  //
129
107
 
130
- export const Grouping = {
131
- getDefaultColumn: <
132
- TGenerics extends PartialGenerics
108
+ export const Grouping: TableFeature = {
109
+ getDefaultColumnDef: <
110
+ TGenerics extends TableGenerics
133
111
  >(): GroupingColumnDef<TGenerics> => {
134
112
  return {
135
- aggregationType: 'auto',
113
+ aggregationFn: 'auto',
136
114
  }
137
115
  },
138
116
 
139
- getInitialState: (): GroupingTableState => {
117
+ getInitialState: (state): GroupingTableState => {
140
118
  return {
141
119
  grouping: [],
120
+ ...state,
142
121
  }
143
122
  },
144
123
 
145
- getDefaultOptions: <TGenerics extends PartialGenerics>(
124
+ getDefaultOptions: <TGenerics extends TableGenerics>(
146
125
  instance: TableInstance<TGenerics>
147
126
  ): GroupingOptions<TGenerics> => {
148
127
  return {
149
128
  onGroupingChange: makeStateUpdater('grouping', instance),
150
- autoResetGrouping: true,
151
129
  groupedColumnMode: 'reorder',
152
130
  }
153
131
  },
154
132
 
155
- createColumn: <TGenerics extends PartialGenerics>(
133
+ createColumn: <TGenerics extends TableGenerics>(
156
134
  column: Column<TGenerics>,
157
135
  instance: TableInstance<TGenerics>
158
136
  ): GroupingColumn<TGenerics> => {
159
137
  return {
160
- aggregationType: column.aggregationType,
161
- getCanGroup: () => instance.getColumnCanGroup(column.id),
162
- getGroupedIndex: () => instance.getColumnGroupedIndex(column.id),
163
- getIsGrouped: () => instance.getColumnIsGrouped(column.id),
164
- toggleGrouping: () => instance.toggleColumnGrouping(column.id),
165
- getToggleGroupingProps: userProps =>
166
- instance.getToggleGroupingProps(column.id, userProps),
167
- }
168
- },
138
+ toggleGrouping: () => {
139
+ instance.setGrouping(old => {
140
+ // Find any existing grouping for this column
141
+ if (old?.includes(column.id)) {
142
+ return old.filter(d => d !== column.id)
143
+ }
169
144
 
170
- getInstance: <TGenerics extends PartialGenerics>(
171
- instance: TableInstance<TGenerics>
172
- ): GroupingInstance<TGenerics> => {
173
- let registered = false
145
+ return [...(old ?? []), column.id]
146
+ })
147
+ },
174
148
 
175
- return {
176
- _notifyGroupingReset: () => {
177
- if (!registered) {
178
- registered = true
179
- return
180
- }
149
+ getCanGroup: () => {
150
+ return (
151
+ column.columnDef.enableGrouping ??
152
+ true ??
153
+ instance.options.enableGrouping ??
154
+ true ??
155
+ !!column.accessorFn
156
+ )
157
+ },
181
158
 
182
- if (instance.options.autoResetAll === false) {
183
- return
184
- }
159
+ getIsGrouped: () => {
160
+ return instance.getState().grouping?.includes(column.id)
161
+ },
185
162
 
186
- if (
187
- instance.options.autoResetAll === true ||
188
- instance.options.autoResetGrouping
189
- ) {
190
- instance.resetGrouping()
163
+ getGroupedIndex: () => instance.getState().grouping?.indexOf(column.id),
164
+
165
+ getToggleGroupingHandler: () => {
166
+ const canGroup = column.getCanGroup()
167
+
168
+ return () => {
169
+ if (!canGroup) return
170
+ column.toggleGrouping()
191
171
  }
192
172
  },
193
- getColumnAutoAggregationFn: columnId => {
173
+ getAutoAggregationFn: () => {
194
174
  const firstRow = instance.getCoreRowModel().flatRows[0]
195
175
 
196
- const value = firstRow?.values[columnId]
176
+ const value = firstRow?.getValue(column.id)
197
177
 
198
178
  if (typeof value === 'number') {
199
- return aggregationTypes.sum
179
+ return aggregationFns.sum
200
180
  }
201
181
 
202
182
  if (Object.prototype.toString.call(value) === '[object Date]') {
203
- return aggregationTypes.extent
183
+ return aggregationFns.extent
204
184
  }
205
185
 
206
- return aggregationTypes.count
186
+ return aggregationFns.count
207
187
  },
208
- getColumnAggregationFn: columnId => {
209
- const column = instance.getColumn(columnId)
210
- const userAggregationTypes = instance.options.aggregationTypes
188
+ getAggregationFn: () => {
189
+ const userAggregationFns = instance.options.aggregationFns
211
190
 
212
191
  if (!column) {
213
192
  throw new Error()
214
193
  }
215
194
 
216
- return isFunction(column.aggregationType)
217
- ? column.aggregationType
218
- : column.aggregationType === 'auto'
219
- ? instance.getColumnAutoFilterFn(columnId)
220
- : (userAggregationTypes as Record<string, any>)?.[
221
- column.aggregationType as string
195
+ return isFunction(column.aggregationFn)
196
+ ? column.aggregationFn
197
+ : column.aggregationFn === 'auto'
198
+ ? column.getAutoAggregationFn()
199
+ : (userAggregationFns as Record<string, any>)?.[
200
+ column.aggregationFn as string
222
201
  ] ??
223
- (aggregationTypes[
224
- column.aggregationType as BuiltInAggregationType
202
+ (aggregationFns[
203
+ column.aggregationFn as BuiltInAggregationFn
225
204
  ] as AggregationFn<TGenerics>)
226
205
  },
206
+ }
207
+ },
227
208
 
228
- setGrouping: updater =>
229
- instance.options.onGroupingChange?.(
230
- updater,
231
- functionalUpdate(updater, instance.getState().grouping)
232
- ),
233
-
234
- toggleColumnGrouping: columnId => {
235
- instance.setGrouping(old => {
236
- // Find any existing grouping for this column
237
- if (old?.includes(columnId)) {
238
- return old.filter(d => d !== columnId)
239
- }
240
-
241
- return [...(old ?? []), columnId]
242
- })
243
- },
244
-
245
- getColumnCanGroup: columnId => {
246
- const column = instance.getColumn(columnId)
247
-
248
- if (!column) {
249
- throw new Error()
250
- }
209
+ createInstance: <TGenerics extends TableGenerics>(
210
+ instance: TableInstance<TGenerics>
211
+ ): GroupingInstance<TGenerics> => {
212
+ return {
213
+ setGrouping: updater => instance.options.onGroupingChange?.(updater),
251
214
 
252
- return (
253
- column.enableGrouping ??
254
- instance.options.enableGrouping ??
255
- column.defaultCanGroup ??
256
- !!column.accessorFn
215
+ resetGrouping: defaultState => {
216
+ instance.setGrouping(
217
+ defaultState ? [] : instance.initialState?.grouping ?? []
257
218
  )
258
219
  },
259
220
 
260
- getColumnIsGrouped: columnId => {
261
- return instance.getState().grouping?.includes(columnId)
262
- },
263
-
264
- getColumnGroupedIndex: columnId =>
265
- instance.getState().grouping?.indexOf(columnId),
266
-
267
- resetGrouping: () => {
268
- instance.setGrouping(instance.initialState?.grouping ?? [])
269
- },
270
-
271
- getToggleGroupingProps: (columnId, userProps) => {
272
- const column = instance.getColumn(columnId)
273
-
274
- const canGroup = column.getCanGroup()
221
+ getPreGroupedRowModel: () => instance.getSortedRowModel(),
222
+ getGroupedRowModel: () => {
223
+ if (
224
+ !instance._getGroupedRowModel &&
225
+ instance.options.getGroupedRowModel
226
+ ) {
227
+ instance._getGroupedRowModel =
228
+ instance.options.getGroupedRowModel(instance)
229
+ }
275
230
 
276
- const initialProps: ToggleGroupingProps = {
277
- title: canGroup ? 'Toggle Grouping' : undefined,
278
- onClick: canGroup
279
- ? (e: MouseEvent | TouchEvent) => {
280
- e.persist()
281
- column.toggleGrouping?.()
282
- }
283
- : undefined,
231
+ if (instance.options.manualGrouping || !instance._getGroupedRowModel) {
232
+ return instance.getPreGroupedRowModel()
284
233
  }
285
234
 
286
- return propGetter(initialProps, userProps)
235
+ return instance._getGroupedRowModel()
287
236
  },
288
-
289
- getRowIsGrouped: rowId => !!instance.getRow(rowId)?.groupingColumnId,
290
-
291
- getPreGroupedRowModel: () => instance.getSortedRowModel(),
292
- getGroupedRowModel: memo(
293
- () => [
294
- instance.getState().grouping,
295
- instance.getSortedRowModel(),
296
- instance.options.groupRowsFn,
297
- ],
298
- (grouping, rowModel, groupRowsFn) => {
299
- if (!groupRowsFn || !grouping.length) {
300
- return rowModel
301
- }
302
-
303
- return groupRowsFn(instance, rowModel)
304
- },
305
- {
306
- key: 'getGroupedRowModel',
307
- debug: () => instance.options.debugAll ?? instance.options.debugTable,
308
- onChange: () => instance._notifyExpandedReset(),
309
- }
310
- ),
311
237
  }
312
238
  },
313
239
 
314
- createRow: <TGenerics extends PartialGenerics>(
315
- row: Row<TGenerics>,
316
- instance: TableInstance<TGenerics>
240
+ createRow: <TGenerics extends TableGenerics>(
241
+ row: Row<TGenerics>
317
242
  ): GroupingRow => {
318
243
  return {
319
- getIsGrouped: () => instance.getRowIsGrouped(row.id),
244
+ getIsGrouped: () => !!row.groupingColumnId,
245
+ _groupingValuesCache: {},
320
246
  }
321
247
  },
322
248
 
323
- createCell: <TGenerics extends PartialGenerics>(
324
- cell: Cell<TGenerics> & GroupingCell,
249
+ createCell: <TGenerics extends TableGenerics>(
250
+ cell: Cell<TGenerics>,
325
251
  column: Column<TGenerics>,
326
252
  row: Row<TGenerics>,
327
- _instance: TableInstance<TGenerics>
328
- ): GroupingCell => {
253
+ instance: TableInstance<TGenerics>
254
+ ): GroupingCell<TGenerics> => {
329
255
  return {
330
256
  getIsGrouped: () =>
331
257
  column.getIsGrouped() && column.id === row.groupingColumnId,
@@ -334,30 +260,44 @@ export const Grouping = {
334
260
  !cell.getIsGrouped() &&
335
261
  !cell.getIsPlaceholder() &&
336
262
  row.subRows?.length > 1,
263
+ renderAggregatedCell: () => {
264
+ const template =
265
+ column.columnDef.aggregatedCell ?? column.columnDef.cell
266
+
267
+ return template
268
+ ? instance._render(template, {
269
+ instance,
270
+ column,
271
+ row,
272
+ cell,
273
+ getValue: cell.getValue,
274
+ })
275
+ : null
276
+ },
337
277
  }
338
278
  },
279
+ }
339
280
 
340
- orderColumns: <TGenerics extends PartialGenerics>(
341
- leafColumns: Column<TGenerics>[],
342
- grouping: string[],
343
- groupedColumnMode?: GroupingColumnMode
344
- ) => {
345
- if (!grouping?.length || !groupedColumnMode) {
346
- return leafColumns
347
- }
281
+ export function orderColumns<TGenerics extends TableGenerics>(
282
+ leafColumns: Column<TGenerics>[],
283
+ grouping: string[],
284
+ groupedColumnMode?: GroupingColumnMode
285
+ ) {
286
+ if (!grouping?.length || !groupedColumnMode) {
287
+ return leafColumns
288
+ }
348
289
 
349
- const nonGroupingColumns = leafColumns.filter(
350
- col => !grouping.includes(col.id)
351
- )
290
+ const nonGroupingColumns = leafColumns.filter(
291
+ col => !grouping.includes(col.id)
292
+ )
352
293
 
353
- if (groupedColumnMode === 'remove') {
354
- return nonGroupingColumns
355
- }
294
+ if (groupedColumnMode === 'remove') {
295
+ return nonGroupingColumns
296
+ }
356
297
 
357
- const groupingColumns = grouping
358
- .map(g => leafColumns.find(col => col.id === g)!)
359
- .filter(Boolean)
298
+ const groupingColumns = grouping
299
+ .map(g => leafColumns.find(col => col.id === g)!)
300
+ .filter(Boolean)
360
301
 
361
- return [...groupingColumns, ...nonGroupingColumns]
362
- },
302
+ return [...groupingColumns, ...nonGroupingColumns]
363
303
  }
@@ -1,21 +1,22 @@
1
- import { functionalUpdate, makeStateUpdater, memo } from '../utils'
1
+ import { makeStateUpdater, memo } from '../utils'
2
2
 
3
3
  import {
4
4
  TableInstance,
5
5
  OnChangeFn,
6
6
  Updater,
7
7
  Column,
8
- PartialGenerics,
8
+ TableGenerics,
9
9
  } from '../types'
10
10
 
11
- import { Grouping } from './Grouping'
12
-
13
- export type ColumnOrderState = string[]
11
+ import { Grouping, orderColumns } from './Grouping'
12
+ import { TableFeature } from '../core/instance'
14
13
 
15
14
  export type ColumnOrderTableState = {
16
15
  columnOrder: ColumnOrderState
17
16
  }
18
17
 
18
+ export type ColumnOrderState = string[]
19
+
19
20
  export type ColumnOrderOptions = {
20
21
  onColumnOrderChange?: OnChangeFn<ColumnOrderState>
21
22
  }
@@ -24,22 +25,25 @@ export type ColumnOrderDefaultOptions = {
24
25
  onColumnOrderChange: OnChangeFn<ColumnOrderState>
25
26
  }
26
27
 
27
- export type ColumnOrderInstance<TGenerics extends PartialGenerics> = {
28
+ export type ColumnOrderInstance<TGenerics extends TableGenerics> = {
28
29
  setColumnOrder: (updater: Updater<ColumnOrderState>) => void
29
- resetColumnOrder: () => void
30
- getOrderColumnsFn: () => (columns: Column<TGenerics>[]) => Column<TGenerics>[]
30
+ resetColumnOrder: (defaultState?: boolean) => void
31
+ _getOrderColumnsFn: () => (
32
+ columns: Column<TGenerics>[]
33
+ ) => Column<TGenerics>[]
31
34
  }
32
35
 
33
36
  //
34
37
 
35
- export const Ordering = {
36
- getInitialState: (): ColumnOrderTableState => {
38
+ export const Ordering: TableFeature = {
39
+ getInitialState: (state): ColumnOrderTableState => {
37
40
  return {
38
41
  columnOrder: [],
42
+ ...state,
39
43
  }
40
44
  },
41
45
 
42
- getDefaultOptions: <TGenerics extends PartialGenerics>(
46
+ getDefaultOptions: <TGenerics extends TableGenerics>(
43
47
  instance: TableInstance<TGenerics>
44
48
  ): ColumnOrderDefaultOptions => {
45
49
  return {
@@ -47,19 +51,18 @@ export const Ordering = {
47
51
  }
48
52
  },
49
53
 
50
- getInstance: <TGenerics extends PartialGenerics>(
54
+ createInstance: <TGenerics extends TableGenerics>(
51
55
  instance: TableInstance<TGenerics>
52
56
  ): ColumnOrderInstance<TGenerics> => {
53
57
  return {
54
58
  setColumnOrder: updater =>
55
- instance.options.onColumnOrderChange?.(
56
- updater,
57
- functionalUpdate(updater, instance.getState().columnOrder)
58
- ),
59
- resetColumnOrder: () => {
60
- instance.setColumnOrder(instance.initialState.columnOrder ?? [])
59
+ instance.options.onColumnOrderChange?.(updater),
60
+ resetColumnOrder: defaultState => {
61
+ instance.setColumnOrder(
62
+ defaultState ? [] : instance.initialState.columnOrder ?? []
63
+ )
61
64
  },
62
- getOrderColumnsFn: memo(
65
+ _getOrderColumnsFn: memo(
63
66
  () => [
64
67
  instance.getState().columnOrder,
65
68
  instance.getState().grouping,
@@ -96,14 +99,10 @@ export const Ordering = {
96
99
  orderedColumns = [...orderedColumns, ...columnsCopy]
97
100
  }
98
101
 
99
- return Grouping.orderColumns(
100
- orderedColumns,
101
- grouping,
102
- groupedColumnMode
103
- )
102
+ return orderColumns(orderedColumns, grouping, groupedColumnMode)
104
103
  },
105
104
  {
106
- key: 'getOrderColumnsFn',
105
+ key: process.env.NODE_ENV === 'development' && 'getOrderColumnsFn',
107
106
  // debug: () => instance.options.debugAll ?? instance.options.debugTable,
108
107
  }
109
108
  ),