'use client' import * as React from 'react' import { createColumnHelper } from '@tanstack/react-table' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { CheckCircle, XCircle, Users, Eye, MoreHorizontal, Calendar, User } from 'lucide-react' import { formatDate } from '@/lib/utils' import { biddingStatusLabels, contractTypeLabels } from '@/db/schema' import { PartnersBiddingListItem } from '../detail/service' const columnHelper = createColumnHelper() interface PartnersBiddingListColumnsProps { setRowAction?: (action: { type: string; row: { original: PartnersBiddingListItem } }) => void } export function getPartnersBiddingListColumns({ setRowAction }: PartnersBiddingListColumnsProps = {}) { return [ // 입찰 No. columnHelper.accessor('biddingNumber', { header: '입찰 No.', cell: ({ row }) => { const biddingNumber = row.original.biddingNumber const revision = row.original.revision return (
{biddingNumber}
{revision > 0 && (
Rev.{revision}
)}
) }, }), // 입찰상태 columnHelper.accessor('status', { header: '입찰상태', cell: ({ row }) => { const status = row.original.status return ( {biddingStatusLabels[status] || status} ) }, }), // 상세 (액션 버튼) columnHelper.display({ id: 'actions', header: '상세', cell: ({ row }) => { const handleView = () => { if (setRowAction) { setRowAction({ type: 'view', row: { original: row.original } }) } } return ( ) }, }), // 품목명 columnHelper.accessor('itemName', { header: '품목명', cell: ({ row }) => (
{row.original.itemName}
), }), // 입찰명 columnHelper.accessor('title', { header: '입찰명', cell: ({ row }) => (
{row.original.title}
), }), // 사양설명회 columnHelper.accessor('isAttendingMeeting', { header: '사양설명회', cell: ({ row }) => { const isAttending = row.original.isAttendingMeeting if (isAttending === null) { return
-
} return isAttending ? ( ) : ( ) }, }), // 입찰 참여의사 columnHelper.accessor('invitationStatus', { header: '입찰 참여의사', cell: ({ row }) => { const status = row.original.invitationStatus const statusLabels = { sent: '초대됨', submitted: '참여', declined: '불참', pending: '대기중' } return ( {statusLabels[status as keyof typeof statusLabels] || status} ) }, }), // 계약구분 columnHelper.accessor('contractType', { header: '계약구분', cell: ({ row }) => (
{contractTypeLabels[row.original.contractType] || row.original.contractType}
), }), // 입찰기간 columnHelper.accessor('submissionStartDate', { header: '입찰기간', cell: ({ row }) => { const startDate = row.original.submissionStartDate const endDate = row.original.submissionEndDate if (!startDate || !endDate) { return
-
} return (
{formatDate(startDate, 'KR')}
~
{formatDate(endDate, 'KR')}
) }, }), // 계약기간 columnHelper.accessor('contractPeriod', { header: '계약기간', cell: ({ row }) => (
{row.original.contractPeriod || '-'}
), }), // 참여회신 마감일 columnHelper.accessor('responseDeadline', { header: '참여회신 마감일', cell: ({ row }) => { const deadline = row.original.responseDeadline if (!deadline) { return
-
} return
{formatDate(deadline, 'KR')}
}, }), // 입찰제출일 columnHelper.accessor('submissionDate', { header: '입찰제출일', cell: ({ row }) => { const date = row.original.submissionDate if (!date) { return
-
} return
{formatDate(date, 'KR')}
}, }), // 입찰담당자 columnHelper.accessor('managerName', { header: '입찰담당자', cell: ({ row }) => { const name = row.original.managerName const email = row.original.managerEmail if (!name) { return
-
} return (
{name}
{email && (
{email}
)}
) }, }), // 최종수정일 columnHelper.accessor('updatedAt', { header: '최종수정일', cell: ({ row }) => (
{formatDate(row.original.updatedAt, 'KR')}
), }), // 최종수정자 columnHelper.accessor('updatedBy', { header: '최종수정자', cell: ({ row }) => (
{row.original.updatedBy || '-'}
), }), ] }