// lib/tbe-last/table/tbe-last-table-columns.tsx "use client" import * as React from "react" import { type ColumnDef } from "@tanstack/react-table" import { FileText, MessageSquare, Package, ListChecks } from "lucide-react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { formatDate } from "@/lib/utils" import { TbeLastView } from "@/db/schema/tbeLastView" interface GetColumnsProps { onOpenSessionDetail: (sessionId: number) => void; onOpenDocuments: (sessionId: number) => void; onOpenPrItems: (rfqId: number) => void; onOpenEvaluation: (session: TbeLastView) => void; } export function getColumns({ onOpenSessionDetail, onOpenDocuments, onOpenPrItems, onOpenEvaluation, }: GetColumnsProps): ColumnDef[] { const columns: ColumnDef[] = [ // Select Column { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" className="translate-y-0.5" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" className="translate-y-0.5" /> ), size: 40, enableSorting: false, enableHiding: false, }, // TBE Session Code { accessorKey: "sessionCode", header: ({ column }) => ( ), cell: ({ row }) => { const sessionId = row.original.tbeSessionId; const sessionCode = row.original.sessionCode; return ( ); }, size: 120, }, // RFQ Info Group { id: "rfqInfo", header: "RFQ Information", columns: [ { accessorKey: "rfqCode", header: ({ column }) => ( ), cell: ({ row }) => row.original.rfqCode, size: 120, }, { accessorKey: "rfqTitle", header: ({ column }) => ( ), cell: ({ row }) => row.original.rfqTitle || "-", size: 200, }, { accessorKey: "rfqDueDate", header: ({ column }) => ( ), cell: ({ row }) => { const date = row.original.rfqDueDate; return date ? formatDate(date, "KR") : "-"; }, size: 100, }, ], }, // Package Info { id: "packageInfo", header: "Package", columns: [ { accessorKey: "packageNo", header: ({ column }) => ( ), cell: ({ row }) => { const packageNo = row.original.packageNo; const packageName = row.original.packageName; if (!packageNo) return "-"; return (
{packageNo} {packageName && ( {packageName} )}
); }, size: 150, }, ], }, // Project Info { accessorKey: "projectCode", header: ({ column }) => ( ), cell: ({ row }) => { const projectCode = row.original.projectCode; const projectName = row.original.projectName; if (!projectCode) return "-"; return (
{projectCode} {projectName && ( {projectName} )}
); }, size: 150, }, // Vendor Info { id: "vendorInfo", header: "Vendor", columns: [ { accessorKey: "vendorCode", header: ({ column }) => ( ), cell: ({ row }) => row.original.vendorCode || "-", size: 100, }, { accessorKey: "vendorName", header: ({ column }) => ( ), cell: ({ row }) => row.original.vendorName, size: 200, }, ], }, // TBE Status { accessorKey: "sessionStatus", header: ({ column }) => ( ), cell: ({ row }) => { const status = row.original.sessionStatus; let variant: "default" | "secondary" | "outline" | "destructive" = "outline"; switch (status) { case "준비중": variant = "outline"; break; case "진행중": variant = "default"; break; case "검토중": variant = "secondary"; break; case "완료": variant = "default"; break; case "보류": variant = "destructive"; break; } return {status}; }, size: 100, }, // Evaluation Result { accessorKey: "evaluationResult", header: ({ column }) => ( ), cell: ({ row }) => { const result = row.original.evaluationResult; const session = row.original; if (!result) { return ( ); } let variant: "default" | "secondary" | "destructive" = "default"; let displayText = result; switch (result) { case "pass": variant = "default"; displayText = "Pass"; break; case "conditional_pass": variant = "secondary"; displayText = "Conditional"; break; case "non_pass": variant = "destructive"; displayText = "Non-Pass"; break; } return ( ); }, size: 120, }, // PR Items { id: "prItems", header: ({ column }) => ( ), cell: ({ row }) => { const rfqId = row.original.rfqId; const totalCount = row.original.prItemsCount; const majorCount = row.original.majorItemsCount; return ( ); }, size: 100, enableSorting: false, }, // Documents { id: "documents", header: ({ column }) => ( ), cell: ({ row }) => { const sessionId = row.original.tbeSessionId; const buyerDocs = row.original.buyerDocumentsCount; const vendorDocs = row.original.vendorDocumentsCount; const reviewedDocs = row.original.reviewedDocumentsCount; const totalDocs = buyerDocs + vendorDocs; return ( ); }, size: 100, enableSorting: false, }, // Comments { id: "comments", header: ({ column }) => ( ), cell: ({ row }) => { const sessionId = row.original.tbeSessionId; const totalComments = row.original.totalCommentsCount; const unresolvedComments = row.original.unresolvedCommentsCount; return ( ); }, size: 80, enableSorting: false, }, ]; return columns; }