feat: 메뉴 복사 시 화면명 일괄 변환 기능 추가
새로운 기능: - 화면명에서 특정 텍스트 제거 (예: '탑씰' 제거) - 화면명에 접두사 추가 (예: '한신' 추가) - 변환 로직: 제거 → 접두사 추가 순서로 적용 백엔드: - menuCopyService.copyMenu()에 screenNameConfig 파라미터 추가 - copyScreens()에서 화면명 변환 로직 적용 - 정규식으로 전역 치환 (new RegExp(text, 'g')) 프론트엔드: - MenuCopyDialog에 화면명 일괄 변경 UI 추가 - Checkbox로 기능 활성화/비활성화 - 2개 Input: removeText, addPrefix - API 호출 시 screenNameConfig 전달 사용 예시: 1. '탑씰 회사정보' → '회사정보' (제거만) 2. '회사정보' → '한신 회사정보' (접두사만) 3. '탑씰 회사정보' → '한신 회사정보' (제거 + 접두사) 관련 파일: - backend-node/src/services/menuCopyService.ts - backend-node/src/controllers/adminController.ts - frontend/lib/api/menu.ts - frontend/components/admin/MenuCopyDialog.tsx
This commit is contained in:
@@ -3308,12 +3308,21 @@ export async function copyMenu(
|
||||
return;
|
||||
}
|
||||
|
||||
// 화면명 변환 설정 (선택사항)
|
||||
const screenNameConfig = req.body.screenNameConfig
|
||||
? {
|
||||
removeText: req.body.screenNameConfig.removeText,
|
||||
addPrefix: req.body.screenNameConfig.addPrefix,
|
||||
}
|
||||
: undefined;
|
||||
|
||||
// 메뉴 복사 실행
|
||||
const menuCopyService = new MenuCopyService();
|
||||
const result = await menuCopyService.copyMenu(
|
||||
parseInt(menuObjid, 10),
|
||||
targetCompanyCode,
|
||||
userId
|
||||
userId,
|
||||
screenNameConfig
|
||||
);
|
||||
|
||||
logger.info("✅ 메뉴 복사 API 성공");
|
||||
|
||||
@@ -726,7 +726,11 @@ export class MenuCopyService {
|
||||
async copyMenu(
|
||||
sourceMenuObjid: number,
|
||||
targetCompanyCode: string,
|
||||
userId: string
|
||||
userId: string,
|
||||
screenNameConfig?: {
|
||||
removeText?: string;
|
||||
addPrefix?: string;
|
||||
}
|
||||
): Promise<MenuCopyResult> {
|
||||
logger.info(`
|
||||
🚀 ============================================
|
||||
@@ -807,7 +811,8 @@ export class MenuCopyService {
|
||||
targetCompanyCode,
|
||||
flowIdMap,
|
||||
userId,
|
||||
client
|
||||
client,
|
||||
screenNameConfig
|
||||
);
|
||||
|
||||
// === 4단계: 메뉴 복사 ===
|
||||
@@ -1048,7 +1053,11 @@ export class MenuCopyService {
|
||||
targetCompanyCode: string,
|
||||
flowIdMap: Map<number, number>,
|
||||
userId: string,
|
||||
client: PoolClient
|
||||
client: PoolClient,
|
||||
screenNameConfig?: {
|
||||
removeText?: string;
|
||||
addPrefix?: string;
|
||||
}
|
||||
): Promise<Map<number, number>> {
|
||||
const screenIdMap = new Map<number, number>();
|
||||
|
||||
@@ -1087,6 +1096,25 @@ export class MenuCopyService {
|
||||
client
|
||||
);
|
||||
|
||||
// 2-1) 화면명 변환 적용
|
||||
let transformedScreenName = screenDef.screen_name;
|
||||
if (screenNameConfig) {
|
||||
// 1. 제거할 텍스트 제거
|
||||
if (screenNameConfig.removeText?.trim()) {
|
||||
transformedScreenName = transformedScreenName.replace(
|
||||
new RegExp(screenNameConfig.removeText.trim(), "g"),
|
||||
""
|
||||
);
|
||||
transformedScreenName = transformedScreenName.trim(); // 앞뒤 공백 제거
|
||||
}
|
||||
|
||||
// 2. 접두사 추가
|
||||
if (screenNameConfig.addPrefix?.trim()) {
|
||||
transformedScreenName =
|
||||
screenNameConfig.addPrefix.trim() + " " + transformedScreenName;
|
||||
}
|
||||
}
|
||||
|
||||
// 3) screen_definitions 복사 (deleted 필드는 NULL로 설정, 삭제된 화면도 활성화)
|
||||
const newScreenResult = await client.query<{ screen_id: number }>(
|
||||
`INSERT INTO screen_definitions (
|
||||
@@ -1097,7 +1125,7 @@ export class MenuCopyService {
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
|
||||
RETURNING screen_id`,
|
||||
[
|
||||
screenDef.screen_name,
|
||||
transformedScreenName, // 변환된 화면명
|
||||
newScreenCode, // 새 화면 코드
|
||||
screenDef.table_name,
|
||||
targetCompanyCode, // 새 회사 코드
|
||||
@@ -1634,7 +1662,12 @@ export class MenuCopyService {
|
||||
const existsResult = await client.query(
|
||||
`SELECT value_id FROM table_column_category_values
|
||||
WHERE table_name = $1 AND column_name = $2 AND value_code = $3 AND company_code = $4`,
|
||||
[value.table_name, value.column_name, value.value_code, targetCompanyCode]
|
||||
[
|
||||
value.table_name,
|
||||
value.column_name,
|
||||
value.value_code,
|
||||
targetCompanyCode,
|
||||
]
|
||||
);
|
||||
|
||||
if (existsResult.rows.length > 0) {
|
||||
|
||||
Reference in New Issue
Block a user