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

70 lines
2.1 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 } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
2024-06-07 20:17:03 +03:00
import { ModalForm } from '@/components/Modal';
import { useDialogsStore } from '@/stores/dialogs';
2024-06-07 20:17:03 +03:00
import { limits } from '@/utils/constants';
import { errorMsg } from '@/utils/labels';
2024-06-07 20:17:03 +03:00
2025-03-11 22:24:51 +03:00
import { PickLocation } from '../components/PickLocation';
import { validateLocation } from '../models/libraryAPI';
const schemaLocation = z.strictObject({
location: z.string().refine(data => validateLocation(data), { message: errorMsg.invalidLocation })
});
type ILocationType = z.infer<typeof schemaLocation>;
export interface DlgChangeLocationProps {
2024-06-07 20:17:03 +03:00
initial: string;
onChangeLocation: (newLocation: string) => void;
}
2025-02-19 23:29:45 +03:00
export function DlgChangeLocation() {
const { initial, onChangeLocation } = useDialogsStore(state => state.props as DlgChangeLocationProps);
2024-06-07 20:17:03 +03:00
const {
handleSubmit,
control,
formState: { errors, isValid, isDirty }
} = useForm<ILocationType>({
resolver: zodResolver(schemaLocation),
defaultValues: {
location: initial
},
mode: 'onChange'
});
2024-06-26 18:59:49 +03:00
function onSubmit(data: ILocationType) {
onChangeLocation(data.location);
2025-02-06 14:09:20 +03:00
}
2024-06-07 20:17:03 +03:00
return (
2025-02-06 20:27:56 +03:00
<ModalForm
2024-06-07 20:17:03 +03:00
overflowVisible
header='Изменение расположения'
submitText='Переместить'
submitInvalidTooltip={`Допустимы буквы, цифры, подчерк, пробел и "!". Сегмент пути не может начинаться и заканчиваться пробелом. Общая длина (с корнем) не должна превышать ${limits.location_len}`}
canSubmit={isValid && isDirty}
onSubmit={event => void handleSubmit(onSubmit)(event)}
2025-03-11 22:24:51 +03:00
className='w-130 pb-3 px-6 h-36'
2024-06-07 20:17:03 +03:00
>
<Controller
2025-03-10 16:01:40 +03:00
control={control}
name='location'
render={({ field }) => (
2025-03-11 22:24:51 +03:00
<PickLocation
dropdownHeight='h-38' //
value={field.value}
onChange={field.onChange}
error={errors.location}
/>
)}
/>
2025-02-06 20:27:56 +03:00
</ModalForm>
2024-06-07 20:17:03 +03:00
);
}