"use client" import * as React from "react" import { type DataTableRowAction } from "@/types/table" import { type ColumnDef } from "@tanstack/react-table" import { Ellipsis } from "lucide-react" import { toast } from "sonner" import { getErrorMessage } from "@/lib/handle-error" import { formatDate } from "@/lib/utils" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { DataTableColumnHeader } from "@/components/data-table/data-table-column-header" import { VendorItem, vendors } from "@/db/schema/vendors" import { modifyVendor } from "../service" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { getRFQStatusIcon } from "@/lib/tasks/utils" import { rfqHistoryColumnsConfig } from "@/config/rfqHistoryColumnsConfig" export interface RfqHistoryRow { id: number; rfqCode: string | null; projectCode: string | null; projectName: string | null; description: string | null; dueDate: Date; status: "DRAFT" | "PUBLISHED" | "EVALUATION" | "AWARDED"; vendorStatus: string; totalAmount: number | null; currency: string | null; leadTime: string | null; itemCount: number; tbeResult: string | null; cbeResult: string | null; createdAt: Date; items: { rfqId: number; id: number; itemCode: string; description: string | null; quantity: number | null; uom: string | null; }[]; } interface GetColumnsProps { setRowAction: React.Dispatch | null>>; openItemsModal: (rfqId: number) => void; } /** * tanstack table 컬럼 정의 (중첩 헤더 버전) */ export function getColumns({ setRowAction, openItemsModal }: GetColumnsProps): ColumnDef[] { // ---------------------------------------------------------------- // 1) select 컬럼 (체크박스) // ---------------------------------------------------------------- const selectColumn: ColumnDef = { 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, } // ---------------------------------------------------------------- // 2) actions 컬럼 (Dropdown 메뉴) // ---------------------------------------------------------------- const actionsColumn: ColumnDef = { id: "actions", enableHiding: false, cell: function Cell({ row }) { return ( setRowAction({ row, type: "update" })} > View Details ) }, size: 40, } // ---------------------------------------------------------------- // 3) 일반 컬럼들 // ---------------------------------------------------------------- const basicColumns: ColumnDef[] = rfqHistoryColumnsConfig.map((cfg) => { const column: ColumnDef = { accessorKey: cfg.id, header: ({ column }) => ( ), size: cfg.size, } if (cfg.id === "description") { column.cell = ({ row }) => { const description = row.original.description if (!description) return null return (
{description}
{description}
) } } if (cfg.id === "status") { column.cell = ({ row }) => { const statusVal = row.original.status if (!statusVal) return null const Icon = getRFQStatusIcon(statusVal) return (
) } } if (cfg.id === "totalAmount") { column.cell = ({ row }) => { const amount = row.original.totalAmount const currency = row.original.currency if (!amount || !currency) return null return (
{`${currency} ${amount.toLocaleString()}`}
) } } if (cfg.id === "dueDate" || cfg.id === "createdAt") { column.cell = ({ row }) => (
{formatDate(row.getValue(cfg.id))}
) } return column }) const itemsColumn: ColumnDef = { id: "items", header: "Items", cell: ({ row }) => { const rfq = row.original; const count = rfq.itemCount || 0; return ( ) }, } // ---------------------------------------------------------------- // 4) 최종 컬럼 배열 // ---------------------------------------------------------------- return [ selectColumn, ...basicColumns, itemsColumn, actionsColumn, ] }