/** * Work Analysis Module Loader * 작업 분석 모듈들을 순서대로 로드하고 초기화하는 로더 */ class WorkAnalysisModuleLoader { constructor() { this.modules = [ { name: 'API Client', path: '/js/work-analysis/api-client.js', loaded: false }, { name: 'Data Processor', path: '/js/work-analysis/data-processor.js', loaded: false }, { name: 'State Manager', path: '/js/work-analysis/state-manager.js', loaded: false }, { name: 'Table Renderer', path: '/js/work-analysis/table-renderer.js', loaded: false }, { name: 'Chart Renderer', path: '/js/work-analysis/chart-renderer.js', loaded: false }, { name: 'Main Controller', path: '/js/work-analysis/main-controller.js', loaded: false } ]; this.loadingPromise = null; } /** * 모든 모듈 로드 * @returns {Promise} 로딩 완료 Promise */ async loadAll() { if (this.loadingPromise) { return this.loadingPromise; } this.loadingPromise = this._loadModules(); return this.loadingPromise; } /** * 모듈들을 순차적으로 로드 */ async _loadModules() { console.log('🚀 작업 분석 모듈 로딩 시작'); try { // 의존성 순서대로 로드 for (const module of this.modules) { await this._loadModule(module); } console.log('✅ 모든 작업 분석 모듈 로딩 완료'); this._onAllModulesLoaded(); } catch (error) { console.error('❌ 모듈 로딩 실패:', error); this._onLoadingError(error); throw error; } } /** * 개별 모듈 로드 * @param {Object} module - 모듈 정보 */ async _loadModule(module) { return new Promise((resolve, reject) => { console.log(`📦 로딩 중: ${module.name}`); const script = document.createElement('script'); script.src = module.path; script.type = 'text/javascript'; script.onload = () => { module.loaded = true; console.log(`✅ 로딩 완료: ${module.name}`); resolve(); }; script.onerror = (error) => { console.error(`❌ 로딩 실패: ${module.name}`, error); reject(new Error(`Failed to load ${module.name}: ${module.path}`)); }; document.head.appendChild(script); }); } /** * 모든 모듈 로딩 완료 시 호출 */ _onAllModulesLoaded() { // 전역 변수 확인 const requiredGlobals = [ 'WorkAnalysisAPI', 'WorkAnalysisDataProcessor', 'WorkAnalysisState', 'WorkAnalysisTableRenderer', 'WorkAnalysisChartRenderer' ]; const missingGlobals = requiredGlobals.filter(name => !window[name]); if (missingGlobals.length > 0) { console.warn('⚠️ 일부 전역 객체가 누락됨:', missingGlobals); } // 하위 호환성을 위한 전역 함수들 설정 this._setupLegacyFunctions(); // 모듈 로딩 완료 이벤트 발생 window.dispatchEvent(new CustomEvent('workAnalysisModulesLoaded', { detail: { modules: this.modules } })); console.log('🎉 작업 분석 시스템 준비 완료'); } /** * 하위 호환성을 위한 전역 함수 설정 */ _setupLegacyFunctions() { // 기존 HTML에서 사용하던 함수들을 새 모듈 시스템으로 연결 const legacyFunctions = { // 기간 확정 confirmPeriod: () => { if (window.WorkAnalysisMainController) { window.WorkAnalysisMainController.handlePeriodConfirm(); } }, // 분석 모드 변경 switchAnalysisMode: (mode) => { if (window.WorkAnalysisState) { window.WorkAnalysisState.setAnalysisMode(mode); } }, // 탭 변경 switchTab: (tabId) => { if (window.WorkAnalysisState) { window.WorkAnalysisState.setCurrentTab(tabId); } }, // 개별 분석 함수들 analyzeWorkStatus: () => { if (window.WorkAnalysisMainController) { window.WorkAnalysisMainController.analyzeWorkStatus(); } }, analyzeProjectDistribution: () => { if (window.WorkAnalysisMainController) { window.WorkAnalysisMainController.analyzeProjectDistribution(); } }, analyzeWorkerPerformance: () => { if (window.WorkAnalysisMainController) { window.WorkAnalysisMainController.analyzeWorkerPerformance(); } }, analyzeErrorAnalysis: () => { if (window.WorkAnalysisMainController) { window.WorkAnalysisMainController.analyzeErrorAnalysis(); } } }; // 전역 함수로 등록 Object.assign(window, legacyFunctions); console.log('🔗 하위 호환성 함수 설정 완료'); } /** * 로딩 에러 처리 */ _onLoadingError(error) { // 에러 UI 표시 const container = document.querySelector('.analysis-container'); if (container) { const errorHTML = `
작업 분석 시스템을 로드하는 중 오류가 발생했습니다.
페이지를 새로고침하거나 관리자에게 문의하세요.
${error.message}