Portal/rsconcept/frontend/src/dialogs/DlgRenameCst.tsx

81 lines
2.6 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
import clsx from 'clsx';
import { useEffect, useState } from 'react';
2024-06-07 20:17:03 +03:00
2025-01-23 19:41:31 +03:00
import { ICstRenameDTO } from '@/backend/rsform/api';
import Modal from '@/components/ui/Modal';
2024-06-07 20:17:03 +03:00
import SelectSingle from '@/components/ui/SelectSingle';
import TextInput from '@/components/ui/TextInput';
import usePartialUpdate from '@/hooks/usePartialUpdate';
import { HelpTopic } from '@/models/miscellaneous';
2025-01-23 19:41:31 +03:00
import { CstType, IRSForm } from '@/models/rsform';
2024-06-07 20:17:03 +03:00
import { generateAlias, validateNewAlias } from '@/models/rsformAPI';
import { useDialogsStore } from '@/stores/dialogs';
2024-06-07 20:17:03 +03:00
import { labelCstType } from '@/utils/labels';
import { SelectorCstType } from '@/utils/selectors';
export interface DlgRenameCstProps {
schema: IRSForm;
2025-01-23 19:41:31 +03:00
initial: ICstRenameDTO;
2024-09-05 21:24:57 +03:00
allowChangeType: boolean;
2025-01-23 19:41:31 +03:00
onRename: (data: ICstRenameDTO) => void;
2024-06-07 20:17:03 +03:00
}
function DlgRenameCst() {
const { schema, initial, allowChangeType, onRename } = useDialogsStore(state => state.props as DlgRenameCstProps);
2024-06-07 20:17:03 +03:00
const [validated, setValidated] = useState(false);
const [cstData, updateData] = usePartialUpdate(initial);
useEffect(() => {
if (initial && cstData.cst_type !== initial.cst_type) {
2024-06-07 20:17:03 +03:00
updateData({ alias: generateAlias(cstData.cst_type, schema) });
}
}, [initial, cstData.cst_type, updateData, schema]);
useEffect(() => {
setValidated(cstData.alias !== initial.alias && validateNewAlias(cstData.alias, cstData.cst_type, schema));
2024-06-07 20:17:03 +03:00
}, [cstData.cst_type, cstData.alias, initial, schema]);
2025-02-06 14:09:20 +03:00
function handleSubmit() {
onRename(cstData);
return true;
}
2024-06-07 20:17:03 +03:00
return (
<Modal
header='Переименование конституенты'
submitText='Переименовать'
2024-08-23 22:53:32 +03:00
submitInvalidTooltip='Введите незанятое имя, соответствующее типу'
2024-06-07 20:17:03 +03:00
canSubmit={validated}
2025-02-06 14:09:20 +03:00
onSubmit={handleSubmit}
2024-09-21 20:03:49 +03:00
className={clsx('w-[30rem]', 'py-6 pr-3 pl-6 flex gap-3 justify-center items-center ')}
2024-10-29 12:05:23 +03:00
helpTopic={HelpTopic.CC_CONSTITUENTA}
2024-06-07 20:17:03 +03:00
>
<SelectSingle
id='dlg_cst_type'
placeholder='Выберите тип'
2024-09-21 20:03:49 +03:00
className='min-w-[16rem]'
2024-09-05 21:24:57 +03:00
isDisabled={!allowChangeType}
2024-06-07 20:17:03 +03:00
options={SelectorCstType}
value={{
value: cstData.cst_type,
label: labelCstType(cstData.cst_type)
}}
onChange={data => updateData({ cst_type: data?.value ?? CstType.BASE })}
/>
2024-06-09 20:40:41 +03:00
2024-06-07 20:17:03 +03:00
<TextInput
id='dlg_cst_alias'
dense
label='Имя'
2024-08-30 11:03:31 +03:00
className='w-[7rem]'
2024-06-07 20:17:03 +03:00
value={cstData.alias}
onChange={event => updateData({ alias: event.target.value })}
/>
</Modal>
);
}
export default DlgRenameCst;