"use client" import * as React from "react" import { ColumnDef } from "@tanstack/react-table" import { formatDate, formatDateTime } from "@/lib/utils" import { Checkbox } from "@/components/ui/checkbox" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { DataTableRowAction } from "@/types/table" import { Paperclip, Package, FileText, BarChart3 } from "lucide-react" import { Button } from "@/components/ui/button" import { TechSalesRfq } from "./rfq-table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { MoreHorizontal } from "lucide-react" import { Edit } from "lucide-react" interface GetColumnsProps { setRowAction: React.Dispatch | null>>; openAttachmentsSheet: (rfqId: number, attachmentType?: 'RFQ_COMMON' | 'TBE_RESULT' | 'CBE_RESULT') => void; openItemsDialog: (rfq: TechSalesRfq) => void; } export function getColumns({ setRowAction, openAttachmentsSheet, openItemsDialog, }: GetColumnsProps): ColumnDef[] { return [ { id: "select", // Remove the "Select all" checkbox in header since we're doing single-select header: () => Select, cell: ({ row, table }) => ( { // If selecting this row if (value) { // First deselect all rows (to ensure single selection) table.toggleAllRowsSelected(false) // Then select just this row row.toggleSelected(true) // Trigger the same action that was in the "Select" button setRowAction({ row, type: "select" as const }) } else { // Just deselect this row row.toggleSelected(false) } }} aria-label="Select row" className="translate-y-0.5" /> ), enableSorting: false, enableHiding: false, enableResizing: false, size: 40, minSize: 40, maxSize: 40, }, { accessorKey: "status", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("status")}
, meta: { excelHeader: "진행상태" }, enableResizing: true, minSize: 80, size: 100, }, { accessorKey: "rfqCode", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("rfqCode")}
, meta: { excelHeader: "RFQ No." }, enableResizing: true, size: 120, }, { accessorKey: "description", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("description")}
, meta: { excelHeader: "RFQ Title" }, enableResizing: true, size: 200, }, { accessorKey: "remark", header: ({ column }) => ( ), cell: ({ row }) => { const remark = row.getValue("remark") as string | null; return (
{remark ? ( {remark} ) : ( - )}
); }, meta: { excelHeader: "비고" }, enableResizing: true, size: 200, }, { accessorKey: "projNm", header: ({ column }) => ( ), cell: ({ row }) => { const projNm = row.getValue("projNm") as string; return ( ); }, meta: { excelHeader: "프로젝트명" }, enableResizing: true, size: 160, }, { accessorKey: "workTypes", header: ({ column }) => ( ), cell: ({ row }) => { const workTypes = row.getValue("workTypes") as string | null; return (
{workTypes ? ( {workTypes} ) : ( - )}
); }, meta: { excelHeader: "공종" }, enableResizing: true, size: 120, }, // { // accessorKey: "projMsrm", // header: ({ column }) => ( // // ), // cell: ({ row }) =>
{row.getValue("projMsrm")}
, // meta: { // excelHeader: "척수" // }, // enableResizing: true, // minSize: 60, // size: 80, // }, // { // accessorKey: "ptypeNm", // header: ({ column }) => ( // // ), // cell: ({ row }) =>
{row.getValue("ptypeNm")}
, // meta: { // excelHeader: "선종" // }, // enableResizing: true, // size: 120, // }, // { // accessorKey: "quotationCount", // header: ({ column }) => ( // // ), // cell: ({ row }) =>
{row.getValue("quotationCount")}
, // meta: { // excelHeader: "견적수" // }, // enableResizing: true, // size: 80, // }, { accessorKey: "rfqSendDate", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDate(value as Date, "KR") : ""; }, meta: { excelHeader: "최초 전송일" }, enableResizing: true, size: 120, }, { accessorKey: "dueDate", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDate(value as Date, "KR") : ""; }, meta: { excelHeader: "RFQ 마감일" }, enableResizing: true, minSize: 80, size: 120, }, { accessorKey: "createdByName", header: ({ column }) => ( ), cell: ({ row }) =>
{row.getValue("createdByName")}
, meta: { excelHeader: "요청자" }, enableResizing: true, size: 120, }, { accessorKey: "createdAt", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDateTime(value as Date, "KR") : ""; }, meta: { excelHeader: "등록일" }, enableResizing: true, size: 160, }, { accessorKey: "updatedAt", header: ({ column }) => ( ), cell: ({ cell }) => { const value = cell.getValue(); return value ? formatDateTime(value as Date, "KR") : ""; }, meta: { excelHeader: "수정일" }, enableResizing: true, size: 160, }, // 우측 고정 컬럼들 { id: "items", header: ({ column }) => ( ), cell: ({ row }) => { const rfq = row.original const itemCount = rfq.itemCount || 0 const handleClick = () => { openItemsDialog(rfq) } return ( ) }, enableSorting: false, enableResizing: false, size: 80, meta: { excelHeader: "아이템" }, }, { id: "attachments", header: ({ column }) => ( ), cell: ({ row }) => { const rfq = row.original const attachmentCount = rfq.attachmentCount || 0 const handleClick = () => { openAttachmentsSheet(rfq.id, 'RFQ_COMMON') } return ( ) }, enableSorting: false, enableResizing: false, size: 80, meta: { excelHeader: "첨부파일" }, }, { id: "tbe-attachments", header: ({ column }) => ( ), cell: ({ row }) => { const rfq = row.original const hasTbeAttachments = rfq.hasTbeAttachments const handleClick = () => { openAttachmentsSheet(rfq.id, 'TBE_RESULT') } return ( ) }, enableSorting: false, enableResizing: false, size: 80, meta: { excelHeader: "TBE 결과" }, }, { id: "cbe-attachments", header: ({ column }) => ( ), cell: ({ row }) => { const rfq = row.original const hasCbeAttachments = rfq.hasCbeAttachments const handleClick = () => { openAttachmentsSheet(rfq.id, 'CBE_RESULT') } return ( ) }, enableSorting: false, enableResizing: false, size: 80, meta: { excelHeader: "CBE 결과" }, }, // getColumns 함수 내 컬럼 배열 마지막에 추가 { id: "actions", header: ({ column }) => ( ), cell: ({ row }) => { return ( setRowAction({ row, type: "update" })}> 수정하기 setRowAction({ row, type: "delete" })} className="text-destructive focus:text-destructive" > 삭제하기 ) }, enableSorting: false, enableResizing: false, size: 60, } ] }