ConceptPortal-public/rsconcept/frontend/src/features/oss/dialogs/DlgEditOperation/DlgEditOperation.tsx

112 lines
3.7 KiB
TypeScript
Raw Normal View History

2024-07-29 16:56:24 +03:00
'use client';
2025-02-12 00:14:38 +03:00
import { zodResolver } from '@hookform/resolvers/zod';
2024-07-29 16:56:24 +03:00
import clsx from 'clsx';
2025-02-12 00:14:38 +03:00
import { Suspense, useState } from 'react';
import { FormProvider, useForm, useWatch } from 'react-hook-form';
2024-07-29 16:56:24 +03:00
2025-02-12 00:14:38 +03:00
import { Loader } from '@/components/Loader';
import { ModalForm } from '@/components/Modal';
import { TabLabel, TabList, TabPanel, Tabs } from '@/components/Tabs';
import { HelpTopic } from '@/features/help';
import { useDialogsStore } from '@/stores/dialogs';
2024-07-29 16:56:24 +03:00
2025-02-12 00:14:38 +03:00
import { IOperationPosition, IOperationUpdateDTO, schemaOperationUpdate } from '../../backend/api';
import { useOperationUpdate } from '../../backend/useOperationUpdate';
import { IOperation, IOperationSchema, OperationType } from '../../models/oss';
2024-07-29 16:56:24 +03:00
import TabArguments from './TabArguments';
import TabOperation from './TabOperation';
import TabSynthesis from './TabSynthesis';
export interface DlgEditOperationProps {
2024-07-29 16:56:24 +03:00
oss: IOperationSchema;
target: IOperation;
2025-02-12 00:14:38 +03:00
positions: IOperationPosition[];
2024-07-29 16:56:24 +03:00
}
export enum TabID {
CARD = 0,
ARGUMENTS = 1,
SUBSTITUTION = 2
}
function DlgEditOperation() {
2025-02-12 00:14:38 +03:00
const { oss, target, positions } = useDialogsStore(state => state.props as DlgEditOperationProps);
const { operationUpdate } = useOperationUpdate();
2025-02-12 00:14:38 +03:00
const methods = useForm<IOperationUpdateDTO>({
resolver: zodResolver(schemaOperationUpdate),
defaultValues: {
item_data: {
alias: target.alias,
title: target.alias,
comment: target.comment
},
arguments: target.arguments,
substitutions: target.substitutions.map(sub => ({
original: sub.original,
substitution: sub.substitution
})),
positions: positions
}
2025-02-12 00:14:38 +03:00
});
const alias = useWatch({ control: methods.control, name: 'item_data.alias' });
const canSubmit = alias !== '';
2025-02-12 00:14:38 +03:00
const [activeTab, setActiveTab] = useState(TabID.CARD);
2024-08-26 17:25:07 +03:00
2025-02-12 00:14:38 +03:00
function onSubmit(data: IOperationUpdateDTO) {
return operationUpdate({ itemID: oss.id, data });
}
2024-07-29 16:56:24 +03:00
return (
<ModalForm
2024-07-29 16:56:24 +03:00
header='Редактирование операции'
submitText='Сохранить'
2024-08-26 17:25:07 +03:00
canSubmit={canSubmit}
2025-02-12 00:14:38 +03:00
onSubmit={event => void methods.handleSubmit(onSubmit)(event)}
className='w-[40rem] px-6 h-[32rem]'
2024-10-29 12:06:43 +03:00
helpTopic={HelpTopic.UI_SUBSTITUTIONS}
hideHelpWhen={() => activeTab !== TabID.SUBSTITUTION}
2024-07-29 16:56:24 +03:00
>
<Tabs
selectedTabClassName='clr-selected'
className='flex flex-col'
selectedIndex={activeTab}
onSelect={setActiveTab}
>
2024-12-18 14:55:10 +03:00
<TabList className={clsx('mb-3 self-center', 'flex', 'border divide-x rounded-none', 'bg-prim-200')}>
2024-07-29 16:56:24 +03:00
<TabLabel title='Текстовые поля' label='Карточка' className='w-[8rem]' />
{target.operation_type === OperationType.SYNTHESIS ? (
<TabLabel title='Выбор аргументов операции' label='Аргументы' className='w-[8rem]' />
) : null}
{target.operation_type === OperationType.SYNTHESIS ? (
2025-02-12 00:14:38 +03:00
<TabLabel titleHtml='Таблица отождествлений' label='Отождествления' className='w-[8rem]' />
2024-07-29 16:56:24 +03:00
) : null}
</TabList>
2025-02-12 00:14:38 +03:00
<FormProvider {...methods}>
<TabPanel>
2025-02-12 00:14:38 +03:00
<TabOperation />
</TabPanel>
2025-02-12 00:14:38 +03:00
{target.operation_type === OperationType.SYNTHESIS ? (
<TabPanel>
<TabArguments />
</TabPanel>
) : null}
{target.operation_type === OperationType.SYNTHESIS ? (
<TabPanel>
<Suspense fallback={<Loader />}>
<TabSynthesis />
</Suspense>
</TabPanel>
) : null}
</FormProvider>
2024-07-29 16:56:24 +03:00
</Tabs>
</ModalForm>
2024-07-29 16:56:24 +03:00
);
}
export default DlgEditOperation;