import { state, loadMasterDataFromDB } from './core/state'; import { renderNavigation } from './components/Navigation'; import { renderDashboard } from './views/DashboardView'; import { renderSWTable } from './views/SW_Table'; import { downloadTemplate, exportToExcel, parseExcel, HardwareAsset, SoftwareAsset, SWUser } from './core/excelHandler'; import { initBaseModal } from './components/Modal/BaseModal'; import { initPcModal } from './components/Modal/PCModal'; import { initHwModal, openHwModal } from './components/Modal/HWModal'; import { initStorageModal } from './components/Modal/StorageModal'; import { initSwModal, openSwModal } from './components/Modal/SWModal'; import { initCloudModal, openCloudModal } from './components/Modal/CloudModal'; import { initSwUserModal } from './components/Modal/SWUserModal'; import { initDashboardDetailModal } from './components/Modal/DashboardDetailModal'; import { createIcons, Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw } from 'lucide'; // --- DB 저장을 위한 헬퍼 함수 --- async function saveAllHwToDB(assets: HardwareAsset[]) { try { const response = await fetch('http://localhost:3000/api/hw/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(assets) }); if (!response.ok) throw new Error('HW DB 저장 실패'); console.log('✅ HW DB 저장 완료'); } catch (err) { console.error('❌ HW DB 저장 실패:', err); } } async function saveAllSwToDB(assets: SoftwareAsset[]) { try { const response = await fetch('http://localhost:3000/api/sw/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(assets) }); if (!response.ok) throw new Error('SW DB 저장 실패'); console.log('✅ SW DB 저장 완료'); } catch (err) { console.error('❌ SW DB 저장 실패:', err); } } async function saveAllSwUsersToDB(users: SWUser[]) { try { const response = await fetch('http://localhost:3000/api/sw-users/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(users) }); if (!response.ok) throw new Error('SW User DB 저장 실패'); console.log('✅ SW User DB 저장 완료'); } catch (err) { console.error('❌ SW User DB 저장 실패:', err); } } // --- App Initialization --- function initApp() { console.log('🚀 ITAM System Initializing...'); const mainContent = document.getElementById('main-content')!; if (!mainContent) return; // 1. 전역 모달 및 내비게이션 초기화 const { closeAllModals } = initBaseModal(); try { renderNavigation((tab) => { if (tab === '대시보드') { renderDashboard(mainContent); } else { renderSWTable(mainContent); } }); initPcModal(() => { saveAllHwToDB(state.masterData.hw); renderSWTable(mainContent); }, closeAllModals); initHwModal(() => { saveAllHwToDB(state.masterData.hw); renderSWTable(mainContent); }, closeAllModals); initStorageModal(() => { saveAllHwToDB(state.masterData.hw); renderSWTable(mainContent); }, closeAllModals); initSwModal(() => { saveAllSwToDB(state.masterData.sw); renderSWTable(mainContent); }, closeAllModals); initCloudModal(() => { saveAllSwToDB(state.masterData.sw); renderSWTable(mainContent); }, closeAllModals); initSwUserModal(() => { saveAllSwUsersToDB(state.masterData.swUsers); renderSWTable(mainContent); }, closeAllModals); initDashboardDetailModal(); } catch (e) { console.error('❌ Initialization failed:', e); } // 2. 초기 렌더링 renderDashboard(mainContent); // 3. 비동기 데이터 로드 loadMasterDataFromDB().then((success) => { if (success) { if (state.activeSubTab === '대시보드') renderDashboard(mainContent); else renderSWTable(mainContent); } }); // 4. 이벤트 바인딩 document.getElementById('btn-download-template')?.addEventListener('click', () => downloadTemplate()); document.getElementById('btn-export-excel')?.addEventListener('click', () => exportToExcel(state.masterData)); const uploadInput = document.getElementById('excel-upload') as HTMLInputElement; uploadInput?.addEventListener('change', async (e) => { const file = (e.target as HTMLInputElement).files?.[0]; if (file) { const data = await parseExcel(file); state.masterData = data; // 엑셀 업로드 시 모든 카테고리 일괄 덮어쓰기 저장 await Promise.all([ saveAllHwToDB(data.hw), saveAllSwToDB(data.sw), saveAllSwUsersToDB(data.swUsers) ]); renderSWTable(mainContent); } }); document.getElementById('btn-add-asset')?.addEventListener('click', () => { if (['개인PC', '서버', '전산비품', '스토리지'].includes(state.activeSubTab)) { openHwModal({ id: Math.random().toString(36).substring(2, 9), type: state.activeSubTab, 법인: '한맥', 자산코드: '', 명칭: '', 위치: '', 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', 납품업체: '', 품의서명: '' } as any); } else if (state.activeSubTab === '클라우드') { openCloudModal({ type: '클라우드', 제품명: '', 금액: '', 수량: 1, 계정명: '', 납품업체: '', 비고: '', 법인: '한맥', 플랫폼명: '' } as any); } else if (state.activeSubTab === '구독SW' || state.activeSubTab === '영구SW') { openSwModal({ type: state.activeSubTab, 제품명: '', 금액: '', 수량: 1, 계정명: '', 납품업체: '', 비고: '', 법인: '한맥' } as any); } }); createIcons({ icons: { Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw } }); } document.addEventListener('DOMContentLoaded', initApp);