import { useEffect } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/Components/ui/dialog"; 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 { useForm } from "@inertiajs/react"; import { toast } from "sonner"; import type { Product, Category } from "@/Pages/Product/Index"; import type { Unit } from "@/Components/Unit/UnitManagerDialog"; interface ProductDialogProps { open: boolean; onOpenChange: (open: boolean) => void; product: Product | null; categories: Category[]; units: Unit[]; onSave?: (product: any) => void; // Legacy prop, can be removed if fully switching to Inertia submit within dialog } export default function ProductDialog({ open, onOpenChange, product, categories, units, }: ProductDialogProps) { const { data, setData, post, put, processing, errors, reset, clearErrors } = useForm({ name: "", category_id: "", brand: "", specification: "", base_unit_id: "", large_unit_id: "", conversion_rate: "", purchase_unit_id: "", }); useEffect(() => { if (open) { clearErrors(); if (product) { setData({ name: product.name, category_id: product.category_id.toString(), brand: product.brand || "", specification: product.specification || "", base_unit_id: product.base_unit_id?.toString() || "", large_unit_id: product.large_unit_id?.toString() || "", conversion_rate: product.conversion_rate ? product.conversion_rate.toString() : "", purchase_unit_id: product.purchase_unit_id?.toString() || "", }); } else { reset(); // Set default category if available if (categories.length > 0) { setData("category_id", categories[0].id.toString()); } } } }, [open, product, categories]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (product) { put(route("products.update", product.id), { onSuccess: () => { toast.success("商品已更新"); onOpenChange(false); reset(); }, onError: () => { toast.error("更新失敗,請檢查輸入資料"); } }); } else { post(route("products.store"), { onSuccess: () => { toast.success("商品已新增"); onOpenChange(false); reset(); }, onError: () => { toast.error("新增失敗,請檢查輸入資料"); } }); } }; return ( {product ? "編輯商品" : "新增商品"} {product ? "修改商品資料" : "建立新的商品資料"}
{/* 基本資訊區塊 */}

基本資訊

{errors.category_id &&

{errors.category_id}

}
setData("name", e.target.value)} placeholder="例:法國麵粉" className={errors.name ? "border-red-500" : ""} /> {errors.name &&

{errors.name}

}
setData("brand", e.target.value)} placeholder="例:鳥越製粉" /> {errors.brand &&

{errors.brand}

}