Portal/rsconcept/frontend/src/features/library/dialogs/DlgCreateVersion.tsx

73 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-06-07 20:17:03 +03:00
'use client';
2025-02-12 21:36:03 +03:00
import { Controller, useForm, useWatch } from 'react-hook-form';
2025-02-06 14:09:20 +03:00
import { zodResolver } from '@hookform/resolvers/zod';
2024-06-07 20:17:03 +03:00
import clsx from 'clsx';
import { Checkbox, TextArea, TextInput } from '@/components/Input';
import { ModalForm } from '@/components/Modal';
import { useDialogsStore } from '@/stores/dialogs';
import { errorMsg } from '@/utils/labels';
2024-06-07 20:17:03 +03:00
2025-02-18 19:39:54 +03:00
import { IVersionCreateDTO, IVersionInfo, schemaVersionCreate } from '../backend/types';
2025-02-12 15:12:59 +03:00
import { useVersionCreate } from '../backend/useVersionCreate';
import { nextVersion } from '../models/libraryAPI';
export interface DlgCreateVersionProps {
2025-02-12 15:12:59 +03:00
itemID: number;
2024-06-07 20:17:03 +03:00
versions: IVersionInfo[];
2025-02-12 15:12:59 +03:00
onCreate: (newVersion: number) => void;
selected: number[];
2024-08-24 12:29:09 +03:00
totalCount: number;
2024-06-07 20:17:03 +03:00
}
2025-02-19 23:29:45 +03:00
export function DlgCreateVersion() {
2025-02-12 15:12:59 +03:00
const { itemID, versions, selected, totalCount, onCreate } = useDialogsStore(
state => state.props as DlgCreateVersionProps
);
2025-02-06 14:09:20 +03:00
const { versionCreate } = useVersionCreate();
2024-06-07 20:17:03 +03:00
2025-02-06 14:09:20 +03:00
const { register, handleSubmit, control } = useForm<IVersionCreateDTO>({
resolver: zodResolver(schemaVersionCreate),
2025-02-06 14:09:20 +03:00
defaultValues: {
2025-02-15 15:36:32 +03:00
version: versions.length > 0 ? nextVersion(versions[versions.length - 1].version) : '1.0.0',
2025-02-06 14:09:20 +03:00
description: '',
items: []
2025-02-06 14:09:20 +03:00
}
});
const version = useWatch({ control, name: 'version' });
const canSubmit = !versions.find(ver => ver.version === version);
2024-06-07 20:17:03 +03:00
2025-02-06 14:09:20 +03:00
function onSubmit(data: IVersionCreateDTO) {
2025-02-11 20:15:34 +03:00
return versionCreate({ itemID, data }).then(onCreate);
2024-06-07 20:17:03 +03:00
}
return (
2025-02-06 20:27:56 +03:00
<ModalForm
header='Создание версии'
className={clsx('cc-column', 'w-[30rem]', 'py-2 px-6')}
canSubmit={canSubmit}
submitInvalidTooltip={errorMsg.versionTaken}
2025-02-06 20:27:56 +03:00
submitText='Создать'
onSubmit={event => void handleSubmit(onSubmit)(event)}
>
<TextInput id='dlg_version' {...register('version')} dense label='Версия' className='w-[16rem]' />
<TextArea id='dlg_description' {...register('description')} spellCheck label='Описание' rows={3} />
{selected.length > 0 ? (
<Controller
control={control}
name='items'
render={({ field }) => (
<Checkbox
id='dlg_only_selected'
label={`Только выбранные конституенты [${selected.length} из ${totalCount}]`}
value={field.value.length > 0}
onChange={value => field.onChange(value ? selected : [])}
2025-02-06 20:27:56 +03:00
/>
)}
/>
) : null}
</ModalForm>
2024-06-07 20:17:03 +03:00
);
}