// simplified-doc-table-columns.tsx "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 { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Ellipsis, Calendar, CalendarClock, User, FileText, Eye, Edit, Trash2, Building, Code, Settings } from "lucide-react" import { cn } from "@/lib/utils" import { SimplifiedDocumentsView } from "@/db/schema" interface GetColumnsProps { setRowAction: React.Dispatch | null>> } // 유틸리티 함수들 const getDrawingKindText = (drawingKind: string) => { switch (drawingKind) { case 'B3': return 'B3 도면' case 'B4': return 'B4 도면' case 'B5': return 'B5 도면' default: return drawingKind } } const getDrawingKindColor = (drawingKind: string) => { switch (drawingKind) { case 'B3': return 'bg-blue-100 text-blue-800' case 'B4': return 'bg-green-100 text-green-800' case 'B5': return 'bg-purple-100 text-purple-800' default: return 'bg-gray-100 text-gray-800' } } // 스테이지별 이름 표시 컴포넌트 const StageNameDisplay = ({ stageName, drawingKind, isFirst = true }: { stageName: string | null, drawingKind: string | null, isFirst?: boolean }) => { if (!stageName) return - const stageType = isFirst ? "1차" : "2차" const getExpectedStage = () => { if (drawingKind === 'B4') return isFirst ? 'Pre' : 'Work' if (drawingKind === 'B3') return isFirst ? 'Approval' : 'Work' if (drawingKind === 'B5') return isFirst ? 'First' : 'Second' return '' } return (
{stageType} 스테이지
{stageName}
{getExpectedStage() && (
({getExpectedStage()})
)}
) } // 날짜 정보 표시 컴포넌트 const StageDateInfo = ({ planDate, actualDate, stageName }: { planDate: string | null actualDate: string | null stageName: string | null }) => { if (!planDate && !actualDate) { return 날짜 미설정 } const isCompleted = !!actualDate const isLate = actualDate && planDate && new Date(actualDate) > new Date(planDate) return (
{planDate && (
계획: {formatDate(planDate)}
)} {actualDate && (
실제: {formatDate(actualDate)}
)} {!actualDate && planDate && (
진행중
)} {isCompleted && (
✓ 완료
)}
) } export function getSimplifiedDocumentColumns({ setRowAction, }: GetColumnsProps): ColumnDef[] { // 기본 컬럼들 const baseColumns: 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, }, // 문서번호 + Drawing Kind { accessorKey: "docNumber", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return (
{doc.docNumber} {doc.vendorDocNumber && ( 벤더: {doc.vendorDocNumber} )} {doc.drawingKind && ( {getDrawingKindText(doc.drawingKind)} )}
) }, size: 140, enableResizing: true, meta: { excelHeader: "문서번호" }, }, // 문서명 + 프로젝트/벤더 정보 { accessorKey: "title", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return (
{doc.title}
{doc.pic && ( PIC: {doc.pic} )} {doc.projectCode && (
{doc.projectCode}
)} {doc.vendorName && (
{doc.vendorName}
)}
) }, size: 200, enableResizing: true, meta: { excelHeader: "문서명" }, }, // 첫 번째 스테이지 정보 { accessorKey: "firstStageName", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return ( ) }, size: 130, enableResizing: true, meta: { excelHeader: "1차 스테이지" }, }, // 첫 번째 스테이지 날짜 { accessorKey: "firstStagePlanDate", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return ( ) }, size: 140, enableResizing: true, meta: { excelHeader: "1차 일정" }, }, // 두 번째 스테이지 정보 { accessorKey: "secondStageName", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return ( ) }, size: 130, enableResizing: true, meta: { excelHeader: "2차 스테이지" }, }, // 두 번째 스테이지 날짜 { accessorKey: "secondStagePlanDate", header: ({ column }) => ( ), cell: ({ row }) => { const doc = row.original return ( ) }, size: 140, enableResizing: true, meta: { excelHeader: "2차 일정" }, }, // 첨부파일 수 { accessorKey: "attachmentCount", header: ({ column }) => ( ), cell: ({ row }) => { const count = row.original.attachmentCount || 0 return (
{count}
) }, size: 80, enableResizing: true, meta: { excelHeader: "첨부파일" }, }, // 업데이트 일시 { accessorKey: "updatedAt", header: ({ column }) => ( ), cell: ({ cell }) => ( {formatDateTime(cell.getValue() as Date)} ), size: 140, enableResizing: true, meta: { excelHeader: "업데이트" }, }, // 액션 버튼 { id: "actions", header: () => Actions, cell: ({ row }) => { const doc = row.original return ( setRowAction({ type: "view", row: doc })} > 보기 setRowAction({ type: "edit", row: doc })} > 편집 setRowAction({ type: "delete", row: doc })} className="text-red-600" > 삭제 ) }, size: 50, enableSorting: false, enableHiding: false, }, ] return baseColumns }