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:
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user