"use client" import { ColumnDef } from "@tanstack/react-table" import { Badge } from "@/components/ui/badge" // import { DataTableColumnHeader } from "@/components/data-table/data-table-column-header" import { DataTableRowAction } from "@/types/table" import { Ellipsis } from "lucide-react" import { formatDate } from "@/lib/utils" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Button } from "@/components/ui/button" import React, { useMemo, useState } from "react" import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" import { Checkbox } from "@/components/ui/checkbox" import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet" import { DatePicker } from "@/components/ui/date-picker" import { toast } from "sonner" export interface PQList { id: number name: string type: "GENERAL" | "PROJECT" | "NON_INSPECTION" projectId?: number | null projectCode?: string | null projectName?: string | null isDeleted: boolean validTo?: Date | null createdBy?: string | null // 이제 사용자 이름(users.name) createdAt: Date updatedAt: Date updatedBy?: string | null criteriaCount?: number } const typeLabels = { GENERAL: "일반 PQ", PROJECT: "프로젝트 PQ", NON_INSPECTION: "미실사 PQ" } const typeColors = { GENERAL: "bg-blue-100 text-blue-800", PROJECT: "bg-green-100 text-green-800", NON_INSPECTION: "bg-orange-100 text-orange-800" } interface GetColumnsProps { setRowAction: React.Dispatch | null>> } // 유효일 수정 시트 컴포넌트 interface EditValidToSheetProps { pqList: PQList | null open: boolean onOpenChange: (open: boolean) => void onUpdate: (pqListId: number, newValidTo: Date | null) => Promise } export function EditValidToSheet({ pqList, open, onOpenChange, onUpdate }: EditValidToSheetProps) { const [newValidTo, setNewValidTo] = useState(pqList?.validTo || null) const [isLoading, setIsLoading] = useState(false) const handleSave = async () => { if (!pqList) return setIsLoading(true) try { await onUpdate(pqList.id, newValidTo) onOpenChange(false) } catch (error) { console.error("유효일 수정 실패:", error) } finally { setIsLoading(false) } } return ( 유효일 수정 {pqList && ( <> {pqList.name}의 유효일을 수정합니다. )}
{pqList?.validTo ? formatDate(pqList.validTo, "ko-KR") : "설정되지 않음"}
setNewValidTo(date ?? null)} placeholder="새 유효일을 선택하세요" minDate={new Date()} />
) } export function createPQListsColumns({ setRowAction }: GetColumnsProps): ColumnDef[] { return [ { id: "select", header: () => null, // 단일 선택에서는 전체 선택 체크박스 제거 cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" className="translate-y-0.5" /> ), size:40, enableSorting: false, enableHiding: false, }, { accessorKey: "name", header: ({ column }) => ( ), cell: ({ row }) => (
{row.getValue("name")}
), }, { accessorKey: "type", header: ({ column }) => ( ), cell: ({ row }) => { const type = row.getValue("type") as keyof typeof typeLabels return ( {typeLabels[type]} ) }, filterFn: (row, id, value) => { return value.includes(row.getValue(id)) }, }, { accessorKey: "projectCode", header: "프로젝트", cell: ({ row }) => row.original.projectCode ?? "-", }, { accessorKey: "projectName", header: "프로젝트명", cell: ({ row }) => row.original.projectName ?? "-", }, { accessorKey: "validTo", header: ({ column }) => ( ), cell: ({ row }) => { const validTo = row.getValue("validTo") as Date | null const dateInfo = useMemo(() => { if (!validTo) return { formattedDate: "-", isExpired: false } const now = new Date() const isExpired = validTo < now const formattedDate = formatDate(validTo, "ko-KR") return { formattedDate, isExpired } }, [validTo]) return (
{dateInfo.formattedDate} {dateInfo.isExpired && ( 만료 )}
) }, }, { accessorKey: "isDeleted", header: "상태", cell: ({ row }) => { const isDeleted = row.getValue("isDeleted") as boolean; return ( {isDeleted ? "비활성" : "활성"} ); }, }, { accessorKey: "createdBy", header: "생성자", cell: ({ row }) => row.original.createdBy ?? "-", }, { accessorKey: "updatedBy", header: "변경자", cell: ({ row }) => row.original.updatedBy ?? "-", }, { accessorKey: "createdAt", header: ({ column }) => ( ), cell: ({ row }) => { const createdAt = row.getValue("createdAt") as Date return useMemo(() => formatDate(createdAt, "ko-KR"), [createdAt]) }, }, { accessorKey: "updatedAt", header: ({ column }) => ( ), cell: ({ row }) => { const updatedAt = row.getValue("updatedAt") as Date return useMemo(() => formatDate(updatedAt, "ko-KR"), [updatedAt]) }, }, { id: "actions", cell: ({ row }) => ( setRowAction({ row, type: "view" })} > 상세보기 setRowAction({ row, type: "editValidTo" })} > 유효일 수정 {/* setRowAction({ row, type: "delete" })} className="text-destructive" > 삭제 ⌘⌫ */} ), size: 40, enableSorting: false, enableHiding: false, } ] }