ConceptPortal-public/rsconcept/frontend/src/features/library/dialogs/dlg-create-version.tsx

78 lines
2.6 KiB
TypeScript
Raw Normal View History

'use client';
2025-02-12 21:36:25 +03:00
import { Controller, useForm, useWatch } from 'react-hook-form';
2025-02-06 14:10:18 +03:00
import { zodResolver } from '@hookform/resolvers/zod';
2025-03-12 12:04:50 +03:00
import { Checkbox, TextArea, TextInput } from '@/components/input';
import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs';
import { errorMsg } from '@/utils/labels';
import { type ICreateVersionDTO, type IVersionInfo, schemaCreateVersion } from '../backend/types';
import { useCreateVersion } from '../backend/use-create-version';
2025-03-12 11:55:43 +03:00
import { nextVersion } from '../models/library-api';
export interface DlgCreateVersionProps {
2025-02-12 15:13:37 +03:00
itemID: number;
versions: IVersionInfo[];
2025-02-12 15:13:37 +03:00
onCreate: (newVersion: number) => void;
selected: number[];
2024-08-24 12:29:38 +03:00
totalCount: number;
}
2025-02-19 23:30:35 +03:00
export function DlgCreateVersion() {
2025-02-12 15:13:37 +03:00
const { itemID, versions, selected, totalCount, onCreate } = useDialogsStore(
state => state.props as DlgCreateVersionProps
);
const { createVersion: versionCreate } = useCreateVersion();
const {
register,
handleSubmit,
control,
formState: { errors }
} = useForm<ICreateVersionDTO>({
resolver: zodResolver(schemaCreateVersion),
2025-02-06 14:10:18 +03:00
defaultValues: {
2025-02-15 15:37:19 +03:00
version: versions.length > 0 ? nextVersion(versions[versions.length - 1].version) : '1.0.0',
2025-02-06 14:10:18 +03:00
description: '',
items: []
},
mode: 'onChange'
2025-02-06 14:10:18 +03:00
});
const version = useWatch({ control, name: 'version' });
const canSubmit = !!version && !versions.find(ver => ver.version === version);
function onSubmit(data: ICreateVersionDTO) {
return versionCreate({ itemID, data }).then(onCreate);
}
return (
<ModalForm
header='Создание версии'
2025-03-10 16:02:53 +03:00
className='cc-column w-120 py-2 px-6'
canSubmit={canSubmit}
submitInvalidTooltip={errorMsg.versionTaken}
submitText='Создать'
onSubmit={event => void handleSubmit(onSubmit)(event)}
>
<TextInput id='dlg_version' {...register('version')} label='Версия' className='w-64' error={errors.version} />
<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 : [])}
/>
)}
/>
) : null}
</ModalForm>
);
}