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 { CheckIcon, ChevronDoubleUpIcon, ChevronUpIcon, CrossIcon } from '../../components/Icons'; import { useConceptTheme } from '../../context/ThemeContext'; import { Grammeme, GrammemeGroups, IWordForm, matchWordForm, NounGrams, parseGrammemes, sortGrammemes, VerbGrams } from '../../models/language'; import { IConstituenta, TermForm } from '../../models/rsform'; import { colorfgGrammeme } from '../../utils/color'; import { labelGrammeme } from '../../utils/labels'; import { IGrammemeOption, SelectorGrammems } from '../../utils/selectors'; interface DlgEditTermProps { hideWindow: () => void target: IConstituenta onSave: (data: TermForm[]) => void } const columnHelper = createColumnHelper(); function DlgEditTerm({ hideWindow, target, onSave }: DlgEditTermProps) { 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); }, [target]); // Filter grammemes when input changes useEffect( () => { let newFilter: Grammeme[] = []; inputGrams.forEach(({type: gram}) => { if (!newFilter.includes(gram)) { if (NounGrams.includes(gram)) { newFilter.push(...NounGrams); } if (VerbGrams.includes(gram)) { newFilter.push(...VerbGrams); } } }); inputGrams.forEach(({type: gram}) => GrammemeGroups.forEach(group => { if (group.includes(gram)) { newFilter = newFilter.filter(item => !group.includes(item) || item === gram); } })); newFilter.push(...inputGrams.map(({type: gram}) => gram)); if (newFilter.length === 0) { newFilter = [...VerbGrams, ...NounGrams]; } newFilter = [... new Set(newFilter)]; setOptions(SelectorGrammems.filter(({type: gram}) => newFilter.includes(gram))); }, [inputGrams]); const handleSubmit = () => onSave(getData()); function handleAddForm() { const newForm: IWordForm = { text: inputText, grams: inputGrams.map(item => ({ type: item.type, data: item.data })) }; setForms(forms => [ ...forms.filter(value => !matchWordForm(value, newForm)), newForm ]); } function handleDeleteRow(row: number) { setForms( (prev) => { const newForms: IWordForm[] = []; prev.forEach( (form, index) => { if (index !== row) { newForms.push(form); } }); return newForms; }); } function handleResetForm() { setInputText(''); setInputGrams([]); } function handleGenerateSelected() { } function handleGenerateBasics() { if (forms.length > 0) { if (!window.confirm('Данное действие приведет к перезаписи словоформ при совпадении граммем. Продолжить?')) { return; } } } 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 (