import { state, saveHardwareAsset, deleteHardwareAsset } from '../../core/state'; import { HardwareAsset } from '../../core/excelHandler'; import { openModal, closeModals } from './BaseModal'; import { createIcons, History, X, Paperclip } from 'lucide'; import { CORP_LIST, ORG_LIST, HW_TYPE_LIST, LOCATION_DATA } from './SharedData'; import { generateOptionsHTML, setFieldValue, getFieldValue, parseAndSetLocation, bindLocationEvents, getCombinedLocation } from './ModalUtils'; let currentAsset: HardwareAsset | null = null; let isEditMode = false; const PC_MODAL_HTML = `
`; export function openPcModal(asset: HardwareAsset, mode: 'view' | 'add' = 'view') { currentAsset = asset; const modal = document.getElementById('pc-asset-modal'); if (!modal) return; const form = document.getElementById('pc-asset-form') as HTMLFormElement; const saveBtn = document.getElementById('btn-save-pc-asset')!; const revertBtn = document.getElementById('btn-revert-pc-edit')!; if (form) form.reset(); if (mode === 'add') { isEditMode = true; if (form) { form.classList.remove('is-view-mode'); form.classList.add('is-edit-mode'); } saveBtn.textContent = '저장'; revertBtn.classList.add('hidden'); const prevOrgGroup = document.getElementById('pc-이전사용조직-group'); if (prevOrgGroup) prevOrgGroup.style.display = 'none'; } else { isEditMode = false; if (form) { form.classList.remove('is-edit-mode'); form.classList.add('is-view-mode'); } saveBtn.textContent = '수정'; revertBtn.classList.add('hidden'); const prevOrgGroup = document.getElementById('pc-이전사용조직-group'); if (prevOrgGroup) prevOrgGroup.style.display = 'flex'; } fillFormData(asset); renderHistory(asset.id); modal.classList.remove('hidden'); applyPcTypeSpecificUI(); createIcons({ icons: { X, History, Paperclip } }); } function applyPcTypeSpecificUI() { const type = getFieldValue('pc-유형'); const detailPurpose = getFieldValue('pc-상세용도'); const modelGroup = document.getElementById('pc-모델명')?.closest('.form-group') as HTMLElement; const osGroup = document.getElementById('pc-OS')?.closest('.form-group') as HTMLElement; const cpuGroup = document.getElementById('pc-CPU')?.closest('.form-group') as HTMLElement; const ramGroup = document.getElementById('pc-RAM')?.closest('.form-group') as HTMLElement; const ssd1Group = document.getElementById('pc-SSD1')?.closest('.form-group') as HTMLElement; const ssd2Group = document.getElementById('pc-SSD2')?.closest('.form-group') as HTMLElement; const locationFields = document.querySelectorAll('.pc-location-field'); const etcGroup = document.getElementById('pc-위치-기타-group'); // 초기화 (숨김) [modelGroup, osGroup, cpuGroup, ramGroup, ssd1Group, ssd2Group].forEach(g => { if(g) g.style.display = 'none'; }); locationFields.forEach(el => (el as HTMLElement).style.display = 'none'); if (etcGroup) etcGroup.style.display = 'none'; if (type === '서버') { [modelGroup, osGroup, cpuGroup, ramGroup, ssd1Group, ssd2Group].forEach(g => { if(g) g.style.display = 'flex'; }); locationFields.forEach(el => (el as HTMLElement).style.display = 'flex'); } else if (['스토리지', 'NAS', 'DAS'].includes(type)) { [modelGroup, ssd1Group, ssd2Group].forEach(g => { if(g) g.style.display = 'flex'; }); locationFields.forEach(el => (el as HTMLElement).style.display = 'flex'); } else if (type === 'PC' || type === '노트북') { [modelGroup, osGroup, cpuGroup, ramGroup, ssd1Group, ssd2Group].forEach(g => { if(g) g.style.display = 'flex'; }); if (detailPurpose === '서버') { locationFields.forEach(el => (el as HTMLElement).style.display = 'flex'); } } else if (['CPU', 'GPU', '모바일'].includes(type)) { if (modelGroup) modelGroup.style.display = 'flex'; } else if (type === 'RAM') { if (ramGroup) ramGroup.style.display = 'flex'; } else if (type === 'HDD') { if (ssd1Group) ssd1Group.style.display = 'flex'; } else if (type === '태블릿') { if (modelGroup) modelGroup.style.display = 'flex'; if (ssd1Group) ssd1Group.style.display = 'flex'; } } function fillFormData(asset: HardwareAsset) { setFieldValue('pc-asset-id', asset.id); setFieldValue('pc-법인', asset.법인); setFieldValue('pc-자산코드', asset.자산코드); setFieldValue('pc-유형', asset.type); setFieldValue('pc-사용자', asset.사용자); setFieldValue('pc-현사용조직', asset.현사용조직); setFieldValue('pc-이전사용조직', asset.이전사용조직); setFieldValue('pc-상세용도', (asset as any).상세용도); parseAndSetLocation(asset.위치, 'pc-위치-빌딩', 'pc-위치-상세', 'pc-위치-기타-group', 'pc-위치-기타'); setFieldValue('pc-모델명', asset.모델명); setFieldValue('pc-OS', asset.OS); setFieldValue('pc-CPU', asset.CPU); setFieldValue('pc-RAM', asset.RAM); setFieldValue('pc-SSD1', asset.SSD1); setFieldValue('pc-SSD2', asset.SSD2); setFieldValue('pc-구매일', asset.구매일); setFieldValue('pc-금액', asset.금액); setFieldValue('pc-납품업체', asset.납품업체); setFieldValue('pc-품의서명', asset.품의서명); } export function initPcModal(onSave: () => void, closeModalsCb: () => void) { if (!document.getElementById('pc-asset-modal')) { document.body.insertAdjacentHTML('beforeend', PC_MODAL_HTML); } const pcForm = document.getElementById('pc-asset-form') as HTMLFormElement; const saveBtn = document.getElementById('btn-save-pc-asset'); const revertBtn = document.getElementById('btn-revert-pc-edit'); const deleteBtn = document.getElementById('btn-delete-pc-asset'); // 유형 및 상세용도 리스너 const typeSelect = document.getElementById('pc-유형') as HTMLSelectElement; const detailPurposeSelect = document.getElementById('pc-상세용도') as HTMLSelectElement; [typeSelect, detailPurposeSelect].forEach(el => { el?.addEventListener('change', () => applyPcTypeSpecificUI()); }); bindLocationEvents('pc-위치-빌딩', 'pc-위치-상세', 'pc-위치-기타-group', 'pc-위치-기타'); const handleClose = () => { closeModalsCb(); isEditMode = false; }; document.getElementById('btn-close-pc-modal')?.addEventListener('click', handleClose); document.getElementById('btn-cancel-pc-modal')?.addEventListener('click', handleClose); revertBtn?.addEventListener('click', () => { isEditMode = false; pcForm.classList.replace('is-edit-mode', 'is-view-mode'); if (saveBtn) saveBtn.textContent = '수정'; revertBtn.classList.add('hidden'); if (currentAsset) fillFormData(currentAsset); }); saveBtn?.addEventListener('click', () => { if (!currentAsset) return; if (!isEditMode) { isEditMode = true; pcForm.classList.replace('is-view-mode', 'is-edit-mode'); saveBtn.textContent = '저장'; revertBtn?.classList.remove('hidden'); return; } const type = getFieldValue('pc-유형'); const detailPurpose = getFieldValue('pc-상세용도'); const updated: any = { ...currentAsset, 법인: getFieldValue('pc-법인'), 자산코드: getFieldValue('pc-자산코드'), 현사용조직: getFieldValue('pc-현사용조직'), 이전사용조직: getFieldValue('pc-이전사용조직'), 사용자: getFieldValue('pc-사용자'), 상세용도: detailPurpose, 위치: getCombinedLocation('pc-위치-빌딩', 'pc-위치-상세', 'pc-위치-기타'), 모델명: getFieldValue('pc-모델명'), OS: getFieldValue('pc-OS'), CPU: getFieldValue('pc-CPU'), RAM: getFieldValue('pc-RAM'), SSD1: getFieldValue('pc-SSD1'), SSD2: getFieldValue('pc-SSD2'), 구매일: getFieldValue('pc-구매일'), 금액: getFieldValue('pc-금액'), 납품업체: getFieldValue('pc-납품업체'), type: type || 'PC' }; saveHardwareAsset(updated); onSave(); isEditMode = false; pcForm.classList.replace('is-edit-mode', 'is-view-mode'); saveBtn.textContent = '수정'; revertBtn?.classList.add('hidden'); }); deleteBtn?.addEventListener('click', () => { if (!currentAsset) return; if (confirm('삭제하시겠습니까?')) { deleteHardwareAsset(currentAsset.id); onSave(); handleClose(); } }); } 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 = '