feat: EditModal 및 ButtonActionExecutor에서 데이터 흐름 제어 로직 개선
- EditModal 컴포넌트에서 executionTiming 체크 로직을 추가하여 데이터 흐름 제어를 보다 유연하게 처리하도록 개선하였습니다. - ButtonActionExecutor에서 저장된 데이터 구조를 명확히 하여, API 응답에서 실제 폼 데이터를 올바르게 추출하도록 수정하였습니다. - 디버깅 로그를 추가하여 데이터 흐름 및 상태를 추적할 수 있도록 하여 개발 편의성을 높였습니다.
This commit is contained in:
@@ -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 데이터가 있으면 병합
|
||||
|
||||
Reference in New Issue
Block a user