@tanstack/table-core 8.5.1 → 8.5.4

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tanstack/table-core",
3
3
  "author": "Tanner Linsley",
4
- "version": "8.5.1",
4
+ "version": "8.5.4",
5
5
  "description": "Headless UI for building powerful tables & datagrids for TS/JS.",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/tanstack/table#readme",
@@ -1,4 +1,11 @@
1
- import { AccessorFn, ColumnDef, RowData } from './types'
1
+ import {
2
+ AccessorFn,
3
+ ColumnDef,
4
+ DisplayColumnDef,
5
+ GroupColumnDef,
6
+ IdentifiedColumnDef,
7
+ RowData,
8
+ } from './types'
2
9
  import { DeepKeys, DeepValue, RequiredKeys } from './utils'
3
10
 
4
11
  // type Person = {
@@ -51,20 +58,12 @@ export type ColumnHelper<TData extends RowData> = {
51
58
  : never
52
59
  >(
53
60
  accessor: TAccessor,
54
- column: Omit<ColumnDef<TData, TValue>, 'accessorKey'>
61
+ column: TAccessor extends AccessorFn<TData>
62
+ ? DisplayColumnDef<TData, TValue>
63
+ : IdentifiedColumnDef<TData, TValue>
55
64
  ) => ColumnDef<TData, TValue>
56
- display: (
57
- column: RequiredKeys<
58
- Omit<ColumnDef<TData, unknown>, 'accessorKey' | 'accessorFn'>,
59
- 'id'
60
- >
61
- ) => ColumnDef<TData, unknown>
62
- group: (
63
- column: RequiredKeys<
64
- Omit<ColumnDef<TData, unknown>, 'accessorKey' | 'accessorFn'>,
65
- 'id' | 'columns'
66
- >
67
- ) => ColumnDef<TData, unknown>
65
+ display: (column: DisplayColumnDef<TData>) => ColumnDef<TData, unknown>
66
+ group: (column: GroupColumnDef<TData>) => ColumnDef<TData, unknown>
68
67
  }
69
68
 
70
69
  export function createColumnHelper<
@@ -1,3 +1,4 @@
1
+ import { TaggedTemplateExpression } from '@babel/types'
1
2
  import {
2
3
  Column,
3
4
  Table,
@@ -6,62 +7,9 @@ import {
6
7
  ColumnDefTemplate,
7
8
  RowData,
8
9
  ColumnMeta,
10
+ ColumnDefResolved,
9
11
  } from '../types'
10
- import { DeepKeys, IsKnown, memo, UnionToIntersection } from '../utils'
11
- import { CellContext } from './cell'
12
- import { HeaderContext } from './headers'
13
-
14
- export type CoreColumnDefBase<TData extends RowData, TValue> = {
15
- columns?: ColumnDef<TData, unknown>[]
16
- header?: ColumnDefTemplate<HeaderContext<TData, TValue>>
17
- footer?: ColumnDefTemplate<HeaderContext<TData, TValue>>
18
- cell?: ColumnDefTemplate<CellContext<TData, TValue>>
19
- meta?: ColumnMeta<TData, TValue>
20
- }
21
-
22
- export type CoreColumnDefDisplay<
23
- TData extends RowData,
24
- TValue
25
- > = CoreColumnDefBase<TData, TValue> & {
26
- id: string
27
- }
28
-
29
- export type CoreColumnDefDisplayWithStringHeader<
30
- TData extends RowData,
31
- TValue
32
- > = CoreColumnDefBase<TData, TValue> & {
33
- header: string
34
- id?: string
35
- }
36
-
37
- export type CoreColumnDefAccessorFn<
38
- TData extends RowData,
39
- TValue
40
- > = CoreColumnDefBase<TData, TValue> & {
41
- accessorFn: AccessorFn<TData, TValue>
42
- id: string
43
- }
44
-
45
- export type CoreColumnDefAccessorKey<
46
- TData extends RowData,
47
- TValue
48
- > = CoreColumnDefBase<TData, TValue> & {
49
- accessorKey: DeepKeys<TData>
50
- id?: string
51
- }
52
-
53
- export type CoreColumnDef<TData extends RowData, TValue> =
54
- | CoreColumnDefDisplay<TData, TValue>
55
- | CoreColumnDefDisplayWithStringHeader<TData, TValue>
56
- | CoreColumnDefAccessorFn<TData, TValue>
57
- | CoreColumnDefAccessorKey<TData, TValue>
58
-
59
- export type CoreColumnDefResolved<
60
- TData extends RowData,
61
- TValue = unknown
62
- > = Partial<UnionToIntersection<CoreColumnDef<TData, TValue>>> & {
63
- accessorKey?: string
64
- }
12
+ import { memo } from '../utils'
65
13
 
66
14
  export type CoreColumn<TData extends RowData, TValue> = {
67
15
  id: string
@@ -85,7 +33,7 @@ export function createColumn<TData extends RowData, TValue>(
85
33
  const resolvedColumnDef = {
86
34
  ...defaultColumn,
87
35
  ...columnDef,
88
- } as CoreColumnDefResolved<TData>
36
+ } as ColumnDefResolved<TData>
89
37
 
90
38
  const accessorKey = resolvedColumnDef.accessorKey
91
39
 
package/src/core/table.ts CHANGED
@@ -14,6 +14,8 @@ import {
14
14
  TableOptions,
15
15
  RowData,
16
16
  TableMeta,
17
+ ColumnDefResolved,
18
+ GroupColumnDef,
17
19
  } from '../types'
18
20
 
19
21
  //
@@ -24,7 +26,7 @@ import { Headers } from './headers'
24
26
  import { ColumnSizing } from '../features/ColumnSizing'
25
27
  import { Expanding } from '../features/Expanding'
26
28
  import { Filters } from '../features/Filters'
27
- import { Grouping } from '../features/Grouping'
29
+ import { Grouping, GroupingColumnDef } from '../features/Grouping'
28
30
  import { Ordering } from '../features/Ordering'
29
31
  import { Pagination } from '../features/Pagination'
30
32
  import { Pinning } from '../features/Pinning'
@@ -232,8 +234,21 @@ export function createTable<TData extends RowData>(
232
234
  >
233
235
 
234
236
  return {
235
- header: props => props.header.column.id,
236
- footer: props => props.header.column.id,
237
+ header: props => {
238
+ const resolvedColumnDef = props.header.column
239
+ .columnDef as ColumnDefResolved<TData>
240
+
241
+ if (resolvedColumnDef.accessorKey) {
242
+ return resolvedColumnDef.accessorKey
243
+ }
244
+
245
+ if (resolvedColumnDef.accessorFn) {
246
+ return resolvedColumnDef.id
247
+ }
248
+
249
+ return null
250
+ },
251
+ // footer: props => props.header.column.id,
237
252
  cell: props => props.renderValue<any>()?.toString?.() ?? null,
238
253
  ...table._features.reduce((obj, feature) => {
239
254
  return Object.assign(obj, feature.getDefaultColumnDef?.())
@@ -260,8 +275,13 @@ export function createTable<TData extends RowData>(
260
275
  return columnDefs.map(columnDef => {
261
276
  const column = createColumn(table, columnDef, depth, parent)
262
277
 
263
- column.columns = columnDef.columns
264
- ? recurseColumns(columnDef.columns, column, depth + 1)
278
+ const groupingColumnDef = columnDef as GroupColumnDef<
279
+ TData,
280
+ unknown
281
+ >
282
+
283
+ column.columns = groupingColumnDef.columns
284
+ ? recurseColumns(groupingColumnDef.columns, column, depth + 1)
265
285
  : []
266
286
 
267
287
  return column
@@ -267,16 +267,16 @@ export const RowSelection: TableFeature = {
267
267
  // },
268
268
 
269
269
  getIsAllRowsSelected: () => {
270
- const preFilteredFlatRows = table.getPreFilteredRowModel().flatRows
270
+ const preGroupedFlatRows = table.getFilteredRowModel().flatRows
271
271
  const { rowSelection } = table.getState()
272
272
 
273
273
  let isAllRowsSelected = Boolean(
274
- preFilteredFlatRows.length && Object.keys(rowSelection).length
274
+ preGroupedFlatRows.length && Object.keys(rowSelection).length
275
275
  )
276
276
 
277
277
  if (isAllRowsSelected) {
278
278
  if (
279
- preFilteredFlatRows.some(
279
+ preGroupedFlatRows.some(
280
280
  row => row.getCanSelect() && !rowSelection[row.id]
281
281
  )
282
282
  ) {
@@ -309,7 +309,7 @@ export const RowSelection: TableFeature = {
309
309
  ).length
310
310
  return (
311
311
  totalSelected > 0 &&
312
- totalSelected < table.getCoreRowModel().flatRows.length
312
+ totalSelected < table.getFilteredRowModel().flatRows.length
313
313
  )
314
314
  },
315
315
 
package/src/types.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { CoreOptions, CoreTableState, CoreInstance } from './core/table'
2
- import { CoreColumn, CoreColumnDef } from './core/column'
3
2
  import {
4
3
  VisibilityInstance,
5
4
  VisibilityTableState,
@@ -21,7 +20,12 @@ import {
21
20
  ColumnPinningRow,
22
21
  ColumnPinningTableState,
23
22
  } from './features/Pinning'
24
- import { CoreHeader, CoreHeaderGroup, HeadersInstance } from './core/headers'
23
+ import {
24
+ CoreHeader,
25
+ CoreHeaderGroup,
26
+ HeaderContext,
27
+ HeadersInstance,
28
+ } from './core/headers'
25
29
  import {
26
30
  FilterFn,
27
31
  FiltersColumn,
@@ -75,8 +79,9 @@ import {
75
79
  RowSelectionTableState,
76
80
  } from './features/RowSelection'
77
81
  import { CoreRow } from './core/row'
78
- import { PartialKeys } from './utils'
79
- import { CoreCell } from './core/cell'
82
+ import { DeepKeys, PartialKeys, UnionToIntersection } from './utils'
83
+ import { CellContext, CoreCell } from './core/cell'
84
+ import { CoreColumn } from './core/column'
80
85
 
81
86
  export interface TableMeta<TData extends RowData> {}
82
87
  export interface ColumnMeta<TData extends RowData, TValue> {}
@@ -171,18 +176,97 @@ export type ColumnDefTemplate<TProps extends object> =
171
176
  | string
172
177
  | ((props: TProps) => any)
173
178
 
174
- export type ColumnDef<
175
- TData extends RowData,
176
- TValue extends any = unknown
177
- > = CoreColumnDef<TData, TValue> &
178
- VisibilityColumnDef &
179
+ export type StringOrTemplateHeader<TData, TValue> =
180
+ | string
181
+ | ColumnDefTemplate<HeaderContext<TData, TValue>>
182
+
183
+ type StringHeaderIdentifier = {
184
+ header: string
185
+ id?: string
186
+ }
187
+
188
+ type IdIdentifier<TData extends RowData, TValue> = {
189
+ id: string
190
+ header?: StringOrTemplateHeader<TData, TValue>
191
+ }
192
+
193
+ type ColumnIdentifiers<TData extends RowData, TValue> =
194
+ | IdIdentifier<TData, TValue>
195
+ | StringHeaderIdentifier
196
+
197
+ //
198
+
199
+ export type ColumnDefBase<TData extends RowData, TValue = unknown> = {
200
+ footer?: ColumnDefTemplate<HeaderContext<TData, TValue>>
201
+ cell?: ColumnDefTemplate<CellContext<TData, TValue>>
202
+ meta?: ColumnMeta<TData, TValue>
203
+ } & VisibilityColumnDef &
179
204
  ColumnPinningColumnDef &
180
205
  FiltersColumnDef<TData> &
181
206
  SortingColumnDef<TData> &
182
207
  GroupingColumnDef<TData, TValue> &
183
208
  ColumnSizingColumnDef
184
209
 
185
- export type Column<TData extends RowData, TValue> = CoreColumn<TData, TValue> &
210
+ //
211
+
212
+ export type IdentifiedColumnDef<
213
+ TData extends RowData,
214
+ TValue = unknown
215
+ > = ColumnDefBase<TData, TValue> & {
216
+ id?: string
217
+ header?: StringOrTemplateHeader<TData, TValue>
218
+ }
219
+
220
+ export type DisplayColumnDef<
221
+ TData extends RowData,
222
+ TValue = unknown
223
+ > = ColumnDefBase<TData, TValue> & ColumnIdentifiers<TData, TValue>
224
+
225
+ export type GroupColumnDef<
226
+ TData extends RowData,
227
+ TValue = unknown
228
+ > = ColumnDefBase<TData, TValue> &
229
+ ColumnIdentifiers<TData, TValue> & {
230
+ columns?: ColumnDef<TData, any>[]
231
+ }
232
+
233
+ export type AccessorFnColumnDef<
234
+ TData extends RowData,
235
+ TValue = unknown
236
+ > = ColumnDefBase<TData, TValue> &
237
+ ColumnIdentifiers<TData, TValue> & {
238
+ accessorFn: AccessorFn<TData, TValue>
239
+ }
240
+
241
+ export type AccessorKeyColumnDef<TData extends RowData, TValue = unknown> = {
242
+ id?: string
243
+ } & ColumnIdentifiers<TData, TValue> &
244
+ ColumnDefBase<TData, TValue> & {
245
+ accessorKey: DeepKeys<TData>
246
+ }
247
+
248
+ export type AccessorColumnDef<TData extends RowData, TValue = unknown> =
249
+ | AccessorKeyColumnDef<TData, TValue>
250
+ | AccessorFnColumnDef<TData, TValue>
251
+
252
+ //
253
+
254
+ export type ColumnDef<TData extends RowData, TValue = unknown> =
255
+ | DisplayColumnDef<TData, TValue>
256
+ | GroupColumnDef<TData, TValue>
257
+ | AccessorColumnDef<TData, TValue>
258
+
259
+ export type ColumnDefResolved<
260
+ TData extends RowData,
261
+ TValue = unknown
262
+ > = Partial<UnionToIntersection<ColumnDef<TData, TValue>>> & {
263
+ accessorKey?: string
264
+ }
265
+
266
+ export type Column<TData extends RowData, TValue = unknown> = CoreColumn<
267
+ TData,
268
+ TValue
269
+ > &
186
270
  ColumnVisibilityColumn &
187
271
  ColumnPinningColumn &
188
272
  FiltersColumn<TData> &