'use client'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import * as z from 'zod'; import { Button } from '@/components/ui/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Checkbox } from '@/components/ui/checkbox'; import { toast } from 'sonner'; import { documentNumberingService } from '@/lib/services/document-numbering.service'; import { VoidReplaceDto } from '@/types/dto/numbering.dto'; import { useState } from 'react'; const formSchema = z.object({ documentNumber: z.string().min(3, 'Document Number is required'), reason: z.string().min(5, 'Reason must be at least 5 characters'), replace: z.boolean(), projectId: z.number(), }); type VoidReplaceFormData = z.infer; export function VoidReplaceForm({ projectId = 1 }: { projectId?: number | string }) { const [loading, setLoading] = useState(false); const form = useForm({ resolver: zodResolver(formSchema) as any, // eslint-disable-line @typescript-eslint/no-explicit-any -- zod 4 + @hookform/resolvers compat defaultValues: { documentNumber: '', reason: '', replace: false, projectId: Number(projectId), }, }); async function onSubmit(values: z.infer) { setLoading(true); try { const dto: VoidReplaceDto = { ...values, }; await documentNumberingService.voidAndReplace(dto); toast.success('Number voided successfully. ' + (values.replace ? 'Replacement generated.' : '')); form.reset(); } catch (_error) { toast.error('Failed to void number. Check if it exists.'); } finally { setLoading(false); } } return (

Void & Replace Number

Void a generated number. Useful for skipped numbers or errors.

( Document Number )} /> ( Reason )} /> (
Generate Replacement? If checked, a new number will be reserved immediately.
)} /> ); }