버튼 삭제 수정기능 구현

This commit is contained in:
kjs
2025-09-18 18:49:30 +09:00
parent 87f3959036
commit 004bf28d17
14 changed files with 1637 additions and 134 deletions

View File

@@ -28,6 +28,13 @@ export interface ButtonPrimaryComponentProps extends ComponentRendererProps {
tableName?: string;
onRefresh?: () => void;
onClose?: () => void;
// 폼 데이터 관련
originalData?: Record<string, any>; // 부분 업데이트용 원본 데이터
// 테이블 선택된 행 정보 (다중 선택 액션용)
selectedRows?: any[];
selectedRowsData?: any[];
}
/**
@@ -46,11 +53,14 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
className,
style,
formData,
originalData,
onFormDataChange,
screenId,
tableName,
onRefresh,
onClose,
selectedRows,
selectedRowsData,
...props
}) => {
// 확인 다이얼로그 상태
@@ -84,6 +94,8 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
tableName,
onRefresh,
onClose,
selectedRows,
selectedRowsData,
});
// 스타일 계산 (위치는 RealtimePreviewDynamic에서 처리하므로 제외)
@@ -109,40 +121,48 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
let loadingToast: string | number | undefined;
try {
console.log("📱 로딩 토스트 표시 시작");
// 로딩 토스트 표시
loadingToast = toast.loading(
actionConfig.type === "save"
? "저장 중..."
: actionConfig.type === "delete"
? "삭제 중..."
: actionConfig.type === "submit"
? "제출 중..."
: "처리 중...",
);
console.log("📱 로딩 토스트 ID:", loadingToast);
// edit 액션을 제외하고만 로딩 토스트 표시
if (actionConfig.type !== "edit") {
console.log("📱 로딩 토스트 표시 시작");
loadingToast = toast.loading(
actionConfig.type === "save"
? "저장 중..."
: actionConfig.type === "delete"
? "삭제 중..."
: actionConfig.type === "submit"
? "제출 중..."
: "처리 중...",
);
console.log("📱 로딩 토스트 ID:", loadingToast);
}
console.log("⚡ ButtonActionExecutor.executeAction 호출 시작");
const success = await ButtonActionExecutor.executeAction(actionConfig, context);
console.log("⚡ ButtonActionExecutor.executeAction 완료, success:", success);
// 로딩 토스트 제거
console.log("📱 로딩 토스트 제거");
toast.dismiss(loadingToast);
// 로딩 토스트 제거 (있는 경우에만)
if (loadingToast) {
console.log("📱 로딩 토스트 제거");
toast.dismiss(loadingToast);
}
// 성공 시 토스트 표시
const successMessage =
actionConfig.successMessage ||
(actionConfig.type === "save"
? "저장되었습니다."
: actionConfig.type === "delete"
? "삭제되었습니다."
: actionConfig.type === "submit"
? "제출되었습니다."
: "완료되었습니다.");
// edit 액션은 조용히 처리 (모달 열기만 하므로 토스트 불필요)
if (actionConfig.type !== "edit") {
const successMessage =
actionConfig.successMessage ||
(actionConfig.type === "save"
? "저장되었습니다."
: actionConfig.type === "delete"
? "삭제되었습니다."
: actionConfig.type === "submit"
? "제출되었습니다."
: "완료되었습니다.");
console.log("🎉 성공 토스트 표시:", successMessage);
toast.success(successMessage);
console.log("🎉 성공 토스트 표시:", successMessage);
toast.success(successMessage);
} else {
console.log("🔕 edit 액션은 조용히 처리 (토스트 없음)");
}
console.log("✅ 버튼 액션 실행 성공:", actionConfig.type);
} catch (error) {
@@ -186,11 +206,15 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
if (isInteractive && processedConfig.action) {
const context: ButtonActionContext = {
formData: formData || {},
originalData: originalData || {}, // 부분 업데이트용 원본 데이터 추가
screenId,
tableName,
onFormDataChange,
onRefresh,
onClose,
// 테이블 선택된 행 정보 추가
selectedRows,
selectedRowsData,
};
// 확인이 필요한 액션인지 확인
@@ -245,6 +269,13 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
tableName: _tableName,
onRefresh: _onRefresh,
onClose: _onClose,
selectedRows: _selectedRows,
selectedRowsData: _selectedRowsData,
onSelectedRowsChange: _onSelectedRowsChange,
originalData: _originalData, // 부분 업데이트용 원본 데이터 필터링
refreshKey: _refreshKey, // 필터링 추가
isInModal: _isInModal, // 필터링 추가
mode: _mode, // 필터링 추가
...domProps
} = props;