diff options
Diffstat (limited to 'lib/docu-list-rule/combo-box-settings')
9 files changed, 119 insertions, 35 deletions
diff --git a/lib/docu-list-rule/combo-box-settings/service.ts b/lib/docu-list-rule/combo-box-settings/service.ts index 80c1942d..96daefe4 100644 --- a/lib/docu-list-rule/combo-box-settings/service.ts +++ b/lib/docu-list-rule/combo-box-settings/service.ts @@ -3,6 +3,7 @@ import { revalidatePath } from "next/cache" import db from "@/db/db" import { codeGroups, comboBoxSettings } from "@/db/schema/docu-list-rule" +import { projects } from "@/db/schema/projects" import { eq, sql, count } from "drizzle-orm" import { unstable_noStore } from "next/cache" @@ -34,7 +35,8 @@ export async function getComboBoxCodeGroups(input: { whereConditions = sql`${whereConditions} AND ( ${codeGroups.groupId} ILIKE ${searchTerm} OR ${codeGroups.description} ILIKE ${searchTerm} OR - ${codeGroups.codeFormat} ILIKE ${searchTerm} + ${codeGroups.codeFormat} ILIKE ${searchTerm} OR + ${projects.code} ILIKE ${searchTerm} )` } @@ -78,14 +80,20 @@ export async function getComboBoxCodeGroups(input: { if (sort && sort.length > 0) { const sortField = sort[0] // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 - if (sortField && sortField.id && typeof sortField.id === "string" && sortField.id in codeGroups) { + if (sortField && sortField.id && typeof sortField.id === "string") { const direction = sortField.desc ? sql`DESC` : sql`ASC` - const col = codeGroups[sortField.id as keyof typeof codeGroups] - orderBy = sql`${col} ${direction}` + + // 프로젝트 코드 정렬 처리 + if (sortField.id === "projectCode") { + orderBy = sql`${projects.code} ${direction}` + } else if (sortField.id in codeGroups) { + const col = codeGroups[sortField.id as keyof typeof codeGroups] + orderBy = sql`${col} ${direction}` + } } } - // 데이터 조회 + // 데이터 조회 (프로젝트 정보 포함) const data = await db .select({ id: codeGroups.id, @@ -97,32 +105,36 @@ export async function getComboBoxCodeGroups(input: { isActive: codeGroups.isActive, createdAt: codeGroups.createdAt, updatedAt: codeGroups.updatedAt, + projectId: codeGroups.projectId, + projectCode: projects.code, + projectName: projects.name, }) .from(codeGroups) + .leftJoin(projects, eq(codeGroups.projectId, projects.id)) .where(whereConditions) .orderBy(orderBy) .limit(perPage) .offset(offset) - // 총 개수 조회 - const [{ count: total }] = await db - .select({ count: count() }) + // 총 개수 조회 (프로젝트 정보 포함) + const totalCountResult = await db + .select({ count: sql<number>`count(*)` }) .from(codeGroups) + .leftJoin(projects, eq(codeGroups.projectId, projects.id)) .where(whereConditions) - const pageCount = Math.ceil(total / perPage) + const totalCount = totalCountResult[0]?.count || 0 return { - success: true, data, - pageCount, + totalCount, + pageCount: Math.ceil(totalCount / perPage), } } catch (error) { console.error("Error fetching combo box code groups:", error) return { - success: false, - error: "Failed to fetch combo box code groups", data: [], + totalCount: 0, pageCount: 0, } } @@ -150,7 +162,8 @@ export async function getComboBoxOptions(codeGroupId: number, input?: { whereConditions = sql`${whereConditions} AND ( ${comboBoxSettings.code} ILIKE ${searchTerm} OR ${comboBoxSettings.description} ILIKE ${searchTerm} OR - ${comboBoxSettings.remark} ILIKE ${searchTerm} + ${comboBoxSettings.remark} ILIKE ${searchTerm} OR + ${projects.code} ILIKE ${searchTerm} )` } @@ -159,14 +172,20 @@ export async function getComboBoxOptions(codeGroupId: number, input?: { if (sort && sort.length > 0) { const sortField = sort[0] // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 - if (sortField && sortField.id && typeof sortField.id === "string" && sortField.id in comboBoxSettings) { + if (sortField && sortField.id && typeof sortField.id === "string") { const direction = sortField.desc ? sql`DESC` : sql`ASC` - const col = comboBoxSettings[sortField.id as keyof typeof comboBoxSettings] - orderBy = sql`${col} ${direction}` + + // 프로젝트 코드 정렬 처리 + if (sortField.id === "projectCode") { + orderBy = sql`${projects.code} ${direction}` + } else if (sortField.id in comboBoxSettings) { + const col = comboBoxSettings[sortField.id as keyof typeof comboBoxSettings] + orderBy = sql`${col} ${direction}` + } } } - // 데이터 조회 + // 데이터 조회 (프로젝트 정보 포함) const data = await db .select({ id: comboBoxSettings.id, @@ -176,32 +195,36 @@ export async function getComboBoxOptions(codeGroupId: number, input?: { remark: comboBoxSettings.remark, createdAt: comboBoxSettings.createdAt, updatedAt: comboBoxSettings.updatedAt, + projectId: comboBoxSettings.projectId, + projectCode: projects.code, + projectName: projects.name, }) .from(comboBoxSettings) + .leftJoin(projects, eq(comboBoxSettings.projectId, projects.id)) .where(whereConditions) .orderBy(orderBy) .limit(perPage) .offset(offset) - // 총 개수 조회 - const [{ count: total }] = await db - .select({ count: count() }) + // 총 개수 조회 (프로젝트 정보 포함) + const totalCountResult = await db + .select({ count: sql<number>`count(*)` }) .from(comboBoxSettings) + .leftJoin(projects, eq(comboBoxSettings.projectId, projects.id)) .where(whereConditions) - const pageCount = Math.ceil(total / perPage) + const totalCount = totalCountResult[0]?.count || 0 return { - success: true, data, - pageCount, + totalCount, + pageCount: Math.ceil(totalCount / perPage), } } catch (error) { console.error("Error fetching combo box options:", error) return { - success: false, - error: "Failed to fetch combo box options", data: [], + totalCount: 0, pageCount: 0, } } diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog.tsx index 049e2c1a..a0535b43 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog.tsx @@ -27,7 +27,7 @@ import { } from "@/components/ui/form" import { Input } from "@/components/ui/input" -import { createComboBoxOption } from "../service" +import { createComboBoxOption } from "@/lib/docu-list-rule/combo-box-settings/service" const createOptionSchema = z.object({ code: z.string().min(1, "코드는 필수입니다."), 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 b62b258e..22806ae8 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 @@ -14,7 +14,7 @@ import { getColumns } from "@/lib/docu-list-rule/combo-box-settings/table/combo- import { ComboBoxOptionsEditSheet } from "@/lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet" import { DeleteComboBoxOptionsDialog } from "@/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog" import { ComboBoxOptionsTableToolbarActions } from "@/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar" -import { codeGroups } from "@/db/schema" +import { codeGroups } from "@/db/schema/docu-list-rule" type ComboBoxOption = { id: number codeGroupId: number diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet.tsx index 4ac539d0..e4504d8c 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet.tsx @@ -25,7 +25,7 @@ import { } from "@/components/ui/form" import { Input } from "@/components/ui/input" -import { updateComboBoxOption } from "../service" +import { updateComboBoxOption } from "@/lib/docu-list-rule/combo-box-settings/service" const updateOptionSchema = z.object({ code: z.string().min(1, "코드는 필수입니다."), diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-columns.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-columns.tsx index 0e46c0ed..17754331 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-columns.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-columns.tsx @@ -28,6 +28,9 @@ interface ComboBoxOption { isActive?: boolean createdAt: Date updatedAt: Date + projectId: number + projectCode: string | null + projectName: string | null } interface GetColumnsProps { @@ -111,6 +114,19 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<ComboBo // ---------------------------------------------------------------- const dataColumns: ColumnDef<ComboBoxOption>[] = [ { + accessorKey: "projectCode", + enableResizing: true, + header: ({ column }) => ( + <DataTableColumnHeaderSimple column={column} title="프로젝트 코드" /> + ), + meta: { + excelHeader: "프로젝트 코드", + type: "text", + }, + cell: ({ row }) => row.getValue("projectCode") ?? "", + minSize: 120 + }, + { accessorKey: "code", enableResizing: true, header: ({ column }) => ( @@ -124,6 +140,19 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<ComboBo minSize: 80 }, { + accessorKey: "description", + enableResizing: true, + header: ({ column }) => ( + <DataTableColumnHeaderSimple column={column} title="description" /> + ), + meta: { + excelHeader: "description", + type: "text", + }, + cell: ({ row }) => row.getValue("description") ?? "", + minSize: 80 + }, + { accessorKey: "remark", enableResizing: true, header: ({ column }) => ( diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar.tsx index 7318efb8..3bb3c95f 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar.tsx @@ -3,8 +3,8 @@ import * as React from "react" import { type Table } from "@tanstack/react-table" -import { ComboBoxOptionsAddDialog } from "./combo-box-options-add-dialog" -import { DeleteComboBoxOptionsDialog } from "./delete-combo-box-options-dialog" +import { ComboBoxOptionsAddDialog } from "@/lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog" +import { DeleteComboBoxOptionsDialog } from "@/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog" interface ComboBoxOption { id: number diff --git a/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns.tsx b/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns.tsx index efce54b4..d41fe5ec 100644 --- a/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns.tsx @@ -92,6 +92,19 @@ export function getColumns({ onDetail }: GetColumnsProps): ColumnDef<typeof code // ---------------------------------------------------------------- const dataColumns: ColumnDef<typeof codeGroups.$inferSelect>[] = [ { + accessorKey: "projectCode", + enableResizing: true, + header: ({ column }) => ( + <DataTableColumnHeaderSimple column={column} title="프로젝트 코드" /> + ), + meta: { + excelHeader: "프로젝트 코드", + type: "text", + }, + cell: ({ row }) => row.getValue("projectCode") ?? "", + minSize: 120 + }, + { accessorKey: "groupId", enableResizing: true, header: ({ column }) => ( 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 42ce1a19..8e469149 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 @@ -5,8 +5,8 @@ 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 } from "@/types/table" -import { getColumns } from "./combo-box-settings-table-columns" -import { ComboBoxOptionsDetailSheet } from "./combo-box-options-detail-sheet" +import { getColumns } from "@/lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns" +import { ComboBoxOptionsDetailSheet } from "@/lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet" import { codeGroups } from "@/db/schema/docu-list-rule" interface ComboBoxSettingsTableProps { @@ -61,11 +61,30 @@ export function ComboBoxSettingsTable({ promises }: ComboBoxSettingsTableProps) }, ], }, - getRowId: (originalRow) => String(originalRow.groupId), + getRowId: (originalRow) => String(originalRow.id), shallow: false, clearOnDefault: true, }) + // 컴포넌트 마운트 후 그룹핑 설정 + React.useEffect(() => { + if (rawData[0]?.data && table.getState().grouping.length === 0) { + table.setGrouping(["projectCode"]) + } + }, [table, rawData]) + + // 정렬 시 펼쳐진 상태 유지 + 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 ( <> <DataTable table={table}> diff --git a/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog.tsx b/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog.tsx index e3d8bd23..4d9e2455 100644 --- a/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog.tsx +++ b/lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog.tsx @@ -27,7 +27,7 @@ import { DrawerTrigger, } from "@/components/ui/drawer" -import { deleteComboBoxOption } from "../service" +import { deleteComboBoxOption } from "@/lib/docu-list-rule/combo-box-settings/service" interface ComboBoxOption { id: number |
