ClientsTab.jsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import Typography from "@mui/material/Typography";
  2. import {useEffect, useState} from "react";
  3. import {
  4. Avatar,
  5. Card,
  6. CardContent,
  7. CardHeader,
  8. CircularProgress,
  9. Collapse, Divider,
  10. FormControl,
  11. MenuItem, Pagination,
  12. Select
  13. } from "@mui/material";
  14. import Box from "@mui/material/Box";
  15. import {backURL} from "../../actions/PathDB";
  16. import userDefault from "../../img/header/userDefault.png";
  17. import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
  18. import {connect} from "react-redux";
  19. import {actionUserCount, actionUserFind} from "../../actions/ActionUserFind";
  20. import {timeCalc} from "../ProductPage/timeCalc";
  21. const ClientsCart = ({_id, login, nick, avatar, createdAt, acl}) => {
  22. const ItemAccordion = ({text, size='h6'}) => {
  23. return (
  24. <Typography
  25. variant={size}
  26. color='#616161'
  27. letterSpacing='1px'
  28. >
  29. {text}
  30. </Typography>
  31. )
  32. }
  33. const [expanded, setExpanded] = useState(false);
  34. const handleExpandClick = () => {
  35. setExpanded(!expanded);
  36. };
  37. return (
  38. <Card sx={{boxShadow: 'none', border: '1px solid #616161', marginBottom: '20px'}}>
  39. <Box display='flex' justifyContent='space-between' alignItems='center' padding='0 20px 0 10px'
  40. style={{cursor:'pointer'}}
  41. onClick={handleExpandClick}
  42. >
  43. <CardHeader
  44. avatar={
  45. avatar ?
  46. <Avatar alt="User" src={avatar?.url && backURL + '/' + avatar.url}/> :
  47. <Avatar alt="User" src={userDefault}/>
  48. }
  49. title={`Login: ${login || 'login'} ${nick ? '| Nick: ' + nick : ''} ${(acl && Array.isArray(acl) && acl.length > 1) ? '| Status: ' + acl.slice(1, acl.length).toString() : ''}`}
  50. subheader={timeCalc(+createdAt || 0)}
  51. />
  52. <ExpandMoreIcon />
  53. </Box>
  54. <Collapse in={expanded} timeout="auto" unmountOnExit>
  55. <CardContent>
  56. <ItemAccordion text={`Login: ${login || 'login'}`}/>
  57. <ItemAccordion size={'body1'} text={`${nick ? 'Nick: ' + nick : ''}`}/>
  58. <ItemAccordion size={'body1'} text={`${(acl && Array.isArray(acl) && acl.length > 1) ? 'Status: ' + acl.slice(1, acl.length).toString() : ''}`}/>
  59. <ItemAccordion size={'body1'} text={'Created at: '+timeCalc(+createdAt || 0)}/>
  60. </CardContent>
  61. </Collapse>
  62. </Card>
  63. )
  64. }
  65. const Clients = ({usersArr, usersCount, getAllClients, getCountUser}) => {
  66. const itemsPerPage = 100
  67. const [page, setPage] = useState(1)
  68. const [sortValue, setSortValue] = useState('login')
  69. const [sortVector, setSortVector] = useState(1)
  70. const [sortSelect, setSortSelect] = useState(0)
  71. useEffect(() => {
  72. if (!usersArr && page === 1) getAllClients()
  73. if (!usersCount) getCountUser()
  74. else {
  75. setCount(Math.ceil(+usersCount?.payload / itemsPerPage))
  76. }
  77. }, [getAllClients, getCountUser, page, sortValue, sortVector, usersArr, usersCount])
  78. const [count, setCount] = useState(1)
  79. const handleChange = (event, value) => {
  80. setPage(value);
  81. getAllClients(itemsPerPage * value, sortValue, sortVector);
  82. }
  83. const handleChangeSelect = (event) => {
  84. setSortSelect(event.target.value);
  85. if (event.target.value === 0){
  86. setSortValue('login')
  87. setSortVector(1)
  88. getAllClients(itemsPerPage*page, sortValue, sortVector)
  89. }
  90. else if (event.target.value === 1){
  91. setSortValue('login')
  92. setSortVector(-1)
  93. getAllClients(itemsPerPage*page, sortValue, sortVector)
  94. }
  95. else if (event.target.value === 2){
  96. setSortValue('login')
  97. setSortVector(1)
  98. getAllClients(itemsPerPage*page, sortValue, sortVector)
  99. }
  100. else if (event.target.value === 3){
  101. setSortValue('createdAt')
  102. setSortVector(1)
  103. getAllClients(itemsPerPage*page, sortValue, sortVector)
  104. }
  105. else if (event.target.value === 4){
  106. setSortValue('createdAt')
  107. setSortVector(-1)
  108. getAllClients(itemsPerPage*page, sortValue, sortVector)
  109. }
  110. }
  111. return (
  112. <>
  113. <Box marginBottom='20px' width='100%' display='flex' justifyContent='space-between' alignItems='center'>
  114. {usersCount?.payload && <Typography variant='h6' letterSpacing='2px'>Total clients: {usersCount.payload}</Typography>}
  115. <FormControl variant="standard">
  116. <Select
  117. labelId="demo-simple-select-label"
  118. id="demo-simple-select"
  119. value={sortSelect}
  120. label="Sort"
  121. onChange={handleChangeSelect}
  122. sx={{textTransform: 'uppercase', color: '#616161'}}
  123. >
  124. <MenuItem value={0}>Default sort</MenuItem>
  125. <MenuItem value={1}>Sort by login: ascending</MenuItem>
  126. <MenuItem value={2}>Sort by login: descending</MenuItem>
  127. <MenuItem value={3}>Sort by created at: ascending</MenuItem>
  128. <MenuItem value={4}>Sort by created at: descending</MenuItem>
  129. </Select>
  130. </FormControl>
  131. </Box>
  132. {!usersArr || !usersArr?.payload ?
  133. <Box sx={{height: '100%', width: '100%', display: 'flex', justifyContent:'center', alignItems:'center'}}><CircularProgress color="inherit"/></Box>:
  134. Array.isArray(usersArr.payload) && usersArr.payload.map(item => {
  135. return <ClientsCart key={item?._id} _id={item?._id || ''} login={item?.login || 'not found'} nick={item?.nick || ''} createdAt={item?.createdAt || ''} avatar={item?.avatar} acl={item?.acl}/>
  136. })
  137. }
  138. <Box width='100%' flexGrow='0'>
  139. <Divider sx={{margin: '20px'}}/>
  140. <Box display='flex' justifyContent='center' width='100%'>
  141. <Pagination
  142. count={count}
  143. page={page}
  144. onChange={handleChange}
  145. defaultPage={1}
  146. color="primary"
  147. size="large"
  148. showFirstButton
  149. showLastButton
  150. />
  151. </Box>
  152. </Box>
  153. </>
  154. )
  155. }
  156. export const CClients = connect(state => ({usersArr: state.promise['allUsers'], usersCount: state.promise['usersCount']}), {getAllClients: actionUserFind, getCountUser: actionUserCount})(Clients)