import { useState, useEffect } from 'react'; import { PageContainer } from '../../StyledForPage'; import { HeaderSwitch } from '../../../components/HeaderMenu/HeaderSwitch'; import { SwitchUserSsp } from '../../../components/AdminPanel/SwitchUserSsp'; import { ROLES_ID_RUSSIAN_NAME_ARRAY, ROLES_NAME_ID } from '../../../constants'; import { useAuth } from '../../../app/context/AuthProvider'; import { Box, TextField, Autocomplete, FormLabel } from '@mui/material'; import SearchComponent from '../../../components/common/SearchComponent'; import { toast } from 'react-toastify'; import { SspApi } from '../../../api/ssp'; import { UsersApi } from '../../../api/users'; import UserTable from './UserTable/UserTable'; import { ROLES_ID_RUSSIAN_NAME } from '../../../constants'; import { ModalEditUserSsp } from './ModalEditUserSsp'; import { ModalAddUsers } from './ModalAddUsers'; import UsersActionBar from './UsersActionBar'; import { PrimaryButton } from '../../../components/common/Buttons/Buttons'; import { WhitePlus } from '../../../components/common/icons/icons'; const UsersPage = () => { const { user } = useAuth(); const [deps, setDeps] = useState([]); const [roles, setRoles] = useState([]); const [dep, setDep] = useState(null); const [role, setRole] = useState(null); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(false); const [filterString, setFilterString] = useState(''); const [editableUser, setEditableUser] = useState(null); const [selectedUsersId, setSelectedUsersId] = useState(new Set()); const [openEditUsers, setOpenEditUserSsp] = useState(false); const [openModalAddUsers, setOpenModalAddUser] = useState(false); const loadUsers = async () => { setLoading(true); try { const data = await UsersApi.getAll(); if (!data.success) { toast.error('Ошибка получения пользователей ' + data.message); return; } setUsers(data.result.sort((a, b) => a.id - b.id)); } catch { toast.error('Ошибка получения пользователей'); } finally { setLoading(false); } }; useEffect(() => { setRoles(ROLES_ID_RUSSIAN_NAME_ARRAY); SspApi.getAll().then((data) => { if (!data.success) { toast.error( 'Ошибка получения ССП/Региональные филиалы ' + data.message, ); return; } const activeDeps = data.result.filter((v) => v.is_active); setDeps(activeDeps); }); loadUsers(); }, []); const handleEditUserSsp = (user) => { setEditableUser(user); setOpenEditUserSsp(true); }; const handleSaveEditableUser = async (user, depsData = null) => { try { if (depsData !== null) { if (depsData.delete.length > 0) { try { const deleteResult = await SspApi.deleteManySsps(user.id, { user_id: user.id, ssp_ids: depsData.delete, }); if (deleteResult.success) { toast.success('Подразделение у пользователя удалено'); } else { toast.error('Ошибка удаления подразделения у пользователя'); return; } } catch (error) { toast.error('Ошибка удаления подразделения у пользователя'); return; } } if (depsData.update.length > 0) { try { const updateResult = await SspApi.putManySsps(user.id, { ssp_ids: depsData.update, }); if (updateResult.success) { toast.success('Подразделение у пользователя добавлено'); } else { toast.error('Ошибка добавления подразделения у пользователя'); } } catch (error) { toast.error('Ошибка добавления подразделения у пользователя'); } } } const data = await UsersApi.update(user.id, { ...user, load_orgs: true }); if (!data.success) { toast.error('Не удалось обновить данные', data.message); return; } const updatedUser = data.result; if (updatedUser?.id) { setUsers((prev) => prev .map((u) => (u.id === updatedUser.id ? updatedUser : u)) .sort((a, b) => a.id - b.id), ); } } catch (error) { toast.error(error?.detail || 'Не удалось обновить данные'); } }; const handleUserAdded = (newUser) => { if (!newUser?.id) return; setUsers((prev) => { if (prev.some((u) => u.id === newUser.id)) return prev; return [...prev, newUser].sort((a, b) => a.id - b.id); }); }; const handleOpenModalAddUsers = () => { setOpenModalAddUser(true); }; const handleCloseModalAddUsers = () => { setOpenModalAddUser(false); }; const handleSelectedUser = (users) => { setSelectedUsersId(users); }; const handleDeleteSelectedUsers = () => { for (const userId of selectedUsersId) { handleDeleteUser(userId); } }; const handleDeleteUser = (userId) => { UsersApi.delete(userId) .then((data) => { if (data.success) { setUsers((prev) => prev.filter((u) => u.id != userId)); } else { toast.error('Ошибка удаления пользователя ' + data.message); } }) .catch(() => { toast.error('Ошибка удаления пользователя '); }); }; const handleUsersChange = (changeData) => { const { sspId, roleId } = changeData; const selectedUsers = users.filter((u) => selectedUsersId.has(u.id)); for (const user of selectedUsers) { let depsData; if (roleId) { user.role_id = roleId; } if (sspId) { depsData = { update: [sspId], delete: user.role_id === ROLES_NAME_ID.executor_rf && user.org_units?.[0]?.id !== undefined ? [user.org_units[0].id] : [], }; user.ssp_id = sspId; } handleSaveEditableUser(user, depsData); } }; const handleUnselectUsers = () => { setSelectedUsersId(new Set()); }; if (!user || user.role_id != ROLES_NAME_ID.admin) return; return ( <> } > Добавить Роли ROLES_ID_RUSSIAN_NAME[option.id] || option.name || '' } value={role ? roles.find((f) => f.id === role.id) : null} onChange={(event, newValue) => { setRole( newValue ? roles.find((f) => f.id === newValue.id) : null, ); }} sx={{ height: '2.5rem', minWidth: '20.25rem' }} renderInput={(params) => ( )} /> ССП/Региональные филиалы option.title || option.name || ''} value={ dep ? dep.id === null ? { id: null, title: 'Без ССП' } : deps.find((f) => f.id === dep.id) : null } onChange={(event, newValue) => { setDep( newValue ? newValue.id === null ? { id: null, title: 'Без ССП' } : deps.find((f) => f.id === newValue.id) : null, ); }} sx={{ height: '2.5rem', minWidth: '11.25rem' }} renderInput={(params) => ( )} /> {selectedUsersId.size > 0 && ( )} { setOpenEditUserSsp(false); }} user={editableUser} deps={deps} onEdit={handleSaveEditableUser} /> ); }; export default UsersPage;