Portal/rsconcept/frontend/src/dialogs/DlgCreateOperation/DlgCreateOperation.tsx

175 lines
5.0 KiB
TypeScript
Raw Normal View History

2024-07-21 15:17:36 +03:00
'use client';
import clsx from 'clsx';
import { useCallback, useEffect, useMemo, useState } from 'react';
2024-07-21 15:17:36 +03:00
import { TabList, TabPanel, Tabs } from 'react-tabs';
import Modal from '@/components/ui/Modal';
import TabLabel from '@/components/ui/TabLabel';
import { useLibrary } from '@/context/LibraryContext';
import { LibraryItemID } from '@/models/library';
2024-07-29 16:55:48 +03:00
import { HelpTopic } from '@/models/miscellaneous';
import { IOperationCreateData, IOperationSchema, OperationID, OperationType } from '@/models/oss';
2024-07-21 15:17:36 +03:00
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[];
2024-07-21 15:17:36 +03:00
}
export enum TabID {
INPUT = 0,
SYNTHESIS = 1
}
function DlgCreateOperation({ hideWindow, oss, onCreate, initialInputs }: DlgCreateOperationProps) {
2024-07-21 15:17:36 +03:00
const library = useLibrary();
const [activeTab, setActiveTab] = useState(initialInputs.length > 0 ? TabID.SYNTHESIS : TabID.INPUT);
2024-07-21 15:17:36 +03:00
const [alias, setAlias] = useState('');
const [title, setTitle] = useState('');
const [comment, setComment] = useState('');
const [inputs, setInputs] = useState<OperationID[]>(initialInputs);
2024-07-21 15:17:36 +03:00
const [attachedID, setAttachedID] = useState<LibraryItemID | undefined>(undefined);
2024-07-26 17:30:37 +03:00
const [createSchema, setCreateSchema] = useState(false);
2024-07-21 15:17:36 +03:00
const isValid = useMemo(() => {
if (alias === '') {
return false;
}
2024-09-16 19:38:24 +03:00
if (activeTab === TabID.SYNTHESIS && inputs.length === 0) {
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]);
2024-07-21 15:17:36 +03:00
useEffect(() => {
2024-07-21 15:17:36 +03:00
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: {
2024-07-29 16:55:48 +03:00
position_x: 0,
position_y: 0,
2024-07-21 15:17:36 +03:00
alias: alias,
title: title,
comment: comment,
operation_type: activeTab === TabID.INPUT ? OperationType.INPUT : OperationType.SYNTHESIS,
result: activeTab === TabID.INPUT ? attachedID ?? null : null
},
2024-07-29 16:55:48 +03:00
positions: [],
2024-07-26 17:30:37 +03:00
arguments: activeTab === TabID.INPUT ? undefined : inputs.length > 0 ? inputs : undefined,
create_schema: createSchema
2024-07-21 15:17:36 +03:00
};
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]
);
2024-07-21 15:17:36 +03:00
const inputPanel = useMemo(
() => (
<TabPanel>
<TabInputOperation
2024-07-26 00:33:22 +03:00
oss={oss}
2024-07-21 15:17:36 +03:00
alias={alias}
onChangeAlias={setAlias}
2024-07-21 15:17:36 +03:00
comment={comment}
onChangeComment={setComment}
2024-07-21 15:17:36 +03:00
title={title}
onChangeTitle={setTitle}
2024-07-21 15:17:36 +03:00
attachedID={attachedID}
onChangeAttachedID={setAttachedID}
2024-07-26 17:30:37 +03:00
createSchema={createSchema}
onChangeCreateSchema={setCreateSchema}
2024-07-21 15:17:36 +03:00
/>
</TabPanel>
),
2024-08-02 11:17:27 +03:00
[alias, comment, title, attachedID, oss, createSchema, setAlias]
2024-07-21 15:17:36 +03:00
);
const synthesisPanel = useMemo(
() => (
<TabPanel>
<TabSynthesisOperation
oss={oss}
alias={alias}
onChangeAlias={setAlias}
2024-07-21 15:17:36 +03:00
comment={comment}
onChangeComment={setComment}
2024-07-21 15:17:36 +03:00
title={title}
onChangeTitle={setTitle}
2024-07-26 17:30:37 +03:00
inputs={inputs}
2024-07-21 15:17:36 +03:00
setInputs={setInputs}
/>
</TabPanel>
),
2024-08-02 11:17:27 +03:00
[oss, alias, comment, title, inputs, setAlias]
2024-07-21 15:17:36 +03:00
);
return (
<Modal
header='Создание операции'
submitText='Создать'
hideWindow={hideWindow}
canSubmit={isValid}
onSubmit={handleSubmit}
className='w-[40rem] px-6 h-[32rem]'
2024-10-29 12:05:23 +03:00
helpTopic={HelpTopic.CC_OSS}
2024-07-21 15:17:36 +03:00
>
<Tabs
selectedTabClassName='clr-selected'
className='flex flex-col pt-2'
2024-07-21 15:17:36 +03:00
selectedIndex={activeTab}
onSelect={handleSelectTab}
2024-07-21 15:17:36 +03:00
>
<TabList className={clsx('self-center absolute top-[2.4rem]', 'flex', 'border divide-x rounded-none')}>
2024-07-21 15:17:36 +03:00
<TabLabel
title={describeOperationType(OperationType.INPUT)}
label={labelOperationType(OperationType.INPUT)}
/>
<TabLabel
title={describeOperationType(OperationType.SYNTHESIS)}
label={labelOperationType(OperationType.SYNTHESIS)}
/>
</TabList>
{inputPanel}
{synthesisPanel}
</Tabs>
</Modal>
);
}
export default DlgCreateOperation;