console.log 주석 처리 - 개발환경 정리

- menu, company, screenMng, i18n, tableMng 모듈 console 주석 처리
- 총 55개 파일 수정
- 빌드 에러 수정 완료
- 백엔드 서버 정상 작동 확인

관련 파일:
- frontend/components/admin/MenuManagement.tsx
- frontend/components/admin/MenuFormModal.tsx
- frontend/components/admin/ScreenAssignmentTab.tsx
- frontend/components/admin/CompanyTable.tsx
- frontend/components/admin/MultiLang.tsx
- frontend/app/(main)/admin/tableMng/page.tsx
- 기타 screen 관련 컴포넌트 49개 파일
This commit is contained in:
leeheejin
2025-10-01 18:17:30 +09:00
parent 4202a5b310
commit 2c0dca08b4
55 changed files with 1757 additions and 1464 deletions
+157 -157
View File
@@ -34,10 +34,10 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
const newState = updater(currentState);
(window as any).globalFileState = newState;
console.log("🌐 FileUpload 전역 파일 상태 업데이트:", {
componentId: component.id,
newFileCount: newState[component.id]?.length || 0
});
// console.log("🌐 FileUpload 전역 파일 상태 업데이트:", {
// componentId: component.id,
// newFileCount: newState[component.id]?.length || 0
// });
// 강제 리렌더링을 위한 이벤트 발생
window.dispatchEvent(new CustomEvent('globalFileStateChanged', {
@@ -52,12 +52,12 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
const componentFiles = component.uploadedFiles || [];
const finalFiles = globalFiles.length > 0 ? globalFiles : componentFiles;
console.log("🚀 FileUpload 파일 상태 초기화:", {
componentId: component.id,
globalFiles: globalFiles.length,
componentFiles: componentFiles.length,
finalFiles: finalFiles.length
});
// console.log("🚀 FileUpload 파일 상태 초기화:", {
// componentId: component.id,
// globalFiles: globalFiles.length,
// componentFiles: componentFiles.length,
// finalFiles: finalFiles.length
// });
return finalFiles;
};
@@ -70,10 +70,10 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
const handleGlobalFileStateChange = (event: CustomEvent) => {
if (event.detail.componentId === component.id) {
const globalFiles = getGlobalFileState()[component.id] || [];
console.log("🔄 FileUpload 전역 상태 변경 감지:", {
componentId: component.id,
newFileCount: globalFiles.length
});
// console.log("🔄 FileUpload 전역 상태 변경 감지:", {
// componentId: component.id,
// newFileCount: globalFiles.length
// });
setLocalUploadedFiles(globalFiles);
}
};
@@ -101,53 +101,53 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
// 사용자 정보 디버깅
useEffect(() => {
console.log("👤 File 컴포넌트 인증 상태 및 사용자 정보:", {
isLoading,
isLoggedIn,
hasUser: !!user,
user: user,
userId: user?.userId,
company_code: user?.company_code,
companyCode: user?.companyCode,
userType: typeof user,
userKeys: user ? Object.keys(user) : "no user",
userValues: user ? Object.entries(user) : "no user",
});
// console.log("👤 File 컴포넌트 인증 상태 및 사용자 정보:", {
// isLoading,
// isLoggedIn,
// hasUser: !!user,
// user: user,
// userId: user?.userId,
// company_code: user?.company_code,
// companyCode: user?.companyCode,
// userType: typeof user,
// userKeys: user ? Object.keys(user) : "no user",
// userValues: user ? Object.entries(user) : "no user",
// });
// 사용자 정보가 유효하면 initialUser와 userRef 업데이트
if (user && user.userId) {
setInitialUser(user);
userRef.current = user; // 🎯 ref에도 최신 정보 저장
console.log("✅ 초기 사용자 정보 업데이트:", { userId: user.userId, companyCode: user.companyCode });
// console.log("✅ 초기 사용자 정보 업데이트:", { userId: user.userId, companyCode: user.companyCode });
}
// 회사 관련 필드들 확인
if (user) {
console.log("🔍 회사 관련 필드 검색:", {
company_code: user.company_code,
companyCode: user.companyCode,
company: user.company,
deptCode: user.deptCode,
partnerCd: user.partnerCd,
// console.log("🔍 회사 관련 필드 검색:", {
// company_code: user.company_code,
// companyCode: user.companyCode,
// company: user.company,
// deptCode: user.deptCode,
// partnerCd: user.partnerCd,
// 모든 필드에서 company 관련된 것들 찾기
allFields: Object.keys(user).filter(
(key) =>
key.toLowerCase().includes("company") ||
key.toLowerCase().includes("corp") ||
key.toLowerCase().includes("code"),
),
});
// allFields: Object.keys(user).filter(
// (key) =>
// key.toLowerCase().includes("company") ||
// key.toLowerCase().includes("corp") ||
// key.toLowerCase().includes("code"),
// ),
// });
} else {
console.warn("⚠️ 사용자 정보가 없습니다. 인증 상태 확인 필요");
// console.warn("⚠️ 사용자 정보가 없습니다. 인증 상태 확인 필요");
}
}, [user, isLoading, isLoggedIn]);
// 컴포넌트 props가 변경될 때 로컬 상태 동기화
useEffect(() => {
console.log("🔄 File 컴포넌트 props 변경:", {
propsUploadedFiles: component.uploadedFiles?.length || 0,
localUploadedFiles: localUploadedFiles.length,
});
// console.log("🔄 File 컴포넌트 props 변경:", {
// propsUploadedFiles: component.uploadedFiles?.length || 0,
// localUploadedFiles: localUploadedFiles.length,
// });
setLocalUploadedFiles(component.uploadedFiles || []);
}, [component.uploadedFiles]);
@@ -176,23 +176,23 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
const isFileTypeAllowed = (file: File): boolean => {
const fileName = file.name.toLowerCase();
console.log("🔍 파일 타입 검증:", {
fileName: file.name,
fileType: file.type,
acceptRules: fileConfig.accept,
});
// console.log("🔍 파일 타입 검증:", {
// fileName: file.name,
// fileType: file.type,
// acceptRules: fileConfig.accept,
// });
const result = fileConfig.accept.some((accept) => {
// 모든 파일 허용 (와일드카드)
if (accept === "*/*" || accept === "*") {
console.log("✅ 와일드카드 매칭:", accept);
// console.log("✅ 와일드카드 매칭:", accept);
return true;
}
// 확장자 기반 검증 (.jpg, .png 등)
if (accept.startsWith(".")) {
const matches = fileName.endsWith(accept.toLowerCase());
console.log(`${matches ? "✅" : "❌"} 확장자 검증:`, accept, "→", matches);
// console.log(`${matches ? "✅" : "❌"} 확장자 검증:`, accept, "→", matches);
return matches;
}
@@ -200,97 +200,97 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
if (accept.includes("/*")) {
const type = accept.split("/")[0];
const matches = file.type.startsWith(type);
console.log(`${matches ? "✅" : "❌"} MIME 타입 검증:`, accept, "→", matches);
// console.log(`${matches ? "✅" : "❌"} MIME 타입 검증:`, accept, "→", matches);
return matches;
}
// 정확한 MIME 타입 매칭 (image/jpeg, application/pdf 등)
const matches = file.type === accept;
console.log(`${matches ? "✅" : "❌"} 정확한 MIME 매칭:`, accept, "→", matches);
// console.log(`${matches ? "✅" : "❌"} 정확한 MIME 매칭:`, accept, "→", matches);
return matches;
});
console.log(`🎯 최종 검증 결과:`, result);
// console.log(`🎯 최종 검증 결과:`, result);
return result;
};
// 파일 선택 핸들러
const handleFileSelect = useCallback(
(files: FileList | null) => {
console.log("📁 파일 선택됨:", files ? Array.from(files).map((f) => f.name) : "없음");
// console.log("📁 파일 선택됨:", files ? Array.from(files).map((f) => f.name) : "없음");
if (!files) return;
const fileArray = Array.from(files);
const validFiles: File[] = [];
const errors: string[] = [];
console.log("🔍 파일 검증 시작:", {
totalFiles: fileArray.length,
currentUploadedCount: uploadedFiles.length,
maxFiles: fileConfig.maxFiles,
maxSize: fileConfig.maxSize,
allowedTypes: fileConfig.accept,
});
// console.log("🔍 파일 검증 시작:", {
// totalFiles: fileArray.length,
// currentUploadedCount: uploadedFiles.length,
// maxFiles: fileConfig.maxFiles,
// maxSize: fileConfig.maxSize,
// allowedTypes: fileConfig.accept,
// });
// 파일 검증
fileArray.forEach((file) => {
console.log(`📄 파일 검증: ${file.name} (${file.size} bytes, ${file.type})`);
// console.log(`📄 파일 검증: ${file.name} (${file.size} bytes, ${file.type})`);
// 파일 타입 검증
if (!isFileTypeAllowed(file)) {
errors.push(`${file.name}: 허용되지 않는 파일 타입입니다.`);
console.log(`❌ 파일 타입 거부: ${file.name}`);
// console.log(`❌ 파일 타입 거부: ${file.name}`);
return;
}
// 파일 크기 검증
if (file.size > fileConfig.maxSize * 1024 * 1024) {
errors.push(`${file.name}: 파일 크기가 ${fileConfig.maxSize}MB를 초과합니다.`);
console.log(`❌ 파일 크기 초과: ${file.name} (${file.size} > ${fileConfig.maxSize * 1024 * 1024})`);
// console.log(`❌ 파일 크기 초과: ${file.name} (${file.size} > ${fileConfig.maxSize * 1024 * 1024})`);
return;
}
// 최대 파일 수 검증
if (uploadedFiles.length + validFiles.length >= fileConfig.maxFiles) {
errors.push(`최대 ${fileConfig.maxFiles}개까지만 업로드할 수 있습니다.`);
console.log(`❌ 최대 파일 수 초과`);
// console.log(`❌ 최대 파일 수 초과`);
return;
}
validFiles.push(file);
console.log(`✅ 파일 검증 통과: ${file.name}`);
// console.log(`✅ 파일 검증 통과: ${file.name}`);
});
// 에러가 있으면 알림
if (errors.length > 0) {
console.error("💥 파일 업로드 오류:", errors);
// console.error("💥 파일 업로드 오류:", errors);
// TODO: Toast 알림 표시
}
// 유효한 파일들을 업로드 큐에 추가
if (validFiles.length > 0) {
console.log(
"✅ 유효한 파일들 업로드 큐에 추가:",
validFiles.map((f) => f.name),
);
// console.log(
// "✅ 유효한 파일들 업로드 큐에 추가:",
// validFiles.map((f) => f.name),
// );
setUploadQueue((prev) => [...prev, ...validFiles]);
if (fileConfig.autoUpload) {
console.log("🚀 자동 업로드 시작:", {
autoUpload: fileConfig.autoUpload,
filesCount: validFiles.length,
fileNames: validFiles.map((f) => f.name),
});
// console.log("🚀 자동 업로드 시작:", {
// autoUpload: fileConfig.autoUpload,
// filesCount: validFiles.length,
// fileNames: validFiles.map((f) => f.name),
// });
// 자동 업로드 실행
validFiles.forEach(uploadFile);
} else {
console.log("⏸️ 자동 업로드 비활성화:", {
autoUpload: fileConfig.autoUpload,
filesCount: validFiles.length,
});
// console.log("⏸️ 자동 업로드 비활성화:", {
// autoUpload: fileConfig.autoUpload,
// filesCount: validFiles.length,
// });
}
} else {
console.log("❌ 업로드할 유효한 파일이 없음");
// console.log("❌ 업로드할 유효한 파일이 없음");
}
},
[fileConfig, uploadedFiles.length],
@@ -299,7 +299,7 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
// 파일 업로드 함수 (실시간 상태 조회로 타이밍 문제 해결)
const uploadFile = useCallback(
async (file: File) => {
console.log("📤 파일 업로드 시작:", file.name);
// console.log("📤 파일 업로드 시작:", file.name);
const formData = new FormData();
formData.append("files", file);
@@ -311,31 +311,31 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
const currentUser = userRef.current;
// 실시간 사용자 정보 디버깅
console.log("🔍 FileUpload - uploadFile ref를 통한 실시간 상태:", {
hasCurrentUser: !!currentUser,
currentUser: currentUser
? {
userId: currentUser.userId,
companyCode: currentUser.companyCode,
company_code: currentUser.company_code,
}
: null,
// console.log("🔍 FileUpload - uploadFile ref를 통한 실시간 상태:", {
// hasCurrentUser: !!currentUser,
// currentUser: currentUser
// ? {
// userId: currentUser.userId,
// companyCode: currentUser.companyCode,
// company_code: currentUser.company_code,
// }
// : null,
// 기존 상태와 비교
originalUser: user,
originalInitialUser: initialUser,
refExists: !!userRef.current,
});
// originalUser: user,
// originalInitialUser: initialUser,
// refExists: !!userRef.current,
// });
// 사용자 정보가 로드되지 않은 경우 잠시 대기
if (isLoading) {
console.log("⏳ 사용자 정보 로딩 중... 업로드 대기");
// console.log("⏳ 사용자 정보 로딩 중... 업로드 대기");
setTimeout(() => uploadFile(file), 500); // 500ms 후 재시도
return;
}
// 사용자 정보가 없는 경우 - 무한루프 방지로 재시도 제한
if (!user && isLoggedIn) {
console.warn("⚠️ 로그인은 되어 있지만 사용자 정보가 없음. DEFAULT로 진행");
// console.warn("⚠️ 로그인은 되어 있지만 사용자 정보가 없음. DEFAULT로 진행");
// 무한루프 방지: 재시도하지 않고 DEFAULT로 진행
// setTimeout(() => uploadFile(file), 1000); // 1초 후 재시도
// return;
@@ -348,27 +348,27 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
if (companyCode) {
// "*"는 실제 회사코드이므로 그대로 사용
formData.append("companyCode", companyCode);
console.log("✅ 회사코드 추가:", companyCode);
// console.log("✅ 회사코드 추가:", companyCode);
} else {
console.warn("⚠️ 회사코드가 없음, DEFAULT 사용. 사용자 정보:", {
user: user,
initialUser: initialUser,
effectiveUser: effectiveUser,
companyCode: effectiveUser?.companyCode,
company_code: effectiveUser?.company_code,
deptCode: effectiveUser?.deptCode,
isLoading,
isLoggedIn,
allUserKeys: effectiveUser ? Object.keys(effectiveUser) : "no user",
});
// console.warn("⚠️ 회사코드가 없음, DEFAULT 사용. 사용자 정보:", {
// user: user,
// initialUser: initialUser,
// effectiveUser: effectiveUser,
// companyCode: effectiveUser?.companyCode,
// company_code: effectiveUser?.company_code,
// deptCode: effectiveUser?.deptCode,
// isLoading,
// isLoggedIn,
// allUserKeys: effectiveUser ? Object.keys(effectiveUser) : "no user",
// });
formData.append("companyCode", "DEFAULT");
}
if (effectiveUser?.userId) {
formData.append("writer", effectiveUser.userId);
console.log("✅ 작성자 추가:", effectiveUser.userId);
// console.log("✅ 작성자 추가:", effectiveUser.userId);
} else {
console.warn("⚠️ 사용자ID가 없음, system 사용");
// console.warn("⚠️ 사용자ID가 없음, system 사용");
formData.append("writer", "system");
}
@@ -376,45 +376,45 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
if (fileConfig.accept && fileConfig.accept.length > 0) {
const acceptString = fileConfig.accept.join(",");
formData.append("accept", acceptString);
console.log("✅ 허용 파일 타입 추가:", acceptString);
// console.log("✅ 허용 파일 타입 추가:", acceptString);
}
// 자동 연결 정보 추가
if (fileConfig.autoLink) {
formData.append("autoLink", "true");
console.log("✅ 자동 연결 활성화: true");
// console.log("✅ 자동 연결 활성화: true");
if (fileConfig.linkedTable) {
formData.append("linkedTable", fileConfig.linkedTable);
console.log("✅ 연결 테이블 추가:", fileConfig.linkedTable);
// console.log("✅ 연결 테이블 추가:", fileConfig.linkedTable);
}
if (fileConfig.linkedField) {
formData.append("linkedField", fileConfig.linkedField);
console.log("✅ 연결 필드 추가:", fileConfig.linkedField);
// console.log("✅ 연결 필드 추가:", fileConfig.linkedField);
}
if (fileConfig.recordId) {
formData.append("recordId", fileConfig.recordId);
console.log("✅ 레코드 ID 추가:", fileConfig.recordId);
// console.log("✅ 레코드 ID 추가:", fileConfig.recordId);
}
// 가상 파일 컬럼 정보 추가
if (fileConfig.isVirtualFileColumn) {
formData.append("isVirtualFileColumn", "true");
console.log("✅ 가상 파일 컬럼 활성화: true");
// console.log("✅ 가상 파일 컬럼 활성화: true");
if (fileConfig.columnName) {
formData.append("columnName", fileConfig.columnName);
console.log("✅ 컬럼명 추가:", fileConfig.columnName);
// console.log("✅ 컬럼명 추가:", fileConfig.columnName);
}
}
}
// FormData 내용 디버깅
console.log("📋 FormData 내용 확인:");
// console.log("📋 FormData 내용 확인:");
for (const [key, value] of formData.entries()) {
console.log(` ${key}:`, value);
// console.log(` ${key}:`, value);
}
try {
@@ -437,23 +437,23 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
isUploading: true,
};
console.log("📋 임시 파일 정보 생성:", tempFileInfo);
// console.log("📋 임시 파일 정보 생성:", tempFileInfo);
const newUploadedFiles = [...uploadedFiles, tempFileInfo];
console.log("📊 업데이트 전 파일 목록:", uploadedFiles.length, "개");
console.log("📊 업데이트 후 파일 목록:", newUploadedFiles.length, "개");
// console.log("📊 업데이트 전 파일 목록:", uploadedFiles.length, "개");
// console.log("📊 업데이트 후 파일 목록:", newUploadedFiles.length, "개");
// 로컬 상태 즉시 업데이트
setLocalUploadedFiles(newUploadedFiles);
// 임시 파일 정보를 업로드된 파일 목록에 추가
console.log("🔄 onUpdateComponent 호출 중...");
// console.log("🔄 onUpdateComponent 호출 중...");
onUpdateComponent({
uploadedFiles: newUploadedFiles,
});
console.log("✅ onUpdateComponent 호출 완료");
// console.log("✅ onUpdateComponent 호출 완료");
console.log("🚀 API 호출 시작 - /files/upload");
// console.log("🚀 API 호출 시작 - /files/upload");
// 실제 API 호출 (apiClient 사용으로 자동 JWT 토큰 추가)
// FormData 사용 시 Content-Type을 삭제하여 boundary가 자동 설정되도록 함
@@ -464,7 +464,7 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
});
const result = response.data;
console.log("📡 API 응답 성공:", result);
// console.log("📡 API 응답 성공:", result);
if (!result.success || !result.files || result.files.length === 0) {
throw new Error(result.message || "파일 업로드 실패");
@@ -491,7 +491,7 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
isUploading: false,
};
console.log("✅ 실제 파일 업로드 완료 (attach_file_info 저장됨):", successFileInfo);
// console.log("✅ 실제 파일 업로드 완료 (attach_file_info 저장됨):", successFileInfo);
const updatedFiles = uploadedFiles.map((f) => (f.objid === tempFileInfo.objid ? successFileInfo : f));
@@ -514,14 +514,14 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
timestamp: Date.now()
};
console.log("🚀 FileUpload 위젯 이벤트 발생:", eventDetail);
// console.log("🚀 FileUpload 위젯 이벤트 발생:", eventDetail);
const event = new CustomEvent('globalFileStateChanged', {
detail: eventDetail
});
window.dispatchEvent(event);
console.log("✅ FileUpload globalFileStateChanged 이벤트 발생 완료");
// console.log("✅ FileUpload globalFileStateChanged 이벤트 발생 완료");
}
// 컴포넌트 업데이트 (옵셔널)
@@ -539,21 +539,21 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
// 업로드 큐에서 제거
setUploadQueue((prev) => prev.filter((f) => f !== file));
} catch (error) {
console.error("❌ 파일 업로드 실패:", {
error,
errorMessage: error instanceof Error ? error.message : "알 수 없는 오류",
errorStack: error instanceof Error ? error.stack : undefined,
user: user ? { userId: user.userId, companyCode: user.companyCode, hasUser: true } : "no user",
authState: { isLoading, isLoggedIn },
});
// console.error("❌ 파일 업로드 실패:", {
// error,
// errorMessage: error instanceof Error ? error.message : "알 수 없는 오류",
// errorStack: error instanceof Error ? error.stack : undefined,
// user: user ? { userId: user.userId, companyCode: user.companyCode, hasUser: true } : "no user",
// authState: { isLoading, isLoggedIn },
// });
// API 응답 에러인 경우 상세 정보 출력
if ((error as any)?.response) {
console.error("📡 API 응답 에러:", {
status: (error as any).response.status,
statusText: (error as any).response.statusText,
data: (error as any).response.data,
});
// console.error("📡 API 응답 에러:", {
// status: (error as any).response.status,
// statusText: (error as any).response.statusText,
// data: (error as any).response.data,
// });
}
// 에러 상태로 업데이트
@@ -576,7 +576,7 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
// 파일 삭제
const deleteFile = async (fileInfo: AttachedFileInfo) => {
console.log("🗑️ 파일 삭제:", fileInfo.realFileName);
// console.log("🗑️ 파일 삭제:", fileInfo.realFileName);
try {
// 실제 API 호출 (논리적 삭제) - apiClient 사용으로 JWT 토큰 자동 추가
const response = await apiClient.delete(`/files/${fileInfo.objid}`, {
@@ -586,7 +586,7 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
});
const result = response.data;
console.log("📡 파일 삭제 API 응답:", result);
// console.log("📡 파일 삭제 API 응답:", result);
if (!result.success) {
throw new Error(result.message || "파일 삭제 실패");
@@ -615,39 +615,39 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
source: 'realScreen' // 실제 화면에서 온 이벤트임을 표시
};
console.log("🚀🚀🚀 FileUpload 위젯 삭제 이벤트 발생:", eventDetail);
// console.log("🚀🚀🚀 FileUpload 위젯 삭제 이벤트 발생:", eventDetail);
const event = new CustomEvent('globalFileStateChanged', {
detail: eventDetail
});
window.dispatchEvent(event);
console.log("✅✅✅ FileUpload 위젯 → 화면설계 모드 동기화 이벤트 발생 완료");
// console.log("✅✅✅ FileUpload 위젯 → 화면설계 모드 동기화 이벤트 발생 완료");
// 추가 지연 이벤트들
setTimeout(() => {
try {
console.log("🔄 FileUpload 위젯 추가 삭제 이벤트 발생 (지연 100ms)");
// console.log("🔄 FileUpload 위젯 추가 삭제 이벤트 발생 (지연 100ms)");
window.dispatchEvent(new CustomEvent('globalFileStateChanged', {
detail: { ...eventDetail, delayed: true }
}));
} catch (error) {
console.warn("FileUpload 지연 이벤트 발생 실패:", error);
// console.warn("FileUpload 지연 이벤트 발생 실패:", error);
}
}, 100);
setTimeout(() => {
try {
console.log("🔄 FileUpload 위젯 추가 삭제 이벤트 발생 (지연 300ms)");
// console.log("🔄 FileUpload 위젯 추가 삭제 이벤트 발생 (지연 300ms)");
window.dispatchEvent(new CustomEvent('globalFileStateChanged', {
detail: { ...eventDetail, delayed: true, attempt: 2 }
}));
} catch (error) {
console.warn("FileUpload 지연 이벤트 발생 실패:", error);
// console.warn("FileUpload 지연 이벤트 발생 실패:", error);
}
}, 300);
} catch (error) {
console.warn("FileUpload 이벤트 발생 실패:", error);
// console.warn("FileUpload 이벤트 발생 실패:", error);
}
}
@@ -655,9 +655,9 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
uploadedFiles: filteredFiles,
});
console.log("✅ 파일 삭제 완료 (attach_file_info.status = DELETED)");
// console.log("✅ 파일 삭제 완료 (attach_file_info.status = DELETED)");
} catch (error) {
console.error("파일 삭제 실패:", error);
// console.error("파일 삭제 실패:", error);
}
};
@@ -692,10 +692,10 @@ export function FileUpload({ component, onUpdateComponent, onFileUpload, userInf
if (isImage) {
// TODO: 이미지 미리보기 모달 열기
console.log("이미지 미리보기:", fileInfo);
// console.log("이미지 미리보기:", fileInfo);
} else {
// TODO: 파일 다운로드
console.log("파일 다운로드:", fileInfo);
// console.log("파일 다운로드:", fileInfo);
}
};