From 755bbc0c58e734d53e8e2f70c95208e9b775c122 Mon Sep 17 00:00:00 2001 From: kjs Date: Tue, 23 Dec 2025 17:32:27 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B5=EC=82=AC=20=EC=A7=84=EC=A7=9C?= =?UTF-8?q?=EC=A7=84=EC=A7=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-node/src/services/menuCopyService.ts | 79 ++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/backend-node/src/services/menuCopyService.ts b/backend-node/src/services/menuCopyService.ts index 6992baec..075a8229 100644 --- a/backend-node/src/services/menuCopyService.ts +++ b/backend-node/src/services/menuCopyService.ts @@ -279,11 +279,90 @@ export class MenuCopyService { logger.debug(` 📐 분할 패널 우측 화면 참조 발견: ${numId}`); } } + + // 5) 모달 화면 ID (addModalScreenId, editModalScreenId, modalScreenId) + if (props?.componentConfig?.addModalScreenId) { + const addModalScreenId = props.componentConfig.addModalScreenId; + const numId = + typeof addModalScreenId === "number" + ? addModalScreenId + : parseInt(addModalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` 📋 추가 모달 화면 참조 발견: ${numId}`); + } + } + + if (props?.componentConfig?.editModalScreenId) { + const editModalScreenId = props.componentConfig.editModalScreenId; + const numId = + typeof editModalScreenId === "number" + ? editModalScreenId + : parseInt(editModalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` 📝 수정 모달 화면 참조 발견: ${numId}`); + } + } + + if (props?.componentConfig?.modalScreenId) { + const modalScreenId = props.componentConfig.modalScreenId; + const numId = + typeof modalScreenId === "number" + ? modalScreenId + : parseInt(modalScreenId); + if (!isNaN(numId) && numId > 0) { + referenced.push(numId); + logger.debug(` 🔲 모달 화면 참조 발견: ${numId}`); + } + } + + // 6) 재귀적으로 모든 properties에서 화면 ID 추출 (깊은 탐색) + this.extractScreenIdsFromObject(props, referenced); } return referenced; } + /** + * 객체 내부에서 화면 ID를 재귀적으로 추출 + */ + private extractScreenIdsFromObject(obj: any, referenced: number[]): void { + if (!obj || typeof obj !== "object") return; + + if (Array.isArray(obj)) { + for (const item of obj) { + this.extractScreenIdsFromObject(item, referenced); + } + return; + } + + for (const key of Object.keys(obj)) { + const value = obj[key]; + + // 화면 ID 키 패턴 확인 + if ( + key === "screenId" || + key === "targetScreenId" || + key === "leftScreenId" || + key === "rightScreenId" || + key === "addModalScreenId" || + key === "editModalScreenId" || + key === "modalScreenId" + ) { + const numId = typeof value === "number" ? value : parseInt(value); + if (!isNaN(numId) && numId > 0 && !referenced.includes(numId)) { + referenced.push(numId); + } + } + + // 재귀 탐색 + if (typeof value === "object" && value !== null) { + this.extractScreenIdsFromObject(value, referenced); + } + } + } + /** * 화면 수집 (중복 제거, 재귀적 참조 추적) */