115 lines
5.3 KiB
TypeScript
115 lines
5.3 KiB
TypeScript
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})`,
|
|
showLoc: true,
|
|
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 `<span class="badge ${badgeClass}">${status}</span>`;
|
|
}
|
|
},
|
|
{ header: ASSET_SCHEMA.CURRENT_USER.ui, sortKey: ASSET_SCHEMA.CURRENT_USER.key, align: 'center', render: a => 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 => `<span style="font-family:monospace; font-size:11px;">${a[ASSET_SCHEMA.MAC_ADDR.key] || '-'}</span>`
|
|
},
|
|
{
|
|
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 `<span class="badge ${grade.class}" title="성능 점수: ${score}점">${grade.name}</span>`;
|
|
}
|
|
}
|
|
]
|
|
});
|
|
}
|