feat: EditModal 및 ButtonActionExecutor에서 데이터 흐름 제어 로직 개선

- EditModal 컴포넌트에서 executionTiming 체크 로직을 추가하여 데이터 흐름 제어를 보다 유연하게 처리하도록 개선하였습니다.
- ButtonActionExecutor에서 저장된 데이터 구조를 명확히 하여, API 응답에서 실제 폼 데이터를 올바르게 추출하도록 수정하였습니다.
- 디버깅 로그를 추가하여 데이터 흐름 및 상태를 추적할 수 있도록 하여 개발 편의성을 높였습니다.
This commit is contained in:
DDD1542
2026-02-05 10:08:26 +09:00
parent 32139beebc
commit f3a0c92564
4 changed files with 214 additions and 18 deletions
+44 -15
View File
@@ -1616,7 +1616,16 @@ export class ButtonActionExecutor {
if (config.enableDataflowControl && config.dataflowConfig) {
// 테이블 섹션 데이터 파싱 (comp_로 시작하는 필드에 JSON 배열이 있는 경우)
// 입고 화면 등에서 품목 목록이 comp_xxx 필드에 JSON 문자열로 저장됨
const formData: Record<string, any> = (saveResult.data || context.formData || {}) as Record<string, any>;
// 🔧 수정: saveResult.data가 3단계로 중첩된 경우 실제 폼 데이터 추출
// saveResult.data = API 응답 { success, data, message }
// saveResult.data.data = 저장된 레코드 { id, screenId, tableName, data, createdAt... }
// saveResult.data.data.data = 실제 폼 데이터 { sabun, user_name... }
const savedRecord = saveResult?.data?.data || saveResult?.data || {};
const actualFormData = savedRecord?.data || savedRecord;
const formData: Record<string, any> = (Object.keys(actualFormData).length > 0 ? actualFormData : context.formData || {}) as Record<string, any>;
console.log("📦 [executeAfterSaveControl] savedRecord 구조:", Object.keys(savedRecord));
console.log("📦 [executeAfterSaveControl] actualFormData 추출:", Object.keys(formData));
console.log("📦 [executeAfterSaveControl] formData.sabun:", formData.sabun);
let parsedSectionData: any[] = [];
// comp_로 시작하는 필드에서 테이블 섹션 데이터 찾기
@@ -4016,16 +4025,27 @@ export class ButtonActionExecutor {
const { executeNodeFlow } = await import("@/lib/api/nodeFlows");
// 데이터 소스 준비: context-data 모드는 배열을 기대함
// 우선순위: selectedRowsData > savedData > formData
// - selectedRowsData: 테이블 섹션에서 저장된 하위 항목들 (item_code, inbound_qty 등 포함)
// - savedData: 저장 API 응답 데이터
// - formData: 폼에 입력된 데이터
// 🔧 저장 후 제어: savedData > formData > selectedRowsData
// - 저장 후 제어에서는 방금 저장된 데이터(savedData)가 가장 중요!
// - selectedRowsData는 왼쪽 패널 선택 데이터일 수 있으므로 마지막 순위
let sourceData: any[];
if (context.selectedRowsData && context.selectedRowsData.length > 0) {
if (context.savedData) {
// 저장된 데이터가 있으면 우선 사용 (저장 API 응답)
sourceData = Array.isArray(context.savedData) ? context.savedData : [context.savedData];
console.log("📦 [executeAfterSaveControl] savedData 사용:", sourceData);
console.log("📦 [executeAfterSaveControl] savedData 필드:", Object.keys(context.savedData));
console.log("📦 [executeAfterSaveControl] savedData.sabun:", context.savedData.sabun);
} else if (context.formData && Object.keys(context.formData).length > 0) {
// 폼 데이터 사용
sourceData = [context.formData];
console.log("📦 [executeAfterSaveControl] formData 사용:", sourceData);
} else if (context.selectedRowsData && context.selectedRowsData.length > 0) {
// 테이블 섹션 데이터 (마지막 순위)
sourceData = context.selectedRowsData;
console.log("📦 [executeAfterSaveControl] selectedRowsData 사용:", sourceData);
} else {
const savedData = context.savedData || context.formData || {};
sourceData = Array.isArray(savedData) ? savedData : [savedData];
sourceData = [];
console.warn("⚠️ [executeAfterSaveControl] 데이터 소스 없음!");
}
let allSuccess = true;
@@ -4125,16 +4145,25 @@ export class ButtonActionExecutor {
const { executeNodeFlow } = await import("@/lib/api/nodeFlows");
// 데이터 소스 준비: context-data 모드는 배열을 기대함
// 우선순위: selectedRowsData > savedData > formData
// - selectedRowsData: 테이블 섹션에서 저장된 하위 항목들 (item_code, inbound_qty 등 포함)
// - savedData: 저장 API 응답 데이터
// - formData: 폼에 입력된 데이터
// 🔧 저장 후 제어: savedData > formData > selectedRowsData
// - 저장 후 제어에서는 방금 저장된 데이터(savedData)가 가장 중요!
// - selectedRowsData는 왼쪽 패널 선택 데이터일 수 있으므로 마지막 순위
let sourceData: any[];
if (context.selectedRowsData && context.selectedRowsData.length > 0) {
if (context.savedData) {
// 저장된 데이터가 있으면 우선 사용 (저장 API 응답)
sourceData = Array.isArray(context.savedData) ? context.savedData : [context.savedData];
console.log("📦 [executeSingleFlowControl] savedData 사용:", sourceData);
} else if (context.formData && Object.keys(context.formData).length > 0) {
// 폼 데이터 사용
sourceData = [context.formData];
console.log("📦 [executeSingleFlowControl] formData 사용:", sourceData);
} else if (context.selectedRowsData && context.selectedRowsData.length > 0) {
// 테이블 섹션 데이터 (마지막 순위)
sourceData = context.selectedRowsData;
console.log("📦 [executeSingleFlowControl] selectedRowsData 사용:", sourceData);
} else {
const savedData = context.savedData || context.formData || {};
sourceData = Array.isArray(savedData) ? savedData : [savedData];
sourceData = [];
console.warn("⚠️ [executeSingleFlowControl] 데이터 소스 없음!");
}
// repeat-screen-modal 데이터가 있으면 병합