import { UI } from 'app/shared/store/ui/ui.constants'; import { getScreenWidth } from 'app/shared/store/ui/uiSelectors'; import React, { useEffect, useState } from 'react'; import { useSelector } from 'react-redux'; import * as DataTable from './dataTable'; import dataTableHelper from './dataTable.helper'; import { CellValueType, ColumnConfig, ColumnHeader } from './dataTable.types'; interface Props { config: ColumnConfig[]; data: T[]; summary?: T; columnHeaders?: ColumnHeader[]; onRowClick?: (row: T) => void; isSortable?: boolean; hideHeader?: boolean; } const getCell = ( item: ColumnConfig, value: CellValueType, defaultColumnWidth: number, key: number, isSummary?: boolean ) => { switch (item.cellType) { case 'boolean': return ; case 'date': case 'fullDate': return ; case 'number': return ; case 'text': return ; default: return 'Invalid cell type'; } }; const ModelDrivenDataTable = ( { config, data, summary, columnHeaders, onRowClick, hideHeader = false, isSortable = true }: Props) => { const [ orderedData, setData ] = useState([]); const [ sortedColumn, setSortedColumn ] = useState(config[0].columnName); const [ isOrderAscending, setIsOrderAscending ] = useState(false); const screenWidth = useSelector(getScreenWidth); const isRowClickingDisabled = screenWidth < UI.BREAK_POINTS.LG; const getColumnConfig = (columnName: string) => { const columnConfig = config.find(item => item.columnName === columnName); if (!columnConfig) { throw `Couldn't find configuration for column ${columnName}. Invalid config.`; } return columnConfig; }; useEffect(() => { if (isSortable) { const columnConfig = getColumnConfig(sortedColumn); const sortedData = dataTableHelper.reorderData(data, columnConfig.getValue, columnConfig.cellType, isOrderAscending); setData([ ...sortedData ]); } else { setData([ ...data ]); } }, [ data?.length, sortedColumn, isOrderAscending ]); const defaultColumnWidth = dataTableHelper.getDefaultColumnWidth(config); return ( <> { data?.length > 0 && { columnHeaders && } { !hideHeader && {config.map((item, index) => { setSortedColumn(item.columnName); const newOrder = !isOrderAscending; setIsOrderAscending(newOrder); } : undefined} />)} } {orderedData.map((item, index) => {config.map((cfg, index) => getCell(cfg, cfg.getValue(item), defaultColumnWidth, index, (item as T & { highlighted?: boolean }).highlighted))} )} {summary && {config.map((cfg, index) => cfg.noSummary ? getCell({ ...cfg, cellType: 'text' }, '', defaultColumnWidth, index) : getCell(cfg, cfg.getValue(summary), defaultColumnWidth, index, true) )} } } ); }; export { ModelDrivenDataTable };