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 => `${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 = ` H/W 자산 정보 기본 정보 (Identity) 자산번호 관리번호/코드 생성 실사용조직 ${generateOptionsHTML(ORG_LIST)} 자산관리조직 자산구분 ${generateOptionsHTML(HW_TYPE_LIST)} 서버용도 선택하세요 DB 서버 웹 서버 어플리케이션 가상화 호스트 운영 및 상태 관리 보관위치 상태 ${generateOptionsHTML(STATUS_LIST)} 네트워크 정보 (Connectivity) IP 주소 1 IP 주소 2 원격 접속/관리 원격 방법 서버 ID 서버 PW IP 주소 하드웨어 사양 (Specifications) 모델명 운영체제 (OS) CPU 사양 RAM 용량 Storage 1 (SSD/HDD) Storage 2 (SSD/HDD) 모니터링 유무 사양 상세 설치 및 위치 관리 설치장소(대분류) ${generateOptionsHTML(Object.keys(LOCATION_DATA))} 세부 설치 위치 선택하세요 직접 입력 (기타) 도입일 구매가 비고 유지보수 및 변경 이력 이력 추가 이력 추가 일자 변경/유지보수 내용 `; 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'); }); }