버튼 수정과 그룹드롭다운, 품목복사기능, 연속입력기능추가

This commit is contained in:
leeheejin
2025-11-06 17:32:24 +09:00
parent c22e38da76
commit b3cd771b99
6 changed files with 551 additions and 94 deletions

View File

@@ -14,6 +14,7 @@ export type ButtonActionType =
| "save" // 저장
| "delete" // 삭제
| "edit" // 편집
| "copy" // 복사 (품목코드 초기화)
| "navigate" // 페이지 이동
| "modal" // 모달 열기
| "control" // 제어 흐름
@@ -132,6 +133,9 @@ export class ButtonActionExecutor {
case "delete":
return await this.handleDelete(config, context);
case "copy":
return await this.handleCopy(config, context);
case "navigate":
return this.handleNavigate(config, context);
@@ -886,6 +890,154 @@ export class ButtonActionExecutor {
window.location.href = editUrl;
}
/**
* 복사 액션 처리 (품목코드 초기화)
*/
private static async handleCopy(config: ButtonActionConfig, context: ButtonActionContext): Promise<boolean> {
try {
const { selectedRowsData, flowSelectedData } = context;
// 플로우 선택 데이터 우선 사용
let dataToCopy = flowSelectedData && flowSelectedData.length > 0 ? flowSelectedData : selectedRowsData;
console.log("📋 handleCopy - 데이터 소스 확인:", {
hasFlowSelectedData: !!(flowSelectedData && flowSelectedData.length > 0),
flowSelectedDataLength: flowSelectedData?.length || 0,
hasSelectedRowsData: !!(selectedRowsData && selectedRowsData.length > 0),
selectedRowsDataLength: selectedRowsData?.length || 0,
dataToCopyLength: dataToCopy?.length || 0,
});
// 선택된 데이터가 없는 경우
if (!dataToCopy || dataToCopy.length === 0) {
toast.error("복사할 항목을 선택해주세요.");
return false;
}
// 복사 화면이 설정되지 않은 경우
if (!config.targetScreenId) {
toast.error("복사 폼 화면이 설정되지 않았습니다. 버튼 설정에서 복사 폼 화면을 선택해주세요.");
return false;
}
console.log(`📋 복사 액션 실행: ${dataToCopy.length}개 항목`, {
dataToCopy,
targetScreenId: config.targetScreenId,
editMode: config.editMode,
});
if (dataToCopy.length === 1) {
// 단일 항목 복사
const rowData = dataToCopy[0];
console.log("📋 단일 항목 복사:", rowData);
console.log("📋 원본 데이터 키 목록:", Object.keys(rowData));
// 품목코드 필드 초기화 (여러 가능한 필드명 확인)
const copiedData = { ...rowData };
const itemCodeFields = [
"item_code",
"itemCode",
"item_no",
"itemNo",
"품목코드",
"품번",
"code",
];
// 품목코드 필드를 찾아서 초기화
let resetFieldName = "";
for (const field of itemCodeFields) {
if (copiedData[field] !== undefined) {
// 품목코드 필드를 빈 문자열로 초기화
// (저장 시점에 채번 규칙이 자동으로 적용됨)
copiedData[field] = "";
// 채번 규칙 ID도 함께 저장 (formData에 있을 경우)
const ruleIdKey = `${field}_numberingRuleId`;
if (rowData[ruleIdKey]) {
copiedData[ruleIdKey] = rowData[ruleIdKey];
console.log(`📋 채번 규칙 ID 복사: ${ruleIdKey} = ${rowData[ruleIdKey]}`);
}
resetFieldName = field;
console.log(`✅ 품목코드 필드 초기화: ${field} (기존값: ${rowData[field]})`);
break;
}
}
if (resetFieldName) {
toast.success(`품목코드(${resetFieldName})가 초기화되었습니다. 저장 시 자동으로 새 코드가 생성됩니다.`);
} else {
console.warn("⚠️ 품목코드 필드를 찾을 수 없습니다. 전체 데이터를 복사합니다.");
console.warn("⚠️ 사용 가능한 필드:", Object.keys(copiedData));
toast.info("복사본이 생성됩니다. (품목코드 필드를 찾을 수 없음)");
}
console.log("📋 복사된 데이터:", copiedData);
await this.openCopyForm(config, copiedData, context);
} else {
// 다중 항목 복사 - 현재는 단일 복사만 지원
toast.error("현재 단일 항목 복사만 지원됩니다. 하나의 항목만 선택해주세요.");
return false;
}
return true;
} catch (error: any) {
console.error("❌ 복사 액션 실행 중 오류:", error);
toast.error(`복사 중 오류가 발생했습니다: ${error.message || "알 수 없는 오류"}`);
return false;
}
}
/**
* 복사 폼 열기 (단일 항목)
*/
private static async openCopyForm(
config: ButtonActionConfig,
rowData: any,
context: ButtonActionContext,
): Promise<void> {
try {
const editMode = config.editMode || "modal";
console.log("📋 openCopyForm 실행:", { editMode, targetScreenId: config.targetScreenId });
switch (editMode) {
case "modal":
// 모달로 복사 폼 열기 (편집 모달 재사용)
console.log("📋 모달로 복사 폼 열기");
await this.openEditModal(config, rowData, context);
break;
case "navigate":
// 새 페이지로 이동
console.log("📋 새 페이지로 복사 화면 이동");
this.navigateToCopyScreen(config, rowData, context);
break;
default:
// 기본값: 모달
console.log("📋 기본 모달로 복사 폼 열기");
this.openEditModal(config, rowData, context);
}
} catch (error: any) {
console.error("❌ openCopyForm 실행 중 오류:", error);
throw error;
}
}
/**
* 복사 화면으로 네비게이션
*/
private static navigateToCopyScreen(config: ButtonActionConfig, rowData: any, context: ButtonActionContext): void {
const copyUrl = `/screens/${config.targetScreenId}?mode=copy`;
console.log("🔄 복사 화면으로 이동:", copyUrl);
// 복사할 데이터를 sessionStorage에 저장
sessionStorage.setItem("copyData", JSON.stringify(rowData));
window.location.href = copyUrl;
}
/**
* 닫기 액션 처리
*/