import { Wand2 } from "lucide-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 { SearchableSelect } from "@/Components/ui/searchable-select"; import { Switch } from "@/Components/ui/switch"; import { useForm } from "@inertiajs/react"; import { toast } from "sonner"; import type { Category, Product } from "@/Pages/Product/Index"; import type { Unit } from "@/Components/Unit/UnitManagerDialog"; interface ProductFormProps { initialData?: Product | null; categories: Category[]; units: Unit[]; onSubmitsuccess?: () => void; } export default function ProductForm({ initialData, categories, units, }: ProductFormProps) { const isEdit = !!initialData; const urlParams = new URLSearchParams(window.location.search); const from = urlParams.get('from'); const { data, setData, post, put, processing, errors } = useForm({ code: initialData?.code || "", barcode: initialData?.barcode || "", name: initialData?.name || "", category_id: initialData?.categoryId?.toString() || (categories.length > 0 ? categories[0].id.toString() : ""), brand: initialData?.brand || "", specification: initialData?.specification || "", base_unit_id: initialData?.baseUnitId?.toString() || "", large_unit_id: initialData?.largeUnitId?.toString() || "", conversion_rate: initialData?.conversionRate?.toString() || "", purchase_unit_id: initialData?.purchaseUnitId?.toString() || "", location: initialData?.location || "", cost_price: initialData?.cost_price?.toString() || "", price: initialData?.price?.toString() || "", member_price: initialData?.member_price?.toString() || "", wholesale_price: initialData?.wholesale_price?.toString() || "", is_active: initialData?.is_active ?? true, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (isEdit) { put(route("products.update", { product: initialData.id, from }), { onSuccess: () => toast.success("商品已更新"), onError: () => toast.error("更新失敗,請檢查輸入資料"), }); } else { post(route("products.store"), { onSuccess: () => toast.success("商品已建立"), onError: () => toast.error("新增失敗,請檢查輸入資料"), }); } }; const generateRandomBarcode = () => { let result = ""; for (let i = 0; i < 13; i++) { result += Math.floor(Math.random() * 10).toString(); } setData("barcode", result); }; const generateRandomCode = () => { const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; let result = ""; for (let i = 0; i < 8; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } setData("code", result); }; return (
{/* 基本資訊 */}

基本資訊

setData("is_active", checked)} />
setData("category_id", value)} options={categories.map((c) => ({ label: c.name, value: c.id.toString() }))} placeholder="選擇分類" className={errors.category_id ? "border-red-500" : ""} /> {errors.category_id &&

{errors.category_id}

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

{errors.name}

}
setData("code", e.target.value)} placeholder="例:A1 (未填將自動生成)" maxLength={8} className={`flex-1 h-9 ${errors.code ? "border-red-500" : ""}`} />
{errors.code &&

{errors.code}

}
setData("barcode", e.target.value)} placeholder="輸入條碼或自動生成" className={`flex-1 h-9 ${errors.barcode ? "border-red-500" : ""}`} />
{errors.barcode &&

{errors.barcode}

}
setData("brand", e.target.value)} placeholder="例:鳥越製粉" className="h-9" />
setData("location", e.target.value)} placeholder="例:A-1-1" className="h-9" />