// lib/vendor-rfq-response/vendor-tbe-table/vendor-pr-items-dialog.tsx "use client" import * as React from "react" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { ScrollArea } from "@/components/ui/scroll-area" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { formatDate } from "@/lib/utils" import { Download, Package, AlertCircle } from "lucide-react" import { toast } from "sonner" import { exportDataToExcel } from "@/lib/export-to-excel" import { getVendorPrItems } from "../vendor-tbe-service" interface VendorPrItemsDialogProps { open: boolean onOpenChange: (open: boolean) => void rfqId: number | null } interface PrItem { id: number prNo: string prItem: string materialCode: string materialDescription: string size?: string quantity: number uom: string deliveryDate?: string majorYn: boolean specifications?: string remarks?: string } export function VendorPrItemsDialog({ open, onOpenChange, rfqId }: VendorPrItemsDialogProps) { const [prItems, setPrItems] = React.useState([]) const [isLoading, setIsLoading] = React.useState(false) // Load PR items when dialog opens React.useEffect(() => { if (open && rfqId) { loadPrItems() } }, [open, rfqId]) const loadPrItems = async () => { if (!rfqId) return setIsLoading(true) try { const data = await getVendorPrItems(rfqId) setPrItems(data) } catch (error) { console.error("Failed to load PR items:", error) toast.error("Error loading PR items") } finally { setIsLoading(false) } } // Export to Excel const handleExport = async () => { if (prItems.length === 0) { toast.error("No items to export") return } try { // Prepare data for export const exportData = prItems.map(item => ({ "PR No": item.prNo || "-", "PR Item": item.prItem || "-", "Material Code": item.materialCode || "-", "Description": item.materialDescription || "-", "Size": item.size || "-", "Quantity": item.quantity, "Unit": item.uom || "-", "Delivery Date": item.deliveryDate ? formatDate(item.deliveryDate, "KR") : "-", "Major Item": item.majorYn ? "Yes" : "No", "Specifications": item.specifications || "-", "Remarks": item.remarks || "-" })) // Export using new utility await exportDataToExcel(exportData, { filename: `pr-items-${rfqId}`, sheetName: "PR Items", autoFilter: true, freezeHeader: true }) toast.success("Excel file exported successfully") } catch (error) { console.error("Export error:", error) toast.error("Failed to export Excel file") } } // Statistics const statistics = React.useMemo(() => { const totalItems = prItems.length const majorItems = prItems.filter(item => item.majorYn).length const minorItems = totalItems - majorItems return { totalItems, majorItems, minorItems } }, [prItems]) return (
Purchase Request Items RFQ에 포함된 구매 요청 아이템 목록
{/* Statistics */}
Total: {statistics.totalItems} Major: {statistics.majorItems} Minor: {statistics.minorItems}
{/* PR Items Table */} {isLoading ? (
Loading PR items...
) : prItems.length === 0 ? (
No PR items available
) : ( PR No Item Material Code Description Size Qty Unit Delivery Major {prItems.map((item) => ( {item.prNo || "-"} {item.prItem || "-"} {item.materialCode || "-"}

{item.materialDescription || "-"}

{item.remarks && (

{item.remarks}

)}
{item.size || "-"} {item.quantity.toLocaleString()} {item.uom || "-"} {item.deliveryDate ? ( {formatDate(item.deliveryDate, "KR")} ) : ( - )} {item.majorYn ? ( Major ) : ( Minor )}
))}
)} {/* Footer Note */}

Note: Major items은 기술 평가의 주요 대상이며, 모든 기술 요구사항을 충족해야 합니다. 각 아이템의 세부 사양은 RFQ 문서를 참조해주세요.

) }