1+ import {
2+ ColumnDef ,
3+ ExpandedState ,
4+ flexRender ,
5+ getCoreRowModel ,
6+ getExpandedRowModel ,
7+ useReactTable ,
8+ } from '@tanstack/react-table' ;
19import classNames from 'classnames' ;
2- import React , { ReactElement } from 'react' ;
3- import { Column , Row , useExpanded , useTable } from 'react-table' ;
10+ import React , { ReactElement , useState } from 'react' ;
411
512import styles from './table.module.scss' ;
6- import { ExtendedCell , ExtendedHeaderGroup , ExtendedRow } from './types' ;
13+ import { ExtendedColumnDef , ExtendedRow } from './types' ;
714
815type Props < D extends Record < string , unknown > > = {
9- columns : Array < Column < D > > ;
16+ columns : Array < ColumnDef < D > > ;
1017 data : Array < D > ;
1118 expandedAreaOffset ?: number ;
12- onRowClick ?: ( row : Row < D > ) => void ;
19+ onRowClick ?: ( row : ExtendedRow < D > ) => void ;
1320 renderExpandedArea ?: ( row : D ) => React . ReactElement ;
1421 tableHeaderRowClassName ?: string ;
1522} ;
@@ -22,48 +29,47 @@ export default function Table<D extends Record<string, unknown>>({
2229 renderExpandedArea,
2330 tableHeaderRowClassName,
2431} : Props < D > ) : ReactElement {
25- const { getTableBodyProps, getTableProps, headerGroups, prepareRow, rows } =
26- useTable (
27- {
28- columns,
29- data,
30- } ,
31- useExpanded
32- ) ;
32+ const [ expanded , setExpanded ] = useState < ExpandedState > ( { } ) ;
33+
34+ const table = useReactTable ( {
35+ data,
36+ columns,
37+ state : {
38+ expanded,
39+ } ,
40+ onExpandedChange : setExpanded ,
41+ getCoreRowModel : getCoreRowModel ( ) ,
42+ getExpandedRowModel : getExpandedRowModel ( ) ,
43+ } ) ;
44+
45+ const { getHeaderGroups, getRowModel } = table ;
3346
3447 // Render the UI for your table
3548 return (
3649 < div className = { styles . tableWrapper } >
37- < table { ... getTableProps ( { className : styles . table } ) } >
50+ < table className = { styles . table } >
3851 < thead >
39- { headerGroups . map ( ( headerGroup ) => {
40- const headerGroupProps = headerGroup . getHeaderGroupProps ( {
41- className : tableHeaderRowClassName ,
42- } ) ;
43- const { key, ...restHeaderGroupProps } = headerGroupProps ;
44- return (
45- < tr { ...restHeaderGroupProps } key = { key } >
46- { headerGroup . headers . map ( ( column : ExtendedHeaderGroup < D > ) => {
47- const { style, className } = column ;
48- const { key, ...restHeaderProps } = column . getHeaderProps ( ) ;
49- return (
50- < th
51- { ...restHeaderProps }
52- { ...{ style, className } }
53- key = { key }
54- >
55- { column . render ( 'Header' ) }
56- </ th >
57- ) ;
58- } ) }
59- </ tr >
60- ) ;
61- } ) }
52+ { getHeaderGroups ( ) . map ( ( headerGroup ) => (
53+ < tr key = { headerGroup . id } className = { tableHeaderRowClassName } >
54+ { headerGroup . headers . map ( ( header ) => {
55+ const { className, style } =
56+ ( header . column . columnDef as ExtendedColumnDef < D > ) || { } ;
57+ return (
58+ < th key = { header . id } style = { style } className = { className } >
59+ { header . isPlaceholder
60+ ? null
61+ : flexRender (
62+ header . column . columnDef . header ,
63+ header . getContext ( )
64+ ) }
65+ </ th >
66+ ) ;
67+ } ) }
68+ </ tr >
69+ ) ) }
6270 </ thead >
63- < tbody { ...getTableBodyProps ( ) } >
64- { rows . map ( ( row : ExtendedRow < D > ) => {
65- prepareRow ( row ) ;
66-
71+ < tbody >
72+ { getRowModel ( ) . rows . map ( ( row ) => {
6773 const handleClick = ( event : React . MouseEvent ) => {
6874 const element = event . target as HTMLElement ;
6975 if (
@@ -87,40 +93,42 @@ export default function Table<D extends Record<string, unknown>>({
8793 }
8894 } ;
8995
90- const { key, ...restRowProps } = row . getRowProps ( ) ;
91-
9296 return (
93- < React . Fragment key = { key } >
97+ < React . Fragment key = { row . id } >
9498 < tr
95- { ...restRowProps }
9699 className = { classNames ( {
97100 [ styles . clickableRow ] : onRowClick ,
98- [ styles . expandedRow ] : row . isExpanded ,
101+ [ styles . expandedRow ] : row . getIsExpanded ( ) ,
99102 } ) }
100103 onClick = { handleClick }
101104 onKeyDown = { handleKeyDown }
102105 tabIndex = { onRowClick ? 0 : - 1 }
103106 >
104- { row . cells . map ( ( cell : ExtendedCell < D > ) => {
105- const { className, style } = cell . column ;
106- const { key , ... restCellProps } = cell . getCellProps ( ) ;
107+ { row . getVisibleCells ( ) . map ( ( cell ) => {
108+ const { className, style } =
109+ ( cell . column . columnDef as ExtendedColumnDef < D > ) || { } ;
107110 return (
108- < td
109- { ...restCellProps }
110- { ...{ className, style } }
111- key = { key }
112- >
113- { cell . render ( 'Cell' ) }
111+ < td key = { cell . id } style = { style } className = { className } >
112+ { flexRender (
113+ cell . column . columnDef . cell ,
114+ cell . getContext ( )
115+ ) }
114116 </ td >
115117 ) ;
116118 } ) }
117119 </ tr >
118- { row . isExpanded && (
120+ { row . getIsExpanded ( ) && (
119121 < tr className = { styles . expandedArea } >
120- { expandedAreaOffset > 0 && (
121- < td colSpan = { expandedAreaOffset } > </ td >
122- ) }
123- < td colSpan = { row . cells . length - expandedAreaOffset } >
122+ { expandedAreaOffset > 0 &&
123+ expandedAreaOffset < row . getVisibleCells ( ) . length && (
124+ < td colSpan = { expandedAreaOffset } > </ td >
125+ ) }
126+ < td
127+ colSpan = { Math . max (
128+ 1 ,
129+ row . getVisibleCells ( ) . length - expandedAreaOffset
130+ ) }
131+ >
124132 { renderExpandedArea && renderExpandedArea ( row . original ) }
125133 </ td >
126134 </ tr >
0 commit comments