import { state } from '../../core/state'; import { openSwModal } from '../../components/Modal/SWModal'; import { openSwUserModal } from '../../components/Modal/SWUserModal'; import { sortAssets, dynamicSort, formatPrice, getActionButtonsHTML } from '../../core/utils'; import { setupTableSorting, SortState } from '../../core/tableHandler'; import { ASSET_SCHEMA } from '../../core/schema'; import { CORP_LIST } from '../../components/Modal/SharedData'; import { generateOptionsHTML } from '../../components/Modal/ModalUtils'; import { createIcons, Edit2, Users, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide'; export function renderSwList(container: HTMLElement) { const isInternal = state.activeSubTab === '내부'; const fullList = sortAssets(isInternal ? state.masterData.swInternal : state.masterData.swExternal); let sortState: SortState = { key: '', direction: 'asc' }; const filterBar = document.createElement('div'); filterBar.className = 'search-bar'; filterBar.innerHTML = `
${getActionButtonsHTML()} `; container.appendChild(filterBar); const tableWrapper = document.createElement('div'); tableWrapper.className = 'table-container'; const table = document.createElement('table'); if (isInternal) { table.innerHTML = ` No. ${ASSET_SCHEMA.SW_FIELD.ui} ${ASSET_SCHEMA.DEV_OBJ.ui} ${ASSET_SCHEMA.SW_STATUS.ui} ${ASSET_SCHEMA.SW_TYPE.ui} ${ASSET_SCHEMA.MEMO.ui} `; } else { table.innerHTML = ` No. 자산명 유형 ${ASSET_SCHEMA.SW_STATUS.ui} ${ASSET_SCHEMA.SW_FIELD.ui} ${ASSET_SCHEMA.CURRENT_DEPT.ui} 현 사용자 구매연월 시작일 만료일 ${ASSET_SCHEMA.MEMO.ui} `; } 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[ASSET_SCHEMA.PRODUCT_NAME.key] || '').toLowerCase().includes(keyword) || (asset[ASSET_SCHEMA.CURRENT_DEPT.key] || '').toLowerCase().includes(keyword); const matchField = !field || asset[ASSET_SCHEMA.SW_FIELD.key] === field; const matchCorp = !corp || asset[ASSET_SCHEMA.PURCHASE_CORP.key] === 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) => { if (isInternal) { const tr = document.createElement('tr'); tr.style.cursor = 'pointer'; tr.innerHTML = ` ${idx+1} ${asset[ASSET_SCHEMA.SW_FIELD.key]||''} ${asset[ASSET_SCHEMA.DEV_OBJ.key]||''} ${asset[ASSET_SCHEMA.SW_STATUS.key]||'보유중'} ${asset[ASSET_SCHEMA.SW_TYPE.key]||'내부'} ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} `; tr.addEventListener('click', () => openSwModal(asset, 'view')); tbody.appendChild(tr); } else { const tr = document.createElement('tr'); tr.style.cursor = 'pointer'; const users = state.masterData.swUsers.filter(u => u.sw_id === asset.id); const userText = users.length > 0 ? `${users[0].user_name}${users.length > 1 ? ' 외 ' + (users.length - 1) : ''}` : '-'; tr.innerHTML = ` ${idx+1} ${asset[ASSET_SCHEMA.PRODUCT_NAME.key]||''} ${asset[ASSET_SCHEMA.ASSET_TYPE.key]||'외부'} ${asset[ASSET_SCHEMA.SW_STATUS.key]||'사용중'} ${asset[ASSET_SCHEMA.SW_FIELD.key]||''} ${asset[ASSET_SCHEMA.CURRENT_DEPT.key]||''} ${userText} ${asset[ASSET_SCHEMA.PURCHASE_DATE.key]||''} ${asset[ASSET_SCHEMA.PURCHASE_DATE.key]||''} ${asset[ASSET_SCHEMA.EXPIRY_DATE.key]||''} ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} `; tr.addEventListener('click', () => openSwModal(asset, 'view')); tbody.appendChild(tr); } }); setupTableSorting(table, sortState, (key, dir) => { sortState = { key, direction: dir }; updateTable(); }); createIcons({ icons: { Edit2, Users, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } }); }; 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(); }