"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, enablePinning: true, enableAdvancedFilter: true, initialState: { columnPinning: { right: ["actions"] }, }, getRowId: (originalRow) => String(originalRow.id), shallow: false, clearOnDefault: true, }) 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} /> ) }