ConceptPortal-public/rsconcept/frontend/src/dialogs/DlgRenameCst.tsx

77 lines
2.7 KiB
TypeScript
Raw Normal View History

'use client';
import clsx from 'clsx';
2023-08-23 01:36:17 +03:00
import { useLayoutEffect, useState } from 'react';
2023-08-22 23:45:59 +03:00
2024-04-03 19:31:26 +03:00
import BadgeHelp from '@/components/man/BadgeHelp';
import Modal, { ModalProps } from '@/components/ui/Modal';
import SelectSingle from '@/components/ui/SelectSingle';
import TextInput from '@/components/ui/TextInput';
import { useRSForm } from '@/context/RSFormContext';
import usePartialUpdate from '@/hooks/usePartialUpdate';
2024-04-03 19:31:26 +03:00
import { HelpTopic } from '@/models/miscellaneous';
import { CstType, ICstRenameData } from '@/models/rsform';
2024-01-04 14:35:46 +03:00
import { generateAlias, validateNewAlias } from '@/models/rsformAPI';
import { labelCstType } from '@/utils/labels';
import { SelectorCstType } from '@/utils/selectors';
2023-08-22 23:45:59 +03:00
2023-12-28 14:04:44 +03:00
interface DlgRenameCstProps extends Pick<ModalProps, 'hideWindow'> {
initial: ICstRenameData;
onRename: (data: ICstRenameData) => void;
2023-08-22 23:45:59 +03:00
}
function DlgRenameCst({ hideWindow, initial, onRename }: DlgRenameCstProps) {
2023-08-23 01:36:17 +03:00
const { schema } = useRSForm();
2023-08-22 23:45:59 +03:00
const [validated, setValidated] = useState(false);
const [cstData, updateData] = usePartialUpdate(initial);
2023-12-28 14:04:44 +03:00
const handleSubmit = () => onRename(cstData);
2023-08-23 01:36:17 +03:00
2023-12-28 14:04:44 +03:00
useLayoutEffect(() => {
if (schema && initial && cstData.cst_type !== initial.cst_type) {
2024-01-04 14:35:46 +03:00
updateData({ alias: generateAlias(cstData.cst_type, schema) });
2023-08-22 23:45:59 +03:00
}
}, [initial, cstData.cst_type, updateData, schema]);
2023-08-22 23:45:59 +03:00
2023-12-28 14:04:44 +03:00
useLayoutEffect(() => {
setValidated(
2024-01-04 14:35:46 +03:00
!!schema && cstData.alias !== initial.alias && validateNewAlias(cstData.alias, cstData.cst_type, schema)
);
}, [cstData.cst_type, cstData.alias, initial, schema]);
2023-08-22 23:45:59 +03:00
return (
2023-12-28 14:04:44 +03:00
<Modal
header='Переименование конституенты'
submitText='Переименовать'
submitInvalidTooltip={'Введите незанятое имя, соответствующее типу'}
hideWindow={hideWindow}
canSubmit={validated}
onSubmit={handleSubmit}
2024-04-03 19:31:26 +03:00
className={clsx('w-[30rem]', 'py-6 px-6 flex gap-3 justify-center items-center')}
2023-12-28 14:04:44 +03:00
>
<SelectSingle
id='dlg_cst_type'
2023-12-28 14:04:44 +03:00
placeholder='Выберите тип'
className='min-w-[16rem] self-center'
options={SelectorCstType}
value={{
value: cstData.cst_type,
label: labelCstType(cstData.cst_type)
}}
onChange={data => updateData({ cst_type: data?.value ?? CstType.BASE })}
/>
2024-05-13 20:55:48 +03:00
<BadgeHelp topic={HelpTopic.CC_CONSTITUENTA} offset={16} className='max-w-[40rem] max-h-[calc(100vh-2rem)]' />
2023-12-28 14:04:44 +03:00
<TextInput
id='dlg_cst_alias'
2023-12-28 14:04:44 +03:00
dense
label='Имя'
className='w-[7rem]'
value={cstData.alias}
onChange={event => updateData({ alias: event.target.value })}
/>
</Modal>
);
2023-08-22 23:45:59 +03:00
}
2023-12-28 14:04:44 +03:00
export default DlgRenameCst;