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 EnhancedTableHead from 'ba-components/Tables/tableParts/TableHeader';
import EnhancedTableToolbar from 'ba-components/Tables/tableParts/TableToolbar';
import { PapperBlock } from 'ba-components';
import {
Grid,
FormControl,
FormLabel,
FormControlLabel,
FormGroup,
RadioGroup,
Radio,
Table,
TableBody,
TableCell,
TableRow,
TablePagination,
Paper,
Checkbox,
} from '@material-ui/core';
const styles = theme => ({
root: {
width: '100%',
marginTop: theme.spacing(3),
overflowX: 'auto',
},
demo: {
height: 240,
},
paper: {
padding: theme.spacing(2),
height: '100%',
backgroundColor: theme.palette.secondary.light,
},
control: {
padding: theme.spacing(2),
},
settings: {
padding: 30
},
});
let counter = 0;
function createData(name, calories, fat, carbs, protein) {
counter += 1;
return {
id: counter,
name,
calories,
fat,
carbs,
protein
};
}
class InteractiveGrid extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
order: 'asc',
orderBy: 'calories',
selected: [],
columnData: [
{
id: 'name',
numeric: false,
disablePadding: false,
label: 'Dessert (100g serving)'
}, {
id: 'calories',
numeric: true,
disablePadding: false,
label: 'Calories'
}, {
id: 'fat',
numeric: true,
disablePadding: false,
label: 'Fat (g)'
}, {
id: 'carbs',
numeric: true,
disablePadding: false,
label: 'Carbs (g)'
}, {
id: 'protein',
numeric: true,
disablePadding: false,
label: 'Protein (g)'
},
],
data: [
createData('Cupcake', 305, 3.7, 67, 4.3),
createData('Donut', 452, 25.0, 51, 4.9),
createData('Eclair', 262, 16.0, 24, 6.0),
createData('Frozen yoghurt', 159, 6.0, 24, 4.0),
createData('Gingerbread', 356, 16.0, 49, 3.9),
createData('Honeycomb', 408, 3.2, 87, 6.5),
createData('Ice cream sandwich', 237, 9.0, 37, 4.3),
createData('Jelly Bean', 375, 0.0, 94, 0.0),
createData('KitKat', 518, 26.0, 65, 7.0),
createData('Lollipop', 392, 0.2, 98, 0.0),
createData('Marshmallow', 318, 0, 81, 2.0),
createData('Nougat', 360, 19.0, 9, 37.0),
createData('Oreo', 437, 18.0, 63, 4.0),
].sort((a, b) => (a.calories < b.calories ? -1 : 1)),
page: 0,
rowsPerPage: 5,
defaultPerPage: 5,
filterText: '',
size: 'medium',
bordered: false,
stripped: true,
hovered: false,
toolbar: true,
checkcell: false,
pagination: true
};
}
handleChangeRadio = key => (event, value) => {
this.setState({
[key]: value,
});
};
handleChangeCheck = name => event => {
this.setState({ [name]: event.target.checked });
};
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) => {
if (!this.state.checkcell) {
return;
}
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,
size,
columnData,
toolbar, pagination, checkcell,
bordered, stripped, hovered
} = this.state;
const emptyRows = rowsPerPage - Math.min(rowsPerPage, data.length - (page * rowsPerPage));
const renderCell = (dataArray, keyArray) => keyArray.map((itemCell, index) => (
{dataArray[itemCell.id]}
));
return (
Size
} label="Small" />
} label="Medium" />
} label="Big" />
Style
)}
label="Bordered"
/>
)}
label="Strppied"
/>
)}
label="Hovered"
/>
Component
)}
label="Toolbar"
/>
)}
label="Checkbox"
/>
)}
label="Pagination"
/>
{toolbar
&& (
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}
>
{checkcell
&& (
)
}
{renderCell(n, columnData)}
);
})}
{emptyRows > 0 && (
)}
{pagination
&& (
)
}
);
}
}
InteractiveGrid.propTypes = {
classes: PropTypes.object.isRequired,
};
export default withStyles(styles)(InteractiveGrid);