/** * 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() { try { // 의존성 순서대로 로드 for (const module of this.modules) { await this._loadModule(module); } this._onAllModulesLoaded(); } catch (error) { console.error(' 모듈 로딩 실패:', error); this._onLoadingError(error); throw error; } } /** * 개별 모듈 로드 * @param {Object} module - 모듈 정보 */ async _loadModule(module) { return new Promise((resolve, reject) => { const script = document.createElement('script'); script.src = module.path; script.type = 'text/javascript'; script.onload = () => { module.loaded = true; 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 } })); } /** * 하위 호환성을 위한 전역 함수 설정 */ _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); } /** * 로딩 에러 처리 */ _onLoadingError(error) { // 에러 UI 표시 const container = document.querySelector('.analysis-container'); if (container) { const errorHTML = `
⚠️

모듈 로딩 실패

작업 분석 시스템을 로드하는 중 오류가 발생했습니다.
페이지를 새로고침하거나 관리자에게 문의하세요.

기술적 세부사항
${error.message}
`; container.innerHTML = errorHTML; } } /** * 로딩 상태 확인 * @returns {Object} 로딩 상태 정보 */ getLoadingStatus() { const total = this.modules.length; const loaded = this.modules.filter(m => m.loaded).length; return { total, loaded, percentage: Math.round((loaded / total) * 100), isComplete: loaded === total, modules: this.modules.map(m => ({ name: m.name, loaded: m.loaded })) }; } /** * 특정 모듈 로딩 상태 확인 * @param {string} moduleName - 모듈명 * @returns {boolean} 로딩 완료 여부 */ isModuleLoaded(moduleName) { const module = this.modules.find(m => m.name === moduleName); return module ? module.loaded : false; } } // 전역 인스턴스 생성 window.WorkAnalysisModuleLoader = new WorkAnalysisModuleLoader(); // 자동 로딩 시작 (DOM이 준비되면) if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { window.WorkAnalysisModuleLoader.loadAll(); }); } else { // DOM이 이미 준비된 경우 즉시 로딩 window.WorkAnalysisModuleLoader.loadAll(); } // Export는 브라우저 환경에서 제거됨