2024-07-29 16:55:48 +03:00
|
|
|
'use client';
|
|
|
|
|
2025-02-12 00:14:18 +03:00
|
|
|
import { Suspense, useState } from 'react';
|
2025-02-18 23:38:33 +03:00
|
|
|
import { FormProvider, useForm } from 'react-hook-form';
|
2025-02-12 21:36:03 +03:00
|
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
|
|
|
|
|
|
import { HelpTopic } from '@/features/help';
|
2024-07-29 16:55:48 +03:00
|
|
|
|
2025-03-12 12:04:23 +03:00
|
|
|
import { Loader } from '@/components/loader';
|
|
|
|
import { ModalForm } from '@/components/modal';
|
|
|
|
import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs';
|
2025-01-16 16:31:03 +03:00
|
|
|
import { useDialogsStore } from '@/stores/dialogs';
|
2024-07-29 16:55:48 +03:00
|
|
|
|
2025-02-20 20:22:05 +03:00
|
|
|
import {
|
|
|
|
type IOperationPosition,
|
|
|
|
type IOperationUpdateDTO,
|
|
|
|
OperationType,
|
|
|
|
schemaOperationUpdate
|
|
|
|
} from '../../backend/types';
|
2025-03-12 11:54:32 +03:00
|
|
|
import { useOperationUpdate } from '../../backend/use-operation-update';
|
2025-02-20 20:22:05 +03:00
|
|
|
import { type IOperation, type IOperationSchema } from '../../models/oss';
|
2025-02-12 21:36:03 +03:00
|
|
|
|
2025-03-12 11:54:32 +03:00
|
|
|
import { TabArguments } from './tab-arguments';
|
|
|
|
import { TabOperation } from './tab-operation';
|
|
|
|
import { TabSynthesis } from './tab-synthesis';
|
2024-07-29 16:55:48 +03:00
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
export interface DlgEditOperationProps {
|
2024-07-29 16:55:48 +03:00
|
|
|
oss: IOperationSchema;
|
|
|
|
target: IOperation;
|
2025-02-12 00:14:18 +03:00
|
|
|
positions: IOperationPosition[];
|
2024-07-29 16:55:48 +03:00
|
|
|
}
|
|
|
|
|
2025-03-13 23:20:52 +03:00
|
|
|
enum TabID {
|
2024-07-29 16:55:48 +03:00
|
|
|
CARD = 0,
|
|
|
|
ARGUMENTS = 1,
|
|
|
|
SUBSTITUTION = 2
|
|
|
|
}
|
|
|
|
|
2025-02-19 23:29:45 +03:00
|
|
|
export function DlgEditOperation() {
|
2025-02-12 00:14:18 +03:00
|
|
|
const { oss, target, positions } = useDialogsStore(state => state.props as DlgEditOperationProps);
|
|
|
|
const { operationUpdate } = useOperationUpdate();
|
2024-09-16 13:45:58 +03:00
|
|
|
|
2025-02-12 00:14:18 +03:00
|
|
|
const methods = useForm<IOperationUpdateDTO>({
|
|
|
|
resolver: zodResolver(schemaOperationUpdate),
|
|
|
|
defaultValues: {
|
2025-02-18 23:38:33 +03:00
|
|
|
target: target.id,
|
2025-02-12 00:14:18 +03:00
|
|
|
item_data: {
|
|
|
|
alias: target.alias,
|
2025-02-22 17:25:40 +03:00
|
|
|
title: target.title,
|
2025-02-12 00:14:18 +03:00
|
|
|
comment: target.comment
|
|
|
|
},
|
|
|
|
arguments: target.arguments,
|
|
|
|
substitutions: target.substitutions.map(sub => ({
|
|
|
|
original: sub.original,
|
|
|
|
substitution: sub.substitution
|
|
|
|
})),
|
|
|
|
positions: positions
|
2025-02-18 23:38:33 +03:00
|
|
|
},
|
|
|
|
mode: 'onChange'
|
2025-02-12 00:14:18 +03:00
|
|
|
});
|
|
|
|
const [activeTab, setActiveTab] = useState(TabID.CARD);
|
2024-08-26 17:24:46 +03:00
|
|
|
|
2025-02-12 00:14:18 +03:00
|
|
|
function onSubmit(data: IOperationUpdateDTO) {
|
|
|
|
return operationUpdate({ itemID: oss.id, data });
|
2024-12-13 21:30:49 +03:00
|
|
|
}
|
2024-07-29 16:55:48 +03:00
|
|
|
|
|
|
|
return (
|
2025-02-06 20:27:56 +03:00
|
|
|
<ModalForm
|
2024-07-29 16:55:48 +03:00
|
|
|
header='Редактирование операции'
|
|
|
|
submitText='Сохранить'
|
2025-02-18 23:38:33 +03:00
|
|
|
canSubmit={methods.formState.isValid}
|
2025-02-12 00:14:18 +03:00
|
|
|
onSubmit={event => void methods.handleSubmit(onSubmit)(event)}
|
2025-03-09 21:57:21 +03:00
|
|
|
className='w-160 px-6 h-128'
|
2024-10-29 12:05:23 +03:00
|
|
|
helpTopic={HelpTopic.UI_SUBSTITUTIONS}
|
|
|
|
hideHelpWhen={() => activeTab !== TabID.SUBSTITUTION}
|
2024-07-29 16:55:48 +03:00
|
|
|
>
|
2025-03-11 11:35:22 +03:00
|
|
|
<Tabs selectedTabClassName='clr-selected' className='grid' selectedIndex={activeTab} onSelect={setActiveTab}>
|
|
|
|
<TabList className='mb-3 mx-auto w-fit flex border divide-x rounded-none bg-prim-200'>
|
2025-03-09 21:57:21 +03:00
|
|
|
<TabLabel title='Текстовые поля' label='Карточка' className='w-32' />
|
2024-07-29 16:55:48 +03:00
|
|
|
{target.operation_type === OperationType.SYNTHESIS ? (
|
2025-03-09 21:57:21 +03:00
|
|
|
<TabLabel title='Выбор аргументов операции' label='Аргументы' className='w-32' />
|
2024-07-29 16:55:48 +03:00
|
|
|
) : null}
|
|
|
|
{target.operation_type === OperationType.SYNTHESIS ? (
|
2025-03-09 21:57:21 +03:00
|
|
|
<TabLabel titleHtml='Таблица отождествлений' label='Отождествления' className='w-32' />
|
2024-07-29 16:55:48 +03:00
|
|
|
) : null}
|
|
|
|
</TabList>
|
|
|
|
|
2025-02-12 00:14:18 +03:00
|
|
|
<FormProvider {...methods}>
|
2024-12-13 21:30:49 +03:00
|
|
|
<TabPanel>
|
2025-02-12 00:14:18 +03:00
|
|
|
<TabOperation />
|
2024-12-13 21:30:49 +03:00
|
|
|
</TabPanel>
|
2025-02-12 00:14:18 +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:55:48 +03:00
|
|
|
</Tabs>
|
2025-02-06 20:27:56 +03:00
|
|
|
</ModalForm>
|
2024-07-29 16:55:48 +03:00
|
|
|
);
|
|
|
|
}
|