import {ReactNode, useState} from "react"; import './DataTable.css'; export type DataTableColumnDefinition = { field: string, label?: string, visualize?: (value: T) => ReactNode, sorter?: (a: T, b: T) => number }; function DataTableRow({rowData, columns}: { rowData: any, columns: DataTableColumnDefinition[] }) { return { columns.map(column => { return { column.visualize ? column.visualize(rowData) : rowData[column.field] } ; }) } ; } export default function DataTable({data, columns, className}: { data: T[], columns: DataTableColumnDefinition[], className?: string }) { const [sortBy, setSortBy] = useState | null>(null); const [sortReversed, setSortReversed] = useState(false); const headerClick = (column: DataTableColumnDefinition) => { console.log('column clicked', column); if (column.field === sortBy?.field) setSortReversed(prevState => !prevState); else if (column.sorter) setSortBy(column); else console.log('cannot sort by', column) }; const dataToDisplay = [...data]; const actualSorter = sortReversed && sortBy?.sorter ? (a: T, b: T) => -sortBy.sorter!(a, b) : sortBy?.sorter; dataToDisplay.sort(actualSorter) console.log('sorted', {dataToDisplay}); return
{ columns.map(column => ) } { dataToDisplay.map((element, index) => ) }
headerClick(column)}> {column.label ?? column.field}
; }