diff --git a/backend-node/src/controllers/tableCategoryValueController.ts b/backend-node/src/controllers/tableCategoryValueController.ts index 49fe6e72..cff7ccfa 100644 --- a/backend-node/src/controllers/tableCategoryValueController.ts +++ b/backend-node/src/controllers/tableCategoryValueController.ts @@ -116,12 +116,7 @@ export const addCategoryValue = async (req: AuthenticatedRequest, res: Response) const userId = req.user!.userId; const { menuObjid, ...value } = req.body; - if (!menuObjid) { - return res.status(400).json({ - success: false, - message: "menuObjid는 필수입니다", - }); - } + // menuObjid는 선택사항 — 옵션설정 등 전역 관리 화면에서는 없을 수 있음 logger.info("카테고리 값 추가 요청", { tableName: value.tableName, @@ -134,7 +129,7 @@ export const addCategoryValue = async (req: AuthenticatedRequest, res: Response) value, companyCode, userId, - Number(menuObjid) // ← menuObjid 전달 + menuObjid ? Number(menuObjid) : null ); return res.status(201).json({ diff --git a/backend-node/src/services/tableCategoryValueService.ts b/backend-node/src/services/tableCategoryValueService.ts index 6fc07d39..16bc75a2 100644 --- a/backend-node/src/services/tableCategoryValueService.ts +++ b/backend-node/src/services/tableCategoryValueService.ts @@ -269,7 +269,7 @@ class TableCategoryValueService { value: TableCategoryValue, companyCode: string, userId: string, - menuObjid: number + menuObjid: number | null ): Promise { const pool = getPool(); @@ -286,29 +286,35 @@ class TableCategoryValueService { let duplicateQuery: string; let duplicateParams: any[]; + const menuCondition = menuObjid + ? "AND menu_objid = $4" + : "AND menu_objid IS NULL"; + const baseParams = menuObjid + ? [value.tableName, value.columnName, value.valueCode, menuObjid] + : [value.tableName, value.columnName, value.valueCode]; + if (companyCode === "*") { - // 최고 관리자: 모든 회사에서 중복 체크 duplicateQuery = ` - SELECT value_id + SELECT value_id FROM category_values WHERE table_name = $1 AND column_name = $2 AND value_code = $3 - AND menu_objid = $4 + ${menuCondition} `; - duplicateParams = [value.tableName, value.columnName, value.valueCode, menuObjid]; + duplicateParams = baseParams; } else { - // 일반 회사: 자신의 회사에서만 중복 체크 + const companyIdx = menuObjid ? "$5" : "$4"; duplicateQuery = ` - SELECT value_id + SELECT value_id FROM category_values WHERE table_name = $1 AND column_name = $2 AND value_code = $3 - AND menu_objid = $4 - AND company_code = $5 + ${menuCondition} + AND company_code = ${companyIdx} `; - duplicateParams = [value.tableName, value.columnName, value.valueCode, menuObjid, companyCode]; + duplicateParams = [...baseParams, companyCode]; } const duplicateResult = await pool.query(duplicateQuery, duplicateParams); @@ -352,11 +358,11 @@ class TableCategoryValueService { const insertQuery = ` INSERT INTO category_values ( - table_name, column_name, value_code, value_label, value_order, + value_id, table_name, column_name, value_code, value_label, value_order, parent_value_id, depth, description, color, icon, is_active, is_default, company_code, menu_objid, created_by - ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) - RETURNING + ) VALUES ((SELECT COALESCE(MAX(value_id), 0) + 1 FROM category_values), $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) + RETURNING value_id AS "valueId", table_name AS "tableName", column_name AS "columnName", diff --git a/frontend/components/table-category/CategoryColumnList.tsx b/frontend/components/table-category/CategoryColumnList.tsx index 1b1bf0a5..fada949f 100644 --- a/frontend/components/table-category/CategoryColumnList.tsx +++ b/frontend/components/table-category/CategoryColumnList.tsx @@ -372,33 +372,35 @@ export function CategoryColumnList({ } return ( -
-
+
+

카테고리 컬럼

관리할 카테고리 컬럼을 선택하세요

-
- - setSearchQuery(e.target.value)} - className="h-8 pl-8 pr-8 text-xs" - /> - {searchQuery && ( - - )} +
+
+ + setSearchQuery(e.target.value)} + className="h-8 pl-8 pr-8 text-xs" + /> + {searchQuery && ( + + )} +
-
+
{filteredColumns.length === 0 && searchQuery ? (
'{searchQuery}'에 대한 검색 결과가 없습니다 diff --git a/frontend/components/table-category/CategoryValueManager.tsx b/frontend/components/table-category/CategoryValueManager.tsx index 75ddbce8..cdfdd3d5 100644 --- a/frontend/components/table-category/CategoryValueManager.tsx +++ b/frontend/components/table-category/CategoryValueManager.tsx @@ -106,22 +106,13 @@ export const CategoryValueManager: React.FC = ({ const handleAddValue = async (newValue: TableCategoryValue) => { try { - if (!menuObjid) { - toast({ - title: "오류", - description: "메뉴 정보가 없습니다. 카테고리 값을 추가할 수 없습니다.", - variant: "destructive", - }); - return; - } - const response = await addCategoryValue( { ...newValue, tableName, columnName, }, - menuObjid + menuObjid || 0 ); if (response.success && response.data) { diff --git a/frontend/lib/api/tableCategoryValue.ts b/frontend/lib/api/tableCategoryValue.ts index 253e66d0..b2da31ff 100644 --- a/frontend/lib/api/tableCategoryValue.ts +++ b/frontend/lib/api/tableCategoryValue.ts @@ -80,7 +80,7 @@ export async function getCategoryValues( */ export async function addCategoryValue( value: TableCategoryValue, - menuObjid: number + menuObjid?: number ) { try { const response = await apiClient.post<{ @@ -88,7 +88,7 @@ export async function addCategoryValue( data: TableCategoryValue; }>("/table-categories/values", { ...value, - menuObjid, // ← menuObjid 포함 + menuObjid: menuObjid || undefined, }); return response.data; } catch (error: any) {