import { state } from '../../core/state'; import { openHwModal } from '../../components/Modal/HWModal'; 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 renderServerList(container: HTMLElement) { renderPageHeader(container, '서버'); // asset_server 데이터와 asset_pc 데이터 중 '서버PC' 유형만 추출하여 병합 const serverList = state.masterData.server || []; const serverPcList = (state.masterData.pc || []).filter((a: any) => a.asset_type === '서버PC'); const fullList = sortAssets([...serverList, ...serverPcList]); let sortState: SortState = { key: '', direction: 'asc' }; let currentFilters = { keyword: '', loc: '', 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.CURRENT_DEPT.ui} ${ASSET_SCHEMA.ASSET_PURPOSE.ui} ${ASSET_SCHEMA.ASSET_TYPE.ui} 모델/메인보드 ${ASSET_SCHEMA.LOCATION.ui} ${ASSET_SCHEMA.MEMO.ui} `; tableWrapper.appendChild(table); container.appendChild(tableWrapper); const tbody = table.querySelector('tbody')!; const updateTable = () => { let filtered = applyCommonFilters(fullList, currentFilters, ['CURRENT_DEPT', 'MODEL_NAME', 'ASSET_PURPOSE']); 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 || '-'); const modelOrMainboard = asset[ASSET_SCHEMA.MODEL_NAME.key] || asset[ASSET_SCHEMA.ASSET_NAME.key] || asset[ASSET_SCHEMA.MAINBOARD.key] || '-'; tr.innerHTML = ` ${asset[ASSET_SCHEMA.CURRENT_DEPT.key]||'-'} ${formatInline(asset[ASSET_SCHEMA.ASSET_PURPOSE.key]||'-')} ${asset[ASSET_SCHEMA.ASSET_TYPE.key]||'-'} ${formatInline(modelOrMainboard)} ${displayLoc} ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} `; tr.addEventListener('click', () => openHwModal(asset, 'view')); tbody.appendChild(tr); }); setupTableSorting(table, sortState, (key, dir) => { sortState = { key, direction: dir }; updateTable(); }); createIcons({ icons: { RefreshCcw, Plus } }); }; renderFilterBar(filterBar, { keywordLabel: `통합 검색 (${ASSET_SCHEMA.CURRENT_DEPT.ui}/${ASSET_SCHEMA.MODEL_NAME.ui})`, showLoc: true, showDept: true, onFilterChange: (filters) => { currentFilters = filters; updateTable(); } }); // Populate Location Options const locSelect = container.querySelector('#filter-loc') as HTMLSelectElement; if (locSelect) { const locations = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.LOCATION.key]))).filter(Boolean).sort(); locations.forEach(loc => { const opt = document.createElement('option'); opt.value = String(loc); opt.textContent = String(loc); locSelect.appendChild(opt); }); } // 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 = dept; opt.textContent = dept; deptSelect.appendChild(opt); }); } updateTable(); }