import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; 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 TableHead from '@material-ui/core/TableHead'; import TablePagination from '@material-ui/core/TablePagination'; import TableRow from '@material-ui/core/TableRow'; import TableSortLabel from '@material-ui/core/TableSortLabel'; import Typography from '@material-ui/core/Typography'; import EditIcon from '@material-ui/icons/Edit'; import ExpandMore from '@material-ui/icons/ExpandMore'; import { Box, Button, createMuiTheme, Dialog, DialogActions, DialogTitle, Grid, IconButton, Menu, MenuItem, ThemeProvider } from '@material-ui/core'; import CircularProgress from '@material-ui/core/CircularProgress'; import { makeStyles } from '@material-ui/core/styles'; function descendingComparator(a, b, _orderBy) { if (b[_orderBy] < a[_orderBy]) { return -1; } if (b[_orderBy] > a[_orderBy]) { return 1; } return 0; } function getComparator(_order, _orderBy) { return _order === 'desc' ? (a, b) => descendingComparator(a, b, _orderBy) : (a, b) => -descendingComparator(a, b, _orderBy); } function stableSort(array, comparator) { const stabilizedThis = array.map((el, index) => [el, index]); stabilizedThis.sort((a, b) => { const _order = comparator(a[0], b[0]); if (_order !== 0) return _order; return a[1] - b[1]; }); return stabilizedThis.map((el) => el[0]); } // const StyledTableCell = withStyles((theme) => ({ // head: { // backgroundColor: '#0d47a1a8', // color: theme.palette.common.white, // }, // body: { // fontSize: 14, // }, // }))(TableCell); function EnhancedTableHead(props) { const { headerStyles, _order, _orderBy, onRequestSort, headCells } = props; const createSortHandler = (property) => (event) => { onRequestSort(event, property); // onGetData(); }; const sortedStyle = createMuiTheme({ overrides: { MuiTableSortLabel: { root: { "&$active": { color: headerStyles.sortedHeader === undefined ? 'grey' : headerStyles.sortedHeader, "&& $icon": { color: headerStyles.sortedHeader === undefined ? 'grey' : headerStyles.sortedHeader } } } } } }); return ( {headCells.map((headCell) => ( {headCell.id !== 'sr' ? {headCell.label} {_orderBy === headCell.id ? ( {_order === 'desc' ? 'sorted descending' : 'sorted ascending'} ) : null} : {headCell.label} } ))} ); } EnhancedTableHead.propTypes = { headerStyles: PropTypes.object.isRequired, onRequestSort: PropTypes.func.isRequired, onSelectAllClick: PropTypes.func.isRequired, _order: PropTypes.oneOf(['asc', 'desc']).isRequired, _orderBy: PropTypes.string.isRequired, rowCount: PropTypes.number.isRequired, }; const useStyles = makeStyles({ root: { width: '100%', }, table: { // minWidth: 750, tableLayout: 'fixed' }, visuallyHidden: { b_order: 0, clip: 'rect(0 0 0 0)', height: 1, margin: -1, overflow: 'hidden', padding: 0, position: 'absolute', top: 20, width: 1, }, underline: { "&&&:before": { b_orderBottom: "none" }, "&&:after": { b_orderBottom: "none" } }, head: props => ({ backgroundColor: props.headerBackgroundColor === undefined ? '#0d47a1a8' : props.headerBackgroundColor, color: props.headerTextColor === undefined ? 'white' : props.headerTextColor, }), sortedHeader: props => ({ color: props.headerTextColor === undefined ? 'grey' : props.headerTextColor, }), styledTableRow: props => ({ '&:nth-of-type(even)': { backgroundColor: props.primaryColor === undefined ? '#0d47a11c' : props.primaryColor, }, }), }); // const StyledTableRow = withStyles((theme) => ({ // root: { // '&:nth-of-type(even)': { // backgroundColor: '#0d47a11c', // }, // }, // }))(TableRow); function getUpdatedDate(p) { var statusDate = p.updated_date; var day = ''; if (statusDate !== undefined) { var convertDate = new Date(statusDate.toDate()); var dd = String(convertDate.getDate()).padStart(2, '0'); var mm = String(convertDate.getMonth() + 1).padStart(2, '0'); var yyyy = convertDate.getFullYear(); day = mm + '/' + dd + '/' + yyyy; } return day.toString(); } export const formatDateToLocal = (date, withTime = true) => { if (!date) return ""; var d = new Date(date); var ampm = d.getHours() >= 12 ? 'PM' : 'AM'; var hours = d.getHours() > 12 ? d.getHours() - 12 : d.getHours(); if (withTime) { return ("0" + (d.getMonth() + 1)).slice(-2) + "/" + ("0" + d.getDate()).slice(-2) + "/" + d.getFullYear() + " " + ("0" + (hours)).slice(-2) + ":" + ("0" + (d.getMinutes())).slice(-2) + ":" + ("0" + (d.getSeconds())).slice(-2) + " " + ampm; } else { return ("0" + (d.getMonth() + 1)).slice(-2) + "/" + ("0" + d.getDate()).slice(-2) + "/" + d.getFullYear(); } } function RowMenu(props) { const { row, actions, onSelectedAction, onRowEdit } = props; const [anchorEl, setAnchorEl] = React.useState(null); const handleMenuClick = (event) => { event.stopPropagation(); setAnchorEl(event.currentTarget); }; const handleSelectMenu = (e, row, action) => { e.stopPropagation(); onSelectedAction(row, action.action_name); setAnchorEl(null); } const handleClose = (e) => { setAnchorEl(null); e.stopPropagation(); }; const handleEdit = (e) => { onRowEdit(row); e.stopPropagation(); } return (
{actions.map((action) => { return handleSelectMenu(e, row, action)} > {action.display_name} } )}
); } RowMenu.propTypes = { row: PropTypes.object.isRequired, actions: PropTypes.array.isRequired, onSelectedAction: PropTypes.func.isRequired, onRowEdit: PropTypes.func } function ConfirmDialog(props) { const { type, itemName, openDialog, onCancel, onContinue } = props; const [open, setOpen] = React.useState(openDialog); const handleClose = () => { setOpen(false); onCancel(false); }; const handleContinue = () => { onContinue(true); } return (
{"Delete this " + type + ' "' + itemName + '"?'}
); } ConfirmDialog.propTypes = { history: PropTypes.object, type: PropTypes.string, itemName: PropTypes.string, openDialog: PropTypes.bool, onCancel: PropTypes.func, onContinue: PropTypes.func }; function MkTable(props) { console.log("props.styles:", props.styles) const classes = useStyles(props.styles); const { dispatch, data = [], headers = [], actions, onActions, title, page, rowsPerPage, noMoreToLoad = false, order, orderBy, isLoading = false, onChangePaginatePage, onGetData, onUpdateDataRow, onChangeRowPerPage, dense = true, } = props; const [_rowsPerPage, setRowsPerPage] = React.useState(rowsPerPage); const [_page, setPage] = React.useState(page); const [_noMoreToLoad, setNoMoreToLoad] = React.useState(noMoreToLoad); const [_order, setOrder] = React.useState(order); const [_orderBy, setOrderBy] = React.useState(orderBy); const [_isLoading, setIsLoading] = React.useState(isLoading); const [_isConfirm, setIsConfirm] = React.useState(false); const [itemName, setItemName] = React.useState(''); const [row, setRow] = React.useState({}); const [action, setAction] = React.useState(''); const [_dense, setDense] = React.useState(dense); const handleSelectMenu = (row, action) => { if (action === 'delete') { setItemName(row.name === undefined ? row.product_desc : row.name); setIsConfirm(true); setRow(row); setAction(action); } else { onActions(row, action); } } const handleDelete = (v) => { setIsConfirm(false); onActions(row, action); } const handleCancel = (v) => { setIsConfirm(false); } const handleRowEdit = (row) => { onUpdateDataRow(row); } var offset = _page * _rowsPerPage; useEffect(() => { setNoMoreToLoad(noMoreToLoad); setPage(page); setOrder(order); setOrderBy(orderBy); setIsLoading(isLoading); setRowsPerPage(rowsPerPage); setDense(dense); }, []); const handleRequestSort = (event, property) => { const isAsc = _orderBy === property && _order === 'asc'; setOrder(isAsc ? 'desc' : 'asc'); setOrderBy(property); }; const handleChangePage = (event, newPage) => { if (!_noMoreToLoad && (newPage + 1) * _rowsPerPage >= data.length) { onGetData(); } setPage(newPage); onChangePaginatePage(newPage); }; const handleChangeRowsPerPage = (event) => { setRowsPerPage(parseInt(event.target.value)); onChangeRowPerPage(parseInt(event.target.value)); setPage(0); }; const getStatus = (data, header) => { var v = data[header.id]; var _color = 'red'; if (v === 'Pending') { _color = 'red'; } else if (v === 'Started') { _color = 'orange'; } else { _color = 'green'; } return ({data[header.id]}); }; return (
{_isLoading ? : (data.length !== 0 ? stableSort(data, getComparator(_order, _orderBy)) .slice(_page * _rowsPerPage, _page * _rowsPerPage + _rowsPerPage) .map((row, index) => { return ( {headers.map((h, i) => { if (h.id === 'sr') { return ({++offset}); } if (h.id === 'status') { getStatus(row, h); return ({row[h.id]}); } if (h.id === 'updated_date') { return ({getUpdatedDate(row)}); } else { return ({row[h.id]}); } })} {actions ? handleRowEdit(data)} onSelectedAction={(data, actionName) => handleSelectMenu(data, actionName)} /> : handleRowEdit(row)} size={dense ? "small" : "medium"}> } ); }) : )}
{ console.log(from, to, count) }} component="div" count={data.length} rowsPerPage={_rowsPerPage} page={_page} onChangePage={handleChangePage} onChangeRowsPerPage={handleChangeRowsPerPage} />
{_isConfirm ? handleCancel(v)} onContinue={(v) => handleDelete(v)} /> :
}
); } MkTable.propTypes = { history: PropTypes.object, headers: PropTypes.array.isRequired, data: PropTypes.array.isRequired, query: PropTypes.object, onProductBOMClick: PropTypes.func, onActions: PropTypes.func, actions: PropTypes.array, title: PropTypes.string, order: PropTypes.any, orderBy: PropTypes.any, rowsPerPage: PropTypes.any, noMoreToLoad: PropTypes.any, isLoading: PropTypes.any, onChangePaginatePage: PropTypes.any, onGetData: PropTypes.any, onChangeRowPerPage: PropTypes.any, dense: PropTypes.any, styles: PropTypes.any }; export default (MkTable);