import { useCallback, useLayoutEffect, useState } from 'react'; import { useRSForm } from '../../context/RSFormContext'; import { CstType, EditMode, INewCstData } from '../../utils/models'; import { toast } from 'react-toastify'; import TextArea from '../../components/Common/TextArea'; import ExpressionEditor from './ExpressionEditor'; import SubmitButton from '../../components/Common/SubmitButton'; import { createAliasFor, getCstTypeLabel } from '../../utils/staticUI'; import ConstituentsSideList from './ConstituentsSideList'; import { DumpBinIcon, SaveIcon, SmallPlusIcon } from '../../components/Icons'; import CreateCstModal from './CreateCstModal'; import { AxiosResponse } from 'axios'; function ConstituentEditor() { const { activeCst, activeID, schema, setActiveID, processing, isEditable, cstDelete, cstUpdate, cstCreate } = useRSForm(); const [showCstModal, setShowCstModal] = useState(false); const [editMode, setEditMode] = useState(EditMode.TEXT); const [alias, setAlias] = useState(''); const [type, setType] = useState(''); const [term, setTerm] = useState(''); const [textDefinition, setTextDefinition] = useState(''); const [expression, setExpression] = useState(''); const [convention, setConvention] = useState(''); const [typification, setTypification] = useState('N/A'); useLayoutEffect(() => { if (schema?.items && schema?.items.length > 0) { setActiveID((prev) => (prev || schema?.items![0].id)); } }, [schema, setActiveID]) useLayoutEffect(() => { if (activeCst) { setAlias(activeCst.alias); setType(getCstTypeLabel(activeCst.cstType)); setConvention(activeCst.convention || ''); setTerm(activeCst.term?.raw || ''); setTextDefinition(activeCst.definition?.text?.raw || ''); setExpression(activeCst.definition?.formal || ''); setTypification(activeCst?.parse?.typification || 'N/A'); } }, [activeCst]); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); if (!processing) { const data = { 'alias': alias, 'convention': convention, 'definition_formal': expression, 'definition_text': { 'raw': textDefinition, 'resolved': '', }, 'term': { 'raw': term, 'resolved': '', 'forms': activeCst?.term?.forms || [], } }; cstUpdate(data, () => toast.success('Изменения сохранены')); } }; const handleDelete = useCallback( async () => { if (!activeID || !schema?.items || !window.confirm('Вы уверены, что хотите удалить конституенту?')) { return; } const data = { 'items': [{'id': activeID}] } const index = schema.items.findIndex((cst) => cst.id === activeID); if (index !== -1 && index + 1 < schema.items.length) { setActiveID(schema.items[index + 1].id); } cstDelete(data, () => toast.success('Конституента удалена')); }, [activeID, schema, setActiveID, cstDelete]); const handleAddNew = useCallback( async (csttype?: CstType) => { if (!activeID || !schema?.items) { return; } if (!csttype) { setShowCstModal(true); } else { const data: INewCstData = { 'csttype': csttype, 'alias': createAliasFor(csttype, schema!), 'insert_after': activeID } cstCreate(data, async (response: AxiosResponse) => { // navigate(`/rsforms/${schema.id}?tab=${RSFormTabsList.CST_EDIT}&active=${response.data['new_cst']['id']}`); setActiveID(response.data['new_cst']['id']); toast.success(`Конституента добавлена: ${response.data['new_cst']['alias']}`); }); } }, [activeID, schema, cstCreate, setActiveID]); const handleRename = useCallback(() => { toast.info('Переименование в разработке'); }, []); const handleChangeType = useCallback(() => { toast.info('Изменение типа в разработке'); }, []); return (
setShowCstModal(!showCstModal)} onCreate={handleAddNew} defaultType={activeCst?.cstType as CstType} />
{alias} {type}