From 134ef566bee653d90b5126bf31152953a7b58214 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:25:07 +0300 Subject: [PATCH] F: Implement basic substitution checks --- .vscode/settings.json | 1 + .../DlgEditOperation/DlgEditOperation.tsx | 35 +++- .../dialogs/DlgEditOperation/TabSynthesis.tsx | 18 +- .../frontend/src/hooks/useRSFormCache.ts | 3 + rsconcept/frontend/src/models/Graph.test.ts | 36 ++++ rsconcept/frontend/src/models/Graph.ts | 56 ++++++ rsconcept/frontend/src/models/oss.ts | 19 ++ rsconcept/frontend/src/models/ossAPI.ts | 170 +++++++++++++++++- rsconcept/frontend/src/models/rslang.ts | 3 + rsconcept/frontend/src/utils/labels.ts | 23 ++- 10 files changed, 351 insertions(+), 13 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 05a9be93..49098169 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -155,6 +155,7 @@ "toastify", "tooltipic", "tsdoc", + "Typifications", "unknwn", "Upvote", "Viewset", diff --git a/rsconcept/frontend/src/dialogs/DlgEditOperation/DlgEditOperation.tsx b/rsconcept/frontend/src/dialogs/DlgEditOperation/DlgEditOperation.tsx index 81967b3a..093e0f2b 100644 --- a/rsconcept/frontend/src/dialogs/DlgEditOperation/DlgEditOperation.tsx +++ b/rsconcept/frontend/src/dialogs/DlgEditOperation/DlgEditOperation.tsx @@ -1,7 +1,7 @@ 'use client'; import clsx from 'clsx'; -import { useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { TabList, TabPanel, Tabs } from 'react-tabs'; import BadgeHelp from '@/components/info/BadgeHelp'; @@ -18,6 +18,7 @@ import { OperationID, OperationType } from '@/models/oss'; +import { SubstitutionValidator } from '@/models/ossAPI'; import { PARAMETER } from '@/utils/constants'; import TabArguments from './TabArguments'; @@ -44,6 +45,9 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio const [title, setTitle] = useState(target.title); const [comment, setComment] = useState(target.comment); + const [isCorrect, setIsCorrect] = useState(true); + const [validationText, setValidationText] = useState(''); + const [inputs, setInputs] = useState(oss.graph.expandInputs([target.id])); const inputOperations = useMemo(() => inputs.map(id => oss.operationByID.get(id)!), [inputs, oss.operationByID]); const schemasIDs = useMemo( @@ -54,10 +58,10 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio const cache = useRSFormCache(); const schemas = useMemo( () => schemasIDs.map(id => cache.getSchema(id)).filter(item => item !== undefined), - [schemasIDs, cache] + [schemasIDs, cache.getSchema] ); - const isValid = useMemo(() => alias !== '', [alias]); + const canSubmit = useMemo(() => alias !== '', [alias]); useEffect(() => { cache.preload(schemasIDs); @@ -82,7 +86,16 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio ); }, [schemasIDs, schemas, cache.loading]); - const handleSubmit = () => { + useEffect(() => { + if (cache.loading || schemas.length !== schemasIDs.length) { + return; + } + const validator = new SubstitutionValidator(schemas, substitutions); + setIsCorrect(validator.validate()); + setValidationText(validator.msg); + }, [substitutions, cache.loading, schemas, schemasIDs.length]); + + const handleSubmit = useCallback(() => { const data: IOperationUpdateData = { target: target.id, item_data: { @@ -95,7 +108,7 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio substitutions: target.operation_type !== OperationType.SYNTHESIS ? undefined : substitutions }; onSubmit(data); - }; + }, [alias, comment, title, inputs, substitutions, target, onSubmit]); const cardPanel = useMemo( () => ( @@ -134,12 +147,14 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio schemas={schemas} loading={cache.loading} error={cache.error} + validationText={validationText} + isCorrect={isCorrect} substitutions={substitutions} setSubstitutions={setSubstitutions} /> ), - [cache.loading, cache.error, substitutions, schemas] + [cache.loading, cache.error, substitutions, schemas, validationText, isCorrect] ); return ( @@ -147,7 +162,7 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio header='Редактирование операции' submitText='Сохранить' hideWindow={hideWindow} - canSubmit={isValid} + canSubmit={canSubmit} onSubmit={handleSubmit} className='w-[40rem] px-6 min-h-[35rem]' > @@ -167,7 +182,11 @@ function DlgEditOperation({ hideWindow, oss, target, onSubmit }: DlgEditOperatio ) : null} {target.operation_type === OperationType.SYNTHESIS ? ( - + (не прошла проверку)')} + label={isCorrect ? 'Отождествления' : 'Отождествления*'} + className='w-[8rem]' + /> ) : null} diff --git a/rsconcept/frontend/src/dialogs/DlgEditOperation/TabSynthesis.tsx b/rsconcept/frontend/src/dialogs/DlgEditOperation/TabSynthesis.tsx index 3e1d08f0..5ee90712 100644 --- a/rsconcept/frontend/src/dialogs/DlgEditOperation/TabSynthesis.tsx +++ b/rsconcept/frontend/src/dialogs/DlgEditOperation/TabSynthesis.tsx @@ -1,6 +1,8 @@ import { ErrorData } from '@/components/info/InfoError'; import PickSubstitutions from '@/components/select/PickSubstitutions'; +import TextArea from '@/components/ui/TextArea'; import DataLoader from '@/components/wrap/DataLoader'; +import { useConceptOptions } from '@/context/ConceptOptionsContext'; import { ICstSubstitute } from '@/models/oss'; import { IRSForm } from '@/models/rsform'; import { prefixes } from '@/utils/constants'; @@ -8,22 +10,34 @@ import { prefixes } from '@/utils/constants'; interface TabSynthesisProps { loading: boolean; error: ErrorData; + validationText: string; + isCorrect: boolean; schemas: IRSForm[]; substitutions: ICstSubstitute[]; setSubstitutions: React.Dispatch>; } -function TabSynthesis({ schemas, loading, error, substitutions, setSubstitutions }: TabSynthesisProps) { +function TabSynthesis({ + schemas, + loading, + error, + validationText, + isCorrect, + substitutions, + setSubstitutions +}: TabSynthesisProps) { + const { colors } = useConceptOptions(); return ( +