import { makeStyles, Box } from '@material-ui/core' import classnames from 'classnames' import * as R from 'ramda' import React, { useState, useEffect } from 'react' import { AutoSizer, List, CellMeasurer, CellMeasurerCache } from 'react-virtualized' import { Table, TBody, THead, Tr, Td, Th } from 'src/components/fake-table/Table' import { EmptyTable } from 'src/components/table' import { H4 } from 'src/components/typography' import { ReactComponent as ExpandClosedIcon } from 'src/styling/icons/action/expand/closed.svg' import { ReactComponent as ExpandOpenIcon } from 'src/styling/icons/action/expand/open.svg' import styles from './DataTable.styles' const useStyles = makeStyles(styles) const Row = ({ id, index, elements, data, width, Details, expanded, expandRow, expWidth, expandable, onClick, size, ...props }) => { const classes = useStyles() const hasPointer = onClick || expandable const trClasses = { [classes.pointer]: hasPointer, [classes.row]: true, [classes.expanded]: expanded } return (
{ expandable && expandRow(id, data) onClick && onClick(data) }} error={data.error || data.hasError} shouldShowError={false} errorMessage={data.errorMessage || data.hasError}> {elements.map(({ view = it => it?.toString(), ...props }, idx) => ( {view(data)} ))} {expandable && ( )}
{expandable && expanded && (
)}
) } const DataTable = ({ elements = [], data = [], Details, className, expandable, initialExpanded, onClick, loading, emptyText, rowSize, ...props }) => { const [expanded, setExpanded] = useState(initialExpanded) useEffect(() => setExpanded(initialExpanded), [initialExpanded]) const coreWidth = R.compose(R.sum, R.map(R.prop('width')))(elements) const expWidth = 1200 - coreWidth const width = coreWidth + (expandable ? expWidth : 0) const classes = useStyles({ width }) const expandRow = (id, data) => { if (data.id) { cache.clear(data.id) setExpanded(data.id === expanded ? null : data.id) } else { cache.clear(id) setExpanded(id === expanded ? null : id) } } const cache = new CellMeasurerCache({ defaultHeight: 58, fixedWidth: true }) function rowRenderer({ index, key, parent, style }) { return ( {({ registerChild }) => (
)}
) } return ( {elements.map(({ width, className, textAlign, header }, idx) => ( ))} {expandable && } {loading &&

Loading...

} {!loading && R.isEmpty(data) && } {!loading && !R.isEmpty(data) && ( {({ height }) => ( )} )}
{header}
) } export default DataTable