summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/combo-box-settings
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docu-list-rule/combo-box-settings')
-rw-r--r--lib/docu-list-rule/combo-box-settings/service.ts75
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-options-add-dialog.tsx2
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-options-detail-sheet.tsx2
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-options-edit-sheet.tsx2
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-columns.tsx29
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-options-table-toolbar.tsx4
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table-columns.tsx13
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/combo-box-settings-table.tsx25
-rw-r--r--lib/docu-list-rule/combo-box-settings/table/delete-combo-box-options-dialog.tsx2
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