"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useQuery, useMutation } from "@tanstack/react-query"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { circulationService } from "@/lib/services/circulation.service"; import { userService } from "@/lib/services/user.service"; import { correspondenceService } from "@/lib/services/correspondence.service"; import { CreateCirculationDto } from "@/types/circulation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Badge } from "@/components/ui/badge"; import { ArrowLeft, Check, ChevronsUpDown, X } from "lucide-react"; import Link from "next/link"; import { toast } from "sonner"; import { cn } from "@/lib/utils"; // Form validation schema const formSchema = z.object({ correspondenceId: z.number({ required_error: "Please select a document" }), subject: z.string().min(1, "Subject is required"), assigneeIds: z.array(z.number()).min(1, "At least one assignee is required"), remarks: z.string().optional(), }); type FormData = z.infer; export default function CreateCirculationPage() { const router = useRouter(); const [assigneeOpen, setAssigneeOpen] = useState(false); const [docOpen, setDocOpen] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { subject: "", assigneeIds: [], remarks: "", }, }); // Fetch users for assignee selection const { data: users = [] } = useQuery({ queryKey: ["users"], queryFn: () => userService.getAll(), }); // Fetch correspondences for document selection const { data: correspondences } = useQuery({ queryKey: ["correspondences-dropdown"], queryFn: () => correspondenceService.getAll({ limit: 100 }), }); const createMutation = useMutation({ mutationFn: (data: CreateCirculationDto) => circulationService.create(data), onSuccess: (result) => { toast.success("Circulation created successfully"); router.push(`/circulation/${result.id}`); }, onError: () => { toast.error("Failed to create circulation"); }, }); const onSubmit = (data: FormData) => { createMutation.mutate(data); }; const selectedAssignees = form.watch("assigneeIds"); const selectedDocId = form.watch("correspondenceId"); const selectedDoc = correspondences?.data?.find( (c: { id: number }) => c.id === selectedDocId ); const toggleAssignee = (userId: number) => { const current = form.getValues("assigneeIds"); if (current.includes(userId)) { form.setValue( "assigneeIds", current.filter((id) => id !== userId) ); } else { form.setValue("assigneeIds", [...current, userId]); } }; return (
{/* Header */}

Create Circulation

Create a new internal document circulation

Circulation Details
{/* Document Selection */} ( Document No document found. {correspondences?.data?.map((doc: { id: number; correspondence_number: string }) => ( { form.setValue("correspondenceId", doc.id); setDocOpen(false); }} > {doc.correspondence_number} ))} )} /> {/* Subject */} ( Subject )} /> {/* Assignees Multi-select */} ( Assignees No user found. {users.map((user: { user_id: number; username: string; first_name?: string; last_name?: string }) => ( toggleAssignee(user.user_id)} > {user.first_name && user.last_name ? `${user.first_name} ${user.last_name}` : user.username} ))} )} /> {/* Remarks */} ( Remarks (Optional)