Implement global table sorting, dashboard UI enhancements, and secret cloud access
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
import { state } from '../../core/state';
|
||||
import { openHwModal } from '../../components/Modal/HWModal';
|
||||
import { formatInline, createBadge, sortAssets } from '../../core/utils';
|
||||
import { formatInline, createBadge, sortAssets, dynamicSort } from '../../core/utils';
|
||||
import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
|
||||
import { setupTableSorting, SortState } from '../../core/tableHandler';
|
||||
import { createIcons, Paperclip, RefreshCcw } from 'lucide';
|
||||
|
||||
/**
|
||||
@@ -10,6 +11,7 @@ import { createIcons, Paperclip, RefreshCcw } from 'lucide';
|
||||
*/
|
||||
export function renderPcList(container: HTMLElement) {
|
||||
const fullList = sortAssets(state.masterData.pc);
|
||||
let sortState: SortState = { key: '', direction: 'asc' };
|
||||
|
||||
const filterBar = document.createElement('div');
|
||||
filterBar.className = 'search-bar';
|
||||
@@ -37,19 +39,19 @@ export function renderPcList(container: HTMLElement) {
|
||||
table.innerHTML = `
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:center;">No</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.CORP.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.ORG.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.ASSET_CODE.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.USER.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.LOCATION.ui}</th>
|
||||
<th style="text-align:center;">담당자(정/부)</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.MAINBOARD.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.CPU.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.RAM.ui}</th>
|
||||
<th style="text-align:center;">Storage</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.PURCHASE_YM.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.PRICE.ui}</th>
|
||||
<th style="text-align:center; width:50px;">No</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.CORP.key}">${ASSET_SCHEMA.CORP.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.ORG.key}">${ASSET_SCHEMA.ORG.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.ASSET_CODE.key}">${ASSET_SCHEMA.ASSET_CODE.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.USER.key}">${ASSET_SCHEMA.USER.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.LOCATION.key}">${ASSET_SCHEMA.LOCATION.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.MANAGER_MAIN.key}">담당자(정/부)</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.MAINBOARD.key}">${ASSET_SCHEMA.MAINBOARD.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.CPU.key}">${ASSET_SCHEMA.CPU.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.RAM.key}">${ASSET_SCHEMA.RAM.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.STORAGE1.key}">Storage</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.PURCHASE_YM.key}">${ASSET_SCHEMA.PURCHASE_YM.ui}</th>
|
||||
<th style="text-align:center;" data-sort="${ASSET_SCHEMA.PRICE.key}">${ASSET_SCHEMA.PRICE.ui}</th>
|
||||
<th style="text-align:center;">${ASSET_SCHEMA.DOC_NAME.ui}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -67,7 +69,7 @@ export function renderPcList(container: HTMLElement) {
|
||||
const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : '';
|
||||
const corp = corpSelect ? corpSelect.value : '';
|
||||
|
||||
const filtered = fullList.filter(asset => {
|
||||
let filtered = fullList.filter(asset => {
|
||||
const matchKeyword = !keyword ||
|
||||
String(asset[ASSET_SCHEMA.ASSET_CODE.key]||'').toLowerCase().includes(keyword) ||
|
||||
String(asset[ASSET_SCHEMA.USER.key]||'').toLowerCase().includes(keyword) ||
|
||||
@@ -77,6 +79,10 @@ export function renderPcList(container: HTMLElement) {
|
||||
return matchKeyword && matchCorp;
|
||||
});
|
||||
|
||||
if (sortState.key) {
|
||||
filtered = dynamicSort(filtered, sortState.key, sortState.direction);
|
||||
}
|
||||
|
||||
tbody.innerHTML = '';
|
||||
if (filtered.length === 0) {
|
||||
tbody.innerHTML = `<tr><td colspan="14" style="text-align:center; padding: 3rem; color: var(--text-muted);">${UI_TEXT.MESSAGES.NO_DATA}</td></tr>`;
|
||||
@@ -115,6 +121,12 @@ export function renderPcList(container: HTMLElement) {
|
||||
tr.addEventListener('click', () => openHwModal(asset, 'view'));
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
|
||||
setupTableSorting(table, sortState, (key, dir) => {
|
||||
sortState = { key, direction: dir };
|
||||
updateTable();
|
||||
});
|
||||
|
||||
createIcons({ icons: { Paperclip, RefreshCcw } });
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user