"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, DataTableFilterField, DataTableRowAction, } from "@/types/table" import { getColumns } from "@/lib/docu-list-rule/code-groups/table/code-groups-table-columns"; import { DeleteCodeGroupsDialog } from "@/lib/docu-list-rule/code-groups/table/delete-code-groups-dialog"; import { CodeGroupsEditSheet } from "@/lib/docu-list-rule/code-groups/table/code-groups-edit-sheet"; import { CodeGroupsTableToolbarActions } from "@/lib/docu-list-rule/code-groups/table/code-groups-table-toolbar"; import { codeGroups } from "@/db/schema/docu-list-rule"; interface CodeGroupsTableProps { promises?: Promise<[{ data: typeof codeGroups.$inferSelect[]; pageCount: number }] >; } export function CodeGroupsTable({ promises }: CodeGroupsTableProps) { const router = useRouter(); const [rowAction, setRowAction] = React.useState | null>(null); const [{ data, pageCount }] = promises ? React.use(promises) : [{ data: [], pageCount: 0 }]; const refreshData = React.useCallback(async () => { // 전체 페이지 새로고침 대신 router.refresh() 사용 (성능 개선) router.refresh(); }, [router]); // 컬럼 설정 - 외부 파일에서 가져옴 const columns = React.useMemo( () => getColumns({ setRowAction }), [setRowAction] ) // 필터 필드 설정 const filterFields: DataTableFilterField[] = []; // 고급 필터 필드 설정 const advancedFilterFields: DataTableAdvancedFilterField[] = [ { id: "groupId", label: "Group ID", type: "text" }, { id: "description", label: "Description", type: "text" }, { id: "codeFormat", label: "Code Format", type: "text" }, { id: "controlType", label: "Control Type", type: "select", options: [ { label: "Textbox", value: "textbox" }, { label: "Combobox", value: "combobox" }, ] }, { id: "isActive", label: "Status", type: "select", options: [ { label: "Active", value: "true" }, { label: "Inactive", value: "false" }, ] }, { id: "createdAt", label: "Created At", type: "date" }, ]; const { table } = useDataTable({ data, columns, pageCount, filterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { columnPinning: { right: ["actions"] }, expanded: {}, }, getRowId: (originalRow) => String(originalRow.id), shallow: false, clearOnDefault: false, }) // 컴포넌트 마운트 후 그룹핑 설정 React.useEffect(() => { if (data && table.getState().grouping.length === 0) { table.setGrouping(["projectCode"]) } }, [table, data]) // 정렬 시 펼쳐진 상태 유지 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 ( <> setRowAction(null)} codeGroups={rowAction?.row.original ? [rowAction?.row.original] : []} showTrigger={false} onSuccess={() => { rowAction?.row.toggleSelected(false) refreshData() }} /> setRowAction(null)} data={rowAction?.row.original ?? null} onSuccess={refreshData} /> ); }