import { useEffect, useLayoutEffect, useMemo, useState } from 'react'; import ConceptTooltip from '../components/Common/ConceptTooltip'; import MiniButton from '../components/Common/MiniButton'; import Modal from '../components/Common/Modal'; import SelectMulti from '../components/Common/SelectMulti'; import TextArea from '../components/Common/TextArea'; import DataTable, { createColumnHelper } from '../components/DataTable'; import HelpTerminologyControl from '../components/Help/HelpTerminologyControl'; import { ArrowLeftIcon, ArrowRightIcon, CheckIcon, ChevronDoubleDownIcon, CrossIcon, HelpIcon } from '../components/Icons'; import { useConceptTheme } from '../context/ThemeContext'; import useConceptText from '../hooks/useConceptText'; import { Grammeme, ITextRequest, IWordForm, IWordFormPlain } from '../models/language'; import { getCompatibleGrams, wordFormEquals, parseGrammemes } from '../models/languageAPI'; import { IConstituenta, TermForm } from '../models/rsform'; import { colorfgGrammeme } from '../utils/color'; import { labelGrammeme } from '../utils/labels'; import { compareGrammemeOptions,IGrammemeOption, SelectorGrammemesList, SelectorGrammems } from '../utils/selectors'; interface DlgEditWordFormsProps { hideWindow: () => void target: IConstituenta onSave: (data: TermForm[]) => void } const columnHelper = createColumnHelper(); function DlgEditWordForms({ hideWindow, target, onSave }: DlgEditWordFormsProps) { const textProcessor = useConceptText(); const { colors } = useConceptTheme(); const [term, setTerm] = useState(''); const [inputText, setInputText] = useState(''); const [inputGrams, setInputGrams] = useState([]); const [options, setOptions] = useState([]); const [forms, setForms] = useState([]); function getData(): TermForm[] { const result: TermForm[] = []; forms.forEach( ({text, grams}) => result.push({ text: text, tags: grams.join(',') })); return result; } // Initialization useLayoutEffect( () => { const initForms: IWordForm[] = []; target.term_forms.forEach( term => initForms.push({ text: term.text, grams: parseGrammemes(term.tags), })); setForms(initForms); setTerm(target.term_resolved); setInputText(target.term_resolved); setInputGrams([]); }, [target]); // Filter grammemes when input changes useEffect( () => { const compatible = getCompatibleGrams( inputGrams .filter(data => Object.values(Grammeme).includes(data.value as Grammeme)) .map(data => data.value as Grammeme) ); setOptions(SelectorGrammems.filter(({value}) => compatible.includes(value as Grammeme))); }, [inputGrams]); const handleSubmit = () => onSave(getData()); function handleAddForm() { const newForm: IWordForm = { text: inputText, grams: inputGrams.map(item => item.value) }; setForms(forms => [ newForm, ...forms.filter(value => !wordFormEquals(value, newForm)) ]); } function handleDeleteRow(row: number) { setForms( (prev) => { const newForms: IWordForm[] = []; prev.forEach( (form, index) => { if (index !== row) { newForms.push(form); } }); return newForms; }); } function handleRowClicked(form: IWordForm) { setInputText(form.text); setInputGrams(SelectorGrammems.filter(gram => form.grams.find(test => test === gram.value))); } function handleResetAll() { setForms([]); } function handleInflect() { const data: IWordFormPlain = { text: term, grams: inputGrams.map(gram => gram.value).join(',') } textProcessor.inflect(data, response => setInputText(response.result)); } function handleParse() { const data: ITextRequest = { text: inputText } textProcessor.parse(data, response => { const grams = parseGrammemes(response.result); setInputGrams(SelectorGrammems.filter(gram => grams.find(test => test === gram.value))); }); } function handleGenerateLexeme() { if (forms.length > 0) { if (!window.confirm('Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?')) { return; } } const data: ITextRequest = { text: inputText } textProcessor.generateLexeme(data, response => { const lexeme: IWordForm[] = []; response.items.forEach( form => { const newForm: IWordForm = { text: form.text, grams: parseGrammemes(form.grams).filter(gram => SelectorGrammemesList.find(item => item === gram as Grammeme)) } if (newForm.grams.length === 2 && !lexeme.some(test => wordFormEquals(test, newForm))) { lexeme.push(newForm); } }); setForms(lexeme); }); } const columns = useMemo( () => [ columnHelper.accessor('text', { id: 'text', header: 'Текст', size: 350, minSize: 350, maxSize: 350, cell: props =>
{props.getValue()}
}), columnHelper.accessor('grams', { id: 'grams', header: 'Граммемы', size: 250, minSize: 250, maxSize: 250, cell: props =>
{ props.getValue().map( gram =>
{labelGrammeme(gram)}
)}
}), columnHelper.display({ id: 'actions', size: 50, minSize: 50, maxSize: 50, cell: props =>
} noHover onClick={() => handleDeleteRow(props.row.index)} />
}) ], [colors]); return (