import { FC, useEffect, useRef, useState } from 'react'; import React from 'react'; import { makeStyles } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; import TableCell from '@material-ui/core/TableCell'; import TableContainer from '@material-ui/core/TableContainer'; import TableRow from '@material-ui/core/TableRow'; import Checkbox from '@material-ui/core/Checkbox'; import { TableType } from './Types'; import { Box, Button, Typography } from '@material-ui/core'; import EnhancedTableHead from './TableHead'; import EditableTableHead from './TableEditableHead'; import ActionBar from './ActionBar'; import LoadingTable from './LoadingTable'; import CopyButton from '../advancedSearch/CopyButton'; import { useTranslation } from 'react-i18next'; const useStyles = makeStyles(theme => ({ root: { width: '100%', flexGrow: 1, /* set flex basis to make child item height 100% work on Safari */ flexBasis: 0, // change scrollbar style '&::-webkit-scrollbar': { width: '8px', }, '&::-webkit-scrollbar-track': { backgroundColor: '#f9f9f9', }, '&::-webkit-scrollbar-thumb': { borderRadius: '8px', backgroundColor: '#eee', }, }, box: { backgroundColor: '#fff', }, paper: { width: '100%', marginBottom: theme.spacing(2), }, table: { minWidth: 750, }, tableCell: { background: theme.palette.common.white, paddingLeft: theme.spacing(2), }, hoverActionCell: { transition: '0.2s all', padding: 0, width: '50px', backgroundColor: '#fff', '& span': { opacity: 0, }, }, checkbox: { background: theme.palette.common.white, }, rowHover: { '&:hover': { backgroundColor: '#f3fcfe !important', '& td': { background: 'inherit', }, '& $hoverActionCell': { backgroundColor: theme.palette.primary.main, '& span': { opacity: 1, }, }, }, }, cell: { borderBottom: '1px solid #e9e9ed', '& p': { display: 'inline-block', verticalAlign: 'middle', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: (props: { tableCellMaxWidth: string }) => props.tableCellMaxWidth, fontSize: '14px', lineHeight: '20px', }, }, noData: { paddingTop: theme.spacing(6), textAlign: 'center', letterSpacing: '0.5px', color: 'rgba(0, 0, 0, 0.6)', }, copyBtn: { marginLeft: theme.spacing(0.5), }, })); const EnhancedTable: FC = props => { const { selected, onSelected, isSelected, onSelectedAll, rows = [], colDefinitions, primaryKey, // whether show checkbox in the first column // set true as default openCheckBox = true, disableSelect, noData, // whether change table row background color when mouse hover // set true as default showHoverStyle = true, isLoading, setPageSize, headEditable = false, // editable heads required param, contains heads components and its value editHeads = [], // if table cell max width not be passed, table row will use 300px as default tableCellMaxWidth = '300px', handleSort, order, orderBy, } = props; const classes = useStyles({ tableCellMaxWidth }); const [loadingRowCount, setLoadingRowCount] = useState(0); const containerRef = useRef(null); const { t: commonTrans } = useTranslation(); const copyTrans = commonTrans('copy'); useEffect(() => { const height: number = (containerRef.current as any)!.offsetHeight; // table header 57px, loading row 40px const count = Math.floor((height - 57) / 40); setLoadingRowCount(count); }, []); useEffect(() => { if (setPageSize) { const containerHeight: number = (containerRef.current as any)! .offsetHeight; // table default row height is 54 // if pass component as row item, its max height should be 54 too const rowHeight = 54; // table header default height is 57 const tableHeaderHeight: number = 57; if (rowHeight > 0) { const pageSize = Math.floor( (containerHeight - tableHeaderHeight) / rowHeight ); setPageSize(pageSize); } } }, [setPageSize]); return ( {!headEditable ? ( ) : ( )} {!isLoading && ( {rows && rows.length ? ( rows.map((row, index) => { const isItemSelected = isSelected(row); const labelId = `enhanced-table-checkbox-${index}`; return ( onSelected(event, row)} role="checkbox" aria-checked={isItemSelected} tabIndex={-1} selected={isItemSelected && !disableSelect} classes={{ hover: classes.rowHover, }} > {openCheckBox && ( )} {colDefinitions.map((colDef, i) => { const { actionBarConfigs = [], needCopy = false } = colDef; const cellStyle = colDef.getStyle ? colDef.getStyle(row[colDef.id]) : {}; return colDef.showActionCell ? ( ) : ( {row[colDef.id] && typeof row[colDef.id] === 'string' ? ( {colDef.onClick ? ( ) : ( row[colDef.id] )} ) : ( <> {colDef.onClick ? ( ) : ( row[colDef.id] )} )} {needCopy && row[colDef.id] && ( )} ); })} ); }) ) : ( )} )}
{noData}
{/* TODO(wenyi): loadingRowCount wrong here*/} {isLoading && }
); }; export default EnhancedTable;