Some checks failed
No response / noResponse (push) Has been cancelled
CI / Continuous releases (push) Has been cancelled
CI / test-dev (macos-latest) (push) Has been cancelled
CI / test-dev (ubuntu-latest) (push) Has been cancelled
CI / test-dev (windows-latest) (push) Has been cancelled
Maintenance / main (push) Has been cancelled
Scorecards supply-chain security / Scorecards analysis (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
166 lines
4.7 KiB
JavaScript
166 lines
4.7 KiB
JavaScript
import * as React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import IconButton from '@mui/joy/IconButton';
|
|
import Table from '@mui/joy/Table';
|
|
import Typography from '@mui/joy/Typography';
|
|
import Sheet from '@mui/joy/Sheet';
|
|
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
|
|
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
|
|
|
|
function createData(name, calories, fat, carbs, protein, price) {
|
|
return {
|
|
name,
|
|
calories,
|
|
fat,
|
|
carbs,
|
|
protein,
|
|
price,
|
|
history: [
|
|
{
|
|
date: '2020-01-05',
|
|
customerId: '11091700',
|
|
amount: 3,
|
|
},
|
|
{
|
|
date: '2020-01-02',
|
|
customerId: 'Anonymous',
|
|
amount: 1,
|
|
},
|
|
],
|
|
};
|
|
}
|
|
|
|
function Row(props) {
|
|
const { row } = props;
|
|
const [open, setOpen] = React.useState(props.initialOpen || false);
|
|
|
|
return (
|
|
<React.Fragment>
|
|
<tr>
|
|
<td>
|
|
<IconButton
|
|
aria-label="expand row"
|
|
variant="plain"
|
|
color="neutral"
|
|
size="sm"
|
|
onClick={() => setOpen(!open)}
|
|
>
|
|
{open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
|
|
</IconButton>
|
|
</td>
|
|
<th scope="row">{row.name}</th>
|
|
<td>{row.calories}</td>
|
|
<td>{row.fat}</td>
|
|
<td>{row.carbs}</td>
|
|
<td>{row.protein}</td>
|
|
</tr>
|
|
<tr>
|
|
<td style={{ height: 0, padding: 0 }} colSpan={6}>
|
|
{open && (
|
|
<Sheet
|
|
variant="soft"
|
|
sx={{ p: 1, pl: 6, boxShadow: 'inset 0 3px 6px 0 rgba(0 0 0 / 0.08)' }}
|
|
>
|
|
<Typography level="body-lg" component="div">
|
|
History
|
|
</Typography>
|
|
<Table
|
|
borderAxis="bothBetween"
|
|
size="sm"
|
|
aria-label="purchases"
|
|
sx={{
|
|
'& > thead > tr > th:nth-child(n + 3), & > tbody > tr > td:nth-child(n + 3)':
|
|
{ textAlign: 'right' },
|
|
'--TableCell-paddingX': '0.5rem',
|
|
}}
|
|
>
|
|
<thead>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th>Customer</th>
|
|
<th>Amount</th>
|
|
<th>Total price ($)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{row.history.map((historyRow) => (
|
|
<tr key={historyRow.date}>
|
|
<th scope="row">{historyRow.date}</th>
|
|
<td>{historyRow.customerId}</td>
|
|
<td>{historyRow.amount}</td>
|
|
<td>
|
|
{Math.round(historyRow.amount * row.price * 100) / 100}
|
|
</td>
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</Table>
|
|
</Sheet>
|
|
)}
|
|
</td>
|
|
</tr>
|
|
</React.Fragment>
|
|
);
|
|
}
|
|
|
|
Row.propTypes = {
|
|
initialOpen: PropTypes.bool,
|
|
row: PropTypes.shape({
|
|
calories: PropTypes.number.isRequired,
|
|
carbs: PropTypes.number.isRequired,
|
|
fat: PropTypes.number.isRequired,
|
|
history: PropTypes.arrayOf(
|
|
PropTypes.shape({
|
|
amount: PropTypes.number.isRequired,
|
|
customerId: PropTypes.string.isRequired,
|
|
date: PropTypes.string.isRequired,
|
|
}),
|
|
).isRequired,
|
|
name: PropTypes.string.isRequired,
|
|
price: PropTypes.number.isRequired,
|
|
protein: PropTypes.number.isRequired,
|
|
}).isRequired,
|
|
};
|
|
|
|
const rows = [
|
|
createData('Frozen yoghurt', 159, 6.0, 24, 4.0, 3.99),
|
|
createData('Ice cream sandwich', 237, 9.0, 37, 4.3, 4.99),
|
|
createData('Eclair', 262, 16.0, 24, 6.0, 3.79),
|
|
createData('Cupcake', 305, 3.7, 67, 4.3, 2.5),
|
|
createData('Gingerbread', 356, 16.0, 49, 3.9, 1.5),
|
|
];
|
|
|
|
export default function TableCollapsibleRow() {
|
|
return (
|
|
<Sheet>
|
|
<Table
|
|
aria-label="collapsible table"
|
|
sx={{
|
|
'& > thead > tr > th:nth-child(n + 3), & > tbody > tr > td:nth-child(n + 3)':
|
|
{ textAlign: 'right' },
|
|
'& > tbody > tr:nth-child(odd) > td, & > tbody > tr:nth-child(odd) > th[scope="row"]':
|
|
{
|
|
borderBottom: 0,
|
|
},
|
|
}}
|
|
>
|
|
<thead>
|
|
<tr>
|
|
<th style={{ width: 40 }} aria-label="empty" />
|
|
<th style={{ width: '40%' }}>Dessert (100g serving)</th>
|
|
<th>Calories</th>
|
|
<th>Fat (g)</th>
|
|
<th>Carbs (g)</th>
|
|
<th>Protein (g)</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{rows.map((row, index) => (
|
|
<Row key={row.name} row={row} initialOpen={index === 0} />
|
|
))}
|
|
</tbody>
|
|
</Table>
|
|
</Sheet>
|
|
);
|
|
}
|