diff options
Diffstat (limited to 'lib/swp/table/swp-table.tsx')
| -rw-r--r-- | lib/swp/table/swp-table.tsx | 198 |
1 files changed, 41 insertions, 157 deletions
diff --git a/lib/swp/table/swp-table.tsx b/lib/swp/table/swp-table.tsx index 47c9905a..7918c07e 100644 --- a/lib/swp/table/swp-table.tsx +++ b/lib/swp/table/swp-table.tsx @@ -4,9 +4,7 @@ import React, { useState } from "react"; import { useReactTable, getCoreRowModel, - getExpandedRowModel, flexRender, - ExpandedState, } from "@tanstack/react-table"; import { Table, @@ -17,116 +15,37 @@ import { TableRow, } from "@/components/ui/table"; import { Button } from "@/components/ui/button"; -import { swpDocumentColumns, type RevisionRow, type FileRow } from "./swp-table-columns"; -import { fetchDocumentRevisions, fetchRevisionFiles, type SwpDocumentWithStats } from "../actions"; -import { SwpRevisionListDialog } from "./swp-revision-list-dialog"; +import { ChevronRight } from "lucide-react"; +import { swpDocumentColumns } from "./swp-table-columns"; +import { SwpDocumentDetailDialog } from "./swp-document-detail-dialog"; +import type { DocumentListItem } from "@/lib/swp/document-service"; interface SwpTableProps { - initialData: SwpDocumentWithStats[]; - total: number; - page: number; - pageSize: number; - totalPages: number; - onPageChange: (page: number) => void; + documents: DocumentListItem[]; + projNo: string; + vendorCode: string; + userId: string; } export function SwpTable({ - initialData, - total, - page, - pageSize, - totalPages, - onPageChange, + documents, + projNo, + vendorCode, + userId, }: SwpTableProps) { - const [expanded, setExpanded] = useState<ExpandedState>({}); - const [revisionData, setRevisionData] = useState<Record<string, RevisionRow[]>>({}); - const [fileData, setFileData] = useState<Record<number, FileRow[]>>({}); - const [loadingRevisions, setLoadingRevisions] = useState<Set<string>>(new Set()); - const [loadingFiles, setLoadingFiles] = useState<Set<number>>(new Set()); const [dialogOpen, setDialogOpen] = useState(false); - const [selectedDocument, setSelectedDocument] = useState<SwpDocumentWithStats | null>(null); + const [selectedDocument, setSelectedDocument] = useState<DocumentListItem | null>(null); const table = useReactTable({ - data: initialData, + data: documents, columns: swpDocumentColumns, - state: { - expanded, - }, - onExpandedChange: setExpanded, getCoreRowModel: getCoreRowModel(), - getExpandedRowModel: getExpandedRowModel(), - getRowCanExpand: () => true, // 모든 문서는 확장 가능 }); - // 리비전 로드 - const loadRevisions = async (docNo: string) => { - if (revisionData[docNo]) return; // 이미 로드됨 - - setLoadingRevisions((prev) => { - const newSet = new Set(prev); - newSet.add(docNo); - return newSet; - }); - - try { - const revisions = await fetchDocumentRevisions(docNo); - setRevisionData((prev) => ({ ...prev, [docNo]: revisions })); - } catch (error) { - console.error("리비전 로드 실패:", error); - } finally { - setLoadingRevisions((prev) => { - const next = new Set(prev); - next.delete(docNo); - return next; - }); - } - }; - - // 파일 로드 - const loadFiles = async (revisionId: number) => { - if (fileData[revisionId]) return; // 이미 로드됨 - - setLoadingFiles((prev) => { - const newSet = new Set(prev); - newSet.add(revisionId); - return newSet; - }); - - try { - const files = await fetchRevisionFiles(revisionId); - setFileData((prev) => ({ ...prev, [revisionId]: files })); - } catch (error) { - console.error("파일 로드 실패:", error); - } finally { - setLoadingFiles((prev) => { - const next = new Set(prev); - next.delete(revisionId); - return next; - }); - } - }; - // 문서 클릭 핸들러 - Dialog 열기 - const handleDocumentClick = async (document: SwpDocumentWithStats) => { + const handleDocumentClick = (document: DocumentListItem) => { setSelectedDocument(document); setDialogOpen(true); - - // 리비전 데이터 로드 - if (!revisionData[document.DOC_NO]) { - await loadRevisions(document.DOC_NO); - } - }; - - // 모든 리비전의 파일을 로드 - const loadAllFiles = async (docNo: string) => { - const revisions = revisionData[docNo]; - if (!revisions) return; - - for (const revision of revisions) { - if (!fileData[revision.id]) { - await loadFiles(revision.id); - } - } }; return ( @@ -153,31 +72,28 @@ export function SwpTable({ <TableBody> {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( - <React.Fragment key={row.id}> - {/* 문서 행 */} - <TableRow - data-state={row.getIsSelected() && "selected"} - className="hover:bg-muted/50" - > - {row.getVisibleCells().map((cell) => ( - <TableCell key={cell.id}> - {cell.column.id === "expander" ? ( - <div - onClick={() => handleDocumentClick(row.original)} - className="cursor-pointer" - > - {flexRender( - cell.column.columnDef.cell, - cell.getContext() - )} - </div> - ) : ( - flexRender(cell.column.columnDef.cell, cell.getContext()) - )} - </TableCell> - ))} - </TableRow> - </React.Fragment> + <TableRow + key={row.id} + data-state={row.getIsSelected() && "selected"} + className="hover:bg-muted/50 cursor-pointer" + onClick={() => handleDocumentClick(row.original)} + > + {row.getVisibleCells().map((cell) => ( + <TableCell key={cell.id}> + {cell.column.id === "expander" ? ( + <Button + variant="ghost" + size="sm" + className="h-8 w-8 p-0" + > + <ChevronRight className="h-4 w-4" /> + </Button> + ) : ( + flexRender(cell.column.columnDef.cell, cell.getContext()) + )} + </TableCell> + ))} + </TableRow> )) ) : ( <TableRow> @@ -190,46 +106,14 @@ export function SwpTable({ </Table> </div> - {/* 페이지네이션 */} - <div className="flex items-center justify-between"> - <div className="text-sm text-muted-foreground"> - 총 {total}개 중 {(page - 1) * pageSize + 1}- - {Math.min(page * pageSize, total)}개 표시 - </div> - <div className="flex items-center space-x-2"> - <Button - variant="outline" - size="sm" - onClick={() => onPageChange(page - 1)} - disabled={page === 1} - > - 이전 - </Button> - <div className="text-sm"> - {page} / {totalPages} - </div> - <Button - variant="outline" - size="sm" - onClick={() => onPageChange(page + 1)} - disabled={page === totalPages} - > - 다음 - </Button> - </div> - </div> - {/* 문서 상세 Dialog */} - <SwpRevisionListDialog + <SwpDocumentDetailDialog open={dialogOpen} onOpenChange={setDialogOpen} document={selectedDocument} - revisions={selectedDocument ? revisionData[selectedDocument.DOC_NO] || [] : []} - fileData={fileData} - loadingRevisions={selectedDocument ? loadingRevisions.has(selectedDocument.DOC_NO) : false} - loadingFiles={loadingFiles} - onLoadFiles={loadFiles} - onLoadAllFiles={() => selectedDocument && loadAllFiles(selectedDocument.DOC_NO)} + projNo={projNo} + vendorCode={vendorCode} + userId={userId} /> </div> ); |
