@@ -2,12 +2,18 @@ import React from 'react'
2
2
import ReactDOM from 'react-dom/client'
3
3
import './index.css'
4
4
import {
5
+ columnFilteringFeature ,
5
6
createFilteredRowModel ,
6
7
createPaginatedRowModel ,
7
8
createSortedRowModel ,
9
+ filterFns ,
8
10
flexRender ,
9
11
functionalUpdate ,
10
12
makeStateUpdater ,
13
+ rowPaginationFeature ,
14
+ rowSortingFeature ,
15
+ sortFns ,
16
+ tableFeatures ,
11
17
useTable ,
12
18
} from '@tanstack/react-table'
13
19
import { makeData } from './makeData'
@@ -19,6 +25,7 @@ import type {
19
25
Table ,
20
26
TableFeature ,
21
27
TableFeatures ,
28
+ TableState ,
22
29
Updater ,
23
30
} from '@tanstack/react-table'
24
31
import type { Person } from './makeData'
@@ -27,40 +34,42 @@ import type { Person } from './makeData'
27
34
28
35
// define types for our new feature's custom state
29
36
export type DensityState = 'sm' | 'md' | 'lg'
30
- export interface DensityTableState {
37
+ export interface TableState_Density {
31
38
density : DensityState
32
39
}
33
40
34
41
// define types for our new feature's table options
35
- export interface DensityOptions {
42
+ export interface TableOptions_Density {
36
43
enableDensity ?: boolean
37
44
onDensityChange ?: OnChangeFn < DensityState >
38
45
}
39
46
40
47
// Define types for our new feature's table APIs
41
- export interface DensityInstance {
48
+ export interface Table_Density {
42
49
setDensity : ( updater : Updater < DensityState > ) => void
43
50
toggleDensity : ( value ?: DensityState ) => void
44
51
}
45
52
46
53
// Use declaration merging to add our new feature APIs and state types to TanStack Table's existing types.
47
54
declare module '@tanstack/react-table' {
55
+ // declare our new feature as a plugin
56
+ interface Plugins {
57
+ densityPlugin : TableFeature
58
+ }
48
59
// merge our new feature's state with the existing table state
49
- interface TableState extends DensityTableState { }
60
+ interface TableState_Plugins extends TableState_Density { }
50
61
// merge our new feature's options with the existing table options
51
- interface TableOptions < TFeatures extends TableFeatures , TData extends RowData >
52
- extends DensityOptions { }
62
+ interface TableOptions_Plugins extends TableOptions_Density { }
53
63
// merge our new feature's instance APIs with the existing table instance APIs
54
- interface Table < TFeatures extends TableFeatures , TData extends RowData >
55
- extends DensityInstance { }
64
+ interface Table_Plugins extends Table_Density { }
56
65
// if you need to add cell instance APIs...
57
- // interface Cell<TFeatures extends TableFeatures, TData extends RowData, TValue> extends DensityCell
66
+ // interface Cell_Plugins extends Cell_Density {}
58
67
// if you need to add row instance APIs...
59
- // interface Row<TFeatures extends TableFeatures, TData extends RowData> extends DensityRow
68
+ // interface Row_Plugins extends Row_Density {}
60
69
// if you need to add column instance APIs...
61
- // interface Column<TFeatures extends TableFeatures, TData extends RowData, TValue> extends DensityColumn
70
+ // interface Column_Plugins extends Column_Density {}
62
71
// if you need to add header instance APIs...
63
- // interface Header<TFeatures extends TableFeatures, TData extends RowData, TValue> extends DensityHeader
72
+ // interface Header_Plugins extends Header_Density {}
64
73
65
74
// Note: declaration merging on `ColumnDef` is not possible because it is a type, not an interface.
66
75
// But you can still use declaration merging on `ColumnDef.meta`
@@ -69,12 +78,14 @@ declare module '@tanstack/react-table' {
69
78
// end of TS setup!
70
79
71
80
// Here is all of the actual javascript code for our new feature
72
- export const DensityFeature : TableFeature = {
81
+ export const densityPlugin : TableFeature = {
73
82
// define the new feature's initial state
74
- getInitialState : ( state ) : DensityTableState => {
83
+ getInitialState : < TFeatures extends TableFeatures > (
84
+ initialState : Partial < TableState < TFeatures > > ,
85
+ ) : Partial < TableState < TFeatures > > => {
75
86
return {
76
87
density : 'md' ,
77
- ...state ,
88
+ ...initialState , // must come last
78
89
}
79
90
} ,
80
91
@@ -83,20 +94,20 @@ export const DensityFeature: TableFeature = {
83
94
TFeatures extends TableFeatures ,
84
95
TData extends RowData ,
85
96
> (
86
- table : Partial < Table < TFeatures , TData > > ,
87
- ) : DensityOptions => {
97
+ table : Table < TFeatures , TData > ,
98
+ ) : TableOptions_Density => {
88
99
return {
89
100
enableDensity : true ,
90
101
onDensityChange : makeStateUpdater ( 'density' , table ) ,
91
- } as DensityOptions
102
+ } as TableOptions_Density
92
103
} ,
93
104
// if you need to add a default column definition...
94
105
// getDefaultColumnDef: <TFeatures extends TableFeatures, TData extends RowData>(): Partial<ColumnDef<TFeatures, TData>> => {
95
106
// return { meta: {} } //use meta instead of directly adding to the columnDef to avoid typescript stuff that's hard to workaround
96
107
// },
97
108
98
109
// define the new feature's table instance methods
99
- constructTable : < TFeatures extends TableFeatures , TData extends RowData > (
110
+ constructTableAPIs : < TFeatures extends TableFeatures , TData extends RowData > (
100
111
table : Table < TFeatures , TData > ,
101
112
) : void => {
102
113
table . setDensity = ( updater ) => {
@@ -114,20 +125,27 @@ export const DensityFeature: TableFeature = {
114
125
}
115
126
} ,
116
127
117
- // if you need to add row instance APIs...
118
- // constructRow : <TFeatures extends TableFeatures, TData extends RowData>(row, table): void => {},
119
- // if you need to add cell instance APIs...
120
- // constructCell : <TFeatures extends TableFeatures, TData extends RowData>(cell, column, row, table ): void => {},
121
- // if you need to add column instance APIs...
122
- // constructColumn : <TFeatures extends TableFeatures, TData extends RowData>(column, table ): void => {},
123
- // if you need to add header instance APIs...
124
- // constructHeader : <TFeatures extends TableFeatures, TData extends RowData>(header, table ): void => {},
128
+ // // if you need to add row instance APIs...
129
+ // constructRowAPIs : <TFeatures extends TableFeatures, TData extends RowData>(row: Row<TFeatures, TData>, table: Table<TFeatures, TData> ): void => {},
130
+ // // if you need to add cell instance APIs...
131
+ // constructCellAPIs : <TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData >(cell: Cell<TFeatures, TData, TValue> ): void => {},
132
+ // // if you need to add column instance APIs...
133
+ // constructColumnAPIs : <TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData >(column: Column<TFeatures, TData, TValue> ): void => {},
134
+ // // if you need to add header instance APIs...
135
+ // constructHeaderAPIs : <TFeatures extends TableFeatures, TData extends RowData, TValue extends CellData = CellData >(header: Header<TFeatures, TData, TValue> ): void => {},
125
136
}
126
137
// end of custom feature code
127
138
128
139
// app code
140
+ const _features = tableFeatures ( {
141
+ columnFilteringFeature,
142
+ rowSortingFeature,
143
+ rowPaginationFeature,
144
+ densityPlugin, // pass in our plugin just like any other stock feature
145
+ } )
146
+
129
147
function App ( ) {
130
- const columns = React . useMemo < Array < ColumnDef < any , Person > > > (
148
+ const columns = React . useMemo < Array < ColumnDef < typeof _features , Person > > > (
131
149
( ) => [
132
150
{
133
151
accessorKey : 'firstName' ,
@@ -169,12 +187,16 @@ function App() {
169
187
const [ density , setDensity ] = React . useState < DensityState > ( 'md' )
170
188
171
189
const table = useTable ( {
172
- _features : { DensityFeature } , // pass our custom feature to the table to be instantiated upon creation
190
+ _features,
173
191
_rowModels : {
174
192
filteredRowModel : createFilteredRowModel ( ) ,
175
193
paginatedRowModel : createPaginatedRowModel ( ) ,
176
194
sortedRowModel : createSortedRowModel ( ) ,
177
195
} ,
196
+ _processingFns : {
197
+ filterFns,
198
+ sortFns,
199
+ } ,
178
200
columns,
179
201
data,
180
202
debugTable : true ,
@@ -245,7 +267,7 @@ function App() {
245
267
{ table . getRowModel ( ) . rows . map ( ( row ) => {
246
268
return (
247
269
< tr key = { row . id } >
248
- { row . getVisibleCells ( ) . map ( ( cell ) => {
270
+ { row . getAllCells ( ) . map ( ( cell ) => {
249
271
return (
250
272
< td
251
273
key = { cell . id }
@@ -347,17 +369,15 @@ function Filter({
347
369
column,
348
370
table,
349
371
} : {
350
- column : Column < any , any >
351
- table : Table < any , any >
372
+ column : Column < typeof _features , Person >
373
+ table : Table < typeof _features , Person >
352
374
} ) {
353
375
const firstValue = table
354
376
. getPreFilteredRowModel ( )
355
377
. flatRows [ 0 ] ?. getValue ( column . id )
356
378
357
379
const columnFilterValue = column . getFilterValue ( )
358
380
359
- console . log ( 'columnFilterValue' , { columnFilterValue, table, column } )
360
-
361
381
return typeof firstValue === 'number' ? (
362
382
< div className = "flex space-x-2" >
363
383
< input
0 commit comments