@tanstack/table-core 8.0.0-alpha.83 → 8.0.0-alpha.86
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/build/cjs/aggregationFns.js +50 -51
- package/build/cjs/aggregationFns.js.map +1 -1
- package/build/cjs/core/cell.js +38 -0
- package/build/cjs/core/cell.js.map +1 -0
- package/build/cjs/core/column.js +88 -0
- package/build/cjs/core/column.js.map +1 -0
- package/build/cjs/{features/Headers.js → core/headers.js} +54 -66
- package/build/cjs/core/headers.js.map +1 -0
- package/build/cjs/core/instance.js +255 -0
- package/build/cjs/core/instance.js.map +1 -0
- package/build/cjs/core/row.js +77 -0
- package/build/cjs/core/row.js.map +1 -0
- package/build/cjs/features/ColumnSizing.js.map +1 -1
- package/build/cjs/features/Expanding.js +0 -1
- package/build/cjs/features/Expanding.js.map +1 -1
- package/build/cjs/features/Filters.js +2 -3
- package/build/cjs/features/Filters.js.map +1 -1
- package/build/cjs/features/Grouping.js +5 -5
- package/build/cjs/features/Grouping.js.map +1 -1
- package/build/cjs/features/Ordering.js.map +1 -1
- package/build/cjs/features/Pagination.js.map +1 -1
- package/build/cjs/features/Pinning.js +3 -3
- package/build/cjs/features/Pinning.js.map +1 -1
- package/build/cjs/features/RowSelection.js.map +1 -1
- package/build/cjs/features/Sorting.js.map +1 -1
- package/build/cjs/features/Visibility.js +0 -5
- package/build/cjs/features/Visibility.js.map +1 -1
- package/build/cjs/index.js +9 -6
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/utils/filterRowsUtils.js +23 -21
- package/build/cjs/utils/filterRowsUtils.js.map +1 -1
- package/build/cjs/utils/getCoreRowModel.js +9 -8
- package/build/cjs/utils/getCoreRowModel.js.map +1 -1
- package/build/cjs/utils/getExpandedRowModel.js +2 -2
- package/build/cjs/utils/getExpandedRowModel.js.map +1 -1
- package/build/cjs/utils/getGroupedRowModel.js +13 -20
- package/build/cjs/utils/getGroupedRowModel.js.map +1 -1
- package/build/cjs/utils/getPaginationRowModel.js +1 -1
- package/build/cjs/utils/getPaginationRowModel.js.map +1 -1
- package/build/esm/index.js +718 -838
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +403 -380
- package/build/types/aggregationFns.d.ts +10 -19
- package/build/types/core/cell.d.ts +9 -0
- package/build/types/{features/Columns.d.ts → core/column.d.ts} +3 -17
- package/build/types/{features/Headers.d.ts → core/headers.d.ts} +26 -11
- package/build/types/core/instance.d.ts +57 -0
- package/build/types/core/row.d.ts +15 -0
- package/build/types/features/ColumnSizing.d.ts +2 -1
- package/build/types/features/Expanding.d.ts +2 -2
- package/build/types/features/Filters.d.ts +2 -3
- package/build/types/features/Grouping.d.ts +8 -9
- package/build/types/features/Ordering.d.ts +2 -1
- package/build/types/features/Pagination.d.ts +2 -1
- package/build/types/features/Pinning.d.ts +2 -1
- package/build/types/features/RowSelection.d.ts +2 -1
- package/build/types/features/Sorting.d.ts +2 -1
- package/build/types/features/Visibility.d.ts +7 -7
- package/build/types/index.d.ts +4 -2
- package/build/types/sortingFns.d.ts +4 -4
- package/build/types/types.d.ts +10 -53
- package/build/umd/index.development.js +721 -836
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +1 -1
- package/build/umd/index.production.js.map +1 -1
- package/package.json +1 -1
- package/src/aggregationFns.ts +44 -40
- package/src/core/cell.ts +47 -0
- package/src/core/column.ts +148 -0
- package/src/{features/Headers.ts → core/headers.ts} +98 -99
- package/src/core/instance.ts +361 -0
- package/src/core/row.ts +85 -0
- package/src/features/ColumnSizing.ts +1 -1
- package/src/features/Expanding.ts +1 -4
- package/src/features/Filters.ts +2 -7
- package/src/features/Grouping.ts +16 -19
- package/src/features/Ordering.ts +1 -1
- package/src/features/Pagination.ts +1 -1
- package/src/features/Pinning.ts +8 -4
- package/src/features/RowSelection.ts +1 -1
- package/src/features/Sorting.ts +1 -1
- package/src/features/Visibility.ts +8 -17
- package/src/index.ts +4 -8
- package/src/types.ts +9 -61
- package/src/utils/filterRowsUtils.ts +4 -2
- package/src/utils/getCoreRowModel.ts +4 -2
- package/src/utils/getExpandedRowModel.ts +1 -5
- package/src/utils/getGroupedRowModel.ts +14 -23
- package/build/cjs/core.js +0 -168
- package/build/cjs/core.js.map +0 -1
- package/build/cjs/features/Cells.js +0 -101
- package/build/cjs/features/Cells.js.map +0 -1
- package/build/cjs/features/Columns.js +0 -191
- package/build/cjs/features/Columns.js.map +0 -1
- package/build/cjs/features/Headers.js.map +0 -1
- package/build/cjs/features/Rows.js +0 -94
- package/build/cjs/features/Rows.js.map +0 -1
- package/build/types/core.d.ts +0 -30
- package/build/types/features/Cells.d.ts +0 -13
- package/build/types/features/Rows.d.ts +0 -28
- package/src/core.ts +0 -246
- package/src/features/Cells.ts +0 -128
- package/src/features/Columns.ts +0 -293
- package/src/features/Rows.ts +0 -142
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/table-core",
|
|
3
3
|
"author": "Tanner Linsley",
|
|
4
|
-
"version": "8.0.0-alpha.
|
|
4
|
+
"version": "8.0.0-alpha.86",
|
|
5
5
|
"description": "Hooks for building lightweight, fast and extendable datagrids for React",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://github.com/tanstack/react-table#readme",
|
package/src/aggregationFns.ts
CHANGED
|
@@ -1,64 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
sum,
|
|
3
|
-
min,
|
|
4
|
-
max,
|
|
5
|
-
extent,
|
|
6
|
-
mean,
|
|
7
|
-
median,
|
|
8
|
-
unique,
|
|
9
|
-
uniqueCount,
|
|
10
|
-
count,
|
|
11
|
-
}
|
|
1
|
+
import { AggregationFn } from './features/Grouping'
|
|
12
2
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
function sum(_getLeafValues: () => unknown[], getChildValues: () => unknown[]) {
|
|
3
|
+
const sum: AggregationFn<any> = (columnId, _leafRows, childRows) => {
|
|
16
4
|
// It's faster to just add the aggregations together instead of
|
|
17
5
|
// process leaf nodes individually
|
|
18
|
-
return
|
|
6
|
+
return childRows.reduce(
|
|
19
7
|
(sum: number, next: unknown) => sum + (typeof next === 'number' ? next : 0),
|
|
20
8
|
0
|
|
21
9
|
)
|
|
22
10
|
}
|
|
23
11
|
|
|
24
|
-
|
|
12
|
+
const min: AggregationFn<any> = (columnId, _leafRows, childRows) => {
|
|
25
13
|
let min: number | undefined
|
|
26
14
|
|
|
27
|
-
|
|
15
|
+
childRows.forEach(row => {
|
|
16
|
+
const value = row.getValue(columnId)
|
|
17
|
+
|
|
28
18
|
if (
|
|
29
19
|
value != null &&
|
|
30
20
|
(min! > value || (min === undefined && value >= value))
|
|
31
21
|
) {
|
|
32
22
|
min = value
|
|
33
23
|
}
|
|
34
|
-
}
|
|
24
|
+
})
|
|
35
25
|
|
|
36
26
|
return min
|
|
37
27
|
}
|
|
38
28
|
|
|
39
|
-
|
|
29
|
+
const max: AggregationFn<any> = (columnId, _leafRows, childRows) => {
|
|
40
30
|
let max: number | undefined
|
|
41
31
|
|
|
42
|
-
|
|
32
|
+
childRows.forEach(row => {
|
|
33
|
+
const value = row.getValue(columnId)
|
|
43
34
|
if (
|
|
44
35
|
value != null &&
|
|
45
36
|
(max! < value || (max === undefined && value >= value))
|
|
46
37
|
) {
|
|
47
38
|
max = value
|
|
48
39
|
}
|
|
49
|
-
}
|
|
40
|
+
})
|
|
50
41
|
|
|
51
42
|
return max
|
|
52
43
|
}
|
|
53
44
|
|
|
54
|
-
|
|
55
|
-
_getLeafValues: () => unknown[],
|
|
56
|
-
getChildValues: () => unknown[]
|
|
57
|
-
) {
|
|
45
|
+
const extent: AggregationFn<any> = (columnId, _leafRows, childRows) => {
|
|
58
46
|
let min: number | undefined
|
|
59
47
|
let max: number | undefined
|
|
60
48
|
|
|
61
|
-
|
|
49
|
+
childRows.forEach(row => {
|
|
50
|
+
const value = row.getValue(columnId)
|
|
62
51
|
if (value != null) {
|
|
63
52
|
if (min === undefined) {
|
|
64
53
|
if (value >= value) min = max = value
|
|
@@ -67,36 +56,37 @@ function extent(
|
|
|
67
56
|
if (max! < value) max = value
|
|
68
57
|
}
|
|
69
58
|
}
|
|
70
|
-
}
|
|
59
|
+
})
|
|
71
60
|
|
|
72
61
|
return [min, max]
|
|
73
62
|
}
|
|
74
63
|
|
|
75
|
-
|
|
64
|
+
const mean: AggregationFn<any> = (columnId, leafRows) => {
|
|
76
65
|
let count = 0
|
|
77
66
|
let sum = 0
|
|
78
67
|
|
|
79
|
-
|
|
68
|
+
leafRows.forEach(row => {
|
|
69
|
+
let value = row.getValue(columnId)
|
|
80
70
|
if (value != null && (value = +value) >= value) {
|
|
81
71
|
++count, (sum += value)
|
|
82
72
|
}
|
|
83
|
-
}
|
|
73
|
+
})
|
|
84
74
|
|
|
85
75
|
if (count) return sum / count
|
|
86
76
|
|
|
87
77
|
return
|
|
88
78
|
}
|
|
89
79
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (!leafValues.length) {
|
|
80
|
+
const median: AggregationFn<any> = (columnId, leafRows) => {
|
|
81
|
+
if (!leafRows.length) {
|
|
93
82
|
return
|
|
94
83
|
}
|
|
95
84
|
|
|
96
85
|
let min = 0
|
|
97
86
|
let max = 0
|
|
98
87
|
|
|
99
|
-
|
|
88
|
+
leafRows.forEach(row => {
|
|
89
|
+
let value = row.getValue(columnId)
|
|
100
90
|
if (typeof value === 'number') {
|
|
101
91
|
min = Math.min(min, value)
|
|
102
92
|
max = Math.max(max, value)
|
|
@@ -106,14 +96,28 @@ function median(getLeafValues: () => unknown[]) {
|
|
|
106
96
|
return (min + max) / 2
|
|
107
97
|
}
|
|
108
98
|
|
|
109
|
-
|
|
110
|
-
return Array.from(new Set(
|
|
99
|
+
const unique: AggregationFn<any> = (columnId, leafRows) => {
|
|
100
|
+
return Array.from(new Set(leafRows.map(d => d.getValue(columnId))).values())
|
|
111
101
|
}
|
|
112
102
|
|
|
113
|
-
|
|
114
|
-
return new Set(
|
|
103
|
+
const uniqueCount: AggregationFn<any> = (columnId, leafRows) => {
|
|
104
|
+
return new Set(leafRows.map(d => d.getValue(columnId))).size
|
|
115
105
|
}
|
|
116
106
|
|
|
117
|
-
|
|
118
|
-
return
|
|
107
|
+
const count: AggregationFn<any> = (_columnId, leafRows) => {
|
|
108
|
+
return leafRows.length
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export const aggregationFns = {
|
|
112
|
+
sum,
|
|
113
|
+
min,
|
|
114
|
+
max,
|
|
115
|
+
extent,
|
|
116
|
+
mean,
|
|
117
|
+
median,
|
|
118
|
+
unique,
|
|
119
|
+
uniqueCount,
|
|
120
|
+
count,
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
export type BuiltInAggregationFn = keyof typeof aggregationFns
|
package/src/core/cell.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Cell, Column, Row, TableGenerics, TableInstance } from '../types'
|
|
2
|
+
|
|
3
|
+
export type CoreCell<TGenerics extends TableGenerics> = {
|
|
4
|
+
id: string
|
|
5
|
+
getValue: () => TGenerics['Value']
|
|
6
|
+
row: Row<TGenerics>
|
|
7
|
+
column: Column<TGenerics>
|
|
8
|
+
renderCell: () => string | null | TGenerics['Rendered']
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function createCell<TGenerics extends TableGenerics>(
|
|
12
|
+
instance: TableInstance<TGenerics>,
|
|
13
|
+
row: Row<TGenerics>,
|
|
14
|
+
column: Column<TGenerics>,
|
|
15
|
+
columnId: string
|
|
16
|
+
) {
|
|
17
|
+
const cell: CoreCell<TGenerics> = {
|
|
18
|
+
id: `${row.id}_${column.id}`,
|
|
19
|
+
row,
|
|
20
|
+
column,
|
|
21
|
+
getValue: () => row.getValue(columnId),
|
|
22
|
+
renderCell: () =>
|
|
23
|
+
column.columnDef.cell
|
|
24
|
+
? instance._render(column.columnDef.cell, {
|
|
25
|
+
instance,
|
|
26
|
+
column,
|
|
27
|
+
row,
|
|
28
|
+
cell: cell as Cell<TGenerics>,
|
|
29
|
+
getValue: cell.getValue,
|
|
30
|
+
})
|
|
31
|
+
: null,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
instance._features.forEach(feature => {
|
|
35
|
+
Object.assign(
|
|
36
|
+
cell,
|
|
37
|
+
feature.createCell?.(
|
|
38
|
+
cell as Cell<TGenerics>,
|
|
39
|
+
column,
|
|
40
|
+
row as Row<TGenerics>,
|
|
41
|
+
instance
|
|
42
|
+
)
|
|
43
|
+
)
|
|
44
|
+
}, {})
|
|
45
|
+
|
|
46
|
+
return cell as Cell<TGenerics>
|
|
47
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Cell,
|
|
3
|
+
Column,
|
|
4
|
+
Header,
|
|
5
|
+
TableGenerics,
|
|
6
|
+
TableInstance,
|
|
7
|
+
Row,
|
|
8
|
+
AccessorFn,
|
|
9
|
+
ColumnDef,
|
|
10
|
+
Renderable,
|
|
11
|
+
} from '../types'
|
|
12
|
+
import { memo } from '../utils'
|
|
13
|
+
|
|
14
|
+
export type CoreColumnDefType = 'data' | 'display' | 'group'
|
|
15
|
+
|
|
16
|
+
export type CoreColumnDef<TGenerics extends TableGenerics> = {
|
|
17
|
+
id: string
|
|
18
|
+
accessorKey?: string & keyof TGenerics['Row']
|
|
19
|
+
accessorFn?: AccessorFn<TGenerics['Row']>
|
|
20
|
+
columns?: ColumnDef<TGenerics>[]
|
|
21
|
+
header?: Renderable<
|
|
22
|
+
TGenerics,
|
|
23
|
+
{
|
|
24
|
+
instance: TableInstance<TGenerics>
|
|
25
|
+
header: Header<TGenerics>
|
|
26
|
+
column: Column<TGenerics>
|
|
27
|
+
}
|
|
28
|
+
>
|
|
29
|
+
footer?: Renderable<
|
|
30
|
+
TGenerics,
|
|
31
|
+
{
|
|
32
|
+
instance: TableInstance<TGenerics>
|
|
33
|
+
header: Header<TGenerics>
|
|
34
|
+
column: Column<TGenerics>
|
|
35
|
+
}
|
|
36
|
+
>
|
|
37
|
+
cell?: Renderable<
|
|
38
|
+
TGenerics,
|
|
39
|
+
{
|
|
40
|
+
instance: TableInstance<TGenerics>
|
|
41
|
+
row: Row<TGenerics>
|
|
42
|
+
column: Column<TGenerics>
|
|
43
|
+
cell: Cell<TGenerics>
|
|
44
|
+
getValue: () => TGenerics['Value']
|
|
45
|
+
}
|
|
46
|
+
>
|
|
47
|
+
meta?: TGenerics['ColumnMeta']
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type CoreColumn<TGenerics extends TableGenerics> = {
|
|
51
|
+
id: string
|
|
52
|
+
depth: number
|
|
53
|
+
accessorFn?: AccessorFn<TGenerics['Row']>
|
|
54
|
+
columnDef: ColumnDef<TGenerics>
|
|
55
|
+
columnDefType: CoreColumnDefType
|
|
56
|
+
columns: Column<TGenerics>[]
|
|
57
|
+
parent?: Column<TGenerics>
|
|
58
|
+
getFlatColumns: () => Column<TGenerics>[]
|
|
59
|
+
getLeafColumns: () => Column<TGenerics>[]
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function createColumn<TGenerics extends TableGenerics>(
|
|
63
|
+
instance: TableInstance<TGenerics>,
|
|
64
|
+
columnDef: ColumnDef<TGenerics> & { columnDefType?: CoreColumnDefType },
|
|
65
|
+
depth: number,
|
|
66
|
+
parent?: Column<TGenerics>
|
|
67
|
+
) {
|
|
68
|
+
const defaultColumn = instance._getDefaultColumnDef()
|
|
69
|
+
|
|
70
|
+
columnDef = {
|
|
71
|
+
...defaultColumn,
|
|
72
|
+
...columnDef,
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let id =
|
|
76
|
+
columnDef.id ??
|
|
77
|
+
columnDef.accessorKey ??
|
|
78
|
+
(typeof columnDef.header === 'string' ? columnDef.header : undefined)
|
|
79
|
+
|
|
80
|
+
let accessorFn: AccessorFn<TGenerics['Row']> | undefined
|
|
81
|
+
|
|
82
|
+
if (columnDef.accessorFn) {
|
|
83
|
+
accessorFn = columnDef.accessorFn
|
|
84
|
+
} else if (columnDef.accessorKey) {
|
|
85
|
+
accessorFn = (originalRow?: TGenerics['Row']) =>
|
|
86
|
+
(originalRow as any)[columnDef.accessorKey]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (!id) {
|
|
90
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
91
|
+
throw new Error(
|
|
92
|
+
columnDef.accessorFn
|
|
93
|
+
? `Columns require an id when using an accessorFn`
|
|
94
|
+
: `Columns require an id when using a non-string header`
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
throw new Error()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let column: CoreColumn<TGenerics> = {
|
|
101
|
+
...columnDef,
|
|
102
|
+
id: `${id}`,
|
|
103
|
+
accessorFn,
|
|
104
|
+
parent: parent as any,
|
|
105
|
+
depth,
|
|
106
|
+
columnDef,
|
|
107
|
+
columnDefType: columnDef.columnDefType as CoreColumnDefType,
|
|
108
|
+
columns: [],
|
|
109
|
+
getFlatColumns: memo(
|
|
110
|
+
() => [true],
|
|
111
|
+
() => {
|
|
112
|
+
return [
|
|
113
|
+
column as Column<TGenerics>,
|
|
114
|
+
...column.columns?.flatMap(d => d.getFlatColumns()),
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key: process.env.NODE_ENV === 'production' && 'column.getFlatColumns',
|
|
119
|
+
debug: () => instance.options.debugAll ?? instance.options.debugColumns,
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
getLeafColumns: memo(
|
|
123
|
+
() => [instance._getOrderColumnsFn()],
|
|
124
|
+
orderColumns => {
|
|
125
|
+
if (column.columns?.length) {
|
|
126
|
+
let leafColumns = column.columns.flatMap(column =>
|
|
127
|
+
column.getLeafColumns()
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
return orderColumns(leafColumns)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return [column as Column<TGenerics>]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
key: process.env.NODE_ENV === 'production' && 'column.getLeafColumns',
|
|
137
|
+
debug: () => instance.options.debugAll ?? instance.options.debugColumns,
|
|
138
|
+
}
|
|
139
|
+
),
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
column = instance._features.reduce((obj, feature) => {
|
|
143
|
+
return Object.assign(obj, feature.createColumn?.(column, instance))
|
|
144
|
+
}, column)
|
|
145
|
+
|
|
146
|
+
// Yes, we have to convert instance to uknown, because we know more than the compiler here.
|
|
147
|
+
return column as Column<TGenerics>
|
|
148
|
+
}
|
|
@@ -1,24 +1,40 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Column,
|
|
3
|
-
CoreHeader,
|
|
4
3
|
Header,
|
|
5
4
|
HeaderGroup,
|
|
6
5
|
TableGenerics,
|
|
7
6
|
TableInstance,
|
|
8
7
|
} from '../types'
|
|
9
8
|
import { memo } from '../utils'
|
|
9
|
+
import { TableFeature } from './instance'
|
|
10
|
+
|
|
11
|
+
export type CoreHeaderGroup<TGenerics extends TableGenerics> = {
|
|
12
|
+
id: string
|
|
13
|
+
depth: number
|
|
14
|
+
headers: Header<TGenerics>[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type CoreHeader<TGenerics extends TableGenerics> = {
|
|
18
|
+
id: string
|
|
19
|
+
index: number
|
|
20
|
+
depth: number
|
|
21
|
+
column: Column<TGenerics>
|
|
22
|
+
headerGroup: HeaderGroup<TGenerics>
|
|
23
|
+
subHeaders: Header<TGenerics>[]
|
|
24
|
+
colSpan: number
|
|
25
|
+
rowSpan: number
|
|
26
|
+
getLeafHeaders: () => Header<TGenerics>[]
|
|
27
|
+
isPlaceholder: boolean
|
|
28
|
+
placeholderId?: string
|
|
29
|
+
renderHeader: (options?: {
|
|
30
|
+
renderPlaceholder?: boolean
|
|
31
|
+
}) => string | null | TGenerics['Rendered']
|
|
32
|
+
renderFooter: (options?: {
|
|
33
|
+
renderPlaceholder?: boolean
|
|
34
|
+
}) => string | null | TGenerics['Rendered']
|
|
35
|
+
}
|
|
10
36
|
|
|
11
37
|
export type HeadersInstance<TGenerics extends TableGenerics> = {
|
|
12
|
-
createHeader: (
|
|
13
|
-
column: Column<TGenerics>,
|
|
14
|
-
options: {
|
|
15
|
-
id?: string
|
|
16
|
-
isPlaceholder?: boolean
|
|
17
|
-
placeholderId?: string
|
|
18
|
-
index: number
|
|
19
|
-
depth: number
|
|
20
|
-
}
|
|
21
|
-
) => Header<TGenerics>
|
|
22
38
|
getHeaderGroups: () => HeaderGroup<TGenerics>[]
|
|
23
39
|
getLeftHeaderGroups: () => HeaderGroup<TGenerics>[]
|
|
24
40
|
getCenterHeaderGroups: () => HeaderGroup<TGenerics>[]
|
|
@@ -38,79 +54,78 @@ export type HeadersInstance<TGenerics extends TableGenerics> = {
|
|
|
38
54
|
getLeftLeafHeaders: () => Header<TGenerics>[]
|
|
39
55
|
getCenterLeafHeaders: () => Header<TGenerics>[]
|
|
40
56
|
getRightLeafHeaders: () => Header<TGenerics>[]
|
|
41
|
-
|
|
42
|
-
getHeader: (id: string) => Header<TGenerics>
|
|
43
57
|
}
|
|
44
58
|
|
|
45
59
|
//
|
|
46
60
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const recurseHeader = (h: CoreHeader<TGenerics>) => {
|
|
79
|
-
if (h.subHeaders && h.subHeaders.length) {
|
|
80
|
-
h.subHeaders.map(recurseHeader)
|
|
81
|
-
}
|
|
82
|
-
leafHeaders.push(h)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
recurseHeader(header)
|
|
86
|
-
|
|
87
|
-
return leafHeaders as Header<TGenerics>[]
|
|
88
|
-
},
|
|
89
|
-
renderHeader: () =>
|
|
90
|
-
column.columnDef.header
|
|
91
|
-
? instance._render(column.columnDef.header, {
|
|
92
|
-
instance,
|
|
93
|
-
header: header as Header<TGenerics>,
|
|
94
|
-
column,
|
|
95
|
-
})
|
|
96
|
-
: null,
|
|
97
|
-
renderFooter: () =>
|
|
98
|
-
column.columnDef.footer
|
|
99
|
-
? instance._render(column.columnDef.footer, {
|
|
100
|
-
instance,
|
|
101
|
-
header: header as Header<TGenerics>,
|
|
102
|
-
column,
|
|
103
|
-
})
|
|
104
|
-
: null,
|
|
61
|
+
function createHeader<TGenerics extends TableGenerics>(
|
|
62
|
+
instance: TableInstance<TGenerics>,
|
|
63
|
+
column: Column<TGenerics>,
|
|
64
|
+
options: {
|
|
65
|
+
id?: string
|
|
66
|
+
isPlaceholder?: boolean
|
|
67
|
+
placeholderId?: string
|
|
68
|
+
index: number
|
|
69
|
+
depth: number
|
|
70
|
+
}
|
|
71
|
+
) {
|
|
72
|
+
const id = options.id ?? column.id
|
|
73
|
+
|
|
74
|
+
let header: CoreHeader<TGenerics> = {
|
|
75
|
+
id,
|
|
76
|
+
column,
|
|
77
|
+
index: options.index,
|
|
78
|
+
isPlaceholder: !!options.isPlaceholder,
|
|
79
|
+
placeholderId: options.placeholderId,
|
|
80
|
+
depth: options.depth,
|
|
81
|
+
subHeaders: [],
|
|
82
|
+
colSpan: 0,
|
|
83
|
+
rowSpan: 0,
|
|
84
|
+
headerGroup: null!,
|
|
85
|
+
getLeafHeaders: (): Header<TGenerics>[] => {
|
|
86
|
+
const leafHeaders: CoreHeader<TGenerics>[] = []
|
|
87
|
+
|
|
88
|
+
const recurseHeader = (h: CoreHeader<TGenerics>) => {
|
|
89
|
+
if (h.subHeaders && h.subHeaders.length) {
|
|
90
|
+
h.subHeaders.map(recurseHeader)
|
|
105
91
|
}
|
|
92
|
+
leafHeaders.push(h)
|
|
93
|
+
}
|
|
106
94
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
95
|
+
recurseHeader(header)
|
|
96
|
+
|
|
97
|
+
return leafHeaders as Header<TGenerics>[]
|
|
98
|
+
},
|
|
99
|
+
renderHeader: () =>
|
|
100
|
+
column.columnDef.header
|
|
101
|
+
? instance._render(column.columnDef.header, {
|
|
102
|
+
instance,
|
|
103
|
+
header: header as Header<TGenerics>,
|
|
104
|
+
column,
|
|
105
|
+
})
|
|
106
|
+
: null,
|
|
107
|
+
renderFooter: () =>
|
|
108
|
+
column.columnDef.footer
|
|
109
|
+
? instance._render(column.columnDef.footer, {
|
|
110
|
+
instance,
|
|
111
|
+
header: header as Header<TGenerics>,
|
|
112
|
+
column,
|
|
113
|
+
})
|
|
114
|
+
: null,
|
|
115
|
+
}
|
|
110
116
|
|
|
111
|
-
|
|
112
|
-
|
|
117
|
+
instance._features.forEach(feature => {
|
|
118
|
+
Object.assign(header, feature.createHeader?.(header, instance))
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
return header as Header<TGenerics>
|
|
122
|
+
}
|
|
113
123
|
|
|
124
|
+
export const Headers: TableFeature = {
|
|
125
|
+
createInstance: <TGenerics extends TableGenerics>(
|
|
126
|
+
instance: TableInstance<TGenerics>
|
|
127
|
+
): HeadersInstance<TGenerics> => {
|
|
128
|
+
return {
|
|
114
129
|
// Header Groups
|
|
115
130
|
|
|
116
131
|
getHeaderGroups: memo(
|
|
@@ -401,24 +416,6 @@ export const Headers = {
|
|
|
401
416
|
instance.options.debugAll ?? instance.options.debugHeaders,
|
|
402
417
|
}
|
|
403
418
|
),
|
|
404
|
-
|
|
405
|
-
getHeader: (id: string) => {
|
|
406
|
-
const header = [
|
|
407
|
-
...instance.getFlatHeaders(),
|
|
408
|
-
...instance.getCenterFlatHeaders(),
|
|
409
|
-
...instance.getLeftFlatHeaders(),
|
|
410
|
-
...instance.getRightFlatHeaders(),
|
|
411
|
-
].find(d => d.id === id)
|
|
412
|
-
|
|
413
|
-
if (!header) {
|
|
414
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
415
|
-
console.warn(`Could not find header with id: ${id}`)
|
|
416
|
-
}
|
|
417
|
-
throw new Error()
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return header
|
|
421
|
-
},
|
|
422
419
|
}
|
|
423
420
|
},
|
|
424
421
|
}
|
|
@@ -492,7 +489,7 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
|
|
|
492
489
|
latestPendingParentHeader.subHeaders.push(headerToGroup)
|
|
493
490
|
} else {
|
|
494
491
|
// This is a new header. Let's create it
|
|
495
|
-
const header =
|
|
492
|
+
const header = createHeader(instance, column, {
|
|
496
493
|
id: [headerFamily, depth, column.id, headerToGroup?.id]
|
|
497
494
|
.filter(Boolean)
|
|
498
495
|
.join('_'),
|
|
@@ -523,7 +520,7 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
|
|
|
523
520
|
}
|
|
524
521
|
|
|
525
522
|
const bottomHeaders = columnsToGroup.map((column, index) =>
|
|
526
|
-
|
|
523
|
+
createHeader(instance, column, {
|
|
527
524
|
depth: maxDepth,
|
|
528
525
|
index,
|
|
529
526
|
})
|
|
@@ -537,7 +534,9 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
|
|
|
537
534
|
// return !headerGroup.headers.every(header => header.isPlaceholder)
|
|
538
535
|
// })
|
|
539
536
|
|
|
540
|
-
const recurseHeadersForSpans = (
|
|
537
|
+
const recurseHeadersForSpans = (
|
|
538
|
+
headers: Header<TGenerics>[]
|
|
539
|
+
): { colSpan: number; rowSpan: number }[] => {
|
|
541
540
|
const filteredHeaders = headers.filter(header =>
|
|
542
541
|
header.column.getIsVisible()
|
|
543
542
|
)
|
|
@@ -563,8 +562,8 @@ export function buildHeaderGroups<TGenerics extends TableGenerics>(
|
|
|
563
562
|
const minChildRowSpan = Math.min(...childRowSpans)
|
|
564
563
|
rowSpan = rowSpan + minChildRowSpan
|
|
565
564
|
|
|
566
|
-
header.colSpan = colSpan
|
|
567
|
-
header.rowSpan = rowSpan
|
|
565
|
+
header.colSpan = colSpan
|
|
566
|
+
header.rowSpan = rowSpan
|
|
568
567
|
|
|
569
568
|
return { colSpan, rowSpan }
|
|
570
569
|
})
|