import { state, saveAsset, deleteAsset } from '../../core/state'; import { BaseModal } from './BaseModal'; import { CORP_LIST } from './SharedData'; import { generateOptionsHTML, setFieldValue, getFieldValue } from './ModalUtils'; import { createIcons, X, Save, Database, CalendarClock, Edit2, History, Plus } from 'lucide'; import { formatExcelDate } from '../../core/excelHandler'; import { UI_TEXT } from '../../core/schema'; class DomainAssetModal extends BaseModal { constructor() { super('domain', '도메인 정보'); } protected renderFrameHTML(): string { return ` `; } protected initChildLogic(onSave: () => void, closeModals: () => void): void { const saveBtn = document.getElementById('btn-save-domain-asset')!; const revertBtn = document.getElementById('btn-revert-domain-edit')!; const deleteBtn = document.getElementById('btn-delete-domain-asset')!; saveBtn.addEventListener('click', async () => { if (!this.currentAsset) return; if (!this.isEditMode) { this.setEditLockMode('edit'); this.isEditMode = true; return; } const formData = new FormData(this.formEl!); const updated = { ...this.currentAsset }; formData.forEach((value, key) => { updated[key] = value; }); if (!updated.service_name || !updated.domain_name) { alert('서비스명과 관리도메인은 필수 입력 사항입니다.'); return; } if (await saveAsset('domain', updated)) { alert(UI_TEXT.MESSAGES.SAVE_SUCCESS); onSave(); this.close(); closeModals(); } }); revertBtn.addEventListener('click', () => { this.setEditLockMode('view'); if (this.currentAsset) this.fillFormData(this.currentAsset); }); deleteBtn.addEventListener('click', async () => { if (!this.currentAsset || !confirm(UI_TEXT.MESSAGES.CONFIRM_DELETE)) return; if (await deleteAsset('domain', this.currentAsset.id)) { alert('성공적으로 삭제되었습니다.'); onSave(); this.close(); closeModals(); } }); createIcons({ icons: { History, Plus, Save, CalendarClock, Database } }); } protected fillFormData(asset: any): void { setFieldValue('domain-id', asset.id); setFieldValue('domain-type', asset.type || '호스팅'); setFieldValue('domain-corp', asset.corp || ''); setFieldValue('domain-service-name', asset.service_name || ''); setFieldValue('domain-name', asset.domain_name || ''); setFieldValue('domain-start-date', formatExcelDate(asset.start_date)); setFieldValue('domain-expiry-date', formatExcelDate(asset.expiry_date)); setFieldValue('domain-price', asset.price || ''); setFieldValue('domain-manager-main', asset.manager_main || ''); setFieldValue('domain-manager-sub', asset.manager_sub || ''); setFieldValue('domain-remarks', asset.remarks || ''); this.renderHistory(asset.id); } protected onAfterOpen(asset: any, mode: string): void { const titleEl = document.getElementById('domain-modal-title'); if (titleEl) titleEl.textContent = (mode === 'add') ? '신규 도메인 등록' : '도메인 정보 상세'; const deleteBtn = document.getElementById('btn-delete-domain-asset'); if (deleteBtn) deleteBtn.style.display = (mode === 'add') ? 'none' : 'block'; } private renderHistory(assetId: string) { const container = document.getElementById('domain-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(''); } } export const domainModal = new DomainAssetModal(); export function initDomainModal(onSave: () => void, closeModals: () => void) { domainModal.init(onSave, closeModals); } export function openDomainModal(asset: any, mode: 'view' | 'edit' | 'add' = 'view') { domainModal.open(asset, mode); }