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

161 lines
4.7 KiB
TypeScript
Raw Normal View History

2024-07-21 15:17:36 +03:00
'use client';
import clsx from 'clsx';
import { useEffect, 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';
import { useDialogsStore } from '@/stores/dialogs';
2024-07-21 15:17:36 +03:00
import { describeOperationType, labelOperationType } from '@/utils/labels';
import TabInputOperation from './TabInputOperation';
import TabSynthesisOperation from './TabSynthesisOperation';
export interface DlgCreateOperationProps {
2024-07-21 15:17:36 +03:00
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() {
const { oss, onCreate, initialInputs } = useDialogsStore(state => state.props as 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 = (() => {
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;
})();
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);
};
function handleSelectTab(newTab: TabID, last: TabID) {
if (last === newTab) {
return;
}
if (newTab === TabID.INPUT) {
setAttachedID(undefined);
} else {
setInputs(initialInputs);
}
setActiveTab(newTab);
}
2024-07-21 15:17:36 +03:00
return (
<Modal
header='Создание операции'
submitText='Создать'
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
>
2024-12-18 14:54:45 +03:00
<TabList
className={clsx('self-center absolute top-[2.4rem]', 'flex', 'border divide-x rounded-none', 'bg-prim-200')}
>
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>
<TabPanel>
<TabInputOperation
oss={oss}
alias={alias}
onChangeAlias={setAlias}
comment={comment}
onChangeComment={setComment}
title={title}
onChangeTitle={setTitle}
attachedID={attachedID}
onChangeAttachedID={setAttachedID}
createSchema={createSchema}
onChangeCreateSchema={setCreateSchema}
/>
</TabPanel>
<TabPanel>
<TabSynthesisOperation
oss={oss}
alias={alias}
onChangeAlias={setAlias}
comment={comment}
onChangeComment={setComment}
title={title}
onChangeTitle={setTitle}
inputs={inputs}
setInputs={setInputs}
/>
</TabPanel>
2024-07-21 15:17:36 +03:00
</Tabs>
</Modal>
);
}
export default DlgCreateOperation;