import { state } from '../../core/state'; import { BaseModal } from './BaseModal'; import { createIcons, Edit2, X, Paperclip, Calendar, Plus } from 'lucide'; import { ORG_LIST } from './SharedData'; import { generateOptionsHTML, setFieldValue, getFieldValue, applyDateMask } from './ModalUtils'; class SwUserModal extends BaseModal { private tempSwUsers: any[] = []; constructor() { super('sw-user', '소프트웨어 사용자 관리'); } protected renderFrameHTML(): string { return ` `; } protected initChildLogic(onSave: () => void, closeModals: () => void): void { const mainSaveBtn = document.getElementById('btn-save-sw-user')!; const addUserBtn = document.getElementById('btn-open-add-user')!; const confirmUserBtn = document.getElementById('btn-confirm-user-edit')!; ['new-user-시작일', 'new-user-종료일'].forEach(id => { const el = document.getElementById(id) as HTMLInputElement; if (el) applyDateMask(el); }); addUserBtn.addEventListener('click', () => this.openUserEditSubModal()); confirmUserBtn.addEventListener('click', () => this.saveUserDataToList()); mainSaveBtn.addEventListener('click', () => { if (!this.currentAsset) return; const existingIdx = state.masterData.swUsers.findIndex(u => u.sw_id === this.currentAsset!.id); const newMapping = { sw_id: this.currentAsset!.id, userData: this.tempSwUsers.map(u => [u.조직, u.부서, u.직위, u.이름, u.사용기간, u.신청서명]) }; if (existingIdx > -1) state.masterData.swUsers[existingIdx] = newMapping as any; else state.masterData.swUsers.push(newMapping as any); onSave(); this.close(); closeModals(); }); document.getElementById('btn-close-sw-user-modal')?.addEventListener('click', () => this.close()); document.getElementById('btn-cancel-sw-user')?.addEventListener('click', () => this.close()); const subModal = document.getElementById('sw-user-edit-modal')!; const closeSub = () => subModal.classList.add('hidden'); document.getElementById('btn-close-user-edit')?.addEventListener('click', closeSub); document.getElementById('btn-close-user-sub')?.addEventListener('click', closeSub); createIcons({ icons: { X, Plus, Calendar, Edit2, Paperclip } }); } protected fillFormData(asset: any): void { const swInfo = document.getElementById('sw-user-sw-info')!; swInfo.innerHTML = `
${asset.purchase_corp || asset.법인 || ''}
${asset.product_name || asset.제품명 || ''}
`; const existingMapping = state.masterData.swUsers.find(u => u.sw_id === asset.id); this.tempSwUsers = existingMapping ? (existingMapping.userData || []).map((u: any) => ({ 조직: u[0], 부서: u[1], 직위: u[2], 이름: u[3], 사용기간: u[4], 신청서명: u[5] })) : []; this.renderUserList(); } protected onAfterOpen(): void {} private renderUserList() { const tbody = document.getElementById('sw-user-table-body')!; if (!tbody) return; tbody.innerHTML = ''; if (this.tempSwUsers.length === 0) { tbody.innerHTML = '할당된 사용자가 없습니다.'; return; } this.tempSwUsers.forEach((user, idx) => { const tr = document.createElement('tr'); tr.innerHTML = ` ${user.조직 || ''} ${user.부서 || ''} ${user.직위 || ''} ${user.이름 || ''} ${user.사용기간 || ''} ${user.신청서명 ? '' : '-'}
`; tbody.appendChild(tr); }); tbody.querySelectorAll('.btn-edit-user').forEach(btn => { btn.addEventListener('click', (e) => { const idx = parseInt((e.currentTarget as HTMLElement).getAttribute('data-idx')!); this.openUserEditSubModal(idx); }); }); tbody.querySelectorAll('.btn-del-user').forEach(btn => { btn.addEventListener('click', (e) => { const idx = parseInt((e.currentTarget as HTMLElement).getAttribute('data-idx')!); if (confirm('사용자 할당을 삭제하시겠습니까?')) { this.tempSwUsers.splice(idx, 1); this.renderUserList(); } }); }); createIcons({ icons: { Paperclip } }); } private openUserEditSubModal(idx: number = -1) { const subModal = document.getElementById('sw-user-edit-modal')!; const form = document.getElementById('sw-user-edit-form') as HTMLFormElement; form.reset(); setFieldValue('edit-user-index', idx); if (idx > -1) { const user = this.tempSwUsers[idx]; setFieldValue('new-user-조직', user.조직); setFieldValue('new-user-부서', user.부서); setFieldValue('new-user-직위', user.직위); setFieldValue('new-user-이름', user.이름); if (user.사용기간 && user.사용기간.includes('~')) { const parts = user.사용기간.split('~'); setFieldValue('new-user-시작일', parts[0].trim()); setFieldValue('new-user-종료일', parts[1].trim()); } } subModal.classList.remove('hidden'); } private saveUserDataToList() { const idx = parseInt(getFieldValue('edit-user-index')); const 신청서Input = document.getElementById('new-user-신청서') as HTMLInputElement; const 신청서명 = 신청서Input.files && 신청서Input.files.length > 0 ? 신청서Input.files[0].name : (idx > -1 ? this.tempSwUsers[idx].신청서명 : ''); const userData: any = { 조직: getFieldValue('new-user-조직'), 부서: getFieldValue('new-user-부서'), 직위: getFieldValue('new-user-직위'), 이름: getFieldValue('new-user-이름'), 사용기간: `${getFieldValue('new-user-시작일')} ~ ${getFieldValue('new-user-종료일')}`, 신청서명 }; if (idx === -1) this.tempSwUsers.push(userData); else this.tempSwUsers[idx] = userData; document.getElementById('sw-user-edit-modal')?.classList.add('hidden'); this.renderUserList(); } } export const swUserModal = new SwUserModal(); export function initSwUserModal(onSave: () => void, closeModals: () => void) { swUserModal.init(onSave, closeModals); } export function openSwUserModal(asset: any) { swUserModal.open(asset); }