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:
@@ -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!,
|
||||
|
||||
Reference in New Issue
Block a user