@tanstack/table-core 8.1.4 → 8.2.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 (52) hide show
  1. package/build/cjs/aggregationFns.js.map +1 -1
  2. package/build/cjs/core/cell.js.map +1 -1
  3. package/build/cjs/core/column.js.map +1 -1
  4. package/build/cjs/core/headers.js.map +1 -1
  5. package/build/cjs/core/row.js.map +1 -1
  6. package/build/cjs/core/table.js +2 -2
  7. package/build/cjs/core/table.js.map +1 -1
  8. package/build/cjs/features/ColumnSizing.js.map +1 -1
  9. package/build/cjs/features/Filters.js.map +1 -1
  10. package/build/cjs/features/Grouping.js.map +1 -1
  11. package/build/cjs/features/Ordering.js.map +1 -1
  12. package/build/cjs/features/Pinning.js.map +1 -1
  13. package/build/cjs/features/Sorting.js +33 -26
  14. package/build/cjs/features/Sorting.js.map +1 -1
  15. package/build/cjs/features/Visibility.js.map +1 -1
  16. package/build/cjs/filterFns.js.map +1 -1
  17. package/build/cjs/sortingFns.js +6 -1
  18. package/build/cjs/sortingFns.js.map +1 -1
  19. package/build/cjs/utils/getCoreRowModel.js.map +1 -1
  20. package/build/cjs/utils/getFacetedMinMaxValues.js +1 -3
  21. package/build/cjs/utils/getFacetedMinMaxValues.js.map +1 -1
  22. package/build/cjs/utils/getGroupedRowModel.js +1 -1
  23. package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
  24. package/build/esm/index.js +43 -33
  25. package/build/esm/index.js.map +1 -1
  26. package/build/stats-html.html +1 -1
  27. package/build/stats-react.json +310 -310
  28. package/build/types/index.d.ts +94 -90
  29. package/build/umd/index.development.js +43 -33
  30. package/build/umd/index.development.js.map +1 -1
  31. package/build/umd/index.production.js +1 -1
  32. package/build/umd/index.production.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/aggregationFns.ts +8 -11
  35. package/src/core/cell.ts +14 -14
  36. package/src/core/column.ts +58 -47
  37. package/src/core/headers.ts +32 -32
  38. package/src/core/row.ts +9 -9
  39. package/src/core/table.ts +11 -10
  40. package/src/features/ColumnSizing.ts +5 -5
  41. package/src/features/Filters.ts +9 -14
  42. package/src/features/Grouping.ts +15 -10
  43. package/src/features/Ordering.ts +4 -2
  44. package/src/features/Pinning.ts +10 -10
  45. package/src/features/Sorting.ts +40 -29
  46. package/src/features/Visibility.ts +11 -11
  47. package/src/filterFns.ts +13 -7
  48. package/src/sortingFns.ts +7 -4
  49. package/src/types.ts +16 -12
  50. package/src/utils/getCoreRowModel.ts +1 -1
  51. package/src/utils/getFacetedMinMaxValues.ts +1 -1
  52. package/src/utils/getGroupedRowModel.ts +7 -1
@@ -9,14 +9,9 @@ import {
9
9
  Row,
10
10
  Updater,
11
11
  RowData,
12
+ FilterMeta,
12
13
  } from '../types'
13
- import {
14
- functionalUpdate,
15
- isFunction,
16
- makeStateUpdater,
17
- memo,
18
- Overwrite,
19
- } from '../utils'
14
+ import { functionalUpdate, isFunction, makeStateUpdater } from '../utils'
20
15
 
21
16
  export type FiltersTableState = {
22
17
  columnFilters: ColumnFiltersState
@@ -41,7 +36,7 @@ export type FilterFn<TData extends RowData> = {
41
36
  row: Row<TData>,
42
37
  columnId: string,
43
38
  filterValue: any,
44
- addMeta: (meta: any) => void
39
+ addMeta: (meta: FilterMeta) => void
45
40
  ): boolean
46
41
 
47
42
  resolveFilterValue?: TransformFilterValueFn<TData>
@@ -50,12 +45,12 @@ export type FilterFn<TData extends RowData> = {
50
45
 
51
46
  export type TransformFilterValueFn<TData extends RowData> = (
52
47
  value: any,
53
- column?: Column<TData>
48
+ column?: Column<TData, unknown>
54
49
  ) => unknown
55
50
 
56
51
  export type ColumnFilterAutoRemoveTestFn<TData extends RowData> = (
57
52
  value: any,
58
- column?: Column<TData>
53
+ column?: Column<TData, unknown>
59
54
  ) => boolean
60
55
 
61
56
  export type CustomFilterFns<TData extends RowData> = Record<
@@ -93,7 +88,7 @@ export type FiltersColumn<TData extends RowData> = {
93
88
 
94
89
  export type FiltersRow<TData extends RowData> = {
95
90
  columnFilters: Record<string, boolean>
96
- columnFiltersMeta: Record<string, any>
91
+ columnFiltersMeta: Record<string, FilterMeta>
97
92
  }
98
93
 
99
94
  export type FiltersOptions<TData extends RowData> = {
@@ -110,7 +105,7 @@ export type FiltersOptions<TData extends RowData> = {
110
105
  globalFilterFn?: FilterFnOption<TData>
111
106
  onGlobalFilterChange?: OnChangeFn<any>
112
107
  enableGlobalFilter?: boolean
113
- getColumnCanGlobalFilter?: (column: Column<TData>) => boolean
108
+ getColumnCanGlobalFilter?: (column: Column<TData, unknown>) => boolean
114
109
 
115
110
  // Faceting
116
111
  getFacetedRowModel?: (
@@ -189,7 +184,7 @@ export const Filters: TableFeature = {
189
184
  },
190
185
 
191
186
  createColumn: <TData extends RowData>(
192
- column: Column<TData>,
187
+ column: Column<TData, unknown>,
193
188
  table: Table<TData>
194
189
  ): FiltersColumn<TData> => {
195
190
  return {
@@ -451,7 +446,7 @@ export const Filters: TableFeature = {
451
446
  export function shouldAutoRemoveFilter<TData extends RowData>(
452
447
  filterFn?: FilterFn<TData>,
453
448
  value?: any,
454
- column?: Column<TData>
449
+ column?: Column<TData, unknown>
455
450
  ) {
456
451
  return (
457
452
  (filterFn && filterFn.autoRemove
@@ -33,9 +33,11 @@ export type AggregationFnOption<TData extends RowData> =
33
33
  | BuiltInAggregationFn
34
34
  | AggregationFn<TData>
35
35
 
36
- export type GroupingColumnDef<TData extends RowData> = {
36
+ export type GroupingColumnDef<TData extends RowData, TValue> = {
37
37
  aggregationFn?: AggregationFnOption<TData>
38
- aggregatedCell?: ColumnDefTemplate<ReturnType<Cell<TData>['getContext']>>
38
+ aggregatedCell?: ColumnDefTemplate<
39
+ ReturnType<Cell<TData, TValue>['getContext']>
40
+ >
39
41
  enableGrouping?: boolean
40
42
  }
41
43
 
@@ -51,7 +53,7 @@ export type GroupingColumn<TData extends RowData> = {
51
53
 
52
54
  export type GroupingRow = {
53
55
  groupingColumnId?: string
54
- groupingValue?: any
56
+ groupingValue?: unknown
55
57
  getIsGrouped: () => boolean
56
58
  _groupingValuesCache: Record<string, any>
57
59
  }
@@ -89,7 +91,10 @@ export type GroupingInstance<TData extends RowData> = {
89
91
  //
90
92
 
91
93
  export const Grouping: TableFeature = {
92
- getDefaultColumnDef: <TData extends RowData>(): GroupingColumnDef<TData> => {
94
+ getDefaultColumnDef: <TData extends RowData>(): GroupingColumnDef<
95
+ TData,
96
+ unknown
97
+ > => {
93
98
  return {
94
99
  aggregatedCell: props => (props.getValue() as any)?.toString?.() ?? null,
95
100
  aggregationFn: 'auto',
@@ -112,8 +117,8 @@ export const Grouping: TableFeature = {
112
117
  }
113
118
  },
114
119
 
115
- createColumn: <TData extends RowData>(
116
- column: Column<TData>,
120
+ createColumn: <TData extends RowData, TValue>(
121
+ column: Column<TData, TValue>,
117
122
  table: Table<TData>
118
123
  ): GroupingColumn<TData> => {
119
124
  return {
@@ -215,9 +220,9 @@ export const Grouping: TableFeature = {
215
220
  }
216
221
  },
217
222
 
218
- createCell: <TData extends RowData>(
219
- cell: Cell<TData>,
220
- column: Column<TData>,
223
+ createCell: <TData extends RowData, TValue>(
224
+ cell: Cell<TData, TValue>,
225
+ column: Column<TData, TValue>,
221
226
  row: Row<TData>,
222
227
  table: Table<TData>
223
228
  ): GroupingCell => {
@@ -237,7 +242,7 @@ export const Grouping: TableFeature = {
237
242
  }
238
243
 
239
244
  export function orderColumns<TData extends RowData>(
240
- leafColumns: Column<TData>[],
245
+ leafColumns: Column<TData, unknown>[],
241
246
  grouping: string[],
242
247
  groupedColumnMode?: GroupingColumnMode
243
248
  ) {
@@ -29,7 +29,9 @@ export type ColumnOrderDefaultOptions = {
29
29
  export type ColumnOrderInstance<TData extends RowData> = {
30
30
  setColumnOrder: (updater: Updater<ColumnOrderState>) => void
31
31
  resetColumnOrder: (defaultState?: boolean) => void
32
- _getOrderColumnsFn: () => (columns: Column<TData>[]) => Column<TData>[]
32
+ _getOrderColumnsFn: () => (
33
+ columns: Column<TData, unknown>[]
34
+ ) => Column<TData, unknown>[]
33
35
  }
34
36
 
35
37
  //
@@ -69,7 +71,7 @@ export const Ordering: TableFeature = {
69
71
  (columnOrder, grouping, groupedColumnMode) => columns => {
70
72
  // Sort grouped columns to the start of the column list
71
73
  // before the headers are built
72
- let orderedColumns: Column<TData>[] = []
74
+ let orderedColumns: Column<TData, unknown>[] = []
73
75
 
74
76
  // If there is no order, return the normal columns
75
77
  if (!columnOrder?.length) {
@@ -43,18 +43,18 @@ export type ColumnPinningColumn = {
43
43
  }
44
44
 
45
45
  export type ColumnPinningRow<TData extends RowData> = {
46
- getLeftVisibleCells: () => Cell<TData>[]
47
- getCenterVisibleCells: () => Cell<TData>[]
48
- getRightVisibleCells: () => Cell<TData>[]
46
+ getLeftVisibleCells: () => Cell<TData, unknown>[]
47
+ getCenterVisibleCells: () => Cell<TData, unknown>[]
48
+ getRightVisibleCells: () => Cell<TData, unknown>[]
49
49
  }
50
50
 
51
51
  export type ColumnPinningInstance<TData extends RowData> = {
52
52
  setColumnPinning: (updater: Updater<ColumnPinningState>) => void
53
53
  resetColumnPinning: (defaultState?: boolean) => void
54
54
  getIsSomeColumnsPinned: (position?: ColumnPinningPosition) => boolean
55
- getLeftLeafColumns: () => Column<TData>[]
56
- getRightLeafColumns: () => Column<TData>[]
57
- getCenterLeafColumns: () => Column<TData>[]
55
+ getLeftLeafColumns: () => Column<TData, unknown>[]
56
+ getRightLeafColumns: () => Column<TData, unknown>[]
57
+ getCenterLeafColumns: () => Column<TData, unknown>[]
58
58
  }
59
59
 
60
60
  //
@@ -80,8 +80,8 @@ export const Pinning: TableFeature = {
80
80
  }
81
81
  },
82
82
 
83
- createColumn: <TData extends RowData>(
84
- column: Column<TData>,
83
+ createColumn: <TData extends RowData, TValue>(
84
+ column: Column<TData, TValue>,
85
85
  table: Table<TData>
86
86
  ): ColumnPinningColumn => {
87
87
  return {
@@ -185,7 +185,7 @@ export const Pinning: TableFeature = {
185
185
  columnId => allCells.find(cell => cell.column.id === columnId)!
186
186
  )
187
187
  .filter(Boolean)
188
- .map(d => ({ ...d, position: 'left' } as Cell<TData>))
188
+ .map(d => ({ ...d, position: 'left' } as Cell<TData, unknown>))
189
189
 
190
190
  return cells
191
191
  },
@@ -203,7 +203,7 @@ export const Pinning: TableFeature = {
203
203
  columnId => allCells.find(cell => cell.column.id === columnId)!
204
204
  )
205
205
  .filter(Boolean)
206
- .map(d => ({ ...d, position: 'left' } as Cell<TData>))
206
+ .map(d => ({ ...d, position: 'left' } as Cell<TData, unknown>))
207
207
 
208
208
  return cells
209
209
  },
@@ -58,6 +58,7 @@ export type SortingColumn<TData extends RowData> = {
58
58
  getAutoSortingFn: () => SortingFn<TData>
59
59
  getAutoSortDir: () => SortDirection
60
60
  getSortingFn: () => SortingFn<TData>
61
+ getFirstSortDir: () => SortDirection
61
62
  getNextSortingOrder: () => SortDirection | false
62
63
  getCanSort: () => boolean
63
64
  getCanMultiSort: () => boolean
@@ -116,8 +117,8 @@ export const Sorting: TableFeature = {
116
117
  }
117
118
  },
118
119
 
119
- createColumn: <TData extends RowData>(
120
- column: Column<TData>,
120
+ createColumn: <TData extends RowData, TValue>(
121
+ column: Column<TData, TValue>,
121
122
  table: Table<TData>
122
123
  ): SortingColumn<TData> => {
123
124
  return {
@@ -184,19 +185,21 @@ export const Sorting: TableFeature = {
184
185
 
185
186
  // this needs to be outside of table.setSorting to be in sync with rerender
186
187
  const nextSortingOrder = column.getNextSortingOrder()
188
+ const hasManualValue = typeof desc !== 'undefined' && desc !== null
187
189
 
188
190
  table.setSorting(old => {
189
191
  // Find any existing sorting for this column
190
192
  const existingSorting = old?.find(d => d.id === column.id)
191
193
  const existingIndex = old?.findIndex(d => d.id === column.id)
192
- const hasDescDefined = typeof desc !== 'undefined' && desc !== null
193
194
 
194
195
  let newSorting: SortingState = []
195
196
 
196
197
  // What should we do with this sort action?
197
198
  let sortAction: 'add' | 'remove' | 'toggle' | 'replace'
199
+ let nextDesc = hasManualValue ? desc : nextSortingOrder === 'desc'
198
200
 
199
- if (column.getCanMultiSort() && multi) {
201
+ // Multi-mode
202
+ if (old?.length && column.getCanMultiSort() && multi) {
200
203
  if (existingSorting) {
201
204
  sortAction = 'toggle'
202
205
  } else {
@@ -214,29 +217,22 @@ export const Sorting: TableFeature = {
214
217
  }
215
218
 
216
219
  // Handle toggle states that will remove the sorting
217
- if (
218
- sortAction === 'toggle' && // Must be toggling
219
- (table.options.enableSortingRemoval ?? true) && // If enableSortRemove, enable in general
220
- !hasDescDefined && // Must not be setting desc
221
- (multi ? table.options.enableMultiRemove ?? true : true) && // If multi, don't allow if enableMultiRemove
222
- !nextSortingOrder // Finally, detect if it should indeed be removed
223
- ) {
224
- sortAction = 'remove'
220
+ if (sortAction === 'toggle') {
221
+ // If we are "actually" toggling (not a manual set value), should we remove the sorting?
222
+ if (!hasManualValue) {
223
+ // Is our intention to remove?
224
+ if (!nextSortingOrder) {
225
+ sortAction = 'remove'
226
+ }
227
+ }
225
228
  }
226
229
 
227
- if (sortAction === 'replace') {
228
- newSorting = [
229
- {
230
- id: column.id,
231
- desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',
232
- },
233
- ]
234
- } else if (sortAction === 'add' && old?.length) {
230
+ if (sortAction === 'add') {
235
231
  newSorting = [
236
232
  ...old,
237
233
  {
238
234
  id: column.id,
239
- desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',
235
+ desc: nextDesc,
240
236
  },
241
237
  ]
242
238
  // Take latest n columns
@@ -245,41 +241,56 @@ export const Sorting: TableFeature = {
245
241
  newSorting.length -
246
242
  (table.options.maxMultiSortColCount ?? Number.MAX_SAFE_INTEGER)
247
243
  )
248
- } else if (sortAction === 'toggle' && old?.length) {
244
+ } else if (sortAction === 'toggle') {
249
245
  // This flips (or sets) the
250
246
  newSorting = old.map(d => {
251
247
  if (d.id === column.id) {
252
248
  return {
253
249
  ...d,
254
- desc: hasDescDefined ? desc! : nextSortingOrder! === 'desc',
250
+ desc: nextDesc,
255
251
  }
256
252
  }
257
253
  return d
258
254
  })
259
- } else if (sortAction === 'remove' && old?.length) {
255
+ } else if (sortAction === 'remove') {
260
256
  newSorting = old.filter(d => d.id !== column.id)
257
+ } else {
258
+ newSorting = [
259
+ {
260
+ id: column.id,
261
+ desc: nextDesc,
262
+ },
263
+ ]
261
264
  }
262
265
 
263
266
  return newSorting
264
267
  })
265
268
  },
266
269
 
267
- getNextSortingOrder: () => {
270
+ getFirstSortDir: () => {
268
271
  const sortDescFirst =
269
272
  column.columnDef.sortDescFirst ??
270
273
  table.options.sortDescFirst ??
271
274
  column.getAutoSortDir() === 'desc'
272
- const firstSortDirection = sortDescFirst ? 'desc' : 'asc'
275
+ return sortDescFirst ? 'desc' : 'asc'
276
+ },
273
277
 
278
+ getNextSortingOrder: (multi?: boolean) => {
279
+ const firstSortDirection = column.getFirstSortDir()
274
280
  const isSorted = column.getIsSorted()
281
+
275
282
  if (!isSorted) {
276
283
  return firstSortDirection
277
284
  }
278
- if (isSorted === firstSortDirection) {
279
- return isSorted === 'desc' ? 'asc' : 'desc'
280
- } else {
285
+
286
+ if (
287
+ isSorted !== firstSortDirection &&
288
+ (table.options.enableSortingRemoval ?? true) && // If enableSortRemove, enable in general
289
+ (multi ? table.options.enableMultiRemove ?? true : true) // If multi, don't allow if enableMultiRemove))
290
+ ) {
281
291
  return false
282
292
  }
293
+ return isSorted === 'desc' ? 'asc' : 'desc'
283
294
  },
284
295
 
285
296
  getCanSort: () => {
@@ -27,11 +27,11 @@ export type VisibilityDefaultOptions = {
27
27
  }
28
28
 
29
29
  export type VisibilityInstance<TData extends RowData> = {
30
- getVisibleFlatColumns: () => Column<TData>[]
31
- getVisibleLeafColumns: () => Column<TData>[]
32
- getLeftVisibleLeafColumns: () => Column<TData>[]
33
- getRightVisibleLeafColumns: () => Column<TData>[]
34
- getCenterVisibleLeafColumns: () => Column<TData>[]
30
+ getVisibleFlatColumns: () => Column<TData, unknown>[]
31
+ getVisibleLeafColumns: () => Column<TData, unknown>[]
32
+ getLeftVisibleLeafColumns: () => Column<TData, unknown>[]
33
+ getRightVisibleLeafColumns: () => Column<TData, unknown>[]
34
+ getCenterVisibleLeafColumns: () => Column<TData, unknown>[]
35
35
  setColumnVisibility: (updater: Updater<VisibilityState>) => void
36
36
  resetColumnVisibility: (defaultState?: boolean) => void
37
37
  toggleAllColumnsVisible: (value?: boolean) => void
@@ -45,8 +45,8 @@ export type VisibilityColumnDef = {
45
45
  }
46
46
 
47
47
  export type VisibilityRow<TData extends RowData> = {
48
- _getAllVisibleCells: () => Cell<TData>[]
49
- getVisibleCells: () => Cell<TData>[]
48
+ _getAllVisibleCells: () => Cell<TData, unknown>[]
49
+ getVisibleCells: () => Cell<TData, unknown>[]
50
50
  }
51
51
 
52
52
  export type VisibilityColumn = {
@@ -74,8 +74,8 @@ export const Visibility: TableFeature = {
74
74
  }
75
75
  },
76
76
 
77
- createColumn: <TData extends RowData>(
78
- column: Column<TData>,
77
+ createColumn: <TData extends RowData, TValue>(
78
+ column: Column<TData, TValue>,
79
79
  table: Table<TData>
80
80
  ): VisibilityColumn => {
81
81
  return {
@@ -143,8 +143,8 @@ export const Visibility: TableFeature = {
143
143
  ): VisibilityInstance<TData> => {
144
144
  const makeVisibleColumnsMethod = (
145
145
  key: string,
146
- getColumns: () => Column<TData>[]
147
- ): (() => Column<TData>[]) => {
146
+ getColumns: () => Column<TData, unknown>[]
147
+ ): (() => Column<TData, unknown>[]) => {
148
148
  return memo(
149
149
  () => [
150
150
  getColumns(),
package/src/filterFns.ts CHANGED
@@ -6,7 +6,7 @@ const includesString: FilterFn<any> = (
6
6
  filterValue: string
7
7
  ) => {
8
8
  const search = filterValue.toLowerCase()
9
- return row.getValue(columnId)?.toLowerCase().includes(search)
9
+ return row.getValue<string>(columnId)?.toLowerCase().includes(search)
10
10
  }
11
11
 
12
12
  includesString.autoRemove = (val: any) => testFalsey(val)
@@ -16,7 +16,7 @@ const includesStringSensitive: FilterFn<any> = (
16
16
  columnId: string,
17
17
  filterValue: string
18
18
  ) => {
19
- return row.getValue(columnId)?.includes(filterValue)
19
+ return row.getValue<string>(columnId)?.includes(filterValue)
20
20
  }
21
21
 
22
22
  includesStringSensitive.autoRemove = (val: any) => testFalsey(val)
@@ -26,7 +26,9 @@ const equalsString: FilterFn<any> = (
26
26
  columnId: string,
27
27
  filterValue: string
28
28
  ) => {
29
- return row.getValue(columnId)?.toLowerCase() === filterValue.toLowerCase()
29
+ return (
30
+ row.getValue<string>(columnId)?.toLowerCase() === filterValue.toLowerCase()
31
+ )
30
32
  }
31
33
 
32
34
  equalsString.autoRemove = (val: any) => testFalsey(val)
@@ -36,7 +38,7 @@ const arrIncludes: FilterFn<any> = (
36
38
  columnId: string,
37
39
  filterValue: unknown
38
40
  ) => {
39
- return row.getValue(columnId)?.includes(filterValue)
41
+ return row.getValue<unknown[]>(columnId)?.includes(filterValue)
40
42
  }
41
43
 
42
44
  arrIncludes.autoRemove = (val: any) => testFalsey(val) || !val?.length
@@ -46,7 +48,9 @@ const arrIncludesAll: FilterFn<any> = (
46
48
  columnId: string,
47
49
  filterValue: unknown[]
48
50
  ) => {
49
- return !filterValue.some(val => !row.getValue(columnId)?.includes(val))
51
+ return !filterValue.some(
52
+ val => !row.getValue<unknown[]>(columnId)?.includes(val)
53
+ )
50
54
  }
51
55
 
52
56
  arrIncludesAll.autoRemove = (val: any) => testFalsey(val) || !val?.length
@@ -56,7 +60,9 @@ const arrIncludesSome: FilterFn<any> = (
56
60
  columnId: string,
57
61
  filterValue: unknown[]
58
62
  ) => {
59
- return filterValue.some(val => row.getValue(columnId)?.includes(val))
63
+ return filterValue.some(val =>
64
+ row.getValue<unknown[]>(columnId)?.includes(val)
65
+ )
60
66
  }
61
67
 
62
68
  arrIncludesSome.autoRemove = (val: any) => testFalsey(val) || !val?.length
@@ -84,7 +90,7 @@ const inNumberRange: FilterFn<any> = (
84
90
  ) => {
85
91
  let [min, max] = filterValue
86
92
 
87
- const rowValue = row.getValue(columnId)
93
+ const rowValue = row.getValue<number>(columnId)
88
94
  return rowValue >= min && rowValue <= max
89
95
  }
90
96
 
package/src/sortingFns.ts CHANGED
@@ -35,10 +35,13 @@ const textCaseSensitive: SortingFn<any> = (rowA, rowB, columnId) => {
35
35
  }
36
36
 
37
37
  const datetime: SortingFn<any> = (rowA, rowB, columnId) => {
38
- return compareBasic(
39
- (rowA.getValue(columnId) as Date).getTime(),
40
- (rowB.getValue(columnId) as Date).getTime()
41
- )
38
+ const a = rowA.getValue<Date>(columnId)
39
+ const b = rowB.getValue<Date>(columnId)
40
+
41
+ // Can handle nullish values
42
+ // Use > and < because == (and ===) doesn't work with
43
+ // Date objects (would require calling getTime()).
44
+ return a > b ? 1 : a < b ? -1 : 0
42
45
  }
43
46
 
44
47
  const basic: SortingFn<any> = (rowA, rowB, columnId) => {
package/src/types.ts CHANGED
@@ -77,10 +77,14 @@ import { CoreRow } from './core/row'
77
77
  import { PartialKeys } from './utils'
78
78
  import { CoreCell } from './core/cell'
79
79
 
80
+ export interface TableMeta {}
81
+ export interface ColumnMeta {}
82
+ export interface FilterMeta {}
83
+
80
84
  export type Updater<T> = T | ((old: T) => T)
81
85
  export type OnChangeFn<T> = (updaterOrValue: Updater<T>) => void
82
86
 
83
- export type RowData = object | any[]
87
+ export type RowData = unknown | object | any[]
84
88
 
85
89
  export type TableGenerics = {
86
90
  Row?: any
@@ -155,34 +159,33 @@ export type Row<TData extends RowData> = CoreRow<TData> &
155
159
  RowSelectionRow &
156
160
  ExpandedRow
157
161
 
158
- export type RowValues = {
159
- [key: string]: any
160
- }
161
-
162
162
  export type RowModel<TData extends RowData> = {
163
163
  rows: Row<TData>[]
164
164
  flatRows: Row<TData>[]
165
165
  rowsById: Record<string, Row<TData>>
166
166
  }
167
167
 
168
- export type AccessorFn<TData extends RowData> = (
168
+ export type AccessorFn<TData extends RowData, TValue = unknown> = (
169
169
  originalRow: TData,
170
170
  index: number
171
- ) => any
171
+ ) => TValue
172
172
 
173
173
  export type ColumnDefTemplate<TProps extends object> =
174
174
  | string
175
175
  | ((props: TProps) => any)
176
176
 
177
- export type ColumnDef<TData extends RowData> = CoreColumnDef<TData> &
177
+ export type ColumnDef<
178
+ TData extends RowData,
179
+ TValue extends any = unknown
180
+ > = CoreColumnDef<TData, TValue> &
178
181
  VisibilityColumnDef &
179
182
  ColumnPinningColumnDef &
180
183
  FiltersColumnDef<TData> &
181
184
  SortingColumnDef<TData> &
182
- GroupingColumnDef<TData> &
185
+ GroupingColumnDef<TData, TValue> &
183
186
  ColumnSizingColumnDef
184
187
 
185
- export type Column<TData extends RowData> = CoreColumn<TData> &
188
+ export type Column<TData extends RowData, TValue> = CoreColumn<TData, TValue> &
186
189
  ColumnVisibilityColumn &
187
190
  ColumnPinningColumn &
188
191
  FiltersColumn<TData> &
@@ -190,9 +193,10 @@ export type Column<TData extends RowData> = CoreColumn<TData> &
190
193
  GroupingColumn<TData> &
191
194
  ColumnSizingColumn
192
195
 
193
- export type Cell<TData extends RowData> = CoreCell<TData> & GroupingCell
196
+ export type Cell<TData extends RowData, TValue> = CoreCell<TData, TValue> &
197
+ GroupingCell
194
198
 
195
- export type Header<TData extends RowData> = CoreHeader<TData> &
199
+ export type Header<TData extends RowData, TValue> = CoreHeader<TData, TValue> &
196
200
  ColumnSizingHeader
197
201
 
198
202
  export type HeaderGroup<TData extends RowData> = CoreHeaderGroup<TData>
@@ -40,7 +40,7 @@ export function getCoreRowModel<TData extends RowData>(): (
40
40
  const row = createRow(
41
41
  table,
42
42
  table._getRowId(originalRows[i]!, i, parent),
43
- originalRows[i],
43
+ originalRows[i]!,
44
44
  i,
45
45
  depth
46
46
  )
@@ -18,7 +18,7 @@ export function getFacetedMinMaxValues<TData extends RowData>(): (
18
18
  let facetedMinMaxValues: [any, any] = [firstValue, firstValue]
19
19
 
20
20
  for (let i = 0; i < facetedRowModel.flatRows.length; i++) {
21
- const value = facetedRowModel.flatRows[i]?.getValue(columnId)
21
+ const value = facetedRowModel.flatRows[i]!.getValue<number>(columnId)
22
22
 
23
23
  if (value < facetedMinMaxValues[0]) {
24
24
  facetedMinMaxValues[0] = value
@@ -55,7 +55,13 @@ export function getGroupedRowModel<TData extends RowData>(): (
55
55
  ? flattenBy(groupedRows, row => row.subRows)
56
56
  : groupedRows
57
57
 
58
- const row = createRow(table, id, undefined, index, depth)
58
+ const row = createRow(
59
+ table,
60
+ id,
61
+ leafRows[0]!.original,
62
+ index,
63
+ depth
64
+ )
59
65
 
60
66
  Object.assign(row, {
61
67
  groupingColumnId: columnId,