diff --git a/rsconcept/frontend/src/components/Common/ConceptSearch.tsx b/rsconcept/frontend/src/components/Common/ConceptSearch.tsx index e6f1a3d7..d7220225 100644 --- a/rsconcept/frontend/src/components/Common/ConceptSearch.tsx +++ b/rsconcept/frontend/src/components/Common/ConceptSearch.tsx @@ -1,23 +1,29 @@ import { MagnifyingGlassIcon } from '../Icons'; +import Overlay from './Overlay'; import TextInput from './TextInput'; interface ConceptSearchProps { value: string onChange?: (newValue: string) => void dense?: boolean + noBorder?: boolean + dimensions?: string } -function ConceptSearch({ value, onChange, dense }: ConceptSearchProps) { - const borderClass = dense ? 'border-t border-x': ''; +function ConceptSearch({ value, onChange, noBorder, dimensions, dense }: ConceptSearchProps) { + const borderClass = dense && !noBorder ? 'border-t border-x': ''; return ( -
-
- -
+
+ + + (onChange ? onChange(event.target.value) : undefined)} /> diff --git a/rsconcept/frontend/src/components/Common/SelectMulti.tsx b/rsconcept/frontend/src/components/Common/SelectMulti.tsx index d210151f..a3a0484a 100644 --- a/rsconcept/frontend/src/components/Common/SelectMulti.tsx +++ b/rsconcept/frontend/src/components/Common/SelectMulti.tsx @@ -4,7 +4,7 @@ import Select, { GroupBase, Props, StylesConfig } from 'react-select'; import { useConceptTheme } from '../../context/ThemeContext'; import { selectDarkT, selectLightT } from '../../utils/color'; -interface SelectMultiProps< +export interface SelectMultiProps< Option, Group extends GroupBase
); } -export default SelectTermform; \ No newline at end of file +export default SelectWordForm; \ No newline at end of file diff --git a/rsconcept/frontend/src/dialogs/DlgEditWordForms.tsx b/rsconcept/frontend/src/dialogs/DlgEditWordForms.tsx deleted file mode 100644 index 909adbc5..00000000 --- a/rsconcept/frontend/src/dialogs/DlgEditWordForms.tsx +++ /dev/null @@ -1,316 +0,0 @@ -import { useEffect, useLayoutEffect, useMemo, useState } from 'react'; - -import Label from '../components/Common/Label'; -import MiniButton from '../components/Common/MiniButton'; -import Modal from '../components/Common/Modal'; -import Overlay from '../components/Common/Overlay'; -import SelectMulti from '../components/Common/SelectMulti'; -import TextArea from '../components/Common/TextArea'; -import DataTable, { createColumnHelper } from '../components/DataTable'; -import HelpButton from '../components/Help/HelpButton'; -import { ArrowLeftIcon, ArrowRightIcon, CheckIcon, ChevronDoubleDownIcon, CrossIcon } from '../components/Icons'; -import { useConceptTheme } from '../context/ThemeContext'; -import useConceptText from '../hooks/useConceptText'; -import { Grammeme, ITextRequest, IWordForm, IWordFormPlain } from '../models/language'; -import { getCompatibleGrams, parseGrammemes,wordFormEquals } from '../models/languageAPI'; -import { HelpTopic } from '../models/miscelanious'; -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 => -
- } - onClick={() => handleDeleteRow(props.row.index)} - /> -
- }) - ], [colors]); - - return ( - - - - - -