feat: 수정 모달 자동 닫기 및 테이블 새로고침 기능 구현

- EditModal: 저장 완료 후 자동으로 닫히고 부모 테이블 새로고침
- buttonActions.ts: 저장 성공 후 closeEditModal 이벤트 발생
- InteractiveScreenViewerDynamic: onSave prop 추가하여 EditModal 연동
- InteractiveDataTable: EditModal 열 때 onSave 콜백으로 loadData 전달
- 두 가지 시나리오 모두 지원:
  1. InteractiveScreenViewerDynamic 버튼의 onSave 호출
  2. DynamicComponentRenderer 버튼의 buttonActions.ts 처리
This commit is contained in:
kjs
2025-11-03 09:58:04 +09:00
parent aef62454c2
commit 8e9daf5b22
6 changed files with 481 additions and 55 deletions

View File

@@ -102,13 +102,6 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
useEffect(() => {
const handleOpenEditModal = (event: CustomEvent) => {
const { screenId, title, description, modalSize, editData, onSave } = event.detail;
console.log("🚀 EditModal 열기 이벤트 수신:", {
screenId,
title,
description,
modalSize,
editData,
});
setModalState({
isOpen: true,
@@ -126,7 +119,16 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
};
const handleCloseEditModal = () => {
console.log("🚪 EditModal 닫기 이벤트 수신");
// 부모 컴포넌트의 onSave 콜백 실행 (테이블 새로고침)
if (modalState.onSave) {
try {
modalState.onSave();
} catch (callbackError) {
console.error("⚠️ onSave 콜백 에러:", callbackError);
}
}
// 모달 닫기
handleClose();
};
@@ -137,7 +139,7 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
window.removeEventListener("openEditModal", handleOpenEditModal as EventListener);
window.removeEventListener("closeEditModal", handleCloseEditModal);
};
}, []);
}, [modalState.onSave]); // modalState.onSave를 의존성에 추가하여 최신 콜백 참조
// 화면 데이터 로딩
useEffect(() => {
@@ -211,12 +213,6 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
}
try {
console.log("💾 수정 저장 시작:", {
tableName: screenData.screenInfo.tableName,
formData,
originalData,
});
// 변경된 필드만 추출
const changedData: Record<string, any> = {};
Object.keys(formData).forEach((key) => {
@@ -225,26 +221,33 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
}
});
console.log("📝 변경된 필드:", changedData);
if (Object.keys(changedData).length === 0) {
toast.info("변경된 내용이 없습니다.");
handleClose();
return;
}
// 기본키 확인 (id 또는 첫 번째 키)
const recordId = originalData.id || Object.values(originalData)[0];
// UPDATE 액션 실행
const response = await dynamicFormApi.updateData(screenData.screenInfo.tableName, {
...originalData, // 원본 데이터 (WHERE 조건용)
...changedData, // 변경된 데이터만
});
const response = await dynamicFormApi.updateFormDataPartial(
recordId,
originalData,
changedData,
screenData.screenInfo.tableName,
);
if (response.success) {
toast.success("데이터가 수정되었습니다.");
// 부모 컴포넌트의 onSave 콜백 실행
// 부모 컴포넌트의 onSave 콜백 실행 (테이블 새로고침)
if (modalState.onSave) {
modalState.onSave();
try {
modalState.onSave();
} catch (callbackError) {
console.error("⚠️ onSave 콜백 에러:", callbackError);
}
}
handleClose();
@@ -335,16 +338,10 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
allComponents={screenData.components}
formData={formData}
onFormDataChange={(fieldName, value) => {
console.log(`🎯 EditModal onFormDataChange 호출: ${fieldName} = "${value}"`);
console.log("📋 현재 formData:", formData);
setFormData((prev) => {
const newFormData = {
...prev,
[fieldName]: value,
};
console.log("📝 EditModal 업데이트된 formData:", newFormData);
return newFormData;
});
setFormData((prev) => ({
...prev,
[fieldName]: value,
}));
}}
screenInfo={{
id: modalState.screenId!,