import { useEffect, useLayoutEffect, useMemo, useState } from 'react'; import Divider from '../../components/Common/Divider'; 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 { ArrowLeftIcon, ArrowRightIcon, CheckIcon, ChevronDoubleDownIcon, CrossIcon } from '../../components/Icons'; import { useConceptTheme } from '../../context/ThemeContext'; import useConceptText from '../../hooks/useConceptText'; import { GramData, Grammeme, GrammemeGroups, ITextRequest, IWordForm, IWordFormPlain, matchWordForm, NounGrams, parseGrammemes, VerbGrams } from '../../models/language'; 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 DlgEditTermProps { hideWindow: () => void target: IConstituenta onSave: (data: TermForm[]) => void } const columnHelper = createColumnHelper(); function DlgEditTerm({ hideWindow, target, onSave }: DlgEditTermProps) { 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( () => { let newFilter: GramData[] = []; inputGrams.forEach(({value: gram}) => { if (!newFilter.includes(gram)) { if (NounGrams.includes(gram as Grammeme)) { newFilter.push(...NounGrams); } if (VerbGrams.includes(gram as Grammeme)) { newFilter.push(...VerbGrams); } } }); inputGrams.forEach(({value: gram}) => GrammemeGroups.forEach(group => { if (group.includes(gram as Grammeme)) { newFilter = newFilter.filter(item => !group.includes(item as Grammeme) || item === gram); } })); newFilter.push(...inputGrams.map(({value}) => value)); if (newFilter.length === 0) { newFilter = [...VerbGrams, ...NounGrams]; } newFilter = [... new Set(newFilter)]; setOptions(SelectorGrammems.filter(({value}) => newFilter.includes(value))); }, [inputGrams]); const handleSubmit = () => onSave(getData()); function handleAddForm() { const newForm: IWordForm = { text: inputText, grams: inputGrams.map(item => item.value) }; setForms(forms => [ newForm, ...forms.filter(value => !matchWordForm(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 handleResetForm() { setInputText(''); setInputGrams([]); } 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 => matchWordForm(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 (