import { state } from '../../core/state'; import { openHwModal } from '../../components/Modal/HWModal'; import { sortAssets, formatInline, calculatePcScoreDeductive, getPcGrade, isWindows11Incompatible } from '../../core/utils'; import { ASSET_SCHEMA } from '../../core/schema'; import { createListView } from './ListFactory'; import { SortState } from '../../core/tableHandler'; let persistentSortState: SortState = { key: 'updated_at', direction: 'desc' }; export function renderPcList(container: HTMLElement) { createListView(container, { title: 'PC', persistentSortState, dataSource: () => { const list = (state.masterData.pc || []).filter((a: any) => a.asset_type !== '서버PC'); list.forEach((a: any) => { a['_pc_score'] = calculatePcScoreDeductive(a[ASSET_SCHEMA.CPU.key], a[ASSET_SCHEMA.RAM.key], a[ASSET_SCHEMA.GPU.key], a.purchase_date); }); // 변경일시(updated_at) 내림차순 정렬 (최신 변경 항목이 맨 위로) return list.sort((a: any, b: any) => { const dateA = a.updated_at || a.created_at || ''; const dateB = b.updated_at || b.created_at || ''; if (dateA < dateB) return 1; if (dateA > dateB) return -1; return 0; }); }, searchKeys: ['CURRENT_DEPT', 'CURRENT_USER', 'MODEL_NAME', 'MAC_ADDR', 'MANAGER_MAIN', 'ASSET_TYPE'], filterOptions: { keywordLabel: `통합 검색 (${ASSET_SCHEMA.MODEL_NAME.ui}/${ASSET_SCHEMA.MANAGER_MAIN.ui}/${ASSET_SCHEMA.CURRENT_USER.ui})`, showDept: true, showType: true, showStatus: true }, onRowClick: (asset) => openHwModal(asset, 'view'), columns: [ { header: ASSET_SCHEMA.HW_STATUS.ui, sortKey: ASSET_SCHEMA.HW_STATUS.key, align: 'center', width: '8%', render: a => { const status = a[ASSET_SCHEMA.HW_STATUS.key] || '재고'; let badgeClass = 'badge-light'; if (status === '운영') badgeClass = 'b-green'; else if (status === '재고') badgeClass = 'b-yellow'; else if (status === '수리') badgeClass = 'b-purple'; else if (status === '폐기') badgeClass = 'badge-muted'; return `${status}`; } }, { header: '사용자', sortKey: ASSET_SCHEMA.CURRENT_USER.key, align: 'center', render: a => { const status = a[ASSET_SCHEMA.HW_STATUS.key] || '재고'; return (status === '재고' ? a[ASSET_SCHEMA.PREV_USER.key] : a[ASSET_SCHEMA.CURRENT_USER.key]) || '-'; } }, { header: ASSET_SCHEMA.USER_POSITION.ui, sortKey: ASSET_SCHEMA.USER_POSITION.key, align: 'center', render: a => a[ASSET_SCHEMA.USER_POSITION.key] || '-' }, { header: ASSET_SCHEMA.ASSET_TYPE.ui, sortKey: ASSET_SCHEMA.ASSET_TYPE.key, align: 'center', width: '10%', render: a => a[ASSET_SCHEMA.ASSET_TYPE.key] || '-' }, { header: ASSET_SCHEMA.CPU.ui, sortKey: ASSET_SCHEMA.CPU.key, align: 'center', render: a => a[ASSET_SCHEMA.CPU.key] || '' }, { header: ASSET_SCHEMA.MAINBOARD.ui, sortKey: ASSET_SCHEMA.MAINBOARD.key, align: 'center', render: a => a[ASSET_SCHEMA.MAINBOARD.key] || '-' }, { header: ASSET_SCHEMA.RAM.ui, sortKey: ASSET_SCHEMA.RAM.key, align: 'center', render: a => a[ASSET_SCHEMA.RAM.key] || '' }, { header: ASSET_SCHEMA.GPU.ui, sortKey: ASSET_SCHEMA.GPU.key, align: 'center', render: a => a[ASSET_SCHEMA.GPU.key] || '-' }, { header: 'SSD', align: 'center', width: '8%', render: a => { try { const vols = a.volumes ? (typeof a.volumes === 'string' ? JSON.parse(a.volumes) : a.volumes) : []; if (Array.isArray(vols)) { const ssds = vols.filter((v: any) => v && String(v.type).toUpperCase() === 'SSD'); if (ssds.length > 0) { return ssds.map((v: any) => `${v.capacity || ''}${v.unit || 'GB'}`).join(' / '); } } } catch (e) {} return '-'; } }, { header: 'HDD', align: 'center', width: '12%', render: a => { try { const vols = a.volumes ? (typeof a.volumes === 'string' ? JSON.parse(a.volumes) : a.volumes) : []; if (Array.isArray(vols)) { const hdds = vols.filter((v: any) => v && String(v.type).toUpperCase() === 'HDD'); if (hdds.length > 0) { return hdds.map((v: any) => `${v.capacity || ''}${v.unit || 'GB'}`).join(' / '); } } } catch (e) {} return '-'; } }, { header: ASSET_SCHEMA.MAC_ADDR.ui, sortKey: ASSET_SCHEMA.MAC_ADDR.key, align: 'center', render: a => `${a[ASSET_SCHEMA.MAC_ADDR.key] || '-'}` }, { header: '성능 등급', sortKey: '_pc_score', align: 'center', width: '8%', render: a => { const score = a._pc_score !== undefined ? a._pc_score : calculatePcScoreDeductive(a[ASSET_SCHEMA.CPU.key], a[ASSET_SCHEMA.RAM.key], a[ASSET_SCHEMA.GPU.key], a.purchase_date); const isWin11Incompatible = isWindows11Incompatible(a[ASSET_SCHEMA.CPU.key], a[ASSET_SCHEMA.RAM.key]); const grade = getPcGrade(score, isWin11Incompatible); return `${grade.name}`; } } ] }); }