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 { openSwModal } from '../../components/Modal/SWModal';
|
||||
import { openSwUserModal } from '../../components/Modal/SWUserModal';
|
||||
import { sortAssets, formatPrice } from '../../core/utils';
|
||||
import { sortAssets, dynamicSort, formatPrice } from '../../core/utils';
|
||||
import { setupTableSorting, SortState } from '../../core/tableHandler';
|
||||
import { CORP_LIST } from '../../components/Modal/SharedData';
|
||||
import { generateOptionsHTML } from '../../components/Modal/ModalUtils';
|
||||
import { createIcons, Edit2, Users, RefreshCcw } from 'lucide';
|
||||
@@ -10,6 +11,8 @@ export function renderSwList(container: HTMLElement) {
|
||||
const isSub = state.activeSubTab === '구독SW';
|
||||
const fullList = sortAssets(isSub ? state.masterData.subSw : state.masterData.permSw);
|
||||
|
||||
let sortState: SortState = { key: '', direction: 'asc' };
|
||||
|
||||
const filterBar = document.createElement('div');
|
||||
filterBar.className = 'search-bar';
|
||||
filterBar.innerHTML = `
|
||||
@@ -43,17 +46,17 @@ export function renderSwList(container: HTMLElement) {
|
||||
table.innerHTML = `
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:center;">No.</th>
|
||||
<th style="text-align:center;">상태</th>
|
||||
<th style="text-align:center;">분야</th>
|
||||
<th style="text-align:center;">법인</th>
|
||||
<th style="text-align:center;">부서</th>
|
||||
<th style="text-align:center;">제품명</th>
|
||||
<th style="text-align:center;">구매일</th>
|
||||
<th style="text-align:center;">시작일</th>
|
||||
<th style="text-align:center;">만료일</th>
|
||||
<th style="text-align:center;">금액</th>
|
||||
<th style="text-align:center;">수량</th>
|
||||
<th style="text-align:center; width: 50px;">No.</th>
|
||||
<th style="text-align:center;" data-sort="상태">상태</th>
|
||||
<th style="text-align:center;" data-sort="분야">분야</th>
|
||||
<th style="text-align:center;" data-sort="법인">법인</th>
|
||||
<th style="text-align:center;" data-sort="부서">부서</th>
|
||||
<th style="text-align:center;" data-sort="제품명">제품명</th>
|
||||
<th style="text-align:center;" data-sort="구매일">구매일</th>
|
||||
<th style="text-align:center;" data-sort="시작일">시작일</th>
|
||||
<th style="text-align:center;" data-sort="만료일">만료일</th>
|
||||
<th style="text-align:center;" data-sort="금액">금액</th>
|
||||
<th style="text-align:center;" data-sort="수량">수량</th>
|
||||
<th style="text-align:center;">사용가능</th>
|
||||
<th style="text-align:center;">사용자</th>
|
||||
</tr>
|
||||
@@ -74,13 +77,17 @@ export function renderSwList(container: HTMLElement) {
|
||||
const field = fieldSelect ? fieldSelect.value : '';
|
||||
const corp = corpSelect ? corpSelect.value : '';
|
||||
|
||||
const filtered = fullList.filter(asset => {
|
||||
let filtered = fullList.filter(asset => {
|
||||
const matchKeyword = !keyword || (asset.제품명 || '').toLowerCase().includes(keyword) || (asset.부서 || '').toLowerCase().includes(keyword);
|
||||
const matchField = !field || asset.분야 === field;
|
||||
const matchCorp = !corp || asset.법인 === corp;
|
||||
return matchKeyword && matchField && matchCorp;
|
||||
});
|
||||
|
||||
if (sortState.key) {
|
||||
filtered = dynamicSort(filtered, sortState.key, sortState.direction);
|
||||
}
|
||||
|
||||
tbody.innerHTML = '';
|
||||
if (filtered.length === 0) {
|
||||
tbody.innerHTML = `<tr><td colspan="13" style="text-align:center; padding: 3rem; color: var(--text-muted);">검색 결과가 없습니다.</td></tr>`;
|
||||
@@ -155,6 +162,12 @@ export function renderSwList(container: HTMLElement) {
|
||||
});
|
||||
tbody.appendChild(tr);
|
||||
});
|
||||
|
||||
setupTableSorting(table, sortState, (key, dir) => {
|
||||
sortState = { key, direction: dir };
|
||||
updateTable();
|
||||
});
|
||||
|
||||
createIcons({ icons: { Edit2, Users, RefreshCcw } });
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user