OrdersTableCollaps copy.jsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import * as React from 'react';
  2. import Paper from '@mui/material/Paper';
  3. import Table from '@mui/material/Table';
  4. import TableBody from '@mui/material/TableBody';
  5. import TableCell from '@mui/material/TableCell';
  6. import TableContainer from '@mui/material/TableContainer';
  7. import TableHead from '@mui/material/TableHead';
  8. import TablePagination from '@mui/material/TablePagination';
  9. import TableRow from '@mui/material/TableRow';
  10. import { Box, Collapse, IconButton, Typography } from '@mui/material';
  11. import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
  12. import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';
  13. const columns = [
  14. {id: '_', label: '',},
  15. { id: '_id', label: 'Номер заказа', minWidth: 170 },
  16. {
  17. id: 'createdAt',
  18. label: 'Дата',
  19. minWidth: 100,
  20. format: (value) => {
  21. const createdAtFormat = new Date(+value)
  22. const year = createdAtFormat.getFullYear()
  23. const month = createdAtFormat.getMonth() < 9 ? "0" + (createdAtFormat.getMonth() + 1) : createdAtFormat.getMonth() + 1
  24. const day = createdAtFormat.getDate() < 10 ? "0" + (createdAtFormat.getDate()) : createdAtFormat.getDate()
  25. const hours = createdAtFormat.getHours() < 10 ? "0" + (createdAtFormat.getHours()) : createdAtFormat.getHours()
  26. const minutes = createdAtFormat.getMinutes() < 10 ? "0" + (createdAtFormat.getMinutes()) : createdAtFormat.getMinutes()
  27. const createdAtForTable = `${year}.${month}.${day} ${hours}:${minutes} `
  28. return createdAtForTable
  29. }
  30. },
  31. {
  32. id: 'total',
  33. label: 'Сумма',
  34. minWidth: 170,
  35. align: 'right',
  36. format: (value) => value.toLocaleString('en-US'),
  37. },
  38. {
  39. id: 'orderGoods',
  40. label: 'Количество товаров',
  41. minWidth: 170,
  42. align: 'right',
  43. format: (value) => {
  44. return Array.isArray(value) ? value?.length : value
  45. // на момент написания на сайте были битые заказы с orderGoods: null
  46. },
  47. },
  48. ];
  49. export default function StickyHeadTable({rows = []}) {
  50. const [page, setPage] = React.useState(0);
  51. const [rowsPerPage, setRowsPerPage] = React.useState(10);
  52. const handleChangePage = (event, newPage) => {
  53. setPage(newPage);
  54. };
  55. const handleChangeRowsPerPage = (event) => {
  56. setRowsPerPage(+event.target.value);
  57. setPage(0);
  58. };
  59. return (
  60. <Paper sx={{ width: '100%', overflow: 'hidden' }}>
  61. <TableContainer sx={{ maxHeight: 440 }}>
  62. <Table stickyHeader size="small" aria-label="sticky table">
  63. <TableHead>
  64. <TableRow>
  65. {columns.map((column) => (
  66. <TableCell
  67. key={column.id}
  68. align={column.align}
  69. style={{ minWidth: column.minWidth }}
  70. >
  71. {column.label}
  72. </TableCell>
  73. ))}
  74. </TableRow>
  75. </TableHead>
  76. <TableBody>
  77. {rows
  78. .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
  79. .map((row) => {
  80. return (
  81. <Row row ={row}></Row>
  82. );
  83. })}
  84. </TableBody>
  85. </Table>
  86. </TableContainer>
  87. <TablePagination
  88. rowsPerPageOptions={[10, 25, 100]}
  89. component="div"
  90. count={rows.length}
  91. rowsPerPage={rowsPerPage}
  92. page={page}
  93. onPageChange={handleChangePage}
  94. onRowsPerPageChange={handleChangeRowsPerPage}
  95. />
  96. </Paper>
  97. );
  98. }
  99. // єто біло в табе боди стр 83
  100. // <TableRow hover role="checkbox" tabIndex={-1} key={row._id}>
  101. // {columns.map((column) => {
  102. // const value = row[column.id]
  103. // {/* console.log('value', value) */}
  104. // return (
  105. // <TableCell key={column.id} align={column.align}>
  106. // {column.format ? column.format(value) : value}
  107. // </TableCell>
  108. // );
  109. // })}
  110. // </TableRow>
  111. function Row(props) {
  112. const { row } = props;
  113. const [open, setOpen] = React.useState(false);
  114. return (
  115. <React.Fragment>
  116. <TableRow sx={{ '& > *': { borderBottom: 'unset' } }}>
  117. <TableCell>
  118. <IconButton
  119. aria-label="expand row"
  120. size="small"
  121. onClick={() => setOpen(!open)}
  122. >
  123. {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
  124. </IconButton>
  125. </TableCell>
  126. <TableCell component="th" scope="row">
  127. {row._id}
  128. </TableCell>
  129. <TableCell align="right">{row. createdAt}</TableCell>
  130. <TableCell align="right">{row.total}</TableCell>
  131. </TableRow>
  132. <TableRow>
  133. <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>
  134. <Collapse in={open} timeout="auto" unmountOnExit>
  135. <Box sx={{ margin: 1 }}>
  136. <Typography variant="h6" gutterBottom component="div">
  137. Подробности заказа
  138. </Typography>
  139. <Table size="small" aria-label="purchases">
  140. <TableHead>
  141. <TableRow>
  142. <TableCell>ID товара</TableCell>
  143. <TableCell>Название</TableCell>
  144. <TableCell align="right">Количество (шт)</TableCell>
  145. <TableCell align="right">Цена (грн.)</TableCell>
  146. <TableCell align="right">Сумма (грн.)</TableCell>
  147. </TableRow>
  148. </TableHead>
  149. <TableBody>
  150. {row.orderGoods ?
  151. row.orderGoods.map((orderGood) => {
  152. console.log('orderGood true', orderGood)
  153. if(orderGood){
  154. return (
  155. <TableRow key={orderGood._id}>
  156. <TableCell component="th" scope="row">
  157. {orderGood?._id}
  158. </TableCell>
  159. <TableCell >
  160. {orderGood?.goodName || ''}
  161. </TableCell>
  162. <TableCell align="right">
  163. {orderGood?.count}
  164. </TableCell>
  165. <TableCell align="right">
  166. {orderGood?.price}
  167. </TableCell>
  168. <TableCell align="right">
  169. {orderGood?.total}
  170. </TableCell>
  171. </TableRow>
  172. )
  173. }
  174. } )
  175. :
  176. null
  177. }
  178. </TableBody>
  179. </Table>
  180. </Box>
  181. </Collapse>
  182. </TableCell>
  183. </TableRow>
  184. </React.Fragment>
  185. );
  186. }