feat: 메뉴 관리에서 화면 할당 해제 기능 추가

## 문제점
- URL 직접 입력 모드에서 빈 값으로 저장 시 menu_url은 비워지지만
- screen_code는 기존 값이 남아있어 화면 할당이 해제되지 않음

## 해결방법

### 백엔드 (adminController.ts)
- updateMenu: menu_url이 비어있으면 screen_code도 null로 자동 설정
- 로직: menuUrl ? screenCode : null

### 프론트엔드 (MenuFormModal.tsx, menu.ts)
- 화면 선택 시 screenCode도 함께 formData에 저장
- URL 타입 변경 시 screenCode 초기화
- MenuFormData 인터페이스에 screenCode 필드 추가

## 동작 방식
1. 화면 할당: menuUrl + screenCode 함께 저장
2. URL 직접 입력: menuUrl만 저장, screenCode는 undefined
3. 빈 값 저장: menuUrl = null, screenCode = null (자동)

이제 메뉴에서 화면 할당을 완전히 해제할 수 있습니다.
This commit is contained in:
kjs 2025-11-13 12:22:33 +09:00
parent 93bf83375e
commit 3ddca95af5
3 changed files with 16 additions and 5 deletions

View File

@ -1274,6 +1274,10 @@ export async function updateMenu(
const companyCode = requestCompanyCode;
// menu_url이 비어있으면 screen_code도 null로 설정
const menuUrl = menuData.menuUrl || null;
const screenCode = menuUrl ? menuData.screenCode || null : null;
// Raw Query를 사용한 메뉴 수정
const [updatedMenu] = await query<any>(
`UPDATE menu_info SET
@ -1288,8 +1292,9 @@ export async function updateMenu(
system_name = $9,
company_code = $10,
lang_key = $11,
lang_key_desc = $12
WHERE objid = $13
lang_key_desc = $12,
screen_code = $13
WHERE objid = $14
RETURNING *`,
[
menuData.menuType ? Number(menuData.menuType) : null,
@ -1297,13 +1302,14 @@ export async function updateMenu(
menuData.menuNameKor,
menuData.menuNameEng || null,
menuData.seq ? Number(menuData.seq) : null,
menuData.menuUrl || null,
menuUrl,
menuData.menuDesc || null,
menuData.status || "active",
menuData.systemName || null,
companyCode,
menuData.langKey || null,
menuData.langKeyDesc || null,
screenCode,
Number(menuId),
]
);

View File

@ -161,6 +161,7 @@ export const MenuFormModal: React.FC<MenuFormModalProps> = ({
setFormData((prev) => ({
...prev,
menuUrl: screenUrl,
screenCode: screen.screenCode, // 화면 코드도 함께 저장
}));
// console.log("🖥️ 화면 선택 완료:", {
@ -207,10 +208,11 @@ export const MenuFormModal: React.FC<MenuFormModalProps> = ({
if (type === "direct") {
// 직접 입력 모드로 변경 시 선택된 화면 초기화
setSelectedScreen(null);
// URL 필드 초기화 (사용자가 직접 입력할 수 있도록)
// URL 필드와 screenCode 초기화 (사용자가 직접 입력할 수 있도록)
setFormData((prev) => ({
...prev,
menuUrl: "",
screenCode: undefined, // 화면 코드도 함께 초기화
}));
} else {
// 화면 할당 모드로 변경 시
@ -230,12 +232,14 @@ export const MenuFormModal: React.FC<MenuFormModalProps> = ({
setFormData((prev) => ({
...prev,
menuUrl: screenUrl,
screenCode: selectedScreen.screenCode, // 화면 코드도 함께 유지
}));
} else {
// 선택된 화면이 없으면 URL 초기화
// 선택된 화면이 없으면 URL과 screenCode 초기화
setFormData((prev) => ({
...prev,
menuUrl: "",
screenCode: undefined,
}));
}
}

View File

@ -53,6 +53,7 @@ export interface MenuFormData {
status: string;
companyCode: string;
langKey?: string; // 다국어 키 추가
screenCode?: string; // 화면 코드 추가
}
export interface LangKey {