/**
* 採購單商品表格元件
*/
import { Trash2 } from "lucide-react";
import { Button } from "@/Components/ui/button";
import { Input } from "@/Components/ui/input";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/Components/ui/select";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/Components/ui/table";
import type { PurchaseOrderItem, Supplier } from "@/types/purchase-order";
import { formatCurrency } from "@/utils/purchase-order";
interface PurchaseOrderItemsTableProps {
items: PurchaseOrderItem[];
supplier?: Supplier;
isReadOnly?: boolean;
isDisabled?: boolean;
onAddItem?: () => void;
onRemoveItem?: (index: number) => void;
onItemChange?: (index: number, field: keyof PurchaseOrderItem, value: string | number) => void;
}
export function PurchaseOrderItemsTable({
items,
supplier,
isReadOnly = false,
isDisabled = false,
onRemoveItem,
onItemChange,
}: PurchaseOrderItemsTableProps) {
return (
商品名稱
數量
單位
換算基本單位
金額
小計
單價 / 基本單位
{!isReadOnly && }
{items.length === 0 ? (
{isDisabled ? "請先選擇供應商後才能新增商品" : "尚未新增任何商品項"}
) : (
items.map((item, index) => {
// 計算換算後的單價 (基本單位單價)
const convertedUnitPrice = item.selectedUnit === 'large' && item.conversion_rate
? item.unitPrice / item.conversion_rate
: item.unitPrice;
return (
{/* 商品選擇 */}
{isReadOnly ? (
{item.productName}
) : (
)}
{/* 數量 */}
{isReadOnly ? (
{Math.floor(item.quantity)}
) : (
onItemChange?.(index, "quantity", Math.floor(Number(e.target.value)))
}
disabled={isDisabled}
className="h-10 text-left border-gray-200 w-24"
/>
)}
{/* 單位選擇 */}
{!isReadOnly && item.large_unit_id ? (
) : (
{item.selectedUnit === 'large' && item.large_unit_name
? item.large_unit_name
: (item.base_unit_name || "個")}
)}
{/* 換算基本單位 */}
{item.selectedUnit === 'large' && item.conversion_rate
? item.quantity * item.conversion_rate
: item.quantity}
{item.base_unit_name || "個"}
{/* 單價 */}
{isReadOnly ? (
{formatCurrency(item.unitPrice)}
) : (
onItemChange?.(index, "unitPrice", Number(e.target.value))
}
disabled={isDisabled}
className={`h-10 text-left w-32 ${
// 如果有數量但沒有單價,顯示錯誤樣式
item.quantity > 0 && (!item.unitPrice || item.unitPrice <= 0)
? "border-red-400 bg-red-50 focus-visible:ring-red-500"
: "border-gray-200"
}`}
/>
{/* 錯誤提示 (保留必填提示) */}
{item.quantity > 0 && (!item.unitPrice || item.unitPrice <= 0) && (
❌ 請填寫金額
)}
)}
{/* 小計 */}
{formatCurrency(item.subtotal)}
{/* 換算採購單價 / 基本單位 */}
{formatCurrency(convertedUnitPrice)} / {item.base_unit_name || "個"}
{convertedUnitPrice > 0 && item.previousPrice && item.previousPrice > 0 && (
<>
{convertedUnitPrice > item.previousPrice && (
⚠️ 高於上次: {formatCurrency(item.previousPrice)}
)}
{convertedUnitPrice < item.previousPrice && (
📉 低於上次: {formatCurrency(item.previousPrice)}
)}
>
)}
{/* 刪除按鈕 */}
{!isReadOnly && onRemoveItem && (
)}
);
})
)}
);
}