"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { createPo } from "./actions"; import type { Vessel, Account, Vendor } from "@prisma/client"; import { LineItemsEditor } from "@/components/po/po-line-items-editor"; import { FileUploader } from "@/components/po/file-uploader"; import { uploadAndLinkFiles } from "@/lib/upload-files"; import type { LineItemInput } from "@/lib/validations/po"; import { TC_DEFAULTS, TC_FIXED_LINE, TC_FIXED_LINE_2 } from "@/lib/validations/po"; const INPUT_CLS = "w-full rounded-lg border border-neutral-300 px-3 py-2.5 text-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-500/20"; const EMPTY_LINE: LineItemInput = { name: "", description: "", quantity: 1, unit: "pc", size: "", unitPrice: 0, gstRate: 0.18 }; interface Props { vessels: Vessel[]; accounts: Account[]; vendors: Vendor[]; initialLineItems?: LineItemInput[]; initialVendorId?: string; } export function NewPoForm({ vessels, accounts, vendors, initialLineItems, initialVendorId }: Props) { const router = useRouter(); const [lineItems, setLineItems] = useState( initialLineItems && initialLineItems.length > 0 ? initialLineItems : [EMPTY_LINE] ); const [vendorId, setVendorId] = useState(initialVendorId ?? ""); const [files, setFiles] = useState([]); const [submitting, setSubmitting] = useState<"draft" | "submit" | null>(null); const [error, setError] = useState(""); const [multiAccount, setMultiAccount] = useState(false); const [defaultAccountId, setDefaultAccountId] = useState(""); async function handleSubmit(intent: "draft" | "submit") { setSubmitting(intent); setError(""); const form = document.getElementById("po-form") as HTMLFormElement; const data = new FormData(form); data.set("intent", intent); lineItems.forEach((item, i) => { data.set(`lineItems[${i}].name`, item.name); data.set(`lineItems[${i}].description`, item.description ?? ""); data.set(`lineItems[${i}].quantity`, String(item.quantity)); data.set(`lineItems[${i}].unit`, item.unit); data.set(`lineItems[${i}].size`, item.size ?? ""); data.set(`lineItems[${i}].unitPrice`, String(item.unitPrice)); data.set(`lineItems[${i}].gstRate`, String(item.gstRate ?? 0.18)); if (item.productId) data.set(`lineItems[${i}].productId`, item.productId); if (multiAccount && item.accountId) data.set(`lineItems[${i}].accountId`, item.accountId); }); const result = await createPo(data); if ("error" in result) { setError(result.error); setSubmitting(null); return; } if (files.length > 0) { const uploadErr = await uploadAndLinkFiles(result.id, files); if (uploadErr) { setError(uploadErr.error); setSubmitting(null); return; } } router.push(`/po/${result.id}`); } return (
e.preventDefault()}> {/* Order Information */}

Order Information

{/* Quotation Reference */}

Quotation Reference

{/* Requisition */}

Requisition

{/* Delivery */}

Delivery