diff options
Diffstat (limited to 'lib/docu-list-rule/code-groups')
3 files changed, 54 insertions, 45 deletions
diff --git a/lib/docu-list-rule/code-groups/service.ts b/lib/docu-list-rule/code-groups/service.ts index 34ec5610..2c30cedb 100644 --- a/lib/docu-list-rule/code-groups/service.ts +++ b/lib/docu-list-rule/code-groups/service.ts @@ -6,28 +6,18 @@ import { codeGroups, comboBoxSettings, documentClasses } from "@/db/schema/docu- import { eq, sql, count } from "drizzle-orm" import { unstable_noStore } from "next/cache" -// Code Groups 목록 조회 -export async function getCodeGroups(input: { - page: number - perPage: number - search?: string - sort?: Array<{ id: string; desc: boolean }> - filters?: Array<{ id: string; value: string }> - joinOperator?: "and" | "or" - flags?: string[] - groupId?: string - description?: string - controlType?: string - isActive?: string -} | any) { +// Code Groups 목록 조회 +export async function getCodeGroups(input: any) { unstable_noStore() try { - const { page, perPage, sort, search } = input + const { page, perPage, search, filters, joinOperator } = input const offset = (page - 1) * perPage // 검색 조건 (Document Class 제외) let whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS'` + + // 검색어 필터링 if (search) { const searchTerm = `%${search}%` whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS' AND ( @@ -38,33 +28,50 @@ export async function getCodeGroups(input: { )` } - // 정렬 + // 고급 필터링 (단순화) + if (filters && filters.length > 0) { + const filterConditions = filters.map(filter => { + const { id, value } = filter + if (!value || Array.isArray(value)) return null + + switch (id) { + case "groupId": + return sql`${codeGroups.groupId} ILIKE ${`%${value}%`}` + case "description": + return sql`${codeGroups.description} ILIKE ${`%${value}%`}` + case "codeFormat": + return sql`${codeGroups.codeFormat} ILIKE ${`%${value}%`}` + case "controlType": + return sql`${codeGroups.controlType} = ${value}` + case "isActive": + return sql`${codeGroups.isActive} = ${value === "true"}` + case "createdAt": + return sql`${codeGroups.createdAt}::text ILIKE ${`%${value}%`}` + default: + return null + } + }).filter(Boolean) + + if (filterConditions.length > 0) { + const operator = joinOperator === "or" ? sql` OR ` : sql` AND ` + const combinedFilters = filterConditions.reduce((acc, condition, index) => { + if (index === 0) return condition + return sql`${acc}${operator}${condition}` + }) + + whereConditions = sql`${whereConditions} AND (${combinedFilters})` + } + } + + // 정렬 (안전한 필드 체크 적용) let orderBy = sql`${codeGroups.createdAt} DESC` - if (sort && sort.length > 0) { - const sortField = sort[0] - const direction = sortField.desc ? sql`DESC` : sql`ASC` - - switch (sortField.id) { - case "groupId": - orderBy = sql`${codeGroups.groupId} ${direction}` - break - case "description": - orderBy = sql`${codeGroups.description} ${direction}` - break - case "codeFormat": - orderBy = sql`${codeGroups.codeFormat} ${direction}` - break - case "controlType": - orderBy = sql`${codeGroups.controlType} ${direction}` - break - case "isActive": - orderBy = sql`${codeGroups.isActive} ${direction}` - break - case "createdAt": - orderBy = sql`${codeGroups.createdAt} ${direction}` - break - default: - orderBy = sql`${codeGroups.createdAt} DESC` + if (input.sort && input.sort.length > 0) { + const sortField = input.sort[0] + // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 + if (sortField && sortField.id && typeof sortField.id === "string" && sortField.id in codeGroups) { + const direction = sortField.desc ? sql`DESC` : sql`ASC` + const col = codeGroups[sortField.id as keyof typeof codeGroups] + orderBy = sql`${col} ${direction}` } } diff --git a/lib/docu-list-rule/code-groups/table/code-groups-table-columns.tsx b/lib/docu-list-rule/code-groups/table/code-groups-table-columns.tsx index cb6cdf8b..c15dd676 100644 --- a/lib/docu-list-rule/code-groups/table/code-groups-table-columns.tsx +++ b/lib/docu-list-rule/code-groups/table/code-groups-table-columns.tsx @@ -1,3 +1,4 @@ + "use client" import * as React from "react" diff --git a/lib/docu-list-rule/code-groups/table/code-groups-table.tsx b/lib/docu-list-rule/code-groups/table/code-groups-table.tsx index 6d8bb907..c10d3445 100644 --- a/lib/docu-list-rule/code-groups/table/code-groups-table.tsx +++ b/lib/docu-list-rule/code-groups/table/code-groups-table.tsx @@ -1,5 +1,6 @@ "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"; @@ -8,7 +9,6 @@ import type { DataTableFilterField, DataTableRowAction, } from "@/types/table" -import { getCodeGroups } from "../service"; import { getColumns } from "./code-groups-table-columns"; import { DeleteCodeGroupsDialog } from "./delete-code-groups-dialog"; import { CodeGroupsEditSheet } from "./code-groups-edit-sheet"; @@ -20,14 +20,15 @@ interface CodeGroupsTableProps { } export function CodeGroupsTable({ promises }: CodeGroupsTableProps) { + const router = useRouter(); const [rowAction, setRowAction] = React.useState<DataTableRowAction<typeof codeGroups.$inferSelect> | null>(null); const [{ data, pageCount }] = promises ? React.use(promises) : [{ data: [], pageCount: 0 }]; const refreshData = React.useCallback(async () => { - // 페이지 새로고침으로 처리 - window.location.reload(); - }, []); + // 전체 페이지 새로고침 대신 router.refresh() 사용 (성능 개선) + router.refresh(); + }, [router]); // 컬럼 설정 - 외부 파일에서 가져옴 const columns = React.useMemo( |
