[AURORA-1070] - Ошибка редактирования количества пользователей в Подразделении СПП/РФ

This commit is contained in:
Veronika Tsygankova 2026-06-04 15:11:15 +03:00
parent e47200733e
commit 6419b5ad1d
5 changed files with 81 additions and 17 deletions

View File

@ -7,9 +7,9 @@ export const UsersApi = {
getById(userId) { getById(userId) {
return api.get(`/users/${userId}`).then((r) => r.data); return api.get(`/users/${userId}`).then((r) => r.data);
}, },
getAll() { getAll(params = {}) {
return api return api
.get("/users/", { params: { limit: 1000, skip: 0, load_orgs: true } }) .get("/users/", { params: { limit: 1000, skip: 0, ...params } })
.then((r) => r.data); .then((r) => r.data);
}, },
update(idUser, data) { update(idUser, data) {

View File

@ -6,15 +6,20 @@ import { UsersApi } from '../../../api/users';
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
import { AutocompleteForChangeOptions } from '../components/AutocompleteForChangeOptions'; import { AutocompleteForChangeOptions } from '../components/AutocompleteForChangeOptions';
export const ModalChangeUsersInSsp = ({ open, onClose, ssp, onEdit }) => { export const ModalChangeUsersInSsp = ({
open,
onClose,
ssp,
onUsersCountChange,
}) => {
const [users, setUsers] = useState([]); const [users, setUsers] = useState([]);
const [usersDataForUpdate, setUsersDataForUpdate] = useState({ const [usersDataForUpdate, setUsersDataForUpdate] = useState({
update: [], update: [],
delete: [], delete: [],
}); });
const [allUsers, setAllUsers] = useState([]); const [allUsers, setAllUsers] = useState([]);
const [loadingUsers, setLoadingUsers] = useState(false); const [loadingUsers, setLoadingUsers] = useState(false);
useEffect(() => { useEffect(() => {
UsersApi.getAll() UsersApi.getAll()
.then((data) => { .then((data) => {
@ -58,14 +63,66 @@ export const ModalChangeUsersInSsp = ({ open, onClose, ssp, onEdit }) => {
}); });
}, [open, ssp]); }, [open, ssp]);
const handleClickSave = () => { const deleteUserFromSsp = async (user) => {
onEdit?.(ssp, usersDataForUpdate); try {
const data = await SspApi.deleteManySsps(user.id, { ssp_ids: [ssp.id] });
if (!data.success) {
toast.error(data?.message || 'Ошибка удаления пользователя из ССП');
return false;
}
return true;
} catch (error) {
const msg =
error?.response?.data?.message || error?.response?.data?.detail;
toast.error(msg || 'Ошибка удаления пользователя из ССП');
return false;
}
};
const addUserToSsp = async (user) => {
try {
const data = await SspApi.putManySsps(user.id, { ssp_ids: [ssp.id] });
if (!data.success) {
toast.error(data?.message || 'Ошибка добавления пользователя');
return false;
}
return true;
} catch (error) {
const msg =
error?.response?.data?.message || error?.response?.data?.detail;
toast.error(msg || 'Ошибка добавления пользователя');
return false;
}
};
const handleClickSave = async () => {
let added = 0;
let removed = 0;
for (const user of usersDataForUpdate.update) {
if (await addUserToSsp(user)) {
added += 1;
}
}
for (const user of usersDataForUpdate.delete) {
if (await deleteUserFromSsp(user)) {
removed += 1;
}
}
const delta = added - removed;
if (delta !== 0) {
onUsersCountChange?.(ssp.id, delta);
}
onClose?.(); onClose?.();
}; };
const handleChangeUsersList = (dataForUpdate) => { const handleChangeUsersList = (updater) => {
setUsersDataForUpdate(dataForUpdate); setUsersDataForUpdate(updater);
}; };
if (!ssp) return; if (!ssp) return;
return ( return (
<Modal <Modal

View File

@ -376,7 +376,7 @@ const SspsPage = () => {
open={openModalUsersinSspChange} open={openModalUsersinSspChange}
onClose={handleCloseModalUsersInSspChange} onClose={handleCloseModalUsersInSspChange}
ssp={sspForChangeUsers} ssp={sspForChangeUsers}
onEdit={handleUpdateUsers} onUsersCountChange={adjustSspUsersCount}
/> />
<ModalEditSsp <ModalEditSsp
open={openModalEdit} open={openModalEdit}

View File

@ -34,7 +34,7 @@ const UsersPage = () => {
const loadUsers = async () => { const loadUsers = async () => {
setLoading(true); setLoading(true);
try { try {
const data = await UsersApi.getAll(); const data = await UsersApi.getAll({ load_orgs: true });
if (!data.success) { if (!data.success) {
toast.error('Ошибка получения пользователей ' + data.message); toast.error('Ошибка получения пользователей ' + data.message);
return; return;

View File

@ -37,7 +37,7 @@ export const AutocompleteForChangeOptions = ({
if (value) { if (value) {
const newSelected = [...selected, value]; const newSelected = [...selected, value];
setSelected(newSelected); setSelected(newSelected);
onChange?.((prev) => ({ ...prev, update: newSelected })); onChange?.((prev) => ({ ...prev, update: [...prev.update, value] }));
const newAvailable = available.filter((item) => item.id !== value.id); const newAvailable = available.filter((item) => item.id !== value.id);
setAvailable(newAvailable); setAvailable(newAvailable);
@ -49,16 +49,23 @@ export const AutocompleteForChangeOptions = ({
const handleRemove = (id) => { const handleRemove = (id) => {
const itemToRemove = selected.find((s) => s.id === id); const itemToRemove = selected.find((s) => s.id === id);
if (itemToRemove) { if (!itemToRemove) return;
const newSelected = selected.filter((s) => s.id !== id); const newSelected = selected.filter((s) => s.id !== id);
setSelected(newSelected); setSelected(newSelected);
setAvailable([...available, itemToRemove]); setAvailable([...available, itemToRemove]);
const wasInitial = values.some((v) => v.id === id);
if (wasInitial) {
onChange?.((prev) => ({ onChange?.((prev) => ({
...prev, ...prev,
delete: [...prev.delete, itemToRemove], delete: [...prev.delete, itemToRemove],
update: [...newSelected], }));
} else {
onChange?.((prev) => ({
...prev,
update: prev.update.filter((u) => u.id !== id),
})); }));
} }
}; };
@ -130,7 +137,7 @@ export const AutocompleteForChangeOptions = ({
/> />
)} )}
renderOption={(props, option) => ( renderOption={(props, option) => (
<li {...props} style={{ padding: '4px 12px', minHeight: '36px' }}> <li {...props} style={{ padding: '4px 12px', minHeight: '36px' }} key={option.id}>
<Box <Box
sx={{ sx={{
display: 'flex', display: 'flex',