114 lines
5.4 KiB
TypeScript
114 lines
5.4 KiB
TypeScript
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);
|