'use client'; import clsx from 'clsx'; import { useCallback, useEffect, useState } from 'react'; import { TabList, TabPanel, Tabs } from 'react-tabs'; import { IOperationUpdateDTO } from '@/backend/oss/api'; import { useRSForms } from '@/backend/rsform/useRSForms'; import Modal from '@/components/ui/Modal'; import TabLabel from '@/components/ui/TabLabel'; import { LibraryItemID } from '@/models/library'; import { HelpTopic } from '@/models/miscellaneous'; import { ICstSubstitute, IOperation, IOperationSchema, OperationID, OperationType } from '@/models/oss'; import { SubstitutionValidator } from '@/models/ossAPI'; import { ConstituentaID } from '@/models/rsform'; import { useDialogsStore } from '@/stores/dialogs'; import TabArguments from './TabArguments'; import TabOperation from './TabOperation'; import TabSynthesis from './TabSynthesis'; export interface DlgEditOperationProps { oss: IOperationSchema; target: IOperation; onSubmit: (data: IOperationUpdateDTO) => void; } export enum TabID { CARD = 0, ARGUMENTS = 1, SUBSTITUTION = 2 } function DlgEditOperation() { const { oss, target, onSubmit } = useDialogsStore(state => state.props as DlgEditOperationProps); const [activeTab, setActiveTab] = useState(TabID.CARD); const [alias, setAlias] = useState(target.alias); const [title, setTitle] = useState(target.title); const [comment, setComment] = useState(target.comment); const [isCorrect, setIsCorrect] = useState(true); const [validationText, setValidationText] = useState(''); const initialInputs = oss.graph.expandInputs([target.id]); const [inputs, setInputs] = useState(initialInputs); const inputOperations = inputs.map(id => oss.operationByID.get(id)!); const [substitutions, setSubstitutions] = useState(target.substitutions); const [suggestions, setSuggestions] = useState([]); const [schemasIDs, setSchemaIDs] = useState([]); const schemas = useRSForms(schemasIDs); const isModified = alias !== target.alias || title !== target.title || comment !== target.comment || JSON.stringify(initialInputs) !== JSON.stringify(inputs) || JSON.stringify(substitutions) !== JSON.stringify(target.substitutions); const canSubmit = isModified && alias !== ''; const getSchemaByCst = useCallback( (id: ConstituentaID) => { for (const schema of schemas) { const cst = schema.items.find(cst => cst.id === id); if (cst) { return schema; } } return undefined; }, [schemas] ); useEffect(() => { setSchemaIDs(inputOperations.map(operation => operation.result).filter(id => id !== null)); }, [inputOperations]); useEffect(() => { if (schemas.length !== schemasIDs.length || schemas.length === 0) { return; } setSubstitutions(prev => prev.filter(sub => { const original = getSchemaByCst(sub.original); if (!original || !schemasIDs.includes(original.id)) { return false; } const substitution = getSchemaByCst(sub.substitution); if (!substitution || !schemasIDs.includes(substitution.id)) { return false; } return true; }) ); }, [schemasIDs, schemas, getSchemaByCst]); useEffect(() => { if (schemas.length !== schemasIDs.length || schemas.length === 0) { return; } const validator = new SubstitutionValidator(schemas, substitutions); setIsCorrect(validator.validate()); setValidationText(validator.msg); setSuggestions(validator.suggestions); }, [substitutions, schemas, schemasIDs.length]); function handleSubmit() { onSubmit({ target: target.id, item_data: { alias: alias, title: title, comment: comment }, positions: [], arguments: target.operation_type !== OperationType.SYNTHESIS ? undefined : inputs, substitutions: target.operation_type !== OperationType.SYNTHESIS ? undefined : substitutions }); return true; } return ( activeTab !== TabID.SUBSTITUTION} > {target.operation_type === OperationType.SYNTHESIS ? ( ) : null} {target.operation_type === OperationType.SYNTHESIS ? ( (не прошла проверку)')} label={isCorrect ? 'Отождествления' : 'Отождествления*'} className='w-[8rem]' /> ) : null} {target.operation_type === OperationType.SYNTHESIS ? ( ) : null} {target.operation_type === OperationType.SYNTHESIS ? ( ) : null} ); } export default DlgEditOperation;