import { createIcons, Paperclip, History, Plus, X } from 'lucide'; import { HardwareAsset, HardwareLog } from '../../core/state'; import { state, saveHardwareAsset, deleteHardwareAsset } from '../../core/state'; import { setEditLock } from './ModalUtils'; let currentAsset: HardwareAsset | null = null; let isEditMode = false; // 공통 옵션 생성 함수 const generateOptionsHTML = (options: string[]) => options.map(opt => ``).join(''); const ORG_LIST = ["경영지원팀", "전략기획팀", "IT운영팀", "공정기술팀", "품질관리팀"]; const HW_TYPE_LIST = ["서버", "데스크탑", "노트북", "워크스테이션", "태블릿", "기타"]; const STATUS_LIST = ["사용중", "유휴", "수리중", "폐기예정", "기타"]; const LOCATION_DATA: Record = { "본사": ["1층 전산실", "2층 사무실", "3층 회의실"], "IDC": ["A구역 랙 01", "A구역 랙 02", "B구역 랙 05"], "공장": ["생산라인 1", "제어실", "창고"] }; const HW_MODAL_HTML = ` `; function renderHwHistory(assetId: string) { const container = document.getElementById('hw-history-list'); if (!container) return; const logs = (state.masterData.logs || []).filter(l => l.assetId === assetId); if (logs.length === 0) { container.innerHTML = '
기록이 없습니다.
'; return; } container.innerHTML = logs.map(l => `
${l.date}
${l.user}
${l.details}
`).join(''); } function getFieldValue(id: string): string { return (document.getElementById(id) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement)?.value || ''; } function applyTypeSpecificUI(type: string) { const detailPurpose = getFieldValue('hw-서버용도'); const upperType = (type || '').toUpperCase(); const groups: Record = { detailPurpose: document.getElementById('hw-서버용도-group'), networkTitle: document.getElementById('hw-network-title'), specTitle: document.getElementById('hw-spec-title'), opTitle: document.getElementById('hw-op-title') }; const isServer = upperType.includes('서버') || upperType.includes('SERVER'); const serverOnly = document.querySelectorAll('.server-only'); const nonServer = document.querySelectorAll('.non-server'); serverOnly.forEach(el => (el as HTMLElement).style.display = isServer ? 'block' : 'none'); nonServer.forEach(el => (el as HTMLElement).style.display = isServer ? 'none' : 'block'); if (groups.detailPurpose) groups.detailPurpose.style.display = isServer ? 'block' : 'none'; } export function openHwModal(asset: any) { currentAsset = asset; isEditMode = false; const modal = document.getElementById('hw-asset-modal')!; const form = document.getElementById('hw-asset-form') as HTMLFormElement; form.reset(); fillHwFormData(asset); renderHwHistory(asset.id); setEditLock('hw-asset-form', 'view', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); modal.classList.remove('hidden'); createIcons({ icons: { Paperclip, History, Plus, X } }); } function fillHwFormData(asset: any) { const setVal = (id: string, val: any) => { const el = document.getElementById(id) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement; if (el) el.value = val || ''; }; setVal('hw-asset-id', asset.id); setVal('hw-asset-type', asset.type); setVal('hw-자산번호', asset.자산번호 || ''); setVal('hw-관리번호', asset.관리번호 || asset.관리코드 || ''); setVal('hw-사용자조직', asset.실사용조직 || ''); setVal('hw-관리조직', asset.관리조직 || '전산팀'); setVal('hw-자산구분', asset.자산구분 || asset.type || ''); setVal('hw-서버용도', asset.서버용도 || ''); setVal('hw-보관위치', asset.보관위치 || ''); setVal('hw-상태', asset.상태 || '사용중'); setVal('hw-IP주소', asset.IP주소 || ''); setVal('hw-IP2', asset.IP2 || ''); setVal('hw-원격방법', asset.원격방법 || ''); setVal('hw-서버ID', asset.서버ID || ''); setVal('hw-서버PW', asset.서버PW || ''); setVal('hw-IP주소-non-server', asset.IP주소 || ''); setVal('hw-모델명', asset.모델명 || ''); setVal('hw-OS', asset.OS || ''); setVal('hw-CPU', asset.CPU || ''); setVal('hw-RAM', asset.RAM || ''); setVal('hw-SSD1', asset.SSD1 || ''); setVal('hw-SSD2', asset.SSD2 || ''); setVal('hw-모니터링', asset.모니터링 || ''); setVal('hw-HW사양', asset.HW사양 || ''); setVal('hw-설치장소', asset.설치장소 || ''); setVal('hw-도입일', asset.도입일 || ''); setVal('hw-구매가', asset.구매가 || ''); setVal('hw-비고', asset.비고 || ''); applyTypeSpecificUI(asset.type); } export function initHwModal(onSave: () => void) { document.body.insertAdjacentHTML('beforeend', HW_MODAL_HTML); const modal = document.getElementById('hw-asset-modal')!; const closeBtn = document.getElementById('btn-close-hw-modal')!; const closeBtnBottom = document.getElementById('btn-close-modal-bottom')!; const saveBtn = document.getElementById('btn-save-hw-asset')!; const deleteBtn = document.getElementById('btn-delete-hw-asset')!; const revertBtn = document.getElementById('btn-revert-hw-edit')!; const closeModalAction = () => { modal.classList.add('hidden'); isEditMode = false; }; closeBtn.addEventListener('click', closeModalAction); closeBtnBottom.addEventListener('click', closeModalAction); saveBtn.addEventListener('click', () => { if (!isEditMode) { setEditLock('hw-asset-form', 'edit', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); isEditMode = true; return; } const updated: any = { ...currentAsset, 관리번호: getFieldValue('hw-관리번호'), 실사용조직: getFieldValue('hw-사용자조직'), 자산구분: getFieldValue('hw-자산구분'), 서버용도: getFieldValue('hw-서버용도'), 보관위치: getFieldValue('hw-보관위치'), 상태: getFieldValue('hw-상태'), IP주소: getFieldValue('hw-IP주소') || getFieldValue('hw-IP주소-non-server'), IP2: getFieldValue('hw-IP2'), 원격방법: getFieldValue('hw-원격방법'), 서버ID: getFieldValue('hw-서버ID'), 서버PW: getFieldValue('hw-서버PW'), 모델명: getFieldValue('hw-모델명'), OS: getFieldValue('hw-OS'), CPU: getFieldValue('hw-CPU'), RAM: getFieldValue('hw-RAM'), SSD1: getFieldValue('hw-SSD1'), SSD2: getFieldValue('hw-SSD2'), 모니터링: getFieldValue('hw-모니터링'), HW사양: getFieldValue('hw-HW사양'), 설치장소: getFieldValue('hw-설치장소'), 도입일: getFieldValue('hw-도입일'), 구매가: getFieldValue('hw-구매가'), 비고: getFieldValue('hw-비고') }; saveHardwareAsset(updated); onSave(); setEditLock('hw-asset-form', 'view', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); isEditMode = false; }); deleteBtn.addEventListener('click', () => { if (currentAsset && confirm('정말 삭제하시겠습니까?')) { deleteHardwareAsset(currentAsset.id); onSave(); closeModalAction(); } }); revertBtn.addEventListener('click', () => { if (currentAsset) { fillHwFormData(currentAsset); setEditLock('hw-asset-form', 'view', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); isEditMode = false; } }); // 이력 추가 관련 이벤트 const logModal = document.getElementById('hw-log-modal')!; document.getElementById('btn-add-hw-log')?.addEventListener('click', () => { (document.getElementById('new-hw-log-date') as HTMLInputElement).value = new Date().toISOString().split('T')[0]; (document.getElementById('new-hw-log-details') as HTMLTextAreaElement).value = ''; logModal.classList.remove('hidden'); }); document.getElementById('btn-close-hw-log')?.addEventListener('click', () => logModal.classList.add('hidden')); document.getElementById('btn-cancel-hw-log')?.addEventListener('click', () => logModal.classList.add('hidden')); document.getElementById('btn-confirm-hw-log')?.addEventListener('click', () => { if (!currentAsset) return; const date = (document.getElementById('new-hw-log-date') as HTMLInputElement).value; const details = (document.getElementById('new-hw-log-details') as HTMLTextAreaElement).value; if (!details) { alert('내용을 입력해주세요.'); return; } const newLog: HardwareLog = { id: Math.random().toString(36).substring(2, 9), assetId: currentAsset.id, date, details, user: '관리자' }; if (!state.masterData.logs) state.masterData.logs = []; state.masterData.logs.unshift(newLog); renderHwHistory(currentAsset.id); logModal.classList.add('hidden'); }); }