2023-07-16 20:25:55 +03:00
|
|
|
|
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';
|
2023-07-16 20:25:55 +03:00
|
|
|
|
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-16 20:25:55 +03:00
|
|
|
|
|
2023-07-20 17:11:03 +03:00
|
|
|
|
const [editMode, setEditMode] = useState(EditMode.TEXT);
|
|
|
|
|
|
2023-07-16 20:25:55 +03:00
|
|
|
|
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');
|
2023-07-16 20:25:55 +03:00
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-21 00:09:05 +03:00
|
|
|
|
if (schema?.items && schema?.items.length > 0) {
|
|
|
|
|
setActive((prev) => (prev || schema?.items![0]));
|
2023-07-16 20:25:55 +03:00
|
|
|
|
}
|
2023-07-21 00:09:05 +03:00
|
|
|
|
}, [schema, setActive])
|
2023-07-16 20:25:55 +03:00
|
|
|
|
|
|
|
|
|
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 || '');
|
2023-07-16 20:25:55 +03:00
|
|
|
|
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');
|
2023-07-16 20:25:55 +03:00
|
|
|
|
}
|
|
|
|
|
}, [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();
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleRename = useCallback(() => {
|
|
|
|
|
toast.info('Переименование в разработке');
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
const handleChangeType = useCallback(() => {
|
|
|
|
|
toast.info('Изменение типа в разработке');
|
|
|
|
|
}, []);
|
|
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
|
|
return (
|
2023-07-16 20:25:55 +03:00
|
|
|
|
<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'>
|
2023-07-16 20:25:55 +03:00
|
|
|
|
<div className='flex items-center 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>
|
|
|
|
|
<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
|
2023-07-16 20:25:55 +03:00
|
|
|
|
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
|
2023-07-16 20:25:55 +03:00
|
|
|
|
/>
|
|
|
|
|
<ExpressionEditor id='expression' label='Формальное выражение'
|
|
|
|
|
placeholder='Родоструктурное выражение, задающее формальное определение'
|
|
|
|
|
value={expression}
|
|
|
|
|
disabled={!isEditable}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
isActive={editMode==='rslang'}
|
|
|
|
|
toggleEditMode={() => setEditMode(EditMode.RSLANG)}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
onChange={event => setExpression(event.target.value)}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
setTypification={setTypification}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
/>
|
|
|
|
|
<TextArea id='definition' label='Текстовое определение'
|
|
|
|
|
placeholder='Лингвистическая интерпретация формального выражения'
|
|
|
|
|
rows={4}
|
|
|
|
|
value={textDefinition}
|
|
|
|
|
disabled={!isEditable}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
spellCheck
|
2023-07-16 20:25:55 +03:00
|
|
|
|
onChange={event => setTextDefinition(event.target.value)}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
onFocus={() => setEditMode(EditMode.TEXT)}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
/>
|
|
|
|
|
<TextArea id='convention' label='Конвенция / Комментарий'
|
|
|
|
|
placeholder='Договоренность об интерпретации неопределяемых понятий или комментарий к производному понятию'
|
|
|
|
|
rows={4}
|
|
|
|
|
value={convention}
|
|
|
|
|
disabled={!isEditable}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
spellCheck
|
2023-07-16 20:25:55 +03:00
|
|
|
|
onChange={event => setConvention(event.target.value)}
|
2023-07-20 17:11:03 +03:00
|
|
|
|
onFocus={() => setEditMode(EditMode.TEXT)}
|
2023-07-16 20:25:55 +03:00
|
|
|
|
/>
|
|
|
|
|
<div className='flex items-center justify-between gap-1 py-2 mt-2'>
|
|
|
|
|
<SubmitButton text='Сохранить изменения' disabled={!isEditable} />
|
|
|
|
|
</div>
|
|
|
|
|
</form>
|
2023-07-20 17:11:03 +03:00
|
|
|
|
<ConstituentsSideList expression={expression}/>
|
|
|
|
|
</div>
|
2023-07-15 17:46:19 +03:00
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default ConstituentEditor;
|