"use client" import * as React from "react" import { useRouter } from "next/navigation" import { useDataTable } from "@/hooks/use-data-table" import { DataTable } from "@/components/data-table/data-table" import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar" import type { DataTableAdvancedFilterField, DataTableRowAction } from "@/types/table" import { getColumns } from "@/lib/docu-list-rule/document-class/table/document-class-table-columns" import { DocumentClassEditSheet } from "@/lib/docu-list-rule/document-class/table/document-class-edit-sheet" import { DocumentClassOptionsDetailSheet } from "@/lib/docu-list-rule/document-class/table/document-class-options-detail-sheet" import { DocumentClassTableToolbarActions } from "@/lib/docu-list-rule/document-class/table/document-class-table-toolbar" import { DeleteDocumentClassDialog } from "@/lib/docu-list-rule/document-class/table/delete-document-class-dialog" import { documentClasses } from "@/db/schema/docu-list-rule" interface DocumentClassTableProps { promises?: Promise<[{ data: typeof documentClasses.$inferSelect[]; pageCount: number }]> } export function DocumentClassTable({ promises }: DocumentClassTableProps) { const router = useRouter() const rawData = React.use(promises!) const [rowAction, setRowAction] = React.useState | null>(null) const [isDetailSheetOpen, setIsDetailSheetOpen] = React.useState(false) const [selectedDocumentClass, setSelectedDocumentClass] = React.useState(null) const refreshData = React.useCallback(() => { // 전체 페이지 새로고침 대신 router.refresh() 사용 (성능 개선) router.refresh() }, [router]) // Detail 버튼 클릭 핸들러 const handleDetail = React.useCallback((documentClass: typeof documentClasses.$inferSelect) => { setSelectedDocumentClass(documentClass) setIsDetailSheetOpen(true) }, []) const columns = React.useMemo(() => getColumns({ setRowAction, onDetail: handleDetail }), [setRowAction, handleDetail]) // 고급 필터 필드 설정 const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "code", label: "코드", type: "text" }, { id: "value", label: "값", type: "text" }, { id: "description", label: "설명", type: "text" }, { id: "createdAt", label: "생성일", type: "date" }, ] const { table } = useDataTable({ data: rawData[0]?.data as typeof documentClasses.$inferSelect[] || [], columns, pageCount: rawData[0]?.pageCount || 0, enablePinning: true, enableAdvancedFilter: true, initialState: { columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => String(originalRow.id), shallow: false, clearOnDefault: true, }) // 컴포넌트 마운트 후 그룹핑 설정 React.useEffect(() => { if (rawData[0]?.data && table.getState().grouping.length === 0) { table.setGrouping(["projectCode"]) } }, [table, rawData]) // 정렬 시 펼쳐진 상태 유지 React.useEffect(() => { const currentExpanded = table.getState().expanded if (Object.keys(currentExpanded).length > 0) { // 약간의 지연 후 현재 펼쳐진 상태를 다시 설정 const timer = setTimeout(() => { table.setExpanded(currentExpanded) }, 100) return () => clearTimeout(timer) } }, [table.getState().sorting, table]) return ( <> {/* Detail 시트 */} { setIsDetailSheetOpen(false) setSelectedDocumentClass(null) }} /> setRowAction(null)} documentClasses={rowAction?.row.original ? [rowAction?.row.original] : []} showTrigger={false} onSuccess={() => { rowAction?.row.toggleSelected(false) refreshData() }} /> setRowAction(null)} data={rowAction?.row.original ?? null} onSuccess={refreshData} /> ) }