@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
@@ -0,0 +1,359 @@
1
+ import { flattenBy, functionalUpdate, memo, RequiredKeys } from '../utils'
2
+
3
+ import {
4
+ Updater,
5
+ TableOptionsResolved,
6
+ TableState,
7
+ TableInstance,
8
+ Renderable,
9
+ TableGenerics,
10
+ InitialTableState,
11
+ Row,
12
+ Column,
13
+ RowModel,
14
+ ColumnDef,
15
+ } from '../types'
16
+
17
+ //
18
+ import { createColumn } from './column'
19
+ import { Headers } from './headers'
20
+ //
21
+
22
+ import { ColumnSizing } from '../features/ColumnSizing'
23
+ import { Expanding } from '../features/Expanding'
24
+ import { Filters } from '../features/Filters'
25
+ import { Grouping } from '../features/Grouping'
26
+ import { Ordering } from '../features/Ordering'
27
+ import { Pagination } from '../features/Pagination'
28
+ import { Pinning } from '../features/Pinning'
29
+ import { RowSelection } from '../features/RowSelection'
30
+ import { Sorting } from '../features/Sorting'
31
+ import { Visibility } from '../features/Visibility'
32
+
33
+ export type TableFeature = {
34
+ getDefaultOptions?: (instance: any) => any
35
+ getInitialState?: (initialState?: InitialTableState) => any
36
+ createInstance?: (instance: any) => any
37
+ getDefaultColumnDef?: () => any
38
+ createColumn?: (column: any, instance: any) => any
39
+ createHeader?: (column: any, instance: any) => any
40
+ createCell?: (cell: any, column: any, row: any, instance: any) => any
41
+ createRow?: (row: any, instance: any) => any
42
+ }
43
+
44
+ const features = [
45
+ Headers,
46
+ Visibility,
47
+ Ordering,
48
+ Pinning,
49
+ Filters,
50
+ Sorting,
51
+ Grouping,
52
+ Expanding,
53
+ Pagination,
54
+ RowSelection,
55
+ ColumnSizing,
56
+ ] as const
57
+
58
+ //
59
+
60
+ export type CoreTableState = {}
61
+
62
+ export type CoreOptions<TGenerics extends TableGenerics> = {
63
+ data: TGenerics['Row'][]
64
+ state: Partial<TableState>
65
+ onStateChange: (updater: Updater<TableState>) => void
66
+ render: TGenerics['Renderer']
67
+ debugAll?: boolean
68
+ debugTable?: boolean
69
+ debugHeaders?: boolean
70
+ debugColumns?: boolean
71
+ debugRows?: boolean
72
+ initialState?: InitialTableState
73
+ autoResetAll?: boolean
74
+ mergeOptions?: <T>(defaultOptions: T, options: Partial<T>) => T
75
+ meta?: TGenerics['TableMeta']
76
+ getCoreRowModel: (instance: TableInstance<any>) => () => RowModel<any>
77
+ getSubRows?: (
78
+ originalRow: TGenerics['Row'],
79
+ index: number
80
+ ) => undefined | TGenerics['Row'][]
81
+ getRowId?: (
82
+ originalRow: TGenerics['Row'],
83
+ index: number,
84
+ parent?: Row<TGenerics>
85
+ ) => string
86
+ columns: ColumnDef<TGenerics>[]
87
+ defaultColumn?: Partial<ColumnDef<TGenerics>>
88
+ }
89
+
90
+ export type CoreInstance<TGenerics extends TableGenerics> = {
91
+ initialState: TableState
92
+ reset: () => void
93
+ options: RequiredKeys<TableOptionsResolved<TGenerics>, 'state'>
94
+ setOptions: (newOptions: Updater<TableOptionsResolved<TGenerics>>) => void
95
+ getState: () => TableState
96
+ setState: (updater: Updater<TableState>) => void
97
+ _features: readonly TableFeature[]
98
+ _queue: (cb: () => void) => void
99
+ _render: <TProps>(
100
+ template: Renderable<TGenerics, TProps>,
101
+ props: TProps
102
+ ) => string | null | TGenerics['Rendered']
103
+ _getRowId: (
104
+ _: TGenerics['Row'],
105
+ index: number,
106
+ parent?: Row<TGenerics>
107
+ ) => string
108
+ getCoreRowModel: () => RowModel<TGenerics>
109
+ _getCoreRowModel?: () => RowModel<TGenerics>
110
+ getRowModel: () => RowModel<TGenerics>
111
+ getRow: (id: string) => Row<TGenerics>
112
+ _getDefaultColumnDef: () => Partial<ColumnDef<TGenerics>>
113
+ _getColumnDefs: () => ColumnDef<TGenerics>[]
114
+ _getAllFlatColumnsById: () => Record<string, Column<TGenerics>>
115
+ getAllColumns: () => Column<TGenerics>[]
116
+ getAllFlatColumns: () => Column<TGenerics>[]
117
+ getAllLeafColumns: () => Column<TGenerics>[]
118
+ getColumn: (columnId: string) => Column<TGenerics>
119
+ }
120
+
121
+ export function createTableInstance<TGenerics extends TableGenerics>(
122
+ options: TableOptionsResolved<TGenerics>
123
+ ): TableInstance<TGenerics> {
124
+ if (options.debugAll || options.debugTable) {
125
+ console.info('Creating Table Instance...')
126
+ }
127
+
128
+ let instance = { _features: features } as unknown as TableInstance<TGenerics>
129
+
130
+ const defaultOptions = instance._features.reduce((obj, feature) => {
131
+ return Object.assign(obj, feature.getDefaultOptions?.(instance))
132
+ }, {}) as TableOptionsResolved<TGenerics>
133
+
134
+ const mergeOptions = (options: TableOptionsResolved<TGenerics>) => {
135
+ if (instance.options.mergeOptions) {
136
+ return instance.options.mergeOptions(defaultOptions, options)
137
+ }
138
+
139
+ return {
140
+ ...defaultOptions,
141
+ ...options,
142
+ }
143
+ }
144
+
145
+ const coreInitialState: CoreTableState = {}
146
+
147
+ let initialState = {
148
+ ...coreInitialState,
149
+ ...(options.initialState ?? {}),
150
+ } as TableState
151
+
152
+ instance._features.forEach(feature => {
153
+ initialState = feature.getInitialState?.(initialState) ?? initialState
154
+ })
155
+
156
+ const queued: (() => void)[] = []
157
+ let queuedTimeout = false
158
+
159
+ const coreInstance: CoreInstance<TGenerics> = {
160
+ _features: features,
161
+ options: {
162
+ ...defaultOptions,
163
+ ...options,
164
+ },
165
+ initialState,
166
+ _queue: cb => {
167
+ queued.push(cb)
168
+
169
+ if (!queuedTimeout) {
170
+ queuedTimeout = true
171
+
172
+ // Schedule a microtask to run the queued callbacks after
173
+ // the current call stack (render, etc) has finished.
174
+ Promise.resolve()
175
+ .then(() => {
176
+ while (queued.length) {
177
+ queued.shift()!()
178
+ }
179
+ queuedTimeout = false
180
+ })
181
+ .catch(error =>
182
+ setTimeout(() => {
183
+ throw error
184
+ })
185
+ )
186
+ }
187
+ },
188
+ reset: () => {
189
+ instance.setState(instance.initialState)
190
+ },
191
+ setOptions: updater => {
192
+ const newOptions = functionalUpdate(updater, instance.options)
193
+ instance.options = mergeOptions(newOptions)
194
+ },
195
+ _render: (template, props) => {
196
+ if (typeof instance.options.render === 'function') {
197
+ return instance.options.render(template, props)
198
+ }
199
+
200
+ if (typeof template === 'function') {
201
+ return (template as Function)(props)
202
+ }
203
+
204
+ return template
205
+ },
206
+
207
+ getState: () => {
208
+ return instance.options.state as TableState
209
+ },
210
+
211
+ setState: (updater: Updater<TableState>) => {
212
+ instance.options.onStateChange?.(updater)
213
+ },
214
+
215
+ _getRowId: (
216
+ row: TGenerics['Row'],
217
+ index: number,
218
+ parent?: Row<TGenerics>
219
+ ) =>
220
+ instance.options.getRowId?.(row, index, parent) ??
221
+ `${parent ? [parent.id, index].join('.') : index}`,
222
+
223
+ getCoreRowModel: () => {
224
+ if (!instance._getCoreRowModel) {
225
+ instance._getCoreRowModel = instance.options.getCoreRowModel(instance)
226
+ }
227
+
228
+ return instance._getCoreRowModel()
229
+ },
230
+
231
+ // The final calls start at the bottom of the model,
232
+ // expanded rows, which then work their way up
233
+
234
+ getRowModel: () => {
235
+ return instance.getPaginationRowModel()
236
+ },
237
+ getRow: (id: string) => {
238
+ const row = instance.getRowModel().rowsById[id]
239
+
240
+ if (!row) {
241
+ if (process.env.NODE_ENV !== 'production') {
242
+ throw new Error(`getRow expected an ID, but got ${id}`)
243
+ }
244
+ throw new Error()
245
+ }
246
+
247
+ return row
248
+ },
249
+ _getDefaultColumnDef: memo(
250
+ () => [instance.options.defaultColumn],
251
+ defaultColumn => {
252
+ defaultColumn = (defaultColumn ?? {}) as Partial<ColumnDef<TGenerics>>
253
+
254
+ return {
255
+ header: props => props.header.column.id,
256
+ footer: props => props.header.column.id,
257
+ cell: props => props.getValue().toString?.() ?? null,
258
+ ...instance._features.reduce((obj, feature) => {
259
+ return Object.assign(obj, feature.getDefaultColumnDef?.())
260
+ }, {}),
261
+ ...defaultColumn,
262
+ } as Partial<ColumnDef<TGenerics>>
263
+ },
264
+ {
265
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
266
+ key: process.env.NODE_ENV === 'development' && 'getDefaultColumnDef',
267
+ }
268
+ ),
269
+
270
+ _getColumnDefs: () => instance.options.columns,
271
+
272
+ getAllColumns: memo(
273
+ () => [instance._getColumnDefs()],
274
+ columnDefs => {
275
+ const recurseColumns = (
276
+ columnDefs: ColumnDef<TGenerics>[],
277
+ parent?: Column<TGenerics>,
278
+ depth = 0
279
+ ): Column<TGenerics>[] => {
280
+ return columnDefs.map(columnDef => {
281
+ const column = createColumn(instance, columnDef, depth, parent)
282
+
283
+ column.columns = columnDef.columns
284
+ ? recurseColumns(columnDef.columns, column, depth + 1)
285
+ : []
286
+
287
+ return column
288
+ })
289
+ }
290
+
291
+ return recurseColumns(columnDefs)
292
+ },
293
+ {
294
+ key: process.env.NODE_ENV === 'development' && 'getAllColumns',
295
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
296
+ }
297
+ ),
298
+
299
+ getAllFlatColumns: memo(
300
+ () => [instance.getAllColumns()],
301
+ allColumns => {
302
+ return allColumns.flatMap(column => {
303
+ return column.getFlatColumns()
304
+ })
305
+ },
306
+ {
307
+ key: process.env.NODE_ENV === 'development' && 'getAllFlatColumns',
308
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
309
+ }
310
+ ),
311
+
312
+ _getAllFlatColumnsById: memo(
313
+ () => [instance.getAllFlatColumns()],
314
+ flatColumns => {
315
+ return flatColumns.reduce((acc, column) => {
316
+ acc[column.id] = column
317
+ return acc
318
+ }, {} as Record<string, Column<TGenerics>>)
319
+ },
320
+ {
321
+ key: process.env.NODE_ENV === 'development' && 'getAllFlatColumnsById',
322
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
323
+ }
324
+ ),
325
+
326
+ getAllLeafColumns: memo(
327
+ () => [instance.getAllColumns(), instance._getOrderColumnsFn()],
328
+ (allColumns, orderColumns) => {
329
+ let leafColumns = allColumns.flatMap(column => column.getLeafColumns())
330
+ return orderColumns(leafColumns)
331
+ },
332
+ {
333
+ key: process.env.NODE_ENV === 'development' && 'getAllLeafColumns',
334
+ debug: () => instance.options.debugAll ?? instance.options.debugColumns,
335
+ }
336
+ ),
337
+
338
+ getColumn: columnId => {
339
+ const column = instance._getAllFlatColumnsById()[columnId]
340
+
341
+ if (!column) {
342
+ if (process.env.NODE_ENV !== 'production') {
343
+ console.warn(`[Table] Column with id ${columnId} does not exist.`)
344
+ }
345
+ throw new Error()
346
+ }
347
+
348
+ return column
349
+ },
350
+ }
351
+
352
+ Object.assign(instance, coreInstance)
353
+
354
+ instance._features.forEach(feature => {
355
+ return Object.assign(instance, feature.createInstance?.(instance))
356
+ })
357
+
358
+ return instance
359
+ }
@@ -0,0 +1,85 @@
1
+ import { Cell, Row, TableGenerics, TableInstance } from '../types'
2
+ import { flattenBy, memo } from '../utils'
3
+ import { createCell } from './cell'
4
+
5
+ export type CoreRow<TGenerics extends TableGenerics> = {
6
+ id: string
7
+ index: number
8
+ original?: TGenerics['Row']
9
+ depth: number
10
+ _valuesCache: Record<string, any>
11
+ getValue: (columnId: string) => any
12
+ subRows: Row<TGenerics>[]
13
+ getLeafRows: () => Row<TGenerics>[]
14
+ originalSubRows?: TGenerics['Row'][]
15
+ getAllCells: () => Cell<TGenerics>[]
16
+ _getAllCellsByColumnId: () => Record<string, Cell<TGenerics>>
17
+ }
18
+
19
+ export const createRow = <TGenerics extends TableGenerics>(
20
+ instance: TableInstance<TGenerics>,
21
+ id: string,
22
+ original: TGenerics['Row'] | undefined,
23
+ rowIndex: number,
24
+ depth: number,
25
+ subRows?: Row<TGenerics>[]
26
+ ): Row<TGenerics> => {
27
+ let row: CoreRow<TGenerics> = {
28
+ id,
29
+ index: rowIndex,
30
+ original,
31
+ depth,
32
+ _valuesCache: {},
33
+ getValue: columnId => {
34
+ if (row._valuesCache.hasOwnProperty(columnId)) {
35
+ return row._valuesCache[columnId]
36
+ }
37
+
38
+ const column = instance.getColumn(columnId)
39
+
40
+ if (!column.accessorFn) {
41
+ return undefined
42
+ }
43
+
44
+ row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex)
45
+
46
+ return row._valuesCache[columnId]
47
+ },
48
+ subRows: subRows ?? [],
49
+ getLeafRows: () => flattenBy(row.subRows, d => d.subRows),
50
+ getAllCells: memo(
51
+ () => [instance.getAllLeafColumns()],
52
+ leafColumns => {
53
+ return leafColumns.map(column => {
54
+ return createCell(instance, row as Row<TGenerics>, column, column.id)
55
+ })
56
+ },
57
+ {
58
+ key: process.env.NODE_ENV === 'development' && 'row.getAllCells',
59
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
60
+ }
61
+ ),
62
+
63
+ _getAllCellsByColumnId: memo(
64
+ () => [row.getAllCells()],
65
+ allCells => {
66
+ return allCells.reduce((acc, cell) => {
67
+ acc[cell.column.id] = cell
68
+ return acc
69
+ }, {} as Record<string, Cell<TGenerics>>)
70
+ },
71
+ {
72
+ key:
73
+ process.env.NODE_ENV === 'production' && 'row.getAllCellsByColumnId',
74
+ debug: () => instance.options.debugAll ?? instance.options.debugRows,
75
+ }
76
+ ),
77
+ }
78
+
79
+ for (let i = 0; i < instance._features.length; i++) {
80
+ const feature = instance._features[i]
81
+ Object.assign(row, feature?.createRow?.(row, instance))
82
+ }
83
+
84
+ return row as Row<TGenerics>
85
+ }
@@ -0,0 +1,188 @@
1
+ import { CustomFilterFns, FilterFn } from './features/Filters'
2
+ import { AggregationFn, CustomAggregationFns } from './features/Grouping'
3
+ import { CustomSortingFns, SortingFn } from './features/Sorting'
4
+ import {
5
+ ColumnDef,
6
+ AccessorFn,
7
+ AnyRender,
8
+ TableGenerics,
9
+ TableOptionsResolved,
10
+ TableOptions,
11
+ } from './types'
12
+ import { IfDefined, Overwrite } from './utils'
13
+
14
+ export type TableFactory<TGenerics extends TableGenerics> =
15
+ () => Table<TGenerics>
16
+
17
+ export type CreateTableOptions<
18
+ TRender extends AnyRender,
19
+ TFilterFns extends CustomFilterFns<any>,
20
+ TSortingFns extends CustomSortingFns<any>,
21
+ TAggregationFns extends CustomAggregationFns<any>,
22
+ TGenerics extends TableGenerics
23
+ > = Partial<
24
+ {
25
+ render?: TRender
26
+ filterFns?: TFilterFns
27
+ sortingFns?: TSortingFns
28
+ aggregationFns?: TAggregationFns
29
+ } & Omit<
30
+ TableOptionsResolved<TGenerics>,
31
+ 'filterFns' | 'sortingFns' | 'aggregationFns'
32
+ >
33
+ >
34
+
35
+ export type Table<TGenerics extends TableGenerics> = {
36
+ generics: TGenerics
37
+ options: Partial<TableOptionsResolved<TGenerics>>
38
+ // setGenerics: <T extends TableGenerics>() => Table<T>
39
+ setRowType: <TRow>() => Table<Overwrite<TGenerics, { Row: TRow }>>
40
+ setTableMetaType: <TTableMeta>() => Table<
41
+ Overwrite<TGenerics, { TableMeta: TTableMeta }>
42
+ >
43
+ setColumnMetaType: <TColumnMeta>() => Table<
44
+ Overwrite<TGenerics, { ColumnMeta: TColumnMeta }>
45
+ >
46
+ setFilterMetaType: <TFilterMeta>() => Table<
47
+ Overwrite<TGenerics, { FilterMeta: TFilterMeta }>
48
+ >
49
+ setOptions: <
50
+ TFilterFns extends Record<string, FilterFn<any>>,
51
+ TSortingFns extends Record<string, SortingFn<any>>,
52
+ TAggregationFns extends Record<string, AggregationFn<any>>
53
+ >(
54
+ options: CreateTableOptions<
55
+ any,
56
+ TFilterFns,
57
+ TSortingFns,
58
+ TAggregationFns,
59
+ TGenerics
60
+ >
61
+ ) => Table<
62
+ Overwrite<
63
+ TGenerics,
64
+ {
65
+ FilterFns: IfDefined<TFilterFns, TGenerics['FilterFns']>
66
+ SortingFns: IfDefined<TSortingFns, TGenerics['SortingFns']>
67
+ AggregationFns: IfDefined<TAggregationFns, TGenerics['AggregationFns']>
68
+ }
69
+ >
70
+ >
71
+ createGroup: (
72
+ column: Overwrite<
73
+ | Overwrite<
74
+ ColumnDef<any>,
75
+ {
76
+ header: string
77
+ id?: string
78
+ }
79
+ >
80
+ | Overwrite<
81
+ ColumnDef<any>,
82
+ {
83
+ id: string
84
+ header?: string | ((...any: any) => any)
85
+ }
86
+ >,
87
+ {
88
+ accessorFn?: never
89
+ accessorKey?: never
90
+ columns?: ColumnDef<any>[]
91
+ }
92
+ >
93
+ ) => ColumnDef<TGenerics>
94
+ createDisplayColumn: (
95
+ column: Omit<ColumnDef<TGenerics>, 'columns'>
96
+ ) => ColumnDef<TGenerics>
97
+ createDataColumn: <
98
+ TAccessor extends AccessorFn<TGenerics['Row']> | keyof TGenerics['Row']
99
+ >(
100
+ accessor: TAccessor,
101
+ column: Overwrite<
102
+ TAccessor extends (...args: any[]) => any
103
+ ? // Accessor Fn
104
+ ColumnDef<Overwrite<TGenerics, { Value: ReturnType<TAccessor> }>>
105
+ : TAccessor extends keyof TGenerics['Row']
106
+ ? // Accessor Key
107
+ Overwrite<
108
+ ColumnDef<
109
+ Overwrite<TGenerics, { Value: TGenerics['Row'][TAccessor] }>
110
+ >,
111
+ {
112
+ id?: string
113
+ }
114
+ >
115
+ : never,
116
+ {
117
+ accessorFn?: never
118
+ accessorKey?: never
119
+ columns?: ColumnDef<any>[]
120
+ }
121
+ >
122
+ ) => ColumnDef<TGenerics>
123
+ createOptions: (options: TableOptions<TGenerics>) => TableOptions<TGenerics>
124
+ }
125
+
126
+ //
127
+
128
+ export function createTableFactory<TRenderer extends AnyRender>(opts: {
129
+ render: TRenderer
130
+ }): () => Table<{ Renderer: TRenderer; Rendered: ReturnType<TRenderer> }> {
131
+ return () => createTable(undefined, undefined, opts)
132
+ }
133
+
134
+ // A lot of returns in here are `as any` for a reason. Unless you
135
+ // can find a better way to do this, then don't worry about them
136
+ function createTable<TGenerics extends TableGenerics>(
137
+ _?: undefined,
138
+ __?: undefined,
139
+ options?: CreateTableOptions<any, any, any, any, TGenerics>
140
+ ): Table<TGenerics> {
141
+ const table: Table<TGenerics> = {
142
+ generics: undefined!,
143
+ options: options ?? {
144
+ render: (() => {
145
+ throw new Error('')
146
+ })(),
147
+ },
148
+ // setGenerics: () => table as any,
149
+ setRowType: () => table as any,
150
+ setTableMetaType: () => table as any,
151
+ setColumnMetaType: () => table as any,
152
+ setFilterMetaType: () => table as any,
153
+ setOptions: newOptions =>
154
+ createTable(_, __, {
155
+ ...options,
156
+ ...newOptions,
157
+ } as any),
158
+ createDisplayColumn: column => ({ ...column, columnDefType: 'display' }),
159
+ createGroup: column => ({ ...column, columnDefType: 'group' } as any),
160
+ createDataColumn: (accessor, column): any => {
161
+ column = {
162
+ ...column,
163
+ columnDefType: 'data',
164
+ id: column.id,
165
+ }
166
+
167
+ if (typeof accessor === 'string') {
168
+ return {
169
+ ...column,
170
+ id: column.id ?? accessor,
171
+ accessorKey: accessor,
172
+ }
173
+ }
174
+
175
+ if (typeof accessor === 'function') {
176
+ return {
177
+ ...column,
178
+ accessorFn: accessor,
179
+ }
180
+ }
181
+
182
+ throw new Error('Invalid accessor')
183
+ },
184
+ createOptions: options => options,
185
+ }
186
+
187
+ return table
188
+ }