2024-07-26 00:34:08 +03:00
|
|
|
'use client';
|
|
|
|
|
2025-02-11 12:35:14 +03:00
|
|
|
import { Controller, useFormContext, useWatch } from 'react-hook-form';
|
2024-07-26 00:34:08 +03:00
|
|
|
|
2025-02-10 01:32:55 +03:00
|
|
|
import { MiniButton } from '@/components/Control';
|
2024-07-24 22:23:35 +03:00
|
|
|
import { IconReset } from '@/components/Icons';
|
2025-02-10 01:32:55 +03:00
|
|
|
import { Checkbox, Label, TextArea, TextInput } from '@/components/Input';
|
|
|
|
import { useLibrary } from '@/features/library/backend/useLibrary';
|
|
|
|
import { ILibraryItem, LibraryItemID, LibraryItemType } from '@/features/library/models/library';
|
|
|
|
import { sortItemsForOSS } from '@/features/oss/models/ossAPI';
|
2025-02-12 12:21:19 +03:00
|
|
|
import { PickSchema } from '@/features/rsform/components/PickSchema';
|
2025-02-12 00:14:38 +03:00
|
|
|
import { useDialogsStore } from '@/stores/dialogs';
|
2024-07-21 15:19:57 +03:00
|
|
|
|
2025-02-11 12:35:14 +03:00
|
|
|
import { IOperationCreateDTO } from '../../backend/api';
|
2025-02-12 00:14:38 +03:00
|
|
|
import { DlgCreateOperationProps } from './DlgCreateOperation';
|
2025-02-11 12:35:14 +03:00
|
|
|
|
2025-02-12 00:14:38 +03:00
|
|
|
function TabInputOperation() {
|
|
|
|
const { oss } = useDialogsStore(state => state.props as DlgCreateOperationProps);
|
2025-01-27 15:03:48 +03:00
|
|
|
const { items: libraryItems } = useLibrary();
|
|
|
|
const sortedItems = sortItemsForOSS(oss, libraryItems);
|
2024-12-13 21:31:09 +03:00
|
|
|
|
2025-02-11 12:35:14 +03:00
|
|
|
const {
|
|
|
|
register,
|
|
|
|
control,
|
|
|
|
setValue,
|
|
|
|
formState: { errors }
|
|
|
|
} = useFormContext<IOperationCreateDTO>();
|
|
|
|
const createSchema = useWatch({ control, name: 'create_schema' });
|
|
|
|
|
2024-12-13 21:31:09 +03:00
|
|
|
function baseFilter(item: ILibraryItem) {
|
|
|
|
return !oss.schemas.includes(item.id);
|
|
|
|
}
|
2024-07-26 00:34:08 +03:00
|
|
|
|
2025-02-11 12:35:14 +03:00
|
|
|
function handleChangeCreateSchema(value: boolean) {
|
|
|
|
if (value) {
|
|
|
|
setValue('item_data.result', null);
|
|
|
|
}
|
|
|
|
setValue('create_schema', value);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleSetInput(value: LibraryItemID) {
|
|
|
|
const schema = libraryItems.find(item => item.id === value);
|
|
|
|
if (!schema) {
|
|
|
|
return;
|
2024-07-26 17:31:57 +03:00
|
|
|
}
|
2025-02-11 12:35:14 +03:00
|
|
|
setValue('item_data.result', value);
|
|
|
|
setValue('create_schema', false);
|
|
|
|
setValue('item_data.alias', schema.alias);
|
|
|
|
setValue('item_data.title', schema.title);
|
|
|
|
setValue('item_data.comment', schema.comment);
|
|
|
|
}
|
2024-07-26 17:31:57 +03:00
|
|
|
|
2024-07-21 15:19:57 +03:00
|
|
|
return (
|
2024-12-12 13:19:12 +03:00
|
|
|
<div className='cc-fade-in cc-column'>
|
2024-07-21 15:19:57 +03:00
|
|
|
<TextInput
|
2025-02-11 12:35:14 +03:00
|
|
|
id='operation_title' //
|
2024-07-21 15:19:57 +03:00
|
|
|
label='Полное название'
|
2025-02-11 12:35:14 +03:00
|
|
|
{...register('item_data.title')}
|
|
|
|
error={errors.item_data?.title}
|
2024-07-21 15:19:57 +03:00
|
|
|
/>
|
|
|
|
<div className='flex gap-6'>
|
2024-07-30 16:00:09 +03:00
|
|
|
<TextInput
|
2025-02-11 12:35:14 +03:00
|
|
|
id='operation_alias' //
|
2024-07-30 16:00:09 +03:00
|
|
|
label='Сокращение'
|
2024-08-22 23:24:10 +03:00
|
|
|
className='w-[16rem]'
|
2025-02-11 12:35:14 +03:00
|
|
|
{...register('item_data.alias')}
|
|
|
|
error={errors.item_data?.alias}
|
2024-07-30 16:00:09 +03:00
|
|
|
/>
|
2024-07-21 15:19:57 +03:00
|
|
|
|
|
|
|
<TextArea
|
2025-02-11 12:35:14 +03:00
|
|
|
id='operation_comment' //
|
2024-07-21 15:19:57 +03:00
|
|
|
label='Описание'
|
|
|
|
noResize
|
|
|
|
rows={3}
|
2025-02-11 12:35:14 +03:00
|
|
|
{...register('item_data.comment')}
|
2024-07-24 22:23:35 +03:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
|
2024-07-26 17:31:57 +03:00
|
|
|
<div className='flex justify-between gap-3 items-center'>
|
|
|
|
<div className='flex gap-3'>
|
|
|
|
<Label text='Загружаемая концептуальная схема' />
|
|
|
|
<MiniButton
|
|
|
|
title='Сбросить выбор схемы'
|
|
|
|
noHover
|
|
|
|
noPadding
|
|
|
|
icon={<IconReset size='1.25rem' className='icon-primary' />}
|
2025-02-11 12:35:14 +03:00
|
|
|
onClick={() => setValue('item_data.result', null)}
|
2024-07-26 17:31:57 +03:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<Checkbox
|
2025-02-11 12:35:14 +03:00
|
|
|
value={createSchema} //
|
|
|
|
onChange={handleChangeCreateSchema}
|
2024-07-26 17:31:57 +03:00
|
|
|
label='Создать новую схему'
|
2024-07-21 15:19:57 +03:00
|
|
|
/>
|
|
|
|
</div>
|
2024-07-26 17:31:57 +03:00
|
|
|
{!createSchema ? (
|
2025-02-11 12:35:14 +03:00
|
|
|
<Controller
|
|
|
|
control={control}
|
|
|
|
name='item_data.result'
|
|
|
|
render={({ field }) => (
|
|
|
|
<PickSchema
|
|
|
|
items={sortedItems}
|
|
|
|
value={field.value}
|
|
|
|
itemType={LibraryItemType.RSFORM}
|
|
|
|
onChange={handleSetInput}
|
|
|
|
rows={8}
|
|
|
|
baseFilter={baseFilter}
|
|
|
|
/>
|
|
|
|
)}
|
2024-07-26 17:31:57 +03:00
|
|
|
/>
|
|
|
|
) : null}
|
2024-12-12 13:19:12 +03:00
|
|
|
</div>
|
2024-07-21 15:19:57 +03:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
export default TabInputOperation;
|