import React from 'react'; import PropTypes from 'prop-types'; import { withStyles } from '@material-ui/core/styles'; import classNames from 'classnames'; import tableStyles from 'ba-styles/Table.scss'; import { Table, TableBody, TableCell, TableRow, TablePagination, Paper, Checkbox } from '@material-ui/core'; import EnhancedTableHead from './tableParts/TableHeader'; import EnhancedTableToolbar from './tableParts/TableToolbar'; const styles = theme => ({ root: { width: '100%', marginTop: theme.spacing(3), }, table: { minWidth: 1020, }, tableWrapper: { overflowX: 'auto', }, }); class AdvTable extends React.Component { constructor(props, context) { super(props, context); this.state = { order: this.props.order, orderBy: this.props.orderBy, selected: this.props.selected, data: this.props.data.sort((a, b) => (a.calories < b.calories ? -1 : 1)), page: this.props.page, rowsPerPage: this.props.rowsPerPage, defaultPerPage: this.props.defaultPerPage, filterText: this.props.filterText, }; } handleRequestSort = (event, property) => { const orderBy = property; let order = 'desc'; if (this.state.orderBy === property && this.state.order === 'desc') { order = 'asc'; } const data = order === 'desc' ? this.state.data.sort((a, b) => (b[orderBy] < a[orderBy] ? -1 : 1)) : this.state.data.sort((a, b) => (a[orderBy] < b[orderBy] ? -1 : 1)); this.setState({ data, order, orderBy }); }; handleSelectAllClick = (event, checked) => { if (checked) { this.setState({ selected: this.state.data.map(n => n.id) }); return; } this.setState({ selected: [] }); }; handleClick = (event, id) => { const { selected } = this.state; const selectedIndex = selected.indexOf(id); let newSelected = []; if (selectedIndex === -1) { newSelected = newSelected.concat(selected, id); } else if (selectedIndex === 0) { newSelected = newSelected.concat(selected.slice(1)); } else if (selectedIndex === selected.length - 1) { newSelected = newSelected.concat(selected.slice(0, -1)); } else if (selectedIndex > 0) { newSelected = newSelected.concat( selected.slice(0, selectedIndex), selected.slice(selectedIndex + 1), ); } this.setState({ selected: newSelected }); }; handleChangePage = (event, page) => { this.setState({ page }); }; handleChangeRowsPerPage = event => { this.setState({ rowsPerPage: event.target.value }); }; isSelected = id => this.state.selected.indexOf(id) !== -1; handleUserInput(value) { // Show all item first if (value !== '') { this.setState({ rowsPerPage: this.state.data.length }); } else { this.setState({ rowsPerPage: this.state.defaultPerPage }); } // Show result base on keyword this.setState({ filterText: value.toLowerCase() }); } render() { const { classes } = this.props; const { data, order, orderBy, selected, rowsPerPage, page, filterText } = this.state; const { columnData } = this.props; const checkcell = true; const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - (page * rowsPerPage)); const renderCell = (dataArray, keyArray) => keyArray.map((itemCell, index) => ( {dataArray[itemCell.id]} )); return ( this.handleUserInput(event)} />
{data.slice(page * rowsPerPage, (page * rowsPerPage) + rowsPerPage).map(n => { const isSelected = this.isSelected(n.id); if (n.name.toLowerCase().indexOf(filterText) === -1) { return false; } return ( this.handleClick(event, n.id)} role="checkbox" aria-checked={isSelected} tabIndex={-1} key={n.id} selected={isSelected} > {renderCell(n, columnData)} ); })} {emptyRows > 0 && ( )}
); } } AdvTable.propTypes = { classes: PropTypes.object.isRequired, data: PropTypes.array.isRequired, order: PropTypes.string.isRequired, orderBy: PropTypes.string.isRequired, selected: PropTypes.array.isRequired, rowsPerPage: PropTypes.number.isRequired, page: PropTypes.number.isRequired, defaultPerPage: PropTypes.number.isRequired, filterText: PropTypes.string.isRequired, columnData: PropTypes.array.isRequired, }; export default withStyles(styles)(AdvTable);