import { state, saveHardwareAsset, deleteHardwareAsset } from '../../core/state'; import { HardwareAsset, MasterAssetData, HardwareLog } from '../../core/excelHandler'; import { openModal, closeModals } from './BaseModal'; import { createIcons, Paperclip, History, Plus, X, Save, Edit2, RotateCcw } from 'lucide'; import { CORP_LIST, ORG_LIST, HW_TYPE_LIST, LOCATION_DATA, TYPE_PREFIX_MAP } from './SharedData'; import { generateOptionsHTML, setFieldValue, getFieldValue, parseAndSetLocation, bindLocationEvents, getCombinedLocation, setEditLock } from './ModalUtils'; let currentAsset: HardwareAsset | null = null; let isEditMode = false; const STATUS_LIST = ['대여중', '보관중', '수리중', '기타']; 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 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 serverOnly = document.querySelectorAll('.server-only'); const nonServer = document.querySelectorAll('.non-server'); const opOnly = document.querySelectorAll('.op-only'); const standardLoc = document.querySelectorAll('.loc-standard'); // 1. 초기화 serverOnly.forEach(el => (el as HTMLElement).style.display = 'none'); nonServer.forEach(el => (el as HTMLElement).style.display = 'none'); opOnly.forEach(el => (el as HTMLElement).style.display = 'none'); standardLoc.forEach(el => (el as HTMLElement).style.display = 'flex'); Object.values(groups).forEach(g => { if (g) g.style.display = 'none'; }); // 2. 분류 판별 const isMobileGroup = ['모바일', '태블릿', '노트북', '휴대폰'].some(t => upperType.includes(t)); const isEquipGroup = ['CPU', 'RAM', 'HDD', 'GPU'].some(t => upperType.includes(t)) || upperType.includes('비품'); const isOpType = isMobileGroup || isEquipGroup; const isPcType = upperType === 'PC' || upperType === '개인PC' || upperType === '노트북'; // 3. 레이아웃 적용 if (isOpType) { opOnly.forEach(el => (el as HTMLElement).style.display = 'flex'); standardLoc.forEach(el => (el as HTMLElement).style.display = 'none'); if (groups.specTitle) groups.specTitle.style.display = 'flex'; } if (isPcType) { if (groups.detailPurpose) groups.detailPurpose.style.display = 'flex'; if (detailPurpose === '서버') { serverOnly.forEach(el => (el as HTMLElement).style.display = 'flex'); } else { nonServer.forEach(el => (el as HTMLElement).style.display = 'flex'); } if (groups.specTitle) groups.specTitle.style.display = 'flex'; if (groups.networkTitle) groups.networkTitle.style.display = detailPurpose === '서버' ? 'flex' : 'none'; } else if (upperType.includes('서버') || ['스토리지', 'NAS', 'DAS'].includes(upperType)) { serverOnly.forEach(el => (el as HTMLElement).style.display = 'flex'); if (groups.networkTitle) groups.networkTitle.style.display = 'flex'; if (groups.specTitle) groups.specTitle.style.display = 'flex'; } if (groups.opTitle) groups.opTitle.style.display = 'flex'; } export function openHwModal(asset: HardwareAsset, mode: 'view' | 'add' = 'view') { currentAsset = asset; const modal = document.getElementById('hw-asset-modal')!; setEditLock('hw-asset-form', mode, { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit', generateBtnId: 'btn-generate-hw-code' }); isEditMode = (mode === 'add'); fillHwFormData(asset); applyTypeSpecificUI(asset.type); renderHwHistory(asset.id); modal.classList.remove('hidden'); createIcons({ icons: { X, Save, Edit2, RotateCcw, History, Plus, Paperclip } }); } function fillHwFormData(asset: HardwareAsset) { setFieldValue('hw-asset-id', asset.id); setFieldValue('hw-asset-type', asset.type); setFieldValue('hw-법인', asset.법인); setFieldValue('hw-자산코드', asset.자산코드); setFieldValue('hw-현사용조직', asset.현사용조직); setFieldValue('hw-이전사용조직', asset.이전사용조직); setFieldValue('hw-상세용도', (asset as any).상세용도); setFieldValue('hw-유형', asset.type); setFieldValue('hw-모델명', asset.모델명); setFieldValue('hw-명칭', asset.명칭 || asset.모델명); setFieldValue('hw-보관위치', asset.보관위치 || ''); setFieldValue('hw-현재상태', asset.현재상태 || '보관중'); setFieldValue('hw-IP주소', asset.IP주소); setFieldValue('hw-IP2', (asset as any).IP2); setFieldValue('hw-원격접속', (asset as any).원격접속); setFieldValue('hw-서버ID', (asset as any).서버ID); setFieldValue('hw-서버PW', (asset as any).서버PW); setFieldValue('hw-모니터링', (asset as any).모니터링); setFieldValue('hw-OS', asset.OS); setFieldValue('hw-CPU', asset.CPU); setFieldValue('hw-RAM', asset.RAM); setFieldValue('hw-SSD1', asset.SSD1); setFieldValue('hw-SSD2', asset.SSD2); setFieldValue('hw-HW사양', asset.HW사양); setFieldValue('hw-담당자_정', asset.담당자_정 || asset.관리자); setFieldValue('hw-구매일', asset.구매일); setFieldValue('hw-금액', asset.금액); setFieldValue('hw-비고', asset.비고); parseAndSetLocation(asset.위치, 'hw-위치-빌딩', 'hw-위치-상세', 'hw-위치-기타-group', 'hw-위치-기타'); } export function initHwModal(onSave: () => void, closeModals: () => void) { if (!document.getElementById('hw-asset-modal')) { document.body.insertAdjacentHTML('beforeend', HW_MODAL_HTML); } const form = document.getElementById('hw-asset-form') as HTMLFormElement; const saveBtn = document.getElementById('btn-save-hw-asset')!; const revertBtn = document.getElementById('btn-revert-hw-edit')!; const deleteBtn = document.getElementById('btn-delete-hw-asset')!; const typeSelect = document.getElementById('hw-유형') as HTMLSelectElement; const detailPurposeSelect = document.getElementById('hw-상세용도') as HTMLSelectElement; const logAddBtn = document.getElementById('btn-add-hw-log')!; const logModal = document.getElementById('hw-log-modal')!; [typeSelect, detailPurposeSelect].forEach(el => { el?.addEventListener('change', () => applyTypeSpecificUI(typeSelect.value)); }); bindLocationEvents('hw-위치-빌딩', 'hw-위치-상세', 'hw-위치-기타-group', 'hw-위치-기타'); const closeModalAction = () => { closeModals(); isEditMode = false; }; document.getElementById('btn-close-hw-modal')?.addEventListener('click', closeModalAction); document.getElementById('btn-cancel-hw-modal')?.addEventListener('click', closeModalAction); revertBtn.addEventListener('click', () => { setEditLock('hw-asset-form', 'view', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); isEditMode = false; if (currentAsset) fillHwFormData(currentAsset); }); saveBtn.addEventListener('click', () => { if (!currentAsset) return; if (!isEditMode) { setEditLock('hw-asset-form', 'edit', { saveBtnId: 'btn-save-hw-asset', revertBtnId: 'btn-revert-hw-edit' }); isEditMode = true; applyTypeSpecificUI(getFieldValue('hw-유형')); return; } const type = getFieldValue('hw-유형'); const storageLoc = getFieldValue('hw-보관위치'); const isOpType = ['CPU', 'RAM', 'HDD', 'GPU'].some(t => type.toUpperCase().includes(t)) || type.includes('비품') || ['모바일', '태블릿', '노트북'].some(t => type.includes(t)); const updated: any = { ...currentAsset, 법인: getFieldValue('hw-법인'), 자산코드: getFieldValue('hw-자산코드'), 현사용조직: getFieldValue('hw-현사용조직'), type: type, 상세용도: getFieldValue('hw-상세용도'), 명칭: getFieldValue('hw-명칭'), 보관위치: storageLoc, 현재상태: getFieldValue('hw-현재상태'), OS: getFieldValue('hw-OS'), CPU: getFieldValue('hw-CPU'), RAM: getFieldValue('hw-RAM'), SSD1: getFieldValue('hw-SSD1'), SSD2: getFieldValue('hw-SSD2'), IP주소: getFieldValue('hw-IP주소') || getFieldValue('hw-IP주소-non-server'), 담당자_정: getFieldValue('hw-담당자_정'), 구매일: getFieldValue('hw-구매일'), 금액: getFieldValue('hw-금액'), 비고: getFieldValue('hw-비고'), 위치: isOpType ? storageLoc : getCombinedLocation('hw-위치-빌딩', 'hw-위치-상세', '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(); } }); logAddBtn.addEventListener('click', () => { logModal.classList.remove('hidden'); (document.getElementById('new-hw-log-date') as HTMLInputElement).value = new Date().toISOString().split('T')[0]; (document.getElementById('new-hw-log-details') as HTMLTextAreaElement).value = ''; }); 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 (!date || !details) return; state.masterData.logs = state.masterData.logs || []; state.masterData.logs.push({ id: Math.random().toString(36).substring(2, 9), assetId: currentAsset.id, date, user: '관리자', details }); logModal.classList.add('hidden'); renderHwHistory(currentAsset.id); }); }