From 593b483936ce9e391bf1b6b49a2a729b829781a1 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:59:28 +0300 Subject: [PATCH] F: Update substitute UI with nominal cst --- .vscode/settings.json | 1 + rsconcept/frontend/src/features/oss/labels.ts | 2 ++ .../src/features/oss/models/oss-api.ts | 18 ++++++++++++++++-- .../frontend/src/features/oss/models/oss.ts | 3 ++- .../rsform/dialogs/dlg-substitute-cst.tsx | 18 +++++++++++++++--- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b5b0b321..863c595b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -217,6 +217,7 @@ "неитерируемого", "Никанорова", "Номеноид", + "номеноида", "Номеноиды", "операционализации", "операционализированных", diff --git a/rsconcept/frontend/src/features/oss/labels.ts b/rsconcept/frontend/src/features/oss/labels.ts index 6eac4d3e..dee55332 100644 --- a/rsconcept/frontend/src/features/oss/labels.ts +++ b/rsconcept/frontend/src/features/oss/labels.ts @@ -42,6 +42,8 @@ export function describeSubstitutionError(error: RO ${error.params[1]}: замена структурного понятия базисным множеством`; case SubstitutionErrorType.invalidConstant: return `Ошибка ${error.params[0]} -> ${error.params[1]}: подстановка константного множества возможна только вместо другого константного`; + case SubstitutionErrorType.invalidNominal: + return `Ошибка ${error.params[0]} -> ${error.params[1]}: подстановка номеноида возможна только вместо другого номеноида`; case SubstitutionErrorType.invalidClasses: return `Ошибка ${error.params[0]} -> ${error.params[1]}: классы конституент не совпадают`; case SubstitutionErrorType.typificationCycle: diff --git a/rsconcept/frontend/src/features/oss/models/oss-api.ts b/rsconcept/frontend/src/features/oss/models/oss-api.ts index 2c57c568..7636d9fd 100644 --- a/rsconcept/frontend/src/features/oss/models/oss-api.ts +++ b/rsconcept/frontend/src/features/oss/models/oss-api.ts @@ -183,8 +183,18 @@ export class SubstitutionValidator { return this.reportError(SubstitutionErrorType.incorrectCst, [substitution.alias, original.alias]); } switch (substitution.cst_type) { + case CstType.NOMINAL: { + if (original.cst_type !== CstType.NOMINAL) { + return this.reportError(SubstitutionErrorType.invalidNominal, [substitution.alias, original.alias]); + } + break; + } case CstType.BASE: { - if (original.cst_type !== CstType.BASE && original.cst_type !== CstType.CONSTANT) { + if ( + original.cst_type !== CstType.BASE && + original.cst_type !== CstType.CONSTANT && + original.cst_type !== CstType.NOMINAL + ) { return this.reportError(SubstitutionErrorType.invalidBasic, [substitution.alias, original.alias]); } break; @@ -295,7 +305,11 @@ export class SubstitutionValidator { } for (const item of this.substitutions) { const original = this.cstByID.get(item.original)!; - if (original.cst_type === CstType.BASE || original.cst_type === CstType.CONSTANT) { + if ( + original.cst_type === CstType.BASE || + original.cst_type === CstType.CONSTANT || + original.cst_type === CstType.NOMINAL + ) { continue; } const substitution = this.cstByID.get(item.substitution)!; diff --git a/rsconcept/frontend/src/features/oss/models/oss.ts b/rsconcept/frontend/src/features/oss/models/oss.ts index d5487de8..d2a81e47 100644 --- a/rsconcept/frontend/src/features/oss/models/oss.ts +++ b/rsconcept/frontend/src/features/oss/models/oss.ts @@ -112,7 +112,8 @@ export const SubstitutionErrorType = { unequalTypification: 7, unequalExpressions: 8, unequalArgsCount: 9, - unequalArgs: 10 + unequalArgs: 10, + invalidNominal: 11 } as const; export type SubstitutionErrorType = (typeof SubstitutionErrorType)[keyof typeof SubstitutionErrorType]; diff --git a/rsconcept/frontend/src/features/rsform/dialogs/dlg-substitute-cst.tsx b/rsconcept/frontend/src/features/rsform/dialogs/dlg-substitute-cst.tsx index 40e35e01..841ef293 100644 --- a/rsconcept/frontend/src/features/rsform/dialogs/dlg-substitute-cst.tsx +++ b/rsconcept/frontend/src/features/rsform/dialogs/dlg-substitute-cst.tsx @@ -1,11 +1,13 @@ 'use client'; -import { Controller, useForm } from 'react-hook-form'; +import { Controller, useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; +import clsx from 'clsx'; import { HelpTopic } from '@/features/help'; +import { SubstitutionValidator } from '@/features/oss/models/oss-api'; -import { ErrorField } from '@/components/input'; +import { ErrorField, TextArea } from '@/components/input'; import { ModalForm } from '@/components/modal'; import { useDialogsStore } from '@/stores/dialogs'; @@ -34,6 +36,10 @@ export function DlgSubstituteCst() { }, mode: 'onChange' }); + const substitutions = useWatch({ control, name: 'substitutions' }); + + const validator = new SubstitutionValidator([schema], substitutions); + const isCorrect = validator.validate(); function onSubmit(data: ISubstitutionsDTO) { return cstSubstitute({ itemID: schema.id, data: data }).then(() => onSubstitute(data)); @@ -62,7 +68,13 @@ export function DlgSubstituteCst() { /> )} /> - + +