import { Header, flexRender, TableMeta, ColumnMeta, } from '@tanstack/react-table'; import { filterHOC } from './Filter'; import { TableHeaderCell } from './TableHeaderCell'; import { DefaultType } from './types'; interface Props { headers: Header[]; onSortChange?(colId: string, desc: boolean): void; tableMeta: TableMeta | undefined; } export function TableHeaderRow({ headers, onSortChange, tableMeta, }: Props) { return ( {headers.map((header) => { const sortDirection = header.column.getIsSorted(); const { className, filter, width } = parseMeta( header.column.columnDef.meta ); return ( { header.column.toggleSorting(desc); if (onSortChange) { onSortChange(header.id, desc); } }} isSorted={!!sortDirection} isSortedDesc={sortDirection ? sortDirection === 'desc' : false} render={() => flexRender(header.column.columnDef.header, header.getContext()) } renderFilter={ header.column.getCanFilter() ? () => flexRender(filter, { column: header.column, tableMeta, }) : undefined } /> ); })} ); } function parseMeta( meta: ColumnMeta | undefined ) { if (!meta) { return { className: '', width: undefined, filter: filterHOC('Filter'), }; } const className = 'className' in meta && typeof meta.className === 'string' ? meta.className : undefined; const width = 'width' in meta && typeof meta.width === 'string' ? meta.width : undefined; const filter = 'filter' in meta && typeof meta.filter === 'function' ? meta.filter : filterHOC('Filter'); return { className, width, filter }; }