- 서버PC 자산을 asset_pc 테이블로 통합 마이그레이션 및 스키마 확장 (위치, IP 정보 복구 완료) - 하드웨어 자산 페이지의 구매법인 필터를 자산위치 필터로 교체 및 동적 데이터 바인딩 적용 - 모든 자산 리스트 페이지 상단에 설명(Description) 필드 추가 및 헤더 표준화 - 상세 모달 내 삭제 버튼 기능 구현 및 서버PC 용도 필드 노출 오류 수정 - 현 사용조직 필터 리스트가 비어있던 DOM 셀렉터 버그 수정
121 lines
4.6 KiB
TypeScript
121 lines
4.6 KiB
TypeScript
import { state, saveAsset, deleteAsset } from '../../core/state';
|
|
import { closeModals, openModal } from './BaseModal';
|
|
import { CORP_LIST } from './SharedData';
|
|
import { generateOptionsHTML, setEditLock } from './ModalUtils';
|
|
import { createIcons, X, Save, Database, CalendarClock, Edit2 } from 'lucide';
|
|
import { formatExcelDate } from '../../core/excelHandler';
|
|
import { UI_TEXT } from '../../core/schema';
|
|
|
|
let currentItem: any = null;
|
|
|
|
const DOMAIN_MODAL_HTML = `
|
|
... (rest of DOMAIN_MODAL_HTML remains same) ...
|
|
`;
|
|
|
|
export function initDomainModal() {
|
|
if (!document.getElementById('domain-asset-modal')) {
|
|
document.body.insertAdjacentHTML('beforeend', DOMAIN_MODAL_HTML);
|
|
}
|
|
|
|
const modal = document.getElementById('domain-asset-modal')!;
|
|
document.getElementById('btn-close-domain-modal')?.addEventListener('click', () => closeModals());
|
|
document.getElementById('btn-cancel-domain')?.addEventListener('click', () => closeModals());
|
|
|
|
const saveBtn = document.getElementById('btn-save-domain');
|
|
const revertBtn = document.getElementById('btn-revert-domain');
|
|
const deleteBtn = document.getElementById('btn-delete-domain');
|
|
const headerEditBtn = document.getElementById('btn-edit-domain-header');
|
|
|
|
saveBtn?.addEventListener('click', () => {
|
|
if (!currentItem) return;
|
|
if (saveBtn.textContent?.includes('수정')) {
|
|
setEditLock('domain-asset-form', 'edit', { saveBtnId: 'btn-save-domain', revertBtnId: 'btn-revert-domain' });
|
|
return;
|
|
}
|
|
saveDomain();
|
|
});
|
|
|
|
headerEditBtn?.addEventListener('click', () => {
|
|
setEditLock('domain-asset-form', 'edit', { saveBtnId: 'btn-save-domain', revertBtnId: 'btn-revert-domain' });
|
|
});
|
|
|
|
revertBtn?.addEventListener('click', () => {
|
|
setEditLock('domain-asset-form', 'view', { saveBtnId: 'btn-save-domain', revertBtnId: 'btn-revert-domain' });
|
|
if (currentItem) openDomainModal(currentItem);
|
|
});
|
|
|
|
deleteBtn?.addEventListener('click', async () => {
|
|
if (currentItem && confirm(UI_TEXT.MESSAGES.CONFIRM_DELETE)) {
|
|
const success = await deleteAsset('domain', currentItem.id);
|
|
if (success) {
|
|
alert('성공적으로 삭제되었습니다.');
|
|
closeModals();
|
|
window.dispatchEvent(new CustomEvent('refresh-view'));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
export function openDomainModal(item: any = null) {
|
|
currentItem = item;
|
|
const isEdit = !!item;
|
|
const mode = isEdit ? 'view' : 'add';
|
|
|
|
const titleEl = document.getElementById('domain-modal-title');
|
|
if (titleEl) titleEl.textContent = isEdit ? '도메인 정보 상세' : '신규 도메인 등록';
|
|
|
|
setEditLock('domain-asset-form', mode, { saveBtnId: 'btn-save-domain', revertBtnId: 'btn-revert-domain' });
|
|
|
|
const setVal = (id: string, val: any) => {
|
|
const el = document.getElementById(id) as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
|
|
if (el) el.value = val || '';
|
|
};
|
|
|
|
setVal('domain-type', item?.type || '호스팅');
|
|
setVal('domain-corp', item?.corp || '');
|
|
setVal('domain-service-name', item?.service_name || '');
|
|
setVal('domain-name', item?.domain_name || '');
|
|
setVal('domain-start-date', formatExcelDate(item?.start_date));
|
|
setVal('domain-expiry-date', formatExcelDate(item?.expiry_date));
|
|
setVal('domain-price', item?.price || '');
|
|
setVal('domain-manager-main', item?.manager_main || '');
|
|
setVal('domain-manager-sub', item?.manager_sub || '');
|
|
setVal('domain-remarks', item?.remarks || '');
|
|
|
|
const deleteBtn = document.getElementById('btn-delete-domain');
|
|
if (deleteBtn) deleteBtn.style.display = isEdit ? 'block' : 'none';
|
|
|
|
openModal('domain-asset-modal');
|
|
createIcons({ icons: { X, Save, Database, CalendarClock, Edit2 } });
|
|
}
|
|
|
|
async function saveDomain() {
|
|
const getVal = (id: string) => (document.getElementById(id) as HTMLInputElement)?.value || '';
|
|
|
|
const newDomain = {
|
|
id: currentItem ? currentItem.id : `DOM-${Date.now()}`,
|
|
type: getVal('domain-type'),
|
|
corp: getVal('domain-corp'),
|
|
service_name: getVal('domain-service-name'),
|
|
domain_name: getVal('domain-name'),
|
|
start_date: getVal('domain-start-date'),
|
|
expiry_date: getVal('domain-expiry-date'),
|
|
price: getVal('domain-price'),
|
|
manager_main: getVal('domain-manager-main'),
|
|
manager_sub: getVal('domain-manager-sub'),
|
|
remarks: getVal('domain-remarks')
|
|
};
|
|
|
|
if (!newDomain.service_name || !newDomain.domain_name) {
|
|
alert('서비스명과 관리도메인은 필수 입력 사항입니다.');
|
|
return;
|
|
}
|
|
|
|
const success = await saveAsset('domain', newDomain);
|
|
if (success) {
|
|
alert(UI_TEXT.MESSAGES.SAVE_SUCCESS);
|
|
closeModals();
|
|
window.dispatchEvent(new CustomEvent('refresh-view'));
|
|
}
|
|
}
|