209 lines
5.4 KiB
JavaScript
209 lines
5.4 KiB
JavaScript
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
import Modal from '../../../components/common/Modal/Modal';
|
|
import { Box, Button, Typography } from '@mui/material';
|
|
import SelectWithOptions from '../components/SelectWithOptions';
|
|
import { ROLES_NAME_ID } from '../../../constants/constants';
|
|
import { AutocompleteForChangeOptions } from '../components/AutocompleteForChangeOptions';
|
|
|
|
export const ModalEditUserSsp = ({
|
|
open,
|
|
onClose,
|
|
user,
|
|
deps = [],
|
|
onEdit,
|
|
}) => {
|
|
const [curUser, setCurUser] = useState(user);
|
|
const [depsData, setDepsData] = useState({ update: [], delete: [] });
|
|
const [newDepsData, setNewDepsData] = useState({ update: [], delete: [] });
|
|
const [ssps, setSsps] = useState([]);
|
|
const [rfs, setRfs] = useState([]);
|
|
const [selectedType, setSelectedType] = useState('rf'); // 'rf' или 'ssp'
|
|
|
|
useEffect(() => {
|
|
if (!open) {
|
|
setCurUser(null);
|
|
return;
|
|
}
|
|
setCurUser(user);
|
|
try {
|
|
if (user && user.role_id == ROLES_NAME_ID.executor_rf) {
|
|
const isSsp = user.org_units?.[0]?.is_ssp;
|
|
setSelectedType(isSsp ? 'ssp' : 'rf');
|
|
}
|
|
} catch {
|
|
setSelectedType('rf');
|
|
}
|
|
}, [user, open]);
|
|
|
|
useEffect(() => {
|
|
if (!deps) return;
|
|
const ssps = [];
|
|
const rfs = [];
|
|
deps.forEach((dep) => {
|
|
if (dep.is_ssp) {
|
|
ssps.push(dep);
|
|
return;
|
|
}
|
|
rfs.push(dep);
|
|
});
|
|
setSsps(ssps);
|
|
setRfs(rfs);
|
|
}, [deps]);
|
|
|
|
const handleChangeDepForSingle = (depId) => {
|
|
const selectedDep = deps.find((dep) => dep.id == depId);
|
|
if (!selectedDep) return;
|
|
|
|
setDepsData({
|
|
update: [selectedDep],
|
|
delete: [...(user.org_units ?? [])],
|
|
});
|
|
|
|
setCurUser((prev) => ({
|
|
...prev,
|
|
org_units: [selectedDep],
|
|
}));
|
|
};
|
|
|
|
const handleClickSave = () => {
|
|
onEdit(curUser, newDepsData);
|
|
onClose();
|
|
};
|
|
|
|
useEffect(() => {
|
|
const newDataDeps = {
|
|
update: depsData.update.map((d) => d.id),
|
|
delete: depsData.delete.map((d) => d.id),
|
|
};
|
|
setNewDepsData(newDataDeps);
|
|
}, [depsData]);
|
|
|
|
const sspForDfip = useMemo(() => {
|
|
if (!curUser|| !open) return [];
|
|
return curUser.org_units ?? [];
|
|
}, [curUser, deps, newDepsData, open]);
|
|
|
|
const handleTypeChange = (value) => {
|
|
setSelectedType(value);
|
|
// Сбрасываем выбранное подразделение при смене типа
|
|
setCurUser((prev) => ({
|
|
...prev,
|
|
ssp_id: null,
|
|
}));
|
|
setDepsData({ update: [], delete: [] });
|
|
};
|
|
|
|
if (!curUser) return null;
|
|
|
|
return (
|
|
<Modal
|
|
title={'Выбор подразделения'}
|
|
open={open}
|
|
onClose={onClose}
|
|
actions={
|
|
<>
|
|
<Button variant="grey" onClick={onClose} style={{ height: '2.5rem' }}>
|
|
Отменить
|
|
</Button>
|
|
<Button
|
|
variant="contained"
|
|
onClick={handleClickSave}
|
|
style={{ height: '2.5rem' }}
|
|
>
|
|
Сохранить
|
|
</Button>
|
|
</>
|
|
}
|
|
>
|
|
{curUser.role_id == ROLES_NAME_ID['executor_dfip'] && (
|
|
<Box>
|
|
<Typography
|
|
sx={{
|
|
fontWeight: '400',
|
|
fontSize: '0.75rem',
|
|
color: 'var(--grey-dark)',
|
|
paddingBottom: '.25rem',
|
|
}}
|
|
>
|
|
ССП/РФ
|
|
</Typography>
|
|
<AutocompleteForChangeOptions
|
|
values={sspForDfip}
|
|
options={deps}
|
|
onChange={setDepsData}
|
|
/>
|
|
</Box>
|
|
)}
|
|
|
|
{curUser.role_id == ROLES_NAME_ID['executor_rf'] && (
|
|
<Box>
|
|
<Box sx={{ marginBottom: '1rem' }}>
|
|
<Typography
|
|
sx={{
|
|
fontWeight: '400',
|
|
fontSize: '0.75rem',
|
|
color: 'var(--grey-dark)',
|
|
paddingBottom: '.25rem',
|
|
}}
|
|
>
|
|
Тип
|
|
</Typography>
|
|
<SelectWithOptions
|
|
value={selectedType}
|
|
options={[
|
|
{ value: 'rf', label: 'РФ' },
|
|
{ value: 'ssp', label: 'ССП' },
|
|
]}
|
|
onChange={handleTypeChange}
|
|
width="28.25rem"
|
|
placeholder="Выберите тип"
|
|
/>
|
|
</Box>
|
|
|
|
<Box>
|
|
<Typography
|
|
sx={{
|
|
fontWeight: '400',
|
|
fontSize: '0.75rem',
|
|
color: 'var(--grey-dark)',
|
|
paddingBottom: '.25rem',
|
|
}}
|
|
>
|
|
{selectedType === 'rf' ? 'РФ' : 'ССП'}
|
|
</Typography>
|
|
<SelectWithOptions
|
|
value={curUser.org_units?.[0]?.id}
|
|
options={selectedType === 'rf' ? rfs : ssps}
|
|
placeholder="-"
|
|
onChange={handleChangeDepForSingle}
|
|
width="28.25rem"
|
|
/>
|
|
</Box>
|
|
</Box>
|
|
)}
|
|
|
|
{curUser.role_id == ROLES_NAME_ID['admin'] && (
|
|
<Box>
|
|
<Typography
|
|
sx={{
|
|
fontWeight: '400',
|
|
fontSize: '0.75rem',
|
|
color: 'var(--grey-dark)',
|
|
paddingBottom: '.25rem',
|
|
}}
|
|
>
|
|
ССП/РФ
|
|
</Typography>
|
|
<SelectWithOptions
|
|
value={curUser.org_units?.[0]?.id}
|
|
placeholder="-"
|
|
options={deps}
|
|
onChange={handleChangeDepForSingle}
|
|
width="28.25rem"
|
|
/>
|
|
</Box>
|
|
)}
|
|
</Modal>
|
|
);
|
|
};
|