diff options
| author | 0-Zz-ang <s1998319@gmail.com> | 2025-07-29 09:08:52 +0900 |
|---|---|---|
| committer | 0-Zz-ang <s1998319@gmail.com> | 2025-07-29 09:11:22 +0900 |
| commit | 8d92c88ab341156d82156bae49c62a8101280e75 (patch) | |
| tree | 065ed1838de4164da23e3777b5367143e4f13982 /lib/docu-list-rule/combo-box-settings | |
| parent | 75249e6fa46864f49d4eb91bd755171b6b65eaae (diff) | |
(박서영) 설계 Document Numbering Rule 수정
Diffstat (limited to 'lib/docu-list-rule/combo-box-settings')
3 files changed, 57 insertions, 52 deletions
diff --git a/lib/docu-list-rule/combo-box-settings/service.ts b/lib/docu-list-rule/combo-box-settings/service.ts index b603ee71..70046828 100644 --- a/lib/docu-list-rule/combo-box-settings/service.ts +++ b/lib/docu-list-rule/combo-box-settings/service.ts @@ -22,7 +22,7 @@ export async function getComboBoxCodeGroups(input: { unstable_noStore() try { - const { page, perPage, sort, search } = input + const { page, perPage, sort, search, filters, joinOperator } = input const offset = (page - 1) * perPage // Control Type이 combobox인 조건 @@ -38,33 +38,50 @@ export async function getComboBoxCodeGroups(input: { )` } - // 정렬 + // 고급 필터링 + if (filters && filters.length > 0) { + const filterConditions = filters.map(filter => { + const { id, value } = filter + if (!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 (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}` } } @@ -137,30 +154,15 @@ export async function getComboBoxOptions(codeGroupId: number, input?: { )` } - // 정렬 + // 정렬 (안전한 필드 체크 적용) let orderBy = sql`${comboBoxSettings.createdAt} DESC` if (sort && sort.length > 0) { const sortField = sort[0] - const direction = sortField.desc ? sql`DESC` : sql`ASC` - - switch (sortField.id) { - case "code": - orderBy = sql`${comboBoxSettings.code} ${direction}` - break - case "description": - orderBy = sql`${comboBoxSettings.description} ${direction}` - break - case "remark": - orderBy = sql`${comboBoxSettings.remark} ${direction}` - break - case "createdAt": - orderBy = sql`${comboBoxSettings.createdAt} ${direction}` - break - case "updatedAt": - orderBy = sql`${comboBoxSettings.updatedAt} ${direction}` - break - default: - orderBy = sql`${comboBoxSettings.createdAt} DESC` + // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 + if (sortField && sortField.id && typeof sortField.id === "string" && sortField.id in comboBoxSettings) { + const direction = sortField.desc ? sql`DESC` : sql`ASC` + const col = comboBoxSettings[sortField.id as keyof typeof comboBoxSettings] + orderBy = sql`${col} ${direction}` } } diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet.tsx index 1c145c55..0b2a76a4 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet.tsx @@ -88,13 +88,12 @@ export function ComboBoxOptionsDetailSheet({ const result = await getComboBoxOptions(codeGroup.id, { page: 1, perPage: 10, - search: "", - sort: [{ id: "createdAt", desc: true }], - filters: [], + search: table.getState().globalFilter || "", + sort: table.getState().sorting, + filters: table.getState().columnFilters, joinOperator: "and", }) if (result.success && result.data) { - // isActive 필드가 없는 경우 기본값 true로 설정 const optionsWithIsActive = result.data.map(option => ({ ...option, isActive: (option as any).isActive ?? true @@ -126,6 +125,7 @@ export function ComboBoxOptionsDetailSheet({ enableAdvancedFilter: true, manualSorting: true, manualFiltering: true, + manualPagination: true, // 수동 페이징 활성화 initialState: { sorting: [{ id: "createdAt", desc: true }], columnPinning: { right: ["actions"] }, diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table.tsx index 356b2706..f6216363 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table.tsx @@ -1,6 +1,7 @@ "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" @@ -16,13 +17,15 @@ interface ComboBoxSettingsTableProps { } export function ComboBoxSettingsTable({ promises }: ComboBoxSettingsTableProps) { + const router = useRouter() const rawData = React.use(promises!) const [isDetailSheetOpen, setIsDetailSheetOpen] = React.useState(false) const [selectedCodeGroup, setSelectedCodeGroup] = React.useState<typeof codeGroups.$inferSelect | null>(null) const refreshData = React.useCallback(() => { - window.location.reload() - }, []) + // 전체 페이지 새로고침 대신 router.refresh() 사용 (성능 개선) + router.refresh() + }, [router]) // Detail 버튼 클릭 핸들러 const handleDetail = (codeGroup: typeof codeGroups.$inferSelect) => { |
