'use client'; import clsx from 'clsx'; import { useCallback, useLayoutEffect, useMemo, useState } from 'react'; import { TabList, TabPanel, Tabs } from 'react-tabs'; import BadgeHelp from '@/components/info/BadgeHelp'; import Modal from '@/components/ui/Modal'; import Overlay from '@/components/ui/Overlay'; import TabLabel from '@/components/ui/TabLabel'; import { useLibrary } from '@/context/LibraryContext'; import { LibraryItemID } from '@/models/library'; import { HelpTopic } from '@/models/miscellaneous'; import { IOperationCreateData, IOperationSchema, OperationID, OperationType } from '@/models/oss'; import { PARAMETER } from '@/utils/constants'; import { describeOperationType, labelOperationType } from '@/utils/labels'; import TabInputOperation from './TabInputOperation'; import TabSynthesisOperation from './TabSynthesisOperation'; interface DlgCreateOperationProps { hideWindow: () => void; oss: IOperationSchema; onCreate: (data: IOperationCreateData) => void; initialInputs: OperationID[]; } export enum TabID { INPUT = 0, SYNTHESIS = 1 } function DlgCreateOperation({ hideWindow, oss, onCreate, initialInputs }: DlgCreateOperationProps) { const library = useLibrary(); const [activeTab, setActiveTab] = useState(initialInputs.length > 0 ? TabID.SYNTHESIS : TabID.INPUT); const [alias, setAlias] = useState(''); const [title, setTitle] = useState(''); const [comment, setComment] = useState(''); const [inputs, setInputs] = useState(initialInputs); const [attachedID, setAttachedID] = useState(undefined); const [createSchema, setCreateSchema] = useState(false); const isValid = useMemo(() => { if (alias === '') { return false; } if (activeTab === TabID.SYNTHESIS && inputs.length === 1) { return false; } if (activeTab === TabID.INPUT && !attachedID) { if (oss.items.some(operation => operation.alias === alias)) { return false; } } return true; }, [alias, activeTab, inputs, attachedID, oss.items]); useLayoutEffect(() => { if (attachedID) { const schema = library.items.find(value => value.id === attachedID); if (schema) { setAlias(schema.alias); setTitle(schema.title); setComment(schema.comment); } } }, [attachedID, library]); const handleSubmit = () => { const data: IOperationCreateData = { item_data: { position_x: 0, position_y: 0, alias: alias, title: title, comment: comment, operation_type: activeTab === TabID.INPUT ? OperationType.INPUT : OperationType.SYNTHESIS, result: activeTab === TabID.INPUT ? attachedID ?? null : null }, positions: [], arguments: activeTab === TabID.INPUT ? undefined : inputs.length > 0 ? inputs : undefined, create_schema: createSchema }; onCreate(data); }; const handleSelectTab = useCallback( (newTab: TabID, last: TabID) => { if (last === newTab) { return; } if (newTab === TabID.INPUT) { setAttachedID(undefined); } else { setInputs(initialInputs); } setActiveTab(newTab); }, [setActiveTab, initialInputs] ); const inputPanel = useMemo( () => ( ), [alias, comment, title, attachedID, oss, createSchema] ); const synthesisPanel = useMemo( () => ( ), [oss, alias, comment, title, inputs] ); return ( {inputPanel} {synthesisPanel} ); } export default DlgCreateOperation;