diff options
Diffstat (limited to 'lib/procurement-rfqs/table/pr-item-dialog.tsx')
| -rw-r--r-- | lib/procurement-rfqs/table/pr-item-dialog.tsx | 258 |
1 files changed, 0 insertions, 258 deletions
diff --git a/lib/procurement-rfqs/table/pr-item-dialog.tsx b/lib/procurement-rfqs/table/pr-item-dialog.tsx deleted file mode 100644 index aada8438..00000000 --- a/lib/procurement-rfqs/table/pr-item-dialog.tsx +++ /dev/null @@ -1,258 +0,0 @@ -"use client"; - -import * as React from "react"; -import { useState, useEffect } from "react"; -import { formatDate } from "@/lib/utils"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogFooter, -} from "@/components/ui/dialog"; -import { Button } from "@/components/ui/button"; -import { Skeleton } from "@/components/ui/skeleton"; -import { Badge } from "@/components/ui/badge"; -import { ProcurementRfqsView } from "@/db/schema"; -import { fetchPrItemsByRfqId } from "../services"; -import { - Table, - TableBody, - TableCaption, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Input } from "@/components/ui/input"; -import { Search } from "lucide-react"; - -// PR 항목 타입 정의 -interface PrItemView { - id: number; - procurementRfqsId: number; - rfqItem: string | null; - prItem: string | null; - prNo: string | null; - itemId: number | null; - materialCode: string | null; - materialCategory: string | null; - acc: string | null; - materialDescription: string | null; - size: string | null; - deliveryDate: Date | null; - quantity: number | null; - uom: string | null; - grossWeight: number | null; - gwUom: string | null; - specNo: string | null; - specUrl: string | null; - trackingNo: string | null; - majorYn: boolean | null; - projectDef: string | null; - projectSc: string | null; - projectKl: string | null; - projectLc: string | null; - projectDl: string | null; - remark: string | null; - rfqCode: string | null; - itemCode: string | null; - itemName: string | null; -} - -interface PrDetailsDialogProps { - open: boolean; - onOpenChange: (open: boolean) => void; - selectedRfq: ProcurementRfqsView | null; -} - -export function PrDetailsDialog({ - open, - onOpenChange, - selectedRfq, -}: PrDetailsDialogProps) { - const [isLoading, setIsLoading] = useState(false); - const [prItems, setPrItems] = useState<PrItemView[]>([]); - const [searchTerm, setSearchTerm] = useState(""); - - // 검색어로 필터링된 항목들 - const filteredItems = React.useMemo(() => { - if (!searchTerm.trim()) return prItems; - - const term = searchTerm.toLowerCase(); - return prItems.filter(item => - (item.materialDescription || "").toLowerCase().includes(term) || - (item.materialCode || "").toLowerCase().includes(term) || - (item.prNo || "").toLowerCase().includes(term) || - (item.prItem || "").toLowerCase().includes(term) || - (item.rfqItem || "").toLowerCase().includes(term) - ); - }, [prItems, searchTerm]); - - // 선택된 RFQ가 변경되면 PR 항목 데이터를 가져옴 - useEffect(() => { - async function loadPrItems() { - if (!selectedRfq || !open) { - setPrItems([]); - return; - } - - try { - setIsLoading(true); - const result = await fetchPrItemsByRfqId(selectedRfq.id); - const mappedItems: PrItemView[] = result.data.map(item => ({ - ...item, - // procurementRfqsId가 null이면 selectedRfq.id 사용 - procurementRfqsId: item.procurementRfqsId ?? selectedRfq.id, - // 기타 필요한 필드에 대한 기본값 처리 - rfqItem: item.rfqItem ?? null, - prItem: item.prItem ?? null, - prNo: item.prNo ?? null, - // 다른 필드도 필요에 따라 추가 - })); - - setPrItems(mappedItems); - } catch (error) { - console.error("PR 항목 로드 오류:", error); - setPrItems([]); - } finally { - setIsLoading(false); - } - } - - if (open) { - loadPrItems(); - setSearchTerm(""); - } - }, [selectedRfq, open]); - - // 선택된 RFQ가 없는 경우 - if (!selectedRfq) { - return null; - } - - return ( - <Dialog open={open} onOpenChange={onOpenChange}> - <DialogContent className="max-w-screen-sm max-h-[90vh] flex flex-col" style={{ maxWidth: "70vw" }}> - <DialogHeader> - <DialogTitle className="text-xl"> - PR 상세 정보 - {selectedRfq.rfqCode} - </DialogTitle> - <DialogDescription> - 프로젝트: {selectedRfq.projectName} ({selectedRfq.projectCode}) | 건수:{" "} - {selectedRfq.prItemsCount || 0}건 - </DialogDescription> - </DialogHeader> - - {isLoading ? ( - <div className="py-4 space-y-3"> - <Skeleton className="h-8 w-full" /> - <Skeleton className="h-24 w-full" /> - <Skeleton className="h-24 w-full" /> - </div> - ) : ( - <div className="flex-1 flex flex-col"> - {/* 검색 필드 */} - <div className="mb-4 relative"> - <div className="absolute inset-y-0 left-0 flex items-center pl-2 pointer-events-none"> - <Search className="h-4 w-4 text-muted-foreground" /> - </div> - <Input - placeholder="PR 번호, 자재 코드, 설명 등 검색..." - value={searchTerm} - onChange={(e) => setSearchTerm(e.target.value)} - className="pl-8" - /> -</div> - {filteredItems.length === 0 ? ( - <div className="flex items-center justify-center py-8 text-muted-foreground border rounded-md"> - {prItems.length === 0 ? "PR 항목이 없습니다" : "검색 결과가 없습니다"} - </div> - ) : ( - <div className="rounded-md border flex-1 overflow-hidden"> - <div className="overflow-x-auto" style={{ width: "100%" }}> - <Table style={{ minWidth: "2500px" }}> - <TableCaption> - 총 {filteredItems.length}개 항목 (전체 {prItems.length}개 중) - </TableCaption> - <TableHeader className="bg-muted/50 sticky top-0"> - <TableRow> - <TableHead className="w-[100px] whitespace-nowrap">RFQ Item</TableHead> - <TableHead className="w-[120px] whitespace-nowrap">PR 번호</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">PR Item</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">자재그룹</TableHead> - <TableHead className="w-[120px] whitespace-nowrap">자재 코드</TableHead> - <TableHead className="w-[120px] whitespace-nowrap">자재 카테고리</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">ACC</TableHead> - <TableHead className="min-w-[200px] whitespace-nowrap">자재 설명</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">규격</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">납품일</TableHead> - <TableHead className="w-[80px] whitespace-nowrap">수량</TableHead> - <TableHead className="w-[80px] whitespace-nowrap">UOM</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">총중량</TableHead> - <TableHead className="w-[80px] whitespace-nowrap">중량 단위</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">사양 번호</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">사양 URL</TableHead> - <TableHead className="w-[120px] whitespace-nowrap">추적 번호</TableHead> - <TableHead className="w-[80px] whitespace-nowrap">주요 항목</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">프로젝트 DEF</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">프로젝트 SC</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">프로젝트 KL</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">프로젝트 LC</TableHead> - <TableHead className="w-[100px] whitespace-nowrap">프로젝트 DL</TableHead> - <TableHead className="w-[150px] whitespace-nowrap">비고</TableHead> - </TableRow> - </TableHeader> - <TableBody> - {filteredItems.map((item) => ( - <TableRow key={item.id}> - <TableCell className="whitespace-nowrap">{item.rfqItem || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.prNo || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.prItem || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.itemCode || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.materialCode || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.materialCategory || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.acc || "-"}</TableCell> - <TableCell>{item.materialDescription || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.size || "-"}</TableCell> - <TableCell className="whitespace-nowrap"> - {item.deliveryDate ? formatDate(item.deliveryDate, "KR") : "-"} - </TableCell> - <TableCell className="whitespace-nowrap">{item.quantity || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.uom || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.grossWeight || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.gwUom || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.specNo || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.specUrl || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.trackingNo || "-"}</TableCell> - <TableCell className="whitespace-nowrap"> - {item.majorYn ? ( - <Badge variant="secondary">주요</Badge> - ) : ( - "아니오" - )} - </TableCell> - <TableCell className="whitespace-nowrap">{item.projectDef || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.projectSc || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.projectKl || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.projectLc || "-"}</TableCell> - <TableCell className="whitespace-nowrap">{item.projectDl || "-"}</TableCell> - <TableCell className="text-sm">{item.remark || "-"}</TableCell> - </TableRow> - ))} - </TableBody> - </Table> - </div> - </div> - )} - </div> - )} - - <DialogFooter className="mt-2"> - <Button onClick={() => onOpenChange(false)}>닫기</Button> - </DialogFooter> - </DialogContent> - </Dialog> - ); -}
\ No newline at end of file |
