fix: 선택항목 상세입력 컴포넌트 입력 시 포커스 유지 개선

- 입력 중 onFormDataChange 호출 제거하여 불필요한 리렌더링 방지
- 저장 버튼 클릭 시에만 데이터 전달하도록 변경 (beforeFormSave 이벤트)
- handleSave에서 beforeFormSave 이벤트 발생 및 100ms 대기
- 원본 데이터 표시 버그 수정 (modalData 중첩 구조 처리)
- fieldGroups 구조 감지 로직 수정 (details → fieldGroups)

이제 사용자가 타이핑할 때 포커스가 유지됩니다.
This commit is contained in:
kjs 2025-11-18 10:00:56 +09:00
parent e9268b3f00
commit 3d74b9deb2
2 changed files with 29 additions and 14 deletions

View File

@ -220,6 +220,24 @@ export const SelectedItemsDetailInputComponent: React.FC<SelectedItemsDetailInpu
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [modalData, component.id, componentConfig.fieldGroups]); // onFormDataChange는 의존성에서 제외
// 🆕 저장 요청 시에만 데이터 전달 (이벤트 리스너 방식)
useEffect(() => {
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<SelectedItemsDetailInpu
}
});
// 🆕 상태 업데이트 후 즉시 onFormDataChange 호출 (다음 틱에서)
setTimeout(() => {
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) => {

View File

@ -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) {