import { state } from '../../core/state'; import { formatInline, sortAssets, dynamicSort, renderPageHeader } from '../../core/utils'; import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema'; import { setupTableSorting, SortState } from '../../core/tableHandler'; import { renderFilterBar, applyCommonFilters } from '../../core/filterHandler'; import { createIcons, RefreshCcw, Plus } from 'lucide'; /** * 비용관리 자산 목록 뷰 */ export function renderCostList(container: HTMLElement) { renderPageHeader(container, '비용관리'); const fullList = sortAssets(state.masterData.cloud?.filter((a: any) => a.category === '비용관리') || []); let sortState: SortState = { key: '', direction: 'asc' }; let currentFilters = { keyword: '', corp: '', dept: '', field: '' }; const filterBar = document.createElement('div'); filterBar.className = 'search-bar'; container.appendChild(filterBar); const tableWrapper = document.createElement('div'); tableWrapper.className = 'table-container'; const table = document.createElement('table'); table.innerHTML = ` ${ASSET_SCHEMA.ASSET_TYPE.ui} ${ASSET_SCHEMA.ASSET_PURPOSE.ui} 현 사용자 ${ASSET_SCHEMA.LOCATION.ui} ${ASSET_SCHEMA.EMAIL_ACCOUNT.ui} ${ASSET_SCHEMA.MEMO.ui} `; tableWrapper.appendChild(table); container.appendChild(tableWrapper); const tbody = table.querySelector('tbody')!; const updateTable = () => { let filtered = applyCommonFilters(fullList, currentFilters, ['PRODUCT_NAME', 'MANAGER_MAIN', 'EMAIL_ACCOUNT']); if (sortState.key) { filtered = dynamicSort(filtered, sortState.key, sortState.direction); } tbody.innerHTML = ''; if (filtered.length === 0) { tbody.innerHTML = `${UI_TEXT.MESSAGES.NO_DATA}`; return; } filtered.forEach((asset, idx) => { const tr = document.createElement('tr'); tr.style.cursor = 'pointer'; const loc = asset[ASSET_SCHEMA.LOCATION.key] || ''; const detail = asset[ASSET_SCHEMA.LOC_DETAIL.key] || ''; const displayLoc = detail ? `${loc}(${detail})` : (loc || '-'); tr.innerHTML = ` ${asset[ASSET_SCHEMA.ASSET_TYPE.key] || ''} ${formatInline(asset[ASSET_SCHEMA.ASSET_PURPOSE.key] || '-')} ${asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '-'} ${displayLoc} ${asset[ASSET_SCHEMA.EMAIL_ACCOUNT.key] || '-'} ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} `; tr.addEventListener('click', () => alert('상세 정보 준비 중입니다.')); tbody.appendChild(tr); }); setupTableSorting(table, sortState, (key, dir) => { sortState = { key, direction: dir }; updateTable(); }); createIcons({ icons: { RefreshCcw, Plus } }); }; renderFilterBar(filterBar, { keywordLabel: `통합 검색 (${ASSET_SCHEMA.PRODUCT_NAME.ui}/${ASSET_SCHEMA.MANAGER_MAIN.ui})`, showCorp: true, showDept: true, onFilterChange: (filters) => { currentFilters = filters; updateTable(); } }); // Populate Dept Options const deptSelect = container.querySelector('#filter-dept') as HTMLSelectElement; if (deptSelect) { const orgUnits = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.CURRENT_DEPT.key]))).filter(Boolean).sort(); orgUnits.forEach(dept => { const opt = document.createElement('option'); opt.value = String(dept); opt.textContent = String(dept); deptSelect.appendChild(opt); }); } updateTable(); }