ConceptPortal-public/rsconcept/frontend/src/pages/RSFormPage/ConstituentEditor.tsx

154 lines
5.6 KiB
TypeScript
Raw Normal View History

import { useCallback, useEffect, useState } from 'react';
2023-07-15 17:46:19 +03:00
import { useRSForm } from '../../context/RSFormContext';
2023-07-21 00:09:05 +03:00
import { EditMode, IConstituenta } from '../../utils/models';
import { toast } from 'react-toastify';
import TextArea from '../../components/Common/TextArea';
import ExpressionEditor from './ExpressionEditor';
import SubmitButton from '../../components/Common/SubmitButton';
2023-07-20 17:11:03 +03:00
import { getCstTypeLabel } from '../../utils/staticUI';
import ConstituentsSideList from './ConstituentsSideList';
2023-07-15 17:46:19 +03:00
function ConstituentEditor() {
2023-07-18 14:55:40 +03:00
const {
active, schema, setActive, processing, cstUpdate, isEditable, reload
} = useRSForm();
2023-07-20 17:11:03 +03:00
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('');
2023-07-20 17:11:03 +03:00
const [typification, setTypification] = useState('N/A');
useEffect(() => {
2023-07-21 00:09:05 +03:00
if (schema?.items && schema?.items.length > 0) {
setActive((prev) => (prev || schema?.items![0]));
}
2023-07-21 00:09:05 +03:00
}, [schema, setActive])
useEffect(() => {
if (active) {
setAlias(active.alias);
2023-07-20 17:11:03 +03:00
setType(getCstTypeLabel(active.cstType));
2023-07-18 14:55:40 +03:00
setConvention(active.convention || '');
setTerm(active.term?.raw || '');
setTextDefinition(active.definition?.text?.raw || '');
setExpression(active.definition?.formal || '');
2023-07-20 17:11:03 +03:00
setTypification(active?.parse?.typification || 'N/A');
}
}, [active]);
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
2023-07-18 14:55:40 +03:00
if (!processing) {
const data = {
'alias': alias,
'convention': convention,
'definition_formal': expression,
'definition_text': {
'raw': textDefinition,
'resolved': '',
},
'term': {
'raw': term,
'resolved': '',
'forms': active?.term?.forms || [],
}
};
cstUpdate(data, (response) => {
console.log(response);
toast.success('Изменения сохранены');
reload();
});
}
};
const handleRename = useCallback(() => {
toast.info('Переименование в разработке');
}, []);
const handleChangeType = useCallback(() => {
toast.info('Изменение типа в разработке');
}, []);
2023-07-15 17:46:19 +03:00
return (
<div className='flex items-start w-full gap-2'>
2023-07-20 17:11:03 +03:00
<form onSubmit={handleSubmit} className='flex-grow min-w-[50rem] max-w-min px-4 py-2 border'>
<div className='flex items-start justify-between gap-1'>
<span className='mr-12'>
<label
title='Переименовать конституенту'
className='font-semibold underline cursor-pointer'
onClick={handleRename}
>
ID
</label>
<b className='ml-2'>{alias}</b>
</span>
<div className='mt-2 h-[1rem]'>
<SubmitButton text='Сохранить изменения' disabled={!isEditable} />
</div>
<span>
<label
title='Изменить тип конституенты'
className='font-semibold underline cursor-pointer'
onClick={handleChangeType}
>
Тип
</label>
<span className='ml-2'>{type}</span>
</span>
</div>
<TextArea id='term' label='Термин'
placeholder='Схемный или предметный термин, обозначающий данное понятие или утверждение'
rows={2}
value={term}
disabled={!isEditable}
2023-07-20 17:11:03 +03:00
spellCheck
onChange={event => setTerm(event.target.value)}
2023-07-20 17:11:03 +03:00
onFocus={() => setEditMode(EditMode.TEXT)}
/>
<TextArea id='typification' label='Типизация'
rows={1}
value={typification}
disabled
/>
<ExpressionEditor id='expression' label='Формальное выражение'
placeholder='Родоструктурное выражение, задающее формальное определение'
value={expression}
disabled={!isEditable}
2023-07-20 17:11:03 +03:00
isActive={editMode==='rslang'}
toggleEditMode={() => setEditMode(EditMode.RSLANG)}
onChange={event => setExpression(event.target.value)}
2023-07-20 17:11:03 +03:00
setTypification={setTypification}
/>
<TextArea id='definition' label='Текстовое определение'
placeholder='Лингвистическая интерпретация формального выражения'
rows={4}
value={textDefinition}
disabled={!isEditable}
2023-07-20 17:11:03 +03:00
spellCheck
onChange={event => setTextDefinition(event.target.value)}
2023-07-20 17:11:03 +03:00
onFocus={() => setEditMode(EditMode.TEXT)}
/>
<TextArea id='convention' label='Конвенция / Комментарий'
placeholder='Договоренность об интерпретации неопределяемых понятий или комментарий к производному понятию'
rows={4}
value={convention}
disabled={!isEditable}
2023-07-20 17:11:03 +03:00
spellCheck
onChange={event => setConvention(event.target.value)}
2023-07-20 17:11:03 +03:00
onFocus={() => setEditMode(EditMode.TEXT)}
/>
</form>
2023-07-20 17:11:03 +03:00
<ConstituentsSideList expression={expression}/>
</div>
2023-07-15 17:46:19 +03:00
);
}
export default ConstituentEditor;