PotapovaA cf42e23fcb fix
2026-08-13 16:49:38 +03:00

199 lines
5.1 KiB
JavaScript

import styled from '@emotion/styled';
import { Box, Typography } from '@mui/material';
import { useEffect, useState } from 'react';
import { toast } from 'react-toastify';
import { UsersApi } from '../../../api/users';
import { PrimaryButton, SecondaryButton } from '../../../components/common/Buttons/Buttons';
import InlineTagInput from '../../../components/common/InlineTagInput';
import Modal from '../../../components/common/Modal/Modal';
import { EmptyListIcon } from '../../../components/common/icons/icons';
import { TrashSvg } from '../../../components/common/icons/icons';
const ContainerForEmptyIcon = styled(Box)`
height: 22.88rem;
width: 58.13rem;
display: flex;
flex-direction: column;
gap: 1.5rem;
justify-content: center;
align-items: center;
`;
export const ModalAddUsers = ({ open, onClose, onAddUser }) => {
const [users, setUsers] = useState([]);
const [tableIsEmpty, setTableEmpty] = useState(true);
const [usersEmailToAdd, setUsersToAdd] = useState([]);
const handleAddToListUser = (users) => {
setUsers(users);
setTableEmpty(false);
};
useEffect(() => {
setUsers([]);
setTableEmpty(true);
setUsersToAdd([]);
}, [open]);
useEffect(() => {
const newUsers = users.map((u) => ({
full_name: '',
email: u,
username: u.split('@')[0],
}));
setUsersToAdd((prev) => [...prev, ...newUsers]);
}, [users]);
const handleDeleteUser = (indx) => {
setUsersToAdd((prev) => {
return prev.filter((item, i) => i !== indx);
});
};
const handleAddUsers = () => {
for (const user of usersEmailToAdd) {
user['password'] = 'admin123';
UsersApi.createUser(user)
.then((data) => {
if (data.success) {
onAddUser(data.result);
} else {
toast.error('При добавлении пользователя возникла ошибка: ', data.message);
}
})
.catch((error) => {
toast.error('При добавлении пользователя возникла ошибка: ');
});
}
onClose?.();
};
return (
<Modal
title={'Добавить пользователей'}
open={open}
onClose={onClose}
customSize={58.13}
actions={
<>
<SecondaryButton onClick={onClose} sx={{ height: '2.5rem' }}>
Отменить
</SecondaryButton>
<PrimaryButton sx={{ height: '2.5rem' }} onClick={handleAddUsers}>
Сохранить
</PrimaryButton>
</>
}>
<InlineTagInput onSaveTags={handleAddToListUser}></InlineTagInput>
{users.length == 0 && tableIsEmpty ? (
<ContainerForEmptyIcon>
<EmptyListIcon />
<Typography
sx={{
fontWeight: 400,
fontSize: '0.88rem',
color: '#323031',
}}>
Список пользователей пуст
</Typography>
</ContainerForEmptyIcon>
) : (
<Box
sx={{
paddingTop: '1.25rem',
display: 'grid',
gridTemplateRows: 'auto 1fr',
width: '55.13rem',
height: '22.88rem',
overflow: 'hidden',
}}>
<Box
sx={{
display: 'grid',
gridTemplateColumns: '29.75rem 21.38rem 4rem',
gap: '0.75rem',
position: 'sticky',
top: 0,
zIndex: 1,
borderBottom: '1px solid #ccc',
paddingBottom: '.5rem',
}}>
<Box sx={{ fontSize: '0.75rem', lineHeight: '133%', color: '#323031' }}>ФИО</Box>
<Box sx={{ fontSize: '0.75rem', lineHeight: '133%', color: '#323031' }}>Почта</Box>
<Box></Box>
</Box>
<Box
sx={{
overflowY: 'auto',
paddingTop: '.38rem',
}}>
<Box
sx={{
display: 'grid',
gridTemplateColumns: '29.75rem 21.38rem 4rem',
gap: '0.75rem',
width: '100%',
}}>
{usersEmailToAdd.map((user, index) => (
<Box
key={user.email}
sx={{
display: 'contents',
}}>
<Box>
<input
type='text'
defaultValue={user.full_name}
onChange={(event) => {
user.full_name = event.target.value;
}}
style={{
border: '1px solid #ccc',
borderRadius: '0.5rem',
fontSize: '0.75rem',
boxSizing: 'border-box',
width: '20.5rem',
height: '2rem',
padding: '0.25rem 0.75rem',
color: '#4a5565',
}}
/>
</Box>
<Box
sx={{
border: '1px solid #ccc',
borderRadius: '0.5rem',
fontSize: '0.75rem',
boxSizing: 'border-box',
height: '2rem',
padding: '0.25rem 0.75rem',
color: '#4a5565',
width: 'min-content',
maxWidth: '100%',
backgroundColor: 'white',
}}>
{user.email}
</Box>
<Box sx={{ textAlign: 'center' }}>
<button
onClick={() => handleDeleteUser(index)}
style={{
width: '2rem',
height: '2rem',
border: 'none',
}}>
<TrashSvg size={'1.25rem'} fill={'#ff6467'} />
</button>
</Box>
</Box>
))}
</Box>
</Box>
</Box>
)}
</Modal>
);
};