diff --git a/frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputComponent.tsx b/frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputComponent.tsx index 06c105cd..b50c32fe 100644 --- a/frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputComponent.tsx +++ b/frontend/lib/registry/components/selected-items-detail-input/SelectedItemsDetailInputComponent.tsx @@ -220,6 +220,24 @@ export const SelectedItemsDetailInputComponent: React.FC { + const handleSaveRequest = () => { + if (items.length > 0 && onFormDataChange) { + const dataToSave = { [component.id || "selected_items"]: items }; + console.log("📝 [SelectedItemsDetailInput] 저장 요청 시 데이터 전달:", dataToSave); + onFormDataChange(dataToSave); + } + }; + + // 저장 버튼 클릭 시 데이터 수집 + window.addEventListener("beforeFormSave", handleSaveRequest); + + return () => { + window.removeEventListener("beforeFormSave", handleSaveRequest); + }; + }, [items, component.id, onFormDataChange]); + // 스타일 계산 const componentStyle: React.CSSProperties = { width: "100%", @@ -281,18 +299,9 @@ export const SelectedItemsDetailInputComponent: React.FC { - if (onFormDataChange) { - const dataToSave = { [component.id || "selected_items"]: updatedItems }; - console.log("📝 [SelectedItemsDetailInput] formData 업데이트:", dataToSave); - onFormDataChange(dataToSave); - } - }, 0); - return updatedItems; }); - }, [component.id, onFormDataChange]); + }, []); // 🆕 품목 제거 핸들러 const handleRemoveItem = (itemId: string) => { diff --git a/frontend/lib/utils/buttonActions.ts b/frontend/lib/utils/buttonActions.ts index 9ac4426d..1d39ce91 100644 --- a/frontend/lib/utils/buttonActions.ts +++ b/frontend/lib/utils/buttonActions.ts @@ -200,10 +200,16 @@ export class ButtonActionExecutor { console.log("💾 [handleSave] 저장 시작:", { formData, tableName, screenId }); - // 🆕 SelectedItemsDetailInput 배치 저장 처리 (새로운 데이터 구조) - const selectedItemsKeys = Object.keys(formData).filter(key => { - const value = formData[key]; - return Array.isArray(value) && value.length > 0 && value[0]?.originalData && value[0]?.details; + // 🆕 저장 전 이벤트 발생 (SelectedItemsDetailInput 등에서 최신 데이터 수집) + window.dispatchEvent(new CustomEvent("beforeFormSave")); + + // 약간의 대기 시간을 주어 이벤트 핸들러가 formData를 업데이트할 수 있도록 함 + await new Promise(resolve => setTimeout(resolve, 100)); + + // 🆕 SelectedItemsDetailInput 배치 저장 처리 (fieldGroups 구조) + const selectedItemsKeys = Object.keys(context.formData).filter(key => { + const value = context.formData[key]; + return Array.isArray(value) && value.length > 0 && value[0]?.originalData && value[0]?.fieldGroups; }); if (selectedItemsKeys.length > 0) {