@tanstack/table-core 8.0.0-alpha.10

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 (112) hide show
  1. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +112 -0
  2. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  3. package/build/cjs/aggregationTypes.js +130 -0
  4. package/build/cjs/aggregationTypes.js.map +1 -0
  5. package/build/cjs/core.js +545 -0
  6. package/build/cjs/core.js.map +1 -0
  7. package/build/cjs/createTable.js +65 -0
  8. package/build/cjs/createTable.js.map +1 -0
  9. package/build/cjs/features/ColumnSizing.js +316 -0
  10. package/build/cjs/features/ColumnSizing.js.map +1 -0
  11. package/build/cjs/features/Expanding.js +238 -0
  12. package/build/cjs/features/Expanding.js.map +1 -0
  13. package/build/cjs/features/Filters.js +413 -0
  14. package/build/cjs/features/Filters.js.map +1 -0
  15. package/build/cjs/features/Grouping.js +227 -0
  16. package/build/cjs/features/Grouping.js.map +1 -0
  17. package/build/cjs/features/Headers.js +630 -0
  18. package/build/cjs/features/Headers.js.map +1 -0
  19. package/build/cjs/features/Ordering.js +86 -0
  20. package/build/cjs/features/Ordering.js.map +1 -0
  21. package/build/cjs/features/Pagination.js +193 -0
  22. package/build/cjs/features/Pagination.js.map +1 -0
  23. package/build/cjs/features/Pinning.js +148 -0
  24. package/build/cjs/features/Pinning.js.map +1 -0
  25. package/build/cjs/features/RowSelection.js +525 -0
  26. package/build/cjs/features/RowSelection.js.map +1 -0
  27. package/build/cjs/features/Sorting.js +313 -0
  28. package/build/cjs/features/Sorting.js.map +1 -0
  29. package/build/cjs/features/Visibility.js +172 -0
  30. package/build/cjs/features/Visibility.js.map +1 -0
  31. package/build/cjs/filterTypes.js +172 -0
  32. package/build/cjs/filterTypes.js.map +1 -0
  33. package/build/cjs/index.js +75 -0
  34. package/build/cjs/index.js.map +1 -0
  35. package/build/cjs/sortTypes.js +122 -0
  36. package/build/cjs/sortTypes.js.map +1 -0
  37. package/build/cjs/types.js +22 -0
  38. package/build/cjs/types.js.map +1 -0
  39. package/build/cjs/utils/columnFilterRowsFn.js +131 -0
  40. package/build/cjs/utils/columnFilterRowsFn.js.map +1 -0
  41. package/build/cjs/utils/expandRowsFn.js +38 -0
  42. package/build/cjs/utils/expandRowsFn.js.map +1 -0
  43. package/build/cjs/utils/globalFilterRowsFn.js +101 -0
  44. package/build/cjs/utils/globalFilterRowsFn.js.map +1 -0
  45. package/build/cjs/utils/groupRowsFn.js +155 -0
  46. package/build/cjs/utils/groupRowsFn.js.map +1 -0
  47. package/build/cjs/utils/paginateRowsFn.js +44 -0
  48. package/build/cjs/utils/paginateRowsFn.js.map +1 -0
  49. package/build/cjs/utils/sortRowsFn.js +94 -0
  50. package/build/cjs/utils/sortRowsFn.js.map +1 -0
  51. package/build/cjs/utils.js +167 -0
  52. package/build/cjs/utils.js.map +1 -0
  53. package/build/esm/index.js +4689 -0
  54. package/build/esm/index.js.map +1 -0
  55. package/build/stats-html.html +2689 -0
  56. package/build/stats-react.json +939 -0
  57. package/build/types/aggregationTypes.d.ts +22 -0
  58. package/build/types/core.d.ts +105 -0
  59. package/build/types/createTable.d.ts +42 -0
  60. package/build/types/features/ColumnSizing.d.ts +75 -0
  61. package/build/types/features/Expanding.d.ts +50 -0
  62. package/build/types/features/Filters.d.ts +92 -0
  63. package/build/types/features/Grouping.d.ts +85 -0
  64. package/build/types/features/Headers.d.ts +43 -0
  65. package/build/types/features/Ordering.d.ts +21 -0
  66. package/build/types/features/Pagination.d.ts +41 -0
  67. package/build/types/features/Pinning.d.ts +41 -0
  68. package/build/types/features/RowSelection.d.ts +60 -0
  69. package/build/types/features/Sorting.d.ts +81 -0
  70. package/build/types/features/Visibility.d.ts +49 -0
  71. package/build/types/filterTypes.d.ts +50 -0
  72. package/build/types/index.d.ts +23 -0
  73. package/build/types/sortTypes.d.ts +18 -0
  74. package/build/types/types.d.ts +138 -0
  75. package/build/types/utils/columnFilterRowsFn.d.ts +2 -0
  76. package/build/types/utils/expandRowsFn.d.ts +2 -0
  77. package/build/types/utils/globalFilterRowsFn.d.ts +2 -0
  78. package/build/types/utils/groupRowsFn.d.ts +2 -0
  79. package/build/types/utils/paginateRowsFn.d.ts +2 -0
  80. package/build/types/utils/sortRowsFn.d.ts +2 -0
  81. package/build/types/utils.d.ts +23 -0
  82. package/build/umd/index.development.js +4728 -0
  83. package/build/umd/index.development.js.map +1 -0
  84. package/build/umd/index.production.js +12 -0
  85. package/build/umd/index.production.js.map +1 -0
  86. package/package.json +40 -0
  87. package/src/.DS_Store +0 -0
  88. package/src/aggregationTypes.ts +115 -0
  89. package/src/core.tsx +763 -0
  90. package/src/createTable.tsx +137 -0
  91. package/src/features/ColumnSizing.ts +432 -0
  92. package/src/features/Expanding.ts +320 -0
  93. package/src/features/Filters.ts +567 -0
  94. package/src/features/Grouping.ts +363 -0
  95. package/src/features/Headers.ts +747 -0
  96. package/src/features/Ordering.ts +112 -0
  97. package/src/features/Pagination.ts +252 -0
  98. package/src/features/Pinning.ts +177 -0
  99. package/src/features/RowSelection.ts +655 -0
  100. package/src/features/Sorting.ts +460 -0
  101. package/src/features/Visibility.ts +242 -0
  102. package/src/filterTypes.ts +188 -0
  103. package/src/index.tsx +23 -0
  104. package/src/sortTypes.ts +147 -0
  105. package/src/types.ts +311 -0
  106. package/src/utils/columnFilterRowsFn.ts +113 -0
  107. package/src/utils/expandRowsFn.ts +30 -0
  108. package/src/utils/globalFilterRowsFn.ts +89 -0
  109. package/src/utils/groupRowsFn.ts +170 -0
  110. package/src/utils/paginateRowsFn.ts +28 -0
  111. package/src/utils/sortRowsFn.ts +95 -0
  112. package/src/utils.tsx +221 -0
@@ -0,0 +1,363 @@
1
+ import React, { MouseEvent, TouchEvent } from 'react'
2
+ import { RowModel } from '..'
3
+ import { BuiltInAggregationType, aggregationTypes } from '../aggregationTypes'
4
+ import {
5
+ Cell,
6
+ Column,
7
+ Getter,
8
+ OnChangeFn,
9
+ PropGetterValue,
10
+ TableInstance,
11
+ Row,
12
+ Updater,
13
+ PartialGenerics,
14
+ } from '../types'
15
+ import {
16
+ functionalUpdate,
17
+ isFunction,
18
+ makeStateUpdater,
19
+ memo,
20
+ Overwrite,
21
+ propGetter,
22
+ } from '../utils'
23
+
24
+ export type GroupingState = string[]
25
+
26
+ export type AggregationFn<TGenerics extends PartialGenerics> = (
27
+ leafValues: TGenerics['Row'][],
28
+ childValues: TGenerics['Row'][]
29
+ ) => any
30
+
31
+ export type CustomAggregationTypes<TGenerics extends PartialGenerics> = Record<
32
+ string,
33
+ AggregationFn<TGenerics>
34
+ >
35
+
36
+ export type AggregationType<TGenerics extends PartialGenerics> =
37
+ | 'auto'
38
+ | BuiltInAggregationType
39
+ | keyof TGenerics['AggregationFns']
40
+ | AggregationFn<TGenerics>
41
+
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
50
+ enableGrouping?: boolean
51
+ defaultCanGroup?: boolean
52
+ }
53
+
54
+ export type GroupingColumn<TGenerics extends PartialGenerics> = {
55
+ aggregationType?: AggregationType<Overwrite<TGenerics, { Value: any }>>
56
+ getCanGroup: () => boolean
57
+ getIsGrouped: () => boolean
58
+ getGroupedIndex: () => number
59
+ toggleGrouping: () => void
60
+ getToggleGroupingProps: <TGetter extends Getter<ToggleGroupingProps>>(
61
+ userProps?: TGetter
62
+ ) => undefined | PropGetterValue<ToggleGroupingProps, TGetter>
63
+ }
64
+
65
+ export type GroupingRow = {
66
+ groupingColumnId?: string
67
+ groupingValue?: any
68
+ getIsGrouped: () => boolean
69
+ }
70
+
71
+ export type GroupingCell = {
72
+ getIsGrouped: () => boolean
73
+ getIsPlaceholder: () => boolean
74
+ getIsAggregated: () => boolean
75
+ }
76
+
77
+ export type ColumnDefaultOptions = {
78
+ // Column
79
+ onGroupingChange: OnChangeFn<GroupingState>
80
+ autoResetGrouping: boolean
81
+ enableGrouping: boolean
82
+ }
83
+
84
+ export type GroupingOptions<TGenerics extends PartialGenerics> = {
85
+ aggregationTypes?: TGenerics['AggregationFns']
86
+ onGroupingChange?: OnChangeFn<GroupingState>
87
+ autoResetGrouping?: boolean
88
+ enableGrouping?: boolean
89
+ enableGroupingRemoval?: boolean
90
+ groupRowsFn?: (
91
+ instance: TableInstance<TGenerics>,
92
+ rowModel: RowModel<TGenerics>
93
+ ) => RowModel<TGenerics>
94
+
95
+ groupedColumnMode?: false | 'reorder' | 'remove'
96
+ }
97
+
98
+ export type GroupingColumnMode = false | 'reorder' | 'remove'
99
+
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
113
+ 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
124
+ getPreGroupedRowModel: () => RowModel<TGenerics>
125
+ getGroupedRowModel: () => RowModel<TGenerics>
126
+ }
127
+
128
+ //
129
+
130
+ export const Grouping = {
131
+ getDefaultColumn: <
132
+ TGenerics extends PartialGenerics
133
+ >(): GroupingColumnDef<TGenerics> => {
134
+ return {
135
+ aggregationType: 'auto',
136
+ }
137
+ },
138
+
139
+ getInitialState: (): GroupingTableState => {
140
+ return {
141
+ grouping: [],
142
+ }
143
+ },
144
+
145
+ getDefaultOptions: <TGenerics extends PartialGenerics>(
146
+ instance: TableInstance<TGenerics>
147
+ ): GroupingOptions<TGenerics> => {
148
+ return {
149
+ onGroupingChange: makeStateUpdater('grouping', instance),
150
+ autoResetGrouping: true,
151
+ groupedColumnMode: 'reorder',
152
+ }
153
+ },
154
+
155
+ createColumn: <TGenerics extends PartialGenerics>(
156
+ column: Column<TGenerics>,
157
+ instance: TableInstance<TGenerics>
158
+ ): GroupingColumn<TGenerics> => {
159
+ 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
+ },
169
+
170
+ getInstance: <TGenerics extends PartialGenerics>(
171
+ instance: TableInstance<TGenerics>
172
+ ): GroupingInstance<TGenerics> => {
173
+ let registered = false
174
+
175
+ return {
176
+ _notifyGroupingReset: () => {
177
+ if (!registered) {
178
+ registered = true
179
+ return
180
+ }
181
+
182
+ if (instance.options.autoResetAll === false) {
183
+ return
184
+ }
185
+
186
+ if (
187
+ instance.options.autoResetAll === true ||
188
+ instance.options.autoResetGrouping
189
+ ) {
190
+ instance.resetGrouping()
191
+ }
192
+ },
193
+ getColumnAutoAggregationFn: columnId => {
194
+ const firstRow = instance.getCoreRowModel().flatRows[0]
195
+
196
+ const value = firstRow?.values[columnId]
197
+
198
+ if (typeof value === 'number') {
199
+ return aggregationTypes.sum
200
+ }
201
+
202
+ if (Object.prototype.toString.call(value) === '[object Date]') {
203
+ return aggregationTypes.extent
204
+ }
205
+
206
+ return aggregationTypes.count
207
+ },
208
+ getColumnAggregationFn: columnId => {
209
+ const column = instance.getColumn(columnId)
210
+ const userAggregationTypes = instance.options.aggregationTypes
211
+
212
+ if (!column) {
213
+ throw new Error()
214
+ }
215
+
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
222
+ ] ??
223
+ (aggregationTypes[
224
+ column.aggregationType as BuiltInAggregationType
225
+ ] as AggregationFn<TGenerics>)
226
+ },
227
+
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
+ }
251
+
252
+ return (
253
+ column.enableGrouping ??
254
+ instance.options.enableGrouping ??
255
+ column.defaultCanGroup ??
256
+ !!column.accessorFn
257
+ )
258
+ },
259
+
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()
275
+
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,
284
+ }
285
+
286
+ return propGetter(initialProps, userProps)
287
+ },
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
+ }
312
+ },
313
+
314
+ createRow: <TGenerics extends PartialGenerics>(
315
+ row: Row<TGenerics>,
316
+ instance: TableInstance<TGenerics>
317
+ ): GroupingRow => {
318
+ return {
319
+ getIsGrouped: () => instance.getRowIsGrouped(row.id),
320
+ }
321
+ },
322
+
323
+ createCell: <TGenerics extends PartialGenerics>(
324
+ cell: Cell<TGenerics> & GroupingCell,
325
+ column: Column<TGenerics>,
326
+ row: Row<TGenerics>,
327
+ _instance: TableInstance<TGenerics>
328
+ ): GroupingCell => {
329
+ return {
330
+ getIsGrouped: () =>
331
+ column.getIsGrouped() && column.id === row.groupingColumnId,
332
+ getIsPlaceholder: () => !cell.getIsGrouped() && column.getIsGrouped(),
333
+ getIsAggregated: () =>
334
+ !cell.getIsGrouped() &&
335
+ !cell.getIsPlaceholder() &&
336
+ row.subRows?.length > 1,
337
+ }
338
+ },
339
+
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
+ }
348
+
349
+ const nonGroupingColumns = leafColumns.filter(
350
+ col => !grouping.includes(col.id)
351
+ )
352
+
353
+ if (groupedColumnMode === 'remove') {
354
+ return nonGroupingColumns
355
+ }
356
+
357
+ const groupingColumns = grouping
358
+ .map(g => leafColumns.find(col => col.id === g)!)
359
+ .filter(Boolean)
360
+
361
+ return [...groupingColumns, ...nonGroupingColumns]
362
+ },
363
+ }