"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from "@/components/ui/sheet"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { toast } from "sonner"; import { Loader2, ChevronsUpDown, Check } from "lucide-react"; import getPocketBase from "@/lib/pocketbase"; import { getAllCustomers, getAllCompanies, getAllSuppliers, generateOrderNumber, } from "@/lib/pb-helpers"; import { cn } from "@/lib/utils"; import type { Customer, Company, Supplier, Order, OrderStatus } from "@/lib/types"; interface OrderFormProps { open: boolean; onOpenChange: (open: boolean) => void; order?: Order | null; onSaved: () => void; } export function OrderForm({ open, onOpenChange, order, onSaved }: OrderFormProps) { const [loading, setLoading] = useState(false); const [customers, setCustomers] = useState([]); const [companies, setCompanies] = useState([]); const [suppliers, setSuppliers] = useState([]); const [customerOpen, setCustomerOpen] = useState(false); const [companyOpen, setCompanyOpen] = useState(false); const [form, setForm] = useState({ order_number: "", customer: "", company: "", quote: "", status: "new" as OrderStatus, notes: "", }); useEffect(() => { if (open) { loadDropdowns(); if (order) { setForm({ order_number: order.order_number, customer: order.customer || "", company: order.company, quote: order.quote || "", status: order.status, notes: order.notes || "", }); } else { initNewOrder(); } } }, [open, order]); const loadDropdowns = async () => { try { const [custs, comps, supps] = await Promise.all([ getAllCustomers(), getAllCompanies(), getAllSuppliers(), ]); setCustomers(custs); setCompanies(comps); setSuppliers(supps); } catch { toast.error("Failed to load dropdowns"); } }; const initNewOrder = async () => { try { const orderNum = await generateOrderNumber(); setForm({ order_number: orderNum, customer: "", company: "", quote: "", status: "new", notes: "", }); } catch { toast.error("Failed to generate order number"); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.company) { toast.error("Please select a company"); return; } setLoading(true); try { const pb = getPocketBase(); if (order) { await pb.collection("orders").update(order.id, form); toast.success("Order updated"); } else { await pb.collection("orders").create(form); toast.success("Order created"); } onSaved(); onOpenChange(false); } catch (err: unknown) { const message = err instanceof Error ? err.message : "Failed to save order"; toast.error(message); } finally { setLoading(false); } }; const getCustomerName = (id: string) => customers.find((c) => c.id === id)?.customer || ""; const getCompanyName = (id: string) => companies.find((c) => c.id === id)?.company || ""; return ( {order ? "Edit Order" : "New Order"} {order ? `Editing ${order.order_number}` : "Create a new order"}
{form.customer ? getCustomerName(form.customer) : "Select customer..."} No customer found. {customers.map((c) => ( { setForm({ ...form, customer: c.id }); setCustomerOpen(false); }} > {c.customer} ))}
{form.company ? getCompanyName(form.company) : "Select company..."} No company found. {companies.map((c) => ( { setForm({ ...form, company: c.id }); setCompanyOpen(false); }} > {c.company} ))}
{order && (
)}