"use client"; import React, { useMemo, useState } from "react"; import { useReactTable, getCoreRowModel, flexRender, } from "@tanstack/react-table"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; import { swpDocumentColumns } from "./swp-table-columns"; import { SwpDocumentDetailDialog } from "./swp-document-detail-dialog"; import type { DocumentListItem } from "@/lib/swp/document-service"; interface SwpTableProps { documents: DocumentListItem[]; projNo: string; vendorCode: string; userId: string; } // Status 집계 타입 interface StatusCount { status: string; count: number; } export function SwpTable({ documents, projNo, vendorCode, userId, }: SwpTableProps) { const [dialogOpen, setDialogOpen] = useState(false); const [selectedDocument, setSelectedDocument] = useState(null); const [selectedStatus, setSelectedStatus] = useState(null); // Status 집계 const statusCounts = useMemo(() => { const statusMap = new Map(); documents.forEach((doc) => { const status = doc.LTST_ACTV_STAT || "UNKNOWN"; statusMap.set(status, (statusMap.get(status) || 0) + 1); }); const counts: StatusCount[] = []; statusMap.forEach((count, status) => { counts.push({ status, count, }); }); // 개수 순으로 정렬 return counts.sort((a, b) => b.count - a.count); }, [documents]); // Status 필터링된 문서 목록 const filteredDocuments = useMemo(() => { if (!selectedStatus) { return documents; } return documents.filter((doc) => doc.LTST_ACTV_STAT === selectedStatus); }, [documents, selectedStatus]); const table = useReactTable({ data: filteredDocuments, columns: swpDocumentColumns, getCoreRowModel: getCoreRowModel(), }); // 문서 클릭 핸들러 - Dialog 열기 const handleDocumentClick = (document: DocumentListItem) => { setSelectedDocument(document); setDialogOpen(true); }; return (
{/* Status 필터 UI */}
{statusCounts.map((statusCount) => ( ))}
{/* 테이블 */}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} ))} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( handleDocumentClick(row.original)} > {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( 데이터 없음 )}
{/* 문서 상세 Dialog */}
); }