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

73 lines
2.5 KiB
TypeScript
Raw Normal View History

2023-08-23 01:36:17 +03:00
import { useLayoutEffect, useState } from 'react';
2023-08-22 23:45:59 +03:00
2023-11-01 13:47:49 +03:00
import Modal, { ModalProps } from '../components/Common/Modal';
import SelectSingle from '../components/Common/SelectSingle';
import TextInput from '../components/Common/TextInput';
import { useRSForm } from '../context/RSFormContext';
import usePartialUpdate from '../hooks/usePartialUpdate';
2023-11-01 13:47:49 +03:00
import { CstType, ICstRenameData } from '../models/rsform';
import { labelCstType } from '../utils/labels';
import { createAliasFor, validateCstAlias } from '../utils/misc';
2023-11-01 13:47:49 +03:00
import { SelectorCstType } from '../utils/selectors';
2023-08-22 23:45:59 +03:00
2023-09-11 17:56:32 +03:00
interface DlgRenameCstProps
extends Pick<ModalProps, 'hideWindow'> {
initial: ICstRenameData
2023-08-22 23:45:59 +03:00
onRename: (data: ICstRenameData) => void
}
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);
const handleSubmit = () => onRename(cstData);
2023-08-23 01:36:17 +03:00
useLayoutEffect(
() => {
if (schema && initial && cstData.cst_type !== initial.cst_type) {
updateData({ alias: createAliasFor(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-08-23 01:36:17 +03:00
useLayoutEffect(
() => {
setValidated(
!!schema &&
cstData.alias !== initial.alias &&
validateCstAlias(cstData.alias, cstData.cst_type, schema)
);
}, [cstData.cst_type, cstData.alias, initial, schema]);
2023-08-22 23:45:59 +03:00
return (
<Modal
2023-08-23 01:36:17 +03:00
title='Переименование конституенты'
2023-08-22 23:45:59 +03:00
hideWindow={hideWindow}
canSubmit={validated}
onSubmit={handleSubmit}
2023-09-11 17:56:32 +03:00
submitInvalidTooltip={'Введите незанятое имя, соответствующее типу'}
2023-08-23 01:36:17 +03:00
submitText='Переименовать'
2023-08-22 23:45:59 +03:00
>
2023-08-27 15:39:49 +03:00
<div className='flex items-center gap-4 px-2 my-2 h-fit min-w-[25rem]'>
2023-09-14 16:53:38 +03:00
<SelectSingle
2023-09-11 17:56:32 +03:00
className='min-w-[14rem] self-center z-modal-top'
2023-09-14 16:53:38 +03:00
options={SelectorCstType}
2023-08-23 01:36:17 +03:00
placeholder='Выберите тип'
value={{ value: cstData.cst_type, label: labelCstType(cstData.cst_type) }}
onChange={data => updateData({cst_type: data?.value ?? CstType.BASE})}
2023-08-23 01:36:17 +03:00
/>
<div>
<TextInput id='alias' label='Имя'
2023-10-23 18:22:55 +03:00
dense
dimensions='w-[7rem]'
value={cstData.alias}
onChange={event => updateData({alias: event.target.value})}
2023-08-23 01:36:17 +03:00
/>
</div>
2023-08-22 23:45:59 +03:00
</div>
</Modal>
);
}
export default DlgRenameCst;