@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,331 +1,255 @@
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?: (instance: TableInstance<any>) => () => RowModel<any>
95
91
  groupedColumnMode?: false | 'reorder' | 'remove'
96
92
  }
97
93
 
98
94
  export type GroupingColumnMode = false | 'reorder' | 'remove'
99
95
 
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
96
+ export type GroupingInstance<TGenerics extends TableGenerics> = {
113
97
  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
98
+ resetGrouping: (defaultState?: boolean) => void
124
99
  getPreGroupedRowModel: () => RowModel<TGenerics>
125
100
  getGroupedRowModel: () => RowModel<TGenerics>
101
+ _getGroupedRowModel?: () => RowModel<TGenerics>
126
102
  }
127
103
 
128
104
  //
129
105
 
130
- export const Grouping = {
131
- getDefaultColumn: <
132
- TGenerics extends PartialGenerics
106
+ export const Grouping: TableFeature = {
107
+ getDefaultColumnDef: <
108
+ TGenerics extends TableGenerics
133
109
  >(): GroupingColumnDef<TGenerics> => {
134
110
  return {
135
- aggregationType: 'auto',
111
+ aggregationFn: 'auto',
136
112
  }
137
113
  },
138
114
 
139
- getInitialState: (): GroupingTableState => {
115
+ getInitialState: (state): GroupingTableState => {
140
116
  return {
141
117
  grouping: [],
118
+ ...state,
142
119
  }
143
120
  },
144
121
 
145
- getDefaultOptions: <TGenerics extends PartialGenerics>(
122
+ getDefaultOptions: <TGenerics extends TableGenerics>(
146
123
  instance: TableInstance<TGenerics>
147
124
  ): GroupingOptions<TGenerics> => {
148
125
  return {
149
126
  onGroupingChange: makeStateUpdater('grouping', instance),
150
- autoResetGrouping: true,
151
127
  groupedColumnMode: 'reorder',
152
128
  }
153
129
  },
154
130
 
155
- createColumn: <TGenerics extends PartialGenerics>(
131
+ createColumn: <TGenerics extends TableGenerics>(
156
132
  column: Column<TGenerics>,
157
133
  instance: TableInstance<TGenerics>
158
134
  ): GroupingColumn<TGenerics> => {
159
135
  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
- },
136
+ toggleGrouping: () => {
137
+ instance.setGrouping(old => {
138
+ // Find any existing grouping for this column
139
+ if (old?.includes(column.id)) {
140
+ return old.filter(d => d !== column.id)
141
+ }
169
142
 
170
- getInstance: <TGenerics extends PartialGenerics>(
171
- instance: TableInstance<TGenerics>
172
- ): GroupingInstance<TGenerics> => {
173
- let registered = false
143
+ return [...(old ?? []), column.id]
144
+ })
145
+ },
174
146
 
175
- return {
176
- _notifyGroupingReset: () => {
177
- if (!registered) {
178
- registered = true
179
- return
180
- }
147
+ getCanGroup: () => {
148
+ return (
149
+ column.columnDef.enableGrouping ??
150
+ true ??
151
+ instance.options.enableGrouping ??
152
+ true ??
153
+ !!column.accessorFn
154
+ )
155
+ },
181
156
 
182
- if (instance.options.autoResetAll === false) {
183
- return
184
- }
157
+ getIsGrouped: () => {
158
+ return instance.getState().grouping?.includes(column.id)
159
+ },
185
160
 
186
- if (
187
- instance.options.autoResetAll === true ||
188
- instance.options.autoResetGrouping
189
- ) {
190
- instance.resetGrouping()
161
+ getGroupedIndex: () => instance.getState().grouping?.indexOf(column.id),
162
+
163
+ getToggleGroupingHandler: () => {
164
+ const canGroup = column.getCanGroup()
165
+
166
+ return () => {
167
+ if (!canGroup) return
168
+ column.toggleGrouping()
191
169
  }
192
170
  },
193
- getColumnAutoAggregationFn: columnId => {
171
+ getAutoAggregationFn: () => {
194
172
  const firstRow = instance.getCoreRowModel().flatRows[0]
195
173
 
196
- const value = firstRow?.values[columnId]
174
+ const value = firstRow?.getValue(column.id)
197
175
 
198
176
  if (typeof value === 'number') {
199
- return aggregationTypes.sum
177
+ return aggregationFns.sum
200
178
  }
201
179
 
202
180
  if (Object.prototype.toString.call(value) === '[object Date]') {
203
- return aggregationTypes.extent
181
+ return aggregationFns.extent
204
182
  }
205
183
 
206
- return aggregationTypes.count
184
+ return aggregationFns.count
207
185
  },
208
- getColumnAggregationFn: columnId => {
209
- const column = instance.getColumn(columnId)
210
- const userAggregationTypes = instance.options.aggregationTypes
186
+ getAggregationFn: () => {
187
+ const userAggregationFns = instance.options.aggregationFns
211
188
 
212
189
  if (!column) {
213
190
  throw new Error()
214
191
  }
215
192
 
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
193
+ return isFunction(column.aggregationFn)
194
+ ? column.aggregationFn
195
+ : column.aggregationFn === 'auto'
196
+ ? column.getAutoAggregationFn()
197
+ : (userAggregationFns as Record<string, any>)?.[
198
+ column.aggregationFn as string
222
199
  ] ??
223
- (aggregationTypes[
224
- column.aggregationType as BuiltInAggregationType
200
+ (aggregationFns[
201
+ column.aggregationFn as BuiltInAggregationFn
225
202
  ] as AggregationFn<TGenerics>)
226
203
  },
204
+ }
205
+ },
227
206
 
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
- }
207
+ createInstance: <TGenerics extends TableGenerics>(
208
+ instance: TableInstance<TGenerics>
209
+ ): GroupingInstance<TGenerics> => {
210
+ return {
211
+ setGrouping: updater => instance.options.onGroupingChange?.(updater),
251
212
 
252
- return (
253
- column.enableGrouping ??
254
- instance.options.enableGrouping ??
255
- column.defaultCanGroup ??
256
- !!column.accessorFn
213
+ resetGrouping: defaultState => {
214
+ instance.setGrouping(
215
+ defaultState ? [] : instance.initialState?.grouping ?? []
257
216
  )
258
217
  },
259
218
 
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()
219
+ getPreGroupedRowModel: () => instance.getSortedRowModel(),
220
+ getGroupedRowModel: () => {
221
+ if (
222
+ !instance._getGroupedRowModel &&
223
+ instance.options.getGroupedRowModel
224
+ ) {
225
+ instance._getGroupedRowModel =
226
+ instance.options.getGroupedRowModel(instance)
227
+ }
275
228
 
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,
229
+ if (instance.options.manualGrouping || !instance._getGroupedRowModel) {
230
+ return instance.getPreGroupedRowModel()
284
231
  }
285
232
 
286
- return propGetter(initialProps, userProps)
233
+ return instance._getGroupedRowModel()
287
234
  },
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
235
  }
312
236
  },
313
237
 
314
- createRow: <TGenerics extends PartialGenerics>(
315
- row: Row<TGenerics>,
316
- instance: TableInstance<TGenerics>
238
+ createRow: <TGenerics extends TableGenerics>(
239
+ row: Row<TGenerics>
317
240
  ): GroupingRow => {
318
241
  return {
319
- getIsGrouped: () => instance.getRowIsGrouped(row.id),
242
+ getIsGrouped: () => !!row.groupingColumnId,
243
+ _groupingValuesCache: {},
320
244
  }
321
245
  },
322
246
 
323
- createCell: <TGenerics extends PartialGenerics>(
324
- cell: Cell<TGenerics> & GroupingCell,
247
+ createCell: <TGenerics extends TableGenerics>(
248
+ cell: Cell<TGenerics>,
325
249
  column: Column<TGenerics>,
326
250
  row: Row<TGenerics>,
327
- _instance: TableInstance<TGenerics>
328
- ): GroupingCell => {
251
+ instance: TableInstance<TGenerics>
252
+ ): GroupingCell<TGenerics> => {
329
253
  return {
330
254
  getIsGrouped: () =>
331
255
  column.getIsGrouped() && column.id === row.groupingColumnId,
@@ -334,30 +258,44 @@ export const Grouping = {
334
258
  !cell.getIsGrouped() &&
335
259
  !cell.getIsPlaceholder() &&
336
260
  row.subRows?.length > 1,
261
+ renderAggregatedCell: () => {
262
+ const template =
263
+ column.columnDef.aggregatedCell ?? column.columnDef.cell
264
+
265
+ return template
266
+ ? instance._render(template, {
267
+ instance,
268
+ column,
269
+ row,
270
+ cell,
271
+ getValue: cell.getValue,
272
+ })
273
+ : null
274
+ },
337
275
  }
338
276
  },
277
+ }
339
278
 
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
- }
279
+ export function orderColumns<TGenerics extends TableGenerics>(
280
+ leafColumns: Column<TGenerics>[],
281
+ grouping: string[],
282
+ groupedColumnMode?: GroupingColumnMode
283
+ ) {
284
+ if (!grouping?.length || !groupedColumnMode) {
285
+ return leafColumns
286
+ }
348
287
 
349
- const nonGroupingColumns = leafColumns.filter(
350
- col => !grouping.includes(col.id)
351
- )
288
+ const nonGroupingColumns = leafColumns.filter(
289
+ col => !grouping.includes(col.id)
290
+ )
352
291
 
353
- if (groupedColumnMode === 'remove') {
354
- return nonGroupingColumns
355
- }
292
+ if (groupedColumnMode === 'remove') {
293
+ return nonGroupingColumns
294
+ }
356
295
 
357
- const groupingColumns = grouping
358
- .map(g => leafColumns.find(col => col.id === g)!)
359
- .filter(Boolean)
296
+ const groupingColumns = grouping
297
+ .map(g => leafColumns.find(col => col.id === g)!)
298
+ .filter(Boolean)
360
299
 
361
- return [...groupingColumns, ...nonGroupingColumns]
362
- },
300
+ return [...groupingColumns, ...nonGroupingColumns]
363
301
  }
@@ -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
  ),