import { state, loadMasterDataFromDB } from './core/state'; import { renderNavigation } from './components/Navigation'; import { renderDashboard } from './views/DashboardView'; import { renderTable } from './views/AssetTableView'; 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 } from './components/Modal/SWModal'; 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 apiBatchSave(url: string, data: any[], label: string) { try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); if (!response.ok) throw new Error(`${label} DB 저장 실패`); console.log(`✅ ${label} DB 저장 완료`); } catch (err) { console.error(`❌ ${label} DB 저장 오류:`, err); } } const savePcToDB = () => apiBatchSave('http://localhost:3000/api/pc/batch', state.masterData.pc, '개인PC'); const saveServerToDB = () => apiBatchSave('http://localhost:3000/api/server/batch', state.masterData.server, '서버'); const saveStorageToDB = () => apiBatchSave('http://localhost:3000/api/storage/batch', state.masterData.storage, '스토리지'); const saveEquipToDB = () => apiBatchSave('http://localhost:3000/api/equip/batch', state.masterData.equip, '전산비품'); const saveSubSwToDB = () => apiBatchSave('http://localhost:3000/api/sw/sub/batch', state.masterData.subSw, '구독SW'); const savePermSwToDB = () => apiBatchSave('http://localhost:3000/api/sw/perm/batch', state.masterData.permSw, '영구SW'); const saveSwUsersToDB = () => apiBatchSave('http://localhost:3000/api/sw-users/batch', state.masterData.swUsers, 'SW사용자'); // --- App Initialization --- function initApp() { console.log('🚀 ITAM Dedicated System Initializing...'); const mainContent = document.getElementById('main-content')!; if (!mainContent) return; const { closeAllModals } = initBaseModal(); try { renderNavigation((tab) => { if (tab === '대시보드') renderDashboard(mainContent); else renderTable(mainContent); }); // 각 모달 초기화 시 해당 카테고리의 저장 API만 호출하도록 콜백 연결 initPcModal(() => { savePcToDB(); renderTable(mainContent); }, closeAllModals); initHwModal(() => { if (state.activeSubTab === '서버') saveServerToDB(); else if (state.activeSubTab === '스토리지') saveStorageToDB(); else if (state.activeSubTab === '전산비품') saveEquipToDB(); renderTable(mainContent); }, closeAllModals); initStorageModal(() => { saveStorageToDB(); renderTable(mainContent); }, closeAllModals); initSwModal(() => { if (state.activeSubTab === '구독SW') saveSubSwToDB(); else savePermSwToDB(); renderTable(mainContent); }, closeAllModals); initSwUserModal(() => { saveSwUsersToDB(); renderTable(mainContent); }, closeAllModals); initDashboardDetailModal(); } catch (e) { console.error('❌ Initialization failed:', e); } renderDashboard(mainContent); loadMasterDataFromDB().then((success) => { if (success) { if (state.activeSubTab === '대시보드') renderDashboard(mainContent); else renderTable(mainContent); } }); 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([ savePcToDB(), saveServerToDB(), saveStorageToDB(), saveEquipToDB(), saveSubSwToDB(), savePermSwToDB(), saveSwUsersToDB() ]); renderTable(mainContent); } }); document.getElementById('btn-add-asset')?.addEventListener('click', () => { if (state.activeSubTab === '서버' || state.activeSubTab === '전산비품' || state.activeSubTab === '스토리지') { openHwModal({ id: Math.random().toString(36).substring(2, 9), type: state.activeSubTab, 법인: '한맥', 자산코드: '', 명칭: '', 위치: '', 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', 납품업체: '', 품의서명: '' } 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);