import { state } from '../../core/state'; import { HardwareAsset, HardwareLog } from '../../core/excelHandler'; import { openModal } from './BaseModal'; const PC_MODAL_HTML = `
`; export function initPcModal(renderContent: () => void, closeModals: () => void) { if (!document.getElementById('pc-asset-modal')) { document.body.insertAdjacentHTML('beforeend', PC_MODAL_HTML); } const pcForm = document.getElementById('pc-asset-form') as HTMLFormElement; const btnSavePc = document.getElementById('btn-save-pc-asset') as HTMLButtonElement; const btnDeletePc = document.getElementById('btn-delete-pc-asset') as HTMLButtonElement; const btnCancelPc = document.getElementById('btn-cancel-pc-modal') as HTMLButtonElement; const btnClosePc = document.getElementById('btn-close-pc-modal') as HTMLButtonElement; btnCancelPc?.addEventListener('click', closeModals); btnClosePc?.addEventListener('click', closeModals); btnSavePc?.addEventListener('click', (e) => { e.preventDefault(); if (!pcForm.checkValidity()) { pcForm.reportValidity(); return; } const id = (document.getElementById('pc-asset-id') as HTMLInputElement).value; const fileInput = document.getElementById('pc-품의서') as HTMLInputElement; const 품의서명 = fileInput.files && fileInput.files.length > 0 ? fileInput.files[0].name : (document.getElementById('pc-품의서명') as HTMLElement).innerText.replace('첨부: ', ''); const newAsset: HardwareAsset = { id: id || Math.random().toString(36).substring(2, 9), type: '개인PC', 법인: (document.getElementById('pc-법인') as HTMLSelectElement).value, 자산코드: (document.getElementById('pc-자산코드') as HTMLInputElement).value, 명칭: '', 위치: (document.getElementById('pc-위치') as HTMLInputElement).value, 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', 납품업체: (document.getElementById('pc-납품업체') as HTMLInputElement).value, 사용자: (document.getElementById('pc-사용자') as HTMLInputElement).value, CPU: (document.getElementById('pc-CPU') as HTMLInputElement).value, GPU: (document.getElementById('pc-GPU') as HTMLInputElement).value, RAM: (document.getElementById('pc-RAM') as HTMLInputElement).value, SSD1: (document.getElementById('pc-SSD1') as HTMLInputElement).value, SSD2: (document.getElementById('pc-SSD2') as HTMLInputElement).value, HDD1: (document.getElementById('pc-HDD1') as HTMLInputElement).value, HDD2: (document.getElementById('pc-HDD2') as HTMLInputElement).value, 구매일: (document.getElementById('pc-구매일') as HTMLInputElement).value, 금액: (document.getElementById('pc-금액') as HTMLInputElement).value, 품의서명 }; if (id) { const idx = state.masterData.hw.findIndex(a => a.id === id); if(idx !== -1) { const oldAsset = state.masterData.hw[idx]; const changes = getChangeDetails(oldAsset, newAsset); if (changes) { state.masterData.logs.push({ id: Math.random().toString(36).substring(2, 9), assetId: id, date: new Date().toLocaleString(), details: changes, user: '관리자' }); } state.masterData.hw[idx] = newAsset; } } else { state.masterData.hw.push(newAsset); } closeModals(); renderContent(); }); btnDeletePc?.addEventListener('click', (e) => { e.preventDefault(); const id = (document.getElementById('pc-asset-id') as HTMLInputElement).value; if (confirm('삭제하시겠습니까?')) { state.masterData.hw = state.masterData.hw.filter(a => a.id !== id); closeModals(); renderContent(); } }); } export function openPcModal(asset?: HardwareAsset) { const pcForm = document.getElementById('pc-asset-form') as HTMLFormElement; const deleteBtn = document.getElementById('btn-delete-pc-asset')!; const historyArea = document.querySelector('.modal-history-area') as HTMLElement; openModal('pc-asset-modal'); pcForm.reset(); if (asset) { document.getElementById('pc-modal-title')!.textContent = '개인PC 상세 정보 수정'; deleteBtn.style.display = 'block'; if (historyArea) historyArea.style.display = 'flex'; (document.getElementById('pc-asset-id') as HTMLInputElement).value = asset.id; (document.getElementById('pc-법인') as HTMLSelectElement).value = asset.법인; (document.getElementById('pc-자산코드') as HTMLInputElement).value = asset.자산코드; (document.getElementById('pc-사용자') as HTMLInputElement).value = asset.사용자 || ''; (document.getElementById('pc-위치') as HTMLInputElement).value = asset.위치 || ''; (document.getElementById('pc-CPU') as HTMLInputElement).value = asset.CPU || ''; (document.getElementById('pc-GPU') as HTMLInputElement).value = asset.GPU || ''; (document.getElementById('pc-RAM') as HTMLInputElement).value = asset.RAM || ''; (document.getElementById('pc-SSD1') as HTMLInputElement).value = asset.SSD1 || ''; (document.getElementById('pc-SSD2') as HTMLInputElement).value = asset.SSD2 || ''; (document.getElementById('pc-HDD1') as HTMLInputElement).value = asset.HDD1 || ''; (document.getElementById('pc-HDD2') as HTMLInputElement).value = asset.HDD2 || ''; (document.getElementById('pc-구매일') as HTMLInputElement).value = asset.구매일 || ''; (document.getElementById('pc-금액') as HTMLInputElement).value = asset.금액 || ''; (document.getElementById('pc-납품업체') as HTMLInputElement).value = asset.납품업체 || ''; (document.getElementById('pc-품의서명') as HTMLElement).innerText = asset.품의서명 ? `첨부: ${asset.품의서명}` : ''; renderHistory(asset.id); } else { document.getElementById('pc-modal-title')!.textContent = '신규 개인PC 자산 추가'; deleteBtn.style.display = 'none'; if (historyArea) historyArea.style.display = 'none'; (document.getElementById('pc-asset-id') as HTMLInputElement).value = ''; (document.getElementById('pc-법인') as HTMLSelectElement).value = '한맥'; (document.getElementById('pc-품의서명') as HTMLElement).innerText = ''; } } function getChangeDetails(oldAsset: HardwareAsset, newAsset: HardwareAsset): string { const changes: string[] = []; const fields = [ { key: '법인', label: '법인' }, { key: '자산코드', label: '자산코드' }, { key: '사용자', label: '사용자' }, { key: '위치', label: '위치' }, { key: 'CPU', label: 'CPU' }, { key: 'GPU', label: 'GPU' }, { key: 'RAM', label: 'RAM' }, { key: 'SSD1', label: 'SSD1' }, { key: 'SSD2', label: 'SSD2' }, { key: 'HDD1', label: 'HDD1' }, { key: 'HDD2', label: 'HDD2' }, { key: '구매일', label: '구매일' }, { key: '금액', label: '금액' }, { key: '납품업체', label: '납품업체' }, { key: '품의서명', label: '품의서' }, ]; fields.forEach(field => { const oldVal = (oldAsset as any)[field.key] || ''; const newVal = (newAsset as any)[field.key] || ''; if (oldVal !== newVal) { changes.push(`${field.label}: ${oldVal || '없음'} → ${newVal || '없음'}`); } }); return changes.join('\n'); } function renderHistory(assetId: string) { const historyList = document.getElementById('pc-history-list'); if (!historyList) return; const logs = state.masterData.logs .filter(l => l.assetId === assetId) .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); if (logs.length === 0) { historyList.innerHTML = '