import { state } from '../../core/state'; import { openSwModal } from '../../components/Modal/SWModal'; import { openSwUserModal } from '../../components/Modal/SWUserModal'; import { sortAssets, dynamicSort, formatPrice } from '../../core/utils'; import { setupTableSorting, SortState } from '../../core/tableHandler'; import { CORP_LIST } from '../../components/Modal/SharedData'; import { generateOptionsHTML } from '../../components/Modal/ModalUtils'; import { createIcons, Edit2, Users, RefreshCcw } from 'lucide'; export function renderSwList(container: HTMLElement) { const isSub = state.activeSubTab === '구독SW'; const fullList = sortAssets(isSub ? state.masterData.subSw : state.masterData.permSw); let sortState: SortState = { key: '', direction: 'asc' }; const filterBar = document.createElement('div'); filterBar.className = 'search-bar'; filterBar.innerHTML = `
`; container.appendChild(filterBar); const tableWrapper = document.createElement('div'); tableWrapper.className = 'table-container'; const table = document.createElement('table'); table.innerHTML = ` No. 상태 분야 법인 부서 제품명 구매일 시작일 만료일 금액 수량 사용가능 사용자 `; tableWrapper.appendChild(table); container.appendChild(tableWrapper); const tbody = table.querySelector('tbody')!; const updateTable = () => { const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement; const fieldSelect = document.getElementById('filter-field') as HTMLSelectElement; const corpSelect = document.getElementById('filter-corp') as HTMLSelectElement; const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : ''; const field = fieldSelect ? fieldSelect.value : ''; const corp = corpSelect ? corpSelect.value : ''; let filtered = fullList.filter(asset => { const matchKeyword = !keyword || (asset.제품명 || '').toLowerCase().includes(keyword) || (asset.부서 || '').toLowerCase().includes(keyword); const matchField = !field || asset.분야 === field; const matchCorp = !corp || asset.법인 === corp; return matchKeyword && matchField && matchCorp; }); if (sortState.key) { filtered = dynamicSort(filtered, sortState.key, sortState.direction); } tbody.innerHTML = ''; if (filtered.length === 0) { tbody.innerHTML = `검색 결과가 없습니다.`; return; } filtered.forEach((asset, idx) => { const mapping = state.masterData.swUsers.find(u => u.sw_id === asset.id); const assigned = mapping ? (mapping.userData || []).length : 0; const qty = typeof asset.수량 === 'number' ? asset.수량 : parseInt(asset.수량||'0', 10); const avail = qty - assigned; let statusHtml = ''; if (isSub) { let isExpired = false; if (asset.만료일) { const endDateStr = asset.만료일.replace(/\./g, '-'); const endDate = new Date(endDateStr); if (!isNaN(endDate.getTime())) { endDate.setHours(23, 59, 59, 999); if (endDate < new Date()) isExpired = true; } } if (isExpired) statusHtml = `만료`; else statusHtml = `사용중`; } else { let isMaintenance = false; if (asset.시작일 && asset.만료일) { const startDate = new Date(asset.시작일.replace(/\./g, '-')); const endDate = new Date(asset.만료일.replace(/\./g, '-')); const today = new Date(); if (!isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) { endDate.setHours(23, 59, 59, 999); if (today >= startDate && today <= endDate) isMaintenance = true; } } if (isMaintenance) statusHtml = `유지보수`; else statusHtml = `보유중`; } const tr = document.createElement('tr'); tr.style.cursor = 'pointer'; tr.innerHTML = ` ${idx+1} ${statusHtml} ${asset.분야||''} ${asset.법인} ${asset.부서||''} ${asset.제품명} ${asset.구매일||''} ${asset.시작일||''} ${asset.만료일||''} ${formatPrice(asset.금액)} ${qty} ${avail} `; const userBtn = tr.querySelector('.btn-user-mgmt'); userBtn?.addEventListener('click', (e) => { e.stopPropagation(); openSwUserModal(asset); }); tr.addEventListener('click', (e) => { openSwModal(asset, 'view'); }); tbody.appendChild(tr); }); setupTableSorting(table, sortState, (key, dir) => { sortState = { key, direction: dir }; updateTable(); }); createIcons({ icons: { Edit2, Users, RefreshCcw } }); }; document.getElementById('filter-keyword')?.addEventListener('input', updateTable); document.getElementById('filter-field')?.addEventListener('change', updateTable); document.getElementById('filter-corp')?.addEventListener('change', updateTable); document.getElementById('btn-reset-filters')?.addEventListener('click', () => { (document.getElementById('filter-keyword') as HTMLInputElement).value = ''; (document.getElementById('filter-field') as HTMLSelectElement).value = ''; (document.getElementById('filter-corp') as HTMLSelectElement).value = ''; updateTable(); }); updateTable(); }