import { state } from '../../core/state'; import { SoftwareAsset, SWUser } from '../../core/excelHandler'; import { openModal } from './BaseModal'; import { createIcons, Edit2, X, Paperclip } from 'lucide'; let currentSwUserAssetId: string = ''; let tempSwUsers: SWUser[] = []; const SW_USER_MODAL_HTML = ` `; export function initSwUserModal(renderContent: () => void, closeModals: () => void) { if (!document.getElementById('sw-user-modal')) { document.body.insertAdjacentHTML('beforeend', SW_USER_MODAL_HTML); } const btnOpenAddUser = document.getElementById('btn-open-add-user'); const btnSaveEditUser = document.getElementById('btn-save-edit-user'); const btnSaveSwUserMapping = document.getElementById('btn-save-sw-user-mapping'); const btnCancelUserEdit = document.getElementById('btn-cancel-sw-user-edit'); const btnCloseUserEdit = document.getElementById('btn-close-sw-user-edit'); const btnCancelUserModal = document.getElementById('btn-cancel-sw-user-modal'); const btnCloseUserModal = document.getElementById('btn-close-sw-user-modal'); btnOpenAddUser?.addEventListener('click', () => openUserEditModal(-1)); btnSaveEditUser?.addEventListener('click', () => saveUserEdit()); btnSaveSwUserMapping?.addEventListener('click', () => { state.masterData.swUsers = state.masterData.swUsers.filter(u => u.swId !== currentSwUserAssetId); state.masterData.swUsers.push(...tempSwUsers); closeModals(); renderContent(); }); btnCancelUserEdit?.addEventListener('click', () => document.getElementById('sw-user-edit-modal')?.classList.add('hidden')); btnCloseUserEdit?.addEventListener('click', () => document.getElementById('sw-user-edit-modal')?.classList.add('hidden')); btnCancelUserModal?.addEventListener('click', closeModals); btnCloseUserModal?.addEventListener('click', closeModals); } function renderUserList() { const tbody = document.getElementById('user-list-body')!; tbody.innerHTML = ''; if (tempSwUsers.length === 0) { tbody.innerHTML = '할당된 사용자가 없습니다.'; return; } tempSwUsers.forEach((user, idx) => { const tr = document.createElement('tr'); const deptTeam = [user.부서, user.팀].filter(Boolean).join(' / ') || '-'; const attachIcon = user.신청서명 ? `` : '-'; tr.innerHTML = ` ${user.법인} ${deptTeam} ${user.직위 || '-'} ${user.이름} ${user.사용기간 || '-'} ${attachIcon} `; tbody.appendChild(tr); }); createIcons({ icons: { Edit2, X, Paperclip } }); tbody.querySelectorAll('.btn-edit-user').forEach(btn => { btn.addEventListener('click', (e) => { const idx = parseInt((e.currentTarget as HTMLElement).getAttribute('data-idx')!); openUserEditModal(idx); }); }); tbody.querySelectorAll('.btn-remove-user').forEach(btn => { btn.addEventListener('click', (e) => { const idx = parseInt((e.currentTarget as HTMLButtonElement).getAttribute('data-idx')!); tempSwUsers.splice(idx, 1); renderUserList(); }); }); } export function openSwUserModal(asset: SoftwareAsset) { openModal('sw-user-modal'); currentSwUserAssetId = asset.id; tempSwUsers = state.masterData.swUsers.filter(u => u.swId === asset.id).map(u => ({...u})); renderUserList(); } function openUserEditModal(idx: number) { const editModal = document.getElementById('sw-user-edit-modal')!; editModal.classList.remove('hidden'); (document.getElementById('edit-user-idx') as HTMLInputElement).value = String(idx); if (idx === -1) { document.getElementById('sw-user-edit-modal-title')!.innerText = '새 사용자 추가'; (document.getElementById('new-user-법인') as HTMLSelectElement).value = '한맥'; (document.getElementById('new-user-부서') as HTMLInputElement).value = ''; (document.getElementById('new-user-팀') as HTMLInputElement).value = ''; (document.getElementById('new-user-직위') as HTMLInputElement).value = ''; (document.getElementById('new-user-이름') as HTMLInputElement).value = ''; (document.getElementById('new-user-사용기간') as HTMLInputElement).value = ''; (document.getElementById('new-user-신청서') as HTMLInputElement).value = ''; document.getElementById('new-user-신청서명')!.innerText = ''; } else { document.getElementById('sw-user-edit-modal-title')!.innerText = '사용자 정보 수정'; const u = tempSwUsers[idx]; (document.getElementById('new-user-법인') as HTMLSelectElement).value = u.법인; (document.getElementById('new-user-부서') as HTMLInputElement).value = u.부서; (document.getElementById('new-user-팀') as HTMLInputElement).value = u.팀; (document.getElementById('new-user-직위') as HTMLInputElement).value = u.직위; (document.getElementById('new-user-이름') as HTMLInputElement).value = u.이름; (document.getElementById('new-user-사용기간') as HTMLInputElement).value = u.사용기간; (document.getElementById('new-user-신청서') as HTMLInputElement).value = ''; document.getElementById('new-user-신청서명')!.innerText = u.신청서명 ? `첨부: ${u.신청서명}` : ''; } } function saveUserEdit() { const idx = parseInt((document.getElementById('edit-user-idx') as HTMLInputElement).value); const 이름 = (document.getElementById('new-user-이름') as HTMLInputElement).value.trim(); if (!이름) { alert('이름을 입력해주세요.'); return; } const fileInput = document.getElementById('new-user-신청서') as HTMLInputElement; let 신청서명 = ''; if (fileInput.files && fileInput.files.length > 0) { 신청서명 = fileInput.files[0].name; } else if (idx !== -1) { 신청서명 = tempSwUsers[idx].신청서명; } const userData: SWUser = { id: idx === -1 ? Math.random().toString(36).substring(2, 9) : tempSwUsers[idx].id, swId: currentSwUserAssetId, 법인: (document.getElementById('new-user-법인') as HTMLSelectElement).value, 부서: (document.getElementById('new-user-부서') as HTMLInputElement).value, 팀: (document.getElementById('new-user-팀') as HTMLInputElement).value, 직위: (document.getElementById('new-user-직위') as HTMLInputElement).value, 이름, 사용기간: (document.getElementById('new-user-사용기간') as HTMLInputElement).value, 신청서명 }; if (idx === -1) tempSwUsers.push(userData); else tempSwUsers[idx] = userData; document.getElementById('sw-user-edit-modal')?.classList.add('hidden'); renderUserList(); }