@tanstack/table-core 8.0.0-alpha.55 → 8.0.0-alpha.59

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 (88) hide show
  1. package/build/cjs/core.js +18 -404
  2. package/build/cjs/core.js.map +1 -1
  3. package/build/cjs/createTable.js +3 -3
  4. package/build/cjs/createTable.js.map +1 -1
  5. package/build/cjs/features/Cells.js +107 -0
  6. package/build/cjs/features/Cells.js.map +1 -0
  7. package/build/cjs/features/ColumnSizing.js +96 -54
  8. package/build/cjs/features/ColumnSizing.js.map +1 -1
  9. package/build/cjs/features/Columns.js +216 -0
  10. package/build/cjs/features/Columns.js.map +1 -0
  11. package/build/cjs/features/Expanding.js +13 -21
  12. package/build/cjs/features/Expanding.js.map +1 -1
  13. package/build/cjs/features/Filters.js +3 -3
  14. package/build/cjs/features/Filters.js.map +1 -1
  15. package/build/cjs/features/Grouping.js +8 -11
  16. package/build/cjs/features/Grouping.js.map +1 -1
  17. package/build/cjs/features/Headers.js +79 -220
  18. package/build/cjs/features/Headers.js.map +1 -1
  19. package/build/cjs/features/Ordering.js +1 -1
  20. package/build/cjs/features/Ordering.js.map +1 -1
  21. package/build/cjs/features/Pagination.js +5 -5
  22. package/build/cjs/features/Pagination.js.map +1 -1
  23. package/build/cjs/features/Pinning.js +172 -2
  24. package/build/cjs/features/Pinning.js.map +1 -1
  25. package/build/cjs/features/RowSelection.js +16 -48
  26. package/build/cjs/features/RowSelection.js.map +1 -1
  27. package/build/cjs/features/Rows.js +84 -0
  28. package/build/cjs/features/Rows.js.map +1 -0
  29. package/build/cjs/features/Sorting.js +9 -12
  30. package/build/cjs/features/Sorting.js.map +1 -1
  31. package/build/cjs/features/Visibility.js +59 -38
  32. package/build/cjs/features/Visibility.js.map +1 -1
  33. package/build/cjs/filterFns.js +16 -0
  34. package/build/cjs/filterFns.js.map +1 -1
  35. package/build/cjs/index.js +0 -1
  36. package/build/cjs/index.js.map +1 -1
  37. package/build/cjs/utils.js +0 -16
  38. package/build/cjs/utils.js.map +1 -1
  39. package/build/esm/index.js +866 -856
  40. package/build/esm/index.js.map +1 -1
  41. package/build/stats-html.html +1 -1
  42. package/build/stats-react.json +424 -322
  43. package/build/types/core.d.ts +9 -88
  44. package/build/types/createTable.d.ts +10 -11
  45. package/build/types/features/Cells.d.ts +13 -0
  46. package/build/types/features/ColumnSizing.d.ts +24 -30
  47. package/build/types/features/Columns.d.ts +54 -0
  48. package/build/types/features/Expanding.d.ts +6 -9
  49. package/build/types/features/Filters.d.ts +3 -1
  50. package/build/types/features/Grouping.d.ts +6 -9
  51. package/build/types/features/Headers.d.ts +3 -15
  52. package/build/types/features/Ordering.d.ts +1 -1
  53. package/build/types/features/Pagination.d.ts +6 -6
  54. package/build/types/features/Pinning.d.ts +18 -4
  55. package/build/types/features/RowSelection.d.ts +6 -13
  56. package/build/types/features/Rows.d.ts +27 -0
  57. package/build/types/features/Sorting.d.ts +5 -8
  58. package/build/types/features/Visibility.d.ts +9 -7
  59. package/build/types/filterFns.d.ts +5 -0
  60. package/build/types/types.d.ts +27 -69
  61. package/build/types/utils.d.ts +1 -5
  62. package/build/umd/index.development.js +844 -835
  63. package/build/umd/index.development.js.map +1 -1
  64. package/build/umd/index.production.js +1 -1
  65. package/build/umd/index.production.js.map +1 -1
  66. package/package.json +1 -1
  67. package/src/core.ts +55 -601
  68. package/src/createTable.ts +13 -17
  69. package/src/features/Cells.ts +130 -0
  70. package/src/features/ColumnSizing.ts +111 -89
  71. package/src/features/Columns.ts +288 -0
  72. package/src/features/Expanding.ts +20 -42
  73. package/src/features/Filters.ts +11 -3
  74. package/src/features/Grouping.ts +13 -39
  75. package/src/features/Headers.ts +49 -233
  76. package/src/features/Ordering.ts +1 -1
  77. package/src/features/Pagination.ts +14 -4
  78. package/src/features/Pinning.ts +194 -3
  79. package/src/features/RowSelection.ts +26 -88
  80. package/src/features/Rows.ts +123 -0
  81. package/src/features/Sorting.ts +20 -43
  82. package/src/features/Visibility.ts +82 -63
  83. package/src/filterFns.ts +20 -0
  84. package/src/types.ts +59 -133
  85. package/src/utils/getColumnFilteredRowModelAsync.ts +1 -5
  86. package/src/utils/getGlobalFilteredRowModelAsync.ts +2 -6
  87. package/src/utils/getSortedRowModelAsync.ts +0 -1
  88. package/src/utils.ts +2 -31
@@ -0,0 +1,288 @@
1
+ import {
2
+ Cell,
3
+ Column,
4
+ Header,
5
+ TableGenerics,
6
+ TableInstance,
7
+ Row,
8
+ AccessorFn,
9
+ ColumnDef,
10
+ Renderable,
11
+ HeaderRenderProps,
12
+ } from '../types'
13
+ import { memo } from '../utils'
14
+
15
+ export type CoreColumnDefType = 'data' | 'display' | 'group'
16
+
17
+ export type CoreColumnDef<TGenerics extends TableGenerics> = {
18
+ id: string
19
+ accessorKey?: string & keyof TGenerics['Row']
20
+ accessorFn?: AccessorFn<TGenerics['Row']>
21
+ columns?: ColumnDef<TGenerics>[]
22
+ header?: Renderable<
23
+ TGenerics,
24
+ {
25
+ instance: TableInstance<TGenerics>
26
+ header: Header<TGenerics>
27
+ column: Column<TGenerics>
28
+ }
29
+ >
30
+ footer?: Renderable<
31
+ TGenerics,
32
+ {
33
+ instance: TableInstance<TGenerics>
34
+ header: Header<TGenerics>
35
+ column: Column<TGenerics>
36
+ }
37
+ >
38
+ cell?: Renderable<
39
+ TGenerics,
40
+ {
41
+ instance: TableInstance<TGenerics>
42
+ row: Row<TGenerics>
43
+ column: Column<TGenerics>
44
+ cell: Cell<TGenerics>
45
+ value: TGenerics['Value']
46
+ }
47
+ >
48
+ meta?: TGenerics['ColumnMeta']
49
+ }
50
+
51
+ export type CoreColumn<TGenerics extends TableGenerics> = {
52
+ id: string
53
+ depth: number
54
+ accessorFn?: AccessorFn<TGenerics['Row']>
55
+ columnDef: ColumnDef<TGenerics>
56
+ columnDefType: CoreColumnDefType
57
+ columns: Column<TGenerics>[]
58
+ parent?: Column<TGenerics>
59
+ getFlatColumns: () => Column<TGenerics>[]
60
+ getLeafColumns: () => Column<TGenerics>[]
61
+ }
62
+
63
+ export type ColumnsOptions<TGenerics extends TableGenerics> = {
64
+ columns: ColumnDef<TGenerics>[]
65
+ defaultColumn?: Partial<ColumnDef<TGenerics>>
66
+ }
67
+
68
+ export type ColumnsInstance<TGenerics extends TableGenerics> = {
69
+ getDefaultColumn: () => Partial<ColumnDef<TGenerics>>
70
+ getColumnDefs: () => ColumnDef<TGenerics>[]
71
+ createColumn: (
72
+ columnDef: ColumnDef<TGenerics>,
73
+ depth: number,
74
+ parent?: Column<TGenerics>
75
+ ) => Column<TGenerics>
76
+ getAllColumns: () => Column<TGenerics>[]
77
+ getAllFlatColumns: () => Column<TGenerics>[]
78
+ getAllFlatColumnsById: () => Record<string, Column<TGenerics>>
79
+ getAllLeafColumns: () => Column<TGenerics>[]
80
+ getColumn: (columnId: string) => Column<TGenerics>
81
+ }
82
+
83
+ //
84
+
85
+ export const Columns = {
86
+ createInstance: <TGenerics extends TableGenerics>(
87
+ instance: TableInstance<TGenerics>
88
+ ): ColumnsInstance<TGenerics> => {
89
+ return {
90
+ getDefaultColumn: memo(
91
+ () => [instance.options.defaultColumn],
92
+ defaultColumn => {
93
+ defaultColumn = (defaultColumn ?? {}) as Partial<ColumnDef<TGenerics>>
94
+
95
+ return {
96
+ header: (props: HeaderRenderProps<Header<TGenerics>>) =>
97
+ props.header.column.id,
98
+ footer: (props: HeaderRenderProps<Header<TGenerics>>) =>
99
+ props.header.column.id,
100
+ cell: ({ value = '' }: { value: any }): JSX.Element =>
101
+ typeof value === 'boolean' ? value.toString() : value,
102
+ ...instance._features.reduce((obj, feature) => {
103
+ return Object.assign(obj, feature.getDefaultColumn?.())
104
+ }, {}),
105
+ ...defaultColumn,
106
+ } as Partial<ColumnDef<TGenerics>>
107
+ },
108
+ {
109
+ debug: () =>
110
+ instance.options.debugAll ?? instance.options.debugColumns,
111
+ key: 'getDefaultColumn',
112
+ }
113
+ ),
114
+
115
+ getColumnDefs: () => instance.options.columns,
116
+
117
+ createColumn: (
118
+ columnDef: ColumnDef<TGenerics> & { columnDefType?: CoreColumnDefType },
119
+ depth: number,
120
+ parent
121
+ ) => {
122
+ const defaultColumn = instance.getDefaultColumn()
123
+
124
+ let id =
125
+ columnDef.id ??
126
+ columnDef.accessorKey ??
127
+ (typeof columnDef.header === 'string' ? columnDef.header : undefined)
128
+
129
+ let accessorFn: AccessorFn<TGenerics['Row']> | undefined
130
+
131
+ if (columnDef.accessorFn) {
132
+ accessorFn = columnDef.accessorFn
133
+ } else if (columnDef.accessorKey) {
134
+ accessorFn = (originalRow?: TGenerics['Row']) =>
135
+ (originalRow as any)[columnDef.accessorKey]
136
+ }
137
+
138
+ if (!id) {
139
+ if (process.env.NODE_ENV !== 'production') {
140
+ throw new Error(
141
+ columnDef.accessorFn
142
+ ? `Columns require an id when using an accessorFn`
143
+ : `Columns require an id when using a non-string header`
144
+ )
145
+ }
146
+ throw new Error()
147
+ }
148
+
149
+ let column: CoreColumn<TGenerics> = {
150
+ ...defaultColumn,
151
+ ...columnDef,
152
+ id: `${id}`,
153
+ accessorFn,
154
+ parent: parent as any,
155
+ depth,
156
+ columnDef,
157
+ columnDefType: columnDef.columnDefType as CoreColumnDefType,
158
+ columns: [],
159
+ getFlatColumns: memo(
160
+ () => [true],
161
+ () => {
162
+ return [
163
+ column as Column<TGenerics>,
164
+ ...column.columns?.flatMap(d => d.getFlatColumns()),
165
+ ]
166
+ },
167
+ {
168
+ key: 'column.getFlatColumns',
169
+ debug: () =>
170
+ instance.options.debugAll ?? instance.options.debugColumns,
171
+ }
172
+ ),
173
+ getLeafColumns: memo(
174
+ () => [instance._getOrderColumnsFn()],
175
+ orderColumns => {
176
+ if (column.columns?.length) {
177
+ let leafColumns = column.columns.flatMap(column =>
178
+ column.getLeafColumns()
179
+ )
180
+
181
+ return orderColumns(leafColumns)
182
+ }
183
+
184
+ return [column as Column<TGenerics>]
185
+ },
186
+ {
187
+ key: 'column.getLeafColumns',
188
+ debug: () =>
189
+ instance.options.debugAll ?? instance.options.debugColumns,
190
+ }
191
+ ),
192
+ }
193
+
194
+ column = instance._features.reduce((obj, feature) => {
195
+ return Object.assign(obj, feature.createColumn?.(column, instance))
196
+ }, column)
197
+
198
+ // Yes, we have to convert instance to uknown, because we know more than the compiler here.
199
+ return column as Column<TGenerics>
200
+ },
201
+
202
+ getAllColumns: memo(
203
+ () => [instance.getColumnDefs()],
204
+ columnDefs => {
205
+ const recurseColumns = (
206
+ columnDefs: ColumnDef<TGenerics>[],
207
+ parent?: Column<TGenerics>,
208
+ depth = 0
209
+ ): Column<TGenerics>[] => {
210
+ return columnDefs.map(columnDef => {
211
+ const column = instance.createColumn(columnDef, depth, parent)
212
+
213
+ column.columns = columnDef.columns
214
+ ? recurseColumns(columnDef.columns, column, depth + 1)
215
+ : []
216
+
217
+ return column
218
+ })
219
+ }
220
+
221
+ return recurseColumns(columnDefs)
222
+ },
223
+ {
224
+ key: 'getAllColumns',
225
+ debug: () =>
226
+ instance.options.debugAll ?? instance.options.debugColumns,
227
+ }
228
+ ),
229
+
230
+ getAllFlatColumns: memo(
231
+ () => [instance.getAllColumns()],
232
+ allColumns => {
233
+ return allColumns.flatMap(column => {
234
+ return column.getFlatColumns()
235
+ })
236
+ },
237
+ {
238
+ key: 'getAllFlatColumns',
239
+ debug: () =>
240
+ instance.options.debugAll ?? instance.options.debugColumns,
241
+ }
242
+ ),
243
+
244
+ getAllFlatColumnsById: memo(
245
+ () => [instance.getAllFlatColumns()],
246
+ flatColumns => {
247
+ return flatColumns.reduce((acc, column) => {
248
+ acc[column.id] = column
249
+ return acc
250
+ }, {} as Record<string, Column<TGenerics>>)
251
+ },
252
+ {
253
+ key: 'getAllFlatColumnsById',
254
+ debug: () =>
255
+ instance.options.debugAll ?? instance.options.debugColumns,
256
+ }
257
+ ),
258
+
259
+ getAllLeafColumns: memo(
260
+ () => [instance.getAllColumns(), instance._getOrderColumnsFn()],
261
+ (allColumns, orderColumns) => {
262
+ let leafColumns = allColumns.flatMap(column =>
263
+ column.getLeafColumns()
264
+ )
265
+ return orderColumns(leafColumns)
266
+ },
267
+ {
268
+ key: 'getAllLeafColumns',
269
+ debug: () =>
270
+ instance.options.debugAll ?? instance.options.debugColumns,
271
+ }
272
+ ),
273
+
274
+ getColumn: columnId => {
275
+ const column = instance.getAllFlatColumnsById()[columnId]
276
+
277
+ if (!column) {
278
+ if (process.env.NODE_ENV !== 'production') {
279
+ console.warn(`[Table] Column with id ${columnId} does not exist.`)
280
+ }
281
+ throw new Error()
282
+ }
283
+
284
+ return column
285
+ },
286
+ }
287
+ },
288
+ }
@@ -1,14 +1,12 @@
1
1
  import { RowModel } from '..'
2
2
  import {
3
- Getter,
4
3
  OnChangeFn,
5
4
  TableGenerics,
6
- PropGetterValue,
7
5
  TableInstance,
8
6
  Row,
9
7
  Updater,
10
8
  } from '../types'
11
- import { functionalUpdate, makeStateUpdater, memo, propGetter } from '../utils'
9
+ import { makeStateUpdater } from '../utils'
12
10
 
13
11
  export type ExpandedStateList = Record<string, boolean>
14
12
  export type ExpandedState = true | Record<string, boolean>
@@ -20,12 +18,11 @@ export type ExpandedRow = {
20
18
  toggleExpanded: (expanded?: boolean) => void
21
19
  getIsExpanded: () => boolean
22
20
  getCanExpand: () => boolean
23
- getToggleExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
24
- userProps?: TGetter
25
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
21
+ getToggleExpandedHandler: () => () => void
26
22
  }
27
23
 
28
24
  export type ExpandedOptions<TGenerics extends TableGenerics> = {
25
+ manualExpanding?: boolean
29
26
  onExpandedChange?: OnChangeFn<ExpandedState>
30
27
  autoResetExpanded?: boolean
31
28
  enableExpanded?: boolean
@@ -39,11 +36,6 @@ export type ExpandedOptions<TGenerics extends TableGenerics> = {
39
36
  paginateExpandedRows?: boolean
40
37
  }
41
38
 
42
- export type ToggleExpandedProps = {
43
- title?: string
44
- onClick?: (event: unknown) => void
45
- }
46
-
47
39
  export type ExpandedInstance<TGenerics extends TableGenerics> = {
48
40
  queueResetExpanded: () => void
49
41
  setExpanded: (updater: Updater<ExpandedState>) => void
@@ -53,13 +45,8 @@ export type ExpandedInstance<TGenerics extends TableGenerics> = {
53
45
  getRowCanExpand: (rowId: string) => boolean
54
46
  getCanSomeRowsExpand: () => boolean
55
47
  getIsRowExpanded: (rowId: string) => boolean
56
- getToggleExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
57
- rowId: string,
58
- userProps?: TGetter
59
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
60
- getToggleAllRowsExpandedProps: <TGetter extends Getter<ToggleExpandedProps>>(
61
- userProps?: TGetter
62
- ) => undefined | PropGetterValue<ToggleExpandedProps, TGetter>
48
+ getToggleExpandedHandler: (rowId: string) => undefined | (() => void)
49
+ getToggleAllRowsExpandedHandler: () => (event: unknown) => void
63
50
  getIsSomeRowsExpanded: () => boolean
64
51
  getIsAllRowsExpanded: () => boolean
65
52
  getExpandedDepth: () => number
@@ -88,7 +75,7 @@ export const Expanding = {
88
75
  }
89
76
  },
90
77
 
91
- getInstance: <TGenerics extends TableGenerics>(
78
+ createInstance: <TGenerics extends TableGenerics>(
92
79
  instance: TableInstance<TGenerics>
93
80
  ): ExpandedInstance<TGenerics> => {
94
81
  let registered = false
@@ -200,7 +187,7 @@ export const Expanding = {
200
187
  instance.getRowCanExpand(id)
201
188
  )
202
189
  },
203
- getToggleExpandedProps: (rowId, userProps) => {
190
+ getToggleExpandedHandler: rowId => {
204
191
  const row = instance.getRow(rowId)
205
192
 
206
193
  if (!row) {
@@ -209,28 +196,16 @@ export const Expanding = {
209
196
 
210
197
  const canExpand = instance.getRowCanExpand(rowId)
211
198
 
212
- const initialProps: ToggleExpandedProps = {
213
- title: canExpand ? 'Toggle Expanded' : undefined,
214
- onClick: canExpand
215
- ? (e: unknown) => {
216
- ;(e as any).persist?.()
217
- instance.toggleRowExpanded(rowId)
218
- }
219
- : undefined,
199
+ return () => {
200
+ if (!canExpand) return
201
+ instance.toggleRowExpanded(rowId)
220
202
  }
221
-
222
- return propGetter(initialProps, userProps)
223
203
  },
224
- getToggleAllRowsExpandedProps: userProps => {
225
- const initialProps: ToggleExpandedProps = {
226
- title: 'Toggle All Expanded',
227
- onClick: (e: unknown) => {
228
- ;(e as any).persist?.()
229
- instance.toggleAllRowsExpanded()
230
- },
204
+ getToggleAllRowsExpandedHandler: () => {
205
+ return (e: unknown) => {
206
+ ;(e as any).persist?.()
207
+ instance.toggleAllRowsExpanded()
231
208
  }
232
-
233
- return propGetter(initialProps, userProps)
234
209
  },
235
210
  getIsSomeRowsExpanded: () => {
236
211
  const expanded = instance.getState().expanded
@@ -281,7 +256,10 @@ export const Expanding = {
281
256
  instance.options.getExpandedRowModel(instance)
282
257
  }
283
258
 
284
- if (!instance._getExpandedRowModel) {
259
+ if (
260
+ instance.options.manualExpanding ||
261
+ !instance._getExpandedRowModel
262
+ ) {
285
263
  return instance.getPreExpandedRowModel()
286
264
  }
287
265
 
@@ -299,8 +277,8 @@ export const Expanding = {
299
277
  void instance.toggleRowExpanded(row.id, expanded),
300
278
  getIsExpanded: () => instance.getIsRowExpanded(row.id),
301
279
  getCanExpand: () => row.subRows && !!row.subRows.length,
302
- getToggleExpandedProps: userProps =>
303
- instance.getToggleExpandedProps(row.id, userProps),
280
+ getToggleExpandedHandler: () =>
281
+ instance.getToggleExpandedHandler(row.id)!,
304
282
  }
305
283
  },
306
284
  }
@@ -83,6 +83,7 @@ export type FiltersOptions<TGenerics extends TableGenerics> = {
83
83
  filterFns?: TGenerics['FilterFns']
84
84
  enableFilters?: boolean
85
85
  // Column
86
+ manualColumnFiltering?: boolean
86
87
  onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>
87
88
  autoResetColumnFilters?: boolean
88
89
  enableColumnFilters?: boolean
@@ -90,6 +91,7 @@ export type FiltersOptions<TGenerics extends TableGenerics> = {
90
91
  instance: TableInstance<TGenerics>
91
92
  ) => () => RowModel<TGenerics>
92
93
  // Global
94
+ manualGlobalFiltering?: boolean
93
95
  globalFilterFn?: FilterFnOption<TGenerics>
94
96
  onGlobalFilterChange?: OnChangeFn<any>
95
97
  autoResetGlobalFilter?: boolean
@@ -230,7 +232,7 @@ export const Filters = {
230
232
  }
231
233
  },
232
234
 
233
- getInstance: <TGenerics extends TableGenerics>(
235
+ createInstance: <TGenerics extends TableGenerics>(
234
236
  instance: TableInstance<TGenerics>
235
237
  ): FiltersInstance<TGenerics> => {
236
238
  let registered = false
@@ -471,7 +473,10 @@ export const Filters = {
471
473
  instance.options.getColumnFilteredRowModel(instance)
472
474
  }
473
475
 
474
- if (!instance._getColumnFilteredRowModel) {
476
+ if (
477
+ instance.options.manualColumnFiltering ||
478
+ !instance._getColumnFilteredRowModel
479
+ ) {
475
480
  return instance.getPreColumnFilteredRowModel()
476
481
  }
477
482
 
@@ -487,7 +492,10 @@ export const Filters = {
487
492
  instance.options.getGlobalFilteredRowModel(instance)
488
493
  }
489
494
 
490
- if (!instance._getGlobalFilteredRowModel) {
495
+ if (
496
+ instance.options.manualGlobalFiltering ||
497
+ !instance._getGlobalFilteredRowModel
498
+ ) {
491
499
  return instance.getPreGlobalFilteredRowModel()
492
500
  }
493
501
 
@@ -3,24 +3,14 @@ import { BuiltInAggregationFn, aggregationFns } from '../aggregationFns'
3
3
  import {
4
4
  Cell,
5
5
  Column,
6
- Getter,
7
6
  OnChangeFn,
8
- PropGetterValue,
9
7
  TableInstance,
10
8
  Row,
11
9
  Updater,
12
10
  Renderable,
13
- UseRenderer,
14
11
  TableGenerics,
15
12
  } from '../types'
16
- import {
17
- functionalUpdate,
18
- isFunction,
19
- makeStateUpdater,
20
- memo,
21
- Overwrite,
22
- propGetter,
23
- } from '../utils'
13
+ import { isFunction, makeStateUpdater, Overwrite } from '../utils'
24
14
 
25
15
  export type GroupingState = string[]
26
16
 
@@ -67,9 +57,7 @@ export type GroupingColumn<TGenerics extends TableGenerics> = {
67
57
  getIsGrouped: () => boolean
68
58
  getGroupedIndex: () => number
69
59
  toggleGrouping: () => void
70
- getToggleGroupingProps: <TGetter extends Getter<ToggleGroupingProps>>(
71
- userProps?: TGetter
72
- ) => undefined | PropGetterValue<ToggleGroupingProps, TGetter>
60
+ getToggleGroupingHandler: () => () => void
73
61
  }
74
62
 
75
63
  export type GroupingRow = {
@@ -82,7 +70,7 @@ export type GroupingCell<TGenerics extends TableGenerics> = {
82
70
  getIsGrouped: () => boolean
83
71
  getIsPlaceholder: () => boolean
84
72
  getIsAggregated: () => boolean
85
- renderAggregatedCell: () => string | null | ReturnType<UseRenderer<TGenerics>>
73
+ renderAggregatedCell: () => string | null | TGenerics['Rendered']
86
74
  }
87
75
 
88
76
  export type ColumnDefaultOptions = {
@@ -93,6 +81,7 @@ export type ColumnDefaultOptions = {
93
81
  }
94
82
 
95
83
  export type GroupingOptions<TGenerics extends TableGenerics> = {
84
+ manualGrouping?: boolean
96
85
  aggregationFns?: TGenerics['AggregationFns']
97
86
  onGroupingChange?: OnChangeFn<GroupingState>
98
87
  autoResetGrouping?: boolean
@@ -107,11 +96,6 @@ export type GroupingOptions<TGenerics extends TableGenerics> = {
107
96
 
108
97
  export type GroupingColumnMode = false | 'reorder' | 'remove'
109
98
 
110
- export type ToggleGroupingProps = {
111
- title?: string
112
- onClick?: (event: unknown) => void
113
- }
114
-
115
99
  export type GroupingInstance<TGenerics extends TableGenerics> = {
116
100
  queueResetGrouping: () => void
117
101
  getColumnAutoAggregationFn: (
@@ -126,10 +110,7 @@ export type GroupingInstance<TGenerics extends TableGenerics> = {
126
110
  getColumnCanGroup: (columnId: string) => boolean
127
111
  getColumnIsGrouped: (columnId: string) => boolean
128
112
  getColumnGroupedIndex: (columnId: string) => number
129
- getToggleGroupingProps: <TGetter extends Getter<ToggleGroupingProps>>(
130
- columnId: string,
131
- userProps?: TGetter
132
- ) => undefined | PropGetterValue<ToggleGroupingProps, TGetter>
113
+ getToggleGroupingHandler: (columnId: string) => undefined | (() => void)
133
114
  getRowIsGrouped: (rowId: string) => boolean
134
115
  getPreGroupedRowModel: () => RowModel<TGenerics>
135
116
  getGroupedRowModel: () => RowModel<TGenerics>
@@ -173,12 +154,12 @@ export const Grouping = {
173
154
  getGroupedIndex: () => instance.getColumnGroupedIndex(column.id),
174
155
  getIsGrouped: () => instance.getColumnIsGrouped(column.id),
175
156
  toggleGrouping: () => instance.toggleColumnGrouping(column.id),
176
- getToggleGroupingProps: userProps =>
177
- instance.getToggleGroupingProps(column.id, userProps),
157
+ getToggleGroupingHandler: () =>
158
+ instance.getToggleGroupingHandler(column.id)!,
178
159
  }
179
160
  },
180
161
 
181
- getInstance: <TGenerics extends TableGenerics>(
162
+ createInstance: <TGenerics extends TableGenerics>(
182
163
  instance: TableInstance<TGenerics>
183
164
  ): GroupingInstance<TGenerics> => {
184
165
  let registered = false
@@ -277,21 +258,14 @@ export const Grouping = {
277
258
  instance.setGrouping(instance.initialState?.grouping ?? [])
278
259
  },
279
260
 
280
- getToggleGroupingProps: (columnId, userProps) => {
261
+ getToggleGroupingHandler: columnId => {
281
262
  const column = instance.getColumn(columnId)
282
-
283
263
  const canGroup = column.getCanGroup()
284
264
 
285
- const initialProps: ToggleGroupingProps = {
286
- title: canGroup ? 'Toggle Grouping' : undefined,
287
- onClick: canGroup
288
- ? (e: unknown) => {
289
- column.toggleGrouping?.()
290
- }
291
- : undefined,
265
+ return () => {
266
+ if (!canGroup) return
267
+ column.toggleGrouping?.()
292
268
  }
293
-
294
- return propGetter(initialProps, userProps)
295
269
  },
296
270
 
297
271
  getRowIsGrouped: rowId => !!instance.getRow(rowId)?.groupingColumnId,
@@ -306,7 +280,7 @@ export const Grouping = {
306
280
  instance.options.getGroupedRowModel(instance)
307
281
  }
308
282
 
309
- if (!instance._getGroupedRowModel) {
283
+ if (instance.options.manualGrouping || !instance._getGroupedRowModel) {
310
284
  return instance.getPreGroupedRowModel()
311
285
  }
312
286