"use client"; import React from "react"; import { ColumnDef } from "@tanstack/react-table"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Download, Loader2 } from "lucide-react"; import type { DocumentListItem } from "@/lib/swp/document-service"; import { toast } from "sonner"; export const swpDocumentColumns: ColumnDef[] = [ { accessorKey: "LTST_ACTV_STAT", header: "상태", cell: ({ row }) => { const status = row.original.LTST_ACTV_STAT; if (!status) return "-"; const color = status.includes("Complete") ? "bg-green-100 text-green-800" : status.includes("Progress") ? "bg-blue-100 text-blue-800" : status.includes("Pending") || status.includes("Ready") ? "bg-yellow-100 text-yellow-800" : "bg-gray-100 text-gray-800"; return ( {status} ); }, size: 150, minSize: 150, maxSize: 150, }, { accessorKey: "OWN_DOC_NO", header: "OWN_DOC_NO", cell: ({ row }) => (
{row.original.OWN_DOC_NO || "-"}
), size: 250, minSize: 250, maxSize: 250, }, { accessorKey: "DOC_NO", header: "SHI DOC NO", cell: ({ row }) => (
{row.original.DOC_NO}
), size: 250, minSize: 250, maxSize: 250, }, { accessorKey: "DOC_TITLE", header: "문서제목", cell: ({ row }) => (
{row.original.DOC_TITLE}
), size: 300, minSize: 300, maxSize: 300, }, { accessorKey: "PROJ_NO", header: "프로젝트", cell: ({ row }) => (
{row.original.PROJ_NO}
{row.original.PROJ_NM && (
{row.original.PROJ_NM}
)}
), size: 150, minSize: 150, maxSize: 150, }, { accessorKey: "PKG_NO", header: "패키지", cell: ({ row }) => row.original.PKG_NO || "-", size: 100, minSize: 100, maxSize: 100, }, { accessorKey: "VNDR_CD", header: "업체", cell: ({ row }) => (
{row.original.VNDR_CD && (
{row.original.VNDR_CD}
)} {row.original.CPY_NM && (
{row.original.CPY_NM}
)}
), size: 120, minSize: 120, maxSize: 120, }, { accessorKey: "STAGE", header: "최신 스테이지", cell: ({ row }) => { const stage = row.original.STAGE; if (!stage) return "-"; const color = stage === "IFC" ? "bg-green-100 text-green-800" : stage === "IFA" ? "bg-blue-100 text-blue-800" : "bg-gray-100 text-gray-800"; return ( {stage} ); }, size: 100, minSize: 100, maxSize: 100, }, { accessorKey: "LTST_REV_NO", header: "최신 REV", cell: ({ row }) => row.original.LTST_REV_NO || "-", size: 100, minSize: 100, maxSize: 100, }, { id: "actions", header: "커버페이지 다운로드", cell: function ActionCell({ row }) { const [isDownloading, setIsDownloading] = React.useState(false); const handleDownloadCover = async (e: React.MouseEvent) => { e.stopPropagation(); // 행 클릭 이벤트 방지 const docNumber = row.original.DOC_NO; const projectCode = row.original.PROJ_NO; if (!docNumber || !projectCode) { toast.error("문서 번호 또는 프로젝트 정보가 없습니다."); return; } setIsDownloading(true); try { // 1. 프로젝트 코드로 프로젝트 ID 조회 const projectIdResponse = await fetch( `/api/projects/code-to-id?code=${encodeURIComponent(projectCode)}` ); if (!projectIdResponse.ok) { toast.error("프로젝트 정보를 찾을 수 없습니다."); return; } const { projectId } = await projectIdResponse.json(); // 2. 커버페이지 다운로드 API 호출 const response = await fetch( `/api/projects/${projectId}/cover?docNumber=${encodeURIComponent(docNumber)}` ); if (!response.ok) { const error = await response.json(); throw new Error(error.message || "커버페이지 다운로드 실패"); } // 3. 파일 다운로드 const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `${docNumber}_cover.pdf`; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); toast.success("커버페이지 다운로드가 시작되었습니다."); } catch (error) { console.error("커버페이지 다운로드 오류:", error); toast.error( error instanceof Error ? error.message : "커버페이지 다운로드 중 오류가 발생했습니다." ); } finally { setIsDownloading(false); } }; return ( ); }, size: 180, minSize: 180, maxSize: 180, }, ];