diff options
Diffstat (limited to 'lib/compliance/table/compliance-survey-templates-table.tsx')
| -rw-r--r-- | lib/compliance/table/compliance-survey-templates-table.tsx | 77 |
1 files changed, 34 insertions, 43 deletions
diff --git a/lib/compliance/table/compliance-survey-templates-table.tsx b/lib/compliance/table/compliance-survey-templates-table.tsx index c2e441ec..185474cc 100644 --- a/lib/compliance/table/compliance-survey-templates-table.tsx +++ b/lib/compliance/table/compliance-survey-templates-table.tsx @@ -1,6 +1,7 @@ "use client"; import * as React from "react"; +import { useQueryState } from "nuqs"; 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"; @@ -8,33 +9,56 @@ import type { DataTableAdvancedFilterField, DataTableRowAction, DataTableFilterField, + Filter, } from "@/types/table" import { getColumns } from "./compliance-survey-templates-columns"; import { ComplianceTemplateEditSheet } from "./compliance-template-edit-sheet"; import { DeleteComplianceTemplatesDialog } from "./delete-compliance-templates-dialog"; import { ComplianceSurveyTemplatesToolbarActions } from "./compliance-survey-templates-toolbar"; import { complianceSurveyTemplates } from "@/db/schema/compliance"; -import { getComplianceSurveyTemplatesWithSorting } from "../services"; +import { getFiltersStateParser } from "@/lib/parsers"; interface ComplianceSurveyTemplatesTableProps { promises?: Promise<[{ data: typeof complianceSurveyTemplates.$inferSelect[]; pageCount: number }] >; } export function ComplianceSurveyTemplatesTable({ promises }: ComplianceSurveyTemplatesTableProps) { - // 페이지네이션 모드 데이터 + // 서버에서 받은 데이터 사용 const paginationData = promises ? React.use(promises) : null; - const initialData = paginationData ? paginationData[0].data : []; - const pageCount = paginationData ? paginationData[0].pageCount : 0; - + const [{ data, pageCount }] = paginationData + ? paginationData + : [{ data: [], pageCount: 0 }]; const [rowAction, setRowAction] = React.useState<DataTableRowAction<typeof complianceSurveyTemplates.$inferSelect> | null>(null); - const [data, setData] = React.useState(initialData); - const [currentSorting, setCurrentSorting] = React.useState<{ id: string; desc: boolean }[]>([]); - // 초기 데이터가 변경되면 data 상태 업데이트 + // 기본 필터 설정 (isActive = true) + const defaultFilter: Filter<typeof complianceSurveyTemplates.$inferSelect>[] = React.useMemo(() => [ + { + id: "isActive", + operator: "eq" as const, + value: "true", + type: "select" as const, + rowId: "default-isActive-filter", + } + ], []); + + // URL에서 필터 읽기 + const [filters, setFilters] = useQueryState( + "filters", + getFiltersStateParser<typeof complianceSurveyTemplates.$inferSelect>().withDefault([]).withOptions({ + clearOnDefault: true, + shallow: false, + }) + ); + + // 초기 마운트 시 필터가 없으면 기본 필터 설정 + const hasInitialized = React.useRef(false); React.useEffect(() => { - setData(initialData); - }, [initialData]); + if (!hasInitialized.current && filters.length === 0) { + hasInitialized.current = true; + setFilters(defaultFilter); + } + }, [filters.length, setFilters, defaultFilter]); // 컬럼 설정 - 외부 파일에서 가져옴 const columns = React.useMemo( @@ -84,39 +108,6 @@ export function ComplianceSurveyTemplatesTable({ promises }: ComplianceSurveyTem clearOnDefault: true, }) - // 정렬 상태 변경 감지 - React.useEffect(() => { - const newSorting = table.getState().sorting; - if (JSON.stringify(newSorting) !== JSON.stringify(currentSorting)) { - setCurrentSorting(newSorting); - } - }, [table.getState().sorting, currentSorting]); - - // 정렬이 변경될 때 데이터 다시 로드 - React.useEffect(() => { - const loadData = async () => { - try { - console.log("🔄 정렬 변경으로 데이터 다시 로드:", currentSorting); - - // 정렬 상태가 있으면 정렬된 데이터 가져오기 - if (currentSorting && currentSorting.length > 0) { - const result = await getComplianceSurveyTemplatesWithSorting(currentSorting); - setData(result.data); - } else { - // 기본 정렬로 데이터 가져오기 - const result = await getComplianceSurveyTemplatesWithSorting(); - setData(result.data); - } - } catch (error) { - console.error("데이터 로드 오류:", error); - } - }; - - if (currentSorting.length > 0) { - loadData(); - } - }, [currentSorting]); - return ( <> <DataTable table={table}> |
