= { '대여중': 'primary', '보관중': 'success', '수리중': 'danger', '기타': 'muted' };
- const statusValue = asset[ASSET_SCHEMA.STATUS.key] || '보관중';
- const statusType = statusColors[statusValue] || 'muted';
- const statusBadge = `${statusValue}`;
const mainManager = asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '';
- const subManager = asset[ASSET_SCHEMA.MANAGER_SUB.key] || '';
- const managerHtml = [
- mainManager ? `${createBadge('정', 'primary')} ${mainManager}` : '',
- subManager ? `${createBadge('부', 'muted')} ${subManager}` : ''
- ].filter(v => v !== '').join(' / ');
-
+
tr.innerHTML = `
- | ${idx + 1} |
- ${statusBadge} |
- ${asset[ASSET_SCHEMA.CORP.key]} |
- ${asset[ASSET_SCHEMA.ASSET_CODE.key] || '-'} |
- ${formatInline(asset[ASSET_SCHEMA.MODEL.key] || asset.명칭)} |
- ${asset[ASSET_SCHEMA.STORE_LOC.key] || '-'} |
- ${managerHtml || '-'} |
- ${asset[ASSET_SCHEMA.PURCHASE_YM.key] || ''} |
- ${Number(asset[ASSET_SCHEMA.PRICE.key]||0).toLocaleString()} |
+ ${idx+1} |
+ ${asset[ASSET_SCHEMA.HW_STATUS.key] || '운영중'} |
+ ${asset[ASSET_SCHEMA.PURCHASE_CORP.key] || ''} |
+ ${asset[ASSET_SCHEMA.MODEL_NAME.key] || ''} |
+ ${asset[ASSET_SCHEMA.LOCATION.key] || '-'} |
+ ${asset[ASSET_SCHEMA.PURCHASE_DATE.key] || ''} |
+ ${Number(asset[ASSET_SCHEMA.PURCHASE_AMOUNT.key]||0).toLocaleString()} |
+ ${mainManager} |
`;
tr.addEventListener('click', () => openHwModal(asset, 'view'));
tbody.appendChild(tr);
@@ -118,7 +106,7 @@ export function renderMobileList(container: HTMLElement) {
updateTable();
});
- createIcons({ icons: { RefreshCcw } });
+ createIcons({ icons: { Paperclip, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } });
};
document.getElementById('filter-keyword')?.addEventListener('input', updateTable);
diff --git a/src/views/List/NetworkListView.ts b/src/views/List/NetworkListView.ts
new file mode 100644
index 0000000..02d0ad0
--- /dev/null
+++ b/src/views/List/NetworkListView.ts
@@ -0,0 +1,110 @@
+import { state } from '../../core/state';
+import { openHwModal } from '../../components/Modal/HWModal';
+import { formatInline, createBadge, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
+import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
+import { setupTableSorting, SortState } from '../../core/tableHandler';
+import { createIcons, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
+
+/**
+ * 네트워크 자산 목록 뷰
+ */
+export function renderNetworkList(container: HTMLElement) {
+ const fullList = sortAssets(state.masterData.network || []);
+ let sortState: SortState = { key: '', direction: 'asc' };
+
+ const filterBar = document.createElement('div');
+ filterBar.className = 'search-bar';
+ filterBar.innerHTML = `
+
+
+
+
+
+ ${getActionButtonsHTML()}
+ `;
+ container.appendChild(filterBar);
+
+ const tableWrapper = document.createElement('div');
+ tableWrapper.className = 'table-container';
+ const table = document.createElement('table');
+ table.innerHTML = `
+
+
+ | No. |
+ ${ASSET_SCHEMA.HW_STATUS.ui} |
+ 현 사용자 |
+ ${ASSET_SCHEMA.ASSET_TYPE.ui} |
+ ${ASSET_SCHEMA.ASSET_MFR.ui} |
+ ${ASSET_SCHEMA.MODEL_NAME.ui} |
+ ${ASSET_SCHEMA.ASSET_COUNT.ui} |
+ ${ASSET_SCHEMA.LOCATION.ui}(건물) |
+ ${ASSET_SCHEMA.LOC_DETAIL.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
+
+
+
+ `;
+
+ tableWrapper.appendChild(table);
+ container.appendChild(tableWrapper);
+ const tbody = table.querySelector('tbody')!;
+
+ const updateTable = () => {
+ const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement;
+ const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : '';
+
+ let filtered = fullList.filter(asset => {
+ const matchKeyword = !keyword ||
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.ASSET_MFR.key]||'').toLowerCase().includes(keyword);
+ return matchKeyword;
+ });
+
+ 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';
+ tr.innerHTML = `
+ ${idx + 1} |
+ ${asset[ASSET_SCHEMA.HW_STATUS.key] || '운영중'} |
+ ${asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '-'} |
+ ${asset[ASSET_SCHEMA.ASSET_TYPE.key] || ''} |
+ ${asset[ASSET_SCHEMA.ASSET_MFR.key] || ''} |
+ ${formatInline(asset[ASSET_SCHEMA.MODEL_NAME.key] || '-')} |
+ ${asset[ASSET_SCHEMA.ASSET_COUNT.key] || '1'} |
+ ${asset[ASSET_SCHEMA.LOCATION.key] || '-'} |
+ ${asset[ASSET_SCHEMA.LOC_DETAIL.key] || '-'} |
+ ${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, Download, Upload, FileSpreadsheet, Plus } });
+ };
+
+ document.getElementById('filter-keyword')?.addEventListener('input', updateTable);
+ document.getElementById('btn-reset-filters')?.addEventListener('click', () => {
+ (document.getElementById('filter-keyword') as HTMLInputElement).value = '';
+ updateTable();
+ });
+
+ updateTable();
+}
diff --git a/src/views/List/PcListView.ts b/src/views/List/PcListView.ts
index 25da0c4..6882a1b 100644
--- a/src/views/List/PcListView.ts
+++ b/src/views/List/PcListView.ts
@@ -1,9 +1,9 @@
import { state } from '../../core/state';
import { openHwModal } from '../../components/Modal/HWModal';
-import { formatInline, createBadge, sortAssets, dynamicSort } from '../../core/utils';
+import { formatInline, createBadge, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
import { setupTableSorting, SortState } from '../../core/tableHandler';
-import { createIcons, Paperclip, RefreshCcw } from 'lucide';
+import { createIcons, Paperclip, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
/**
* PC 자산 목록 뷰
@@ -16,20 +16,21 @@ export function renderPcList(container: HTMLElement) {
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';
- const corps = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.CORP.key]))).filter(Boolean).sort();
+ const corps = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.PURCHASE_CORP.key]))).filter(Boolean).sort();
filterBar.innerHTML = `
-
+
-
+
+ ${getActionButtonsHTML()}
`;
container.appendChild(filterBar);
@@ -40,18 +41,19 @@ export function renderPcList(container: HTMLElement) {
| No |
- ${ASSET_SCHEMA.CORP.ui} |
- ${ASSET_SCHEMA.ORG.ui} |
- ${ASSET_SCHEMA.ASSET_CODE.ui} |
- ${ASSET_SCHEMA.USER.ui} |
- ${ASSET_SCHEMA.MAINBOARD.ui} |
+ ${ASSET_SCHEMA.CURRENT_DEPT.ui} |
+ ${ASSET_SCHEMA.CURRENT_USER.ui} |
+ ${ASSET_SCHEMA.MANAGER_MAIN.ui} |
${ASSET_SCHEMA.CPU.ui} |
+ ${ASSET_SCHEMA.MAINBOARD.ui} |
${ASSET_SCHEMA.RAM.ui} |
- Storage |
- ${ASSET_SCHEMA.PURCHASE_YM.ui} |
- ${ASSET_SCHEMA.PRICE.ui} |
- ${ASSET_SCHEMA.DOC_NAME.ui} |
- 담당자(정/부) |
+ ${ASSET_SCHEMA.GPU.ui} |
+ SSD1 |
+ SSD2 |
+ HDD1 |
+ HDD2 |
+ ${ASSET_SCHEMA.MAC_ADDR.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
@@ -70,11 +72,12 @@ export function renderPcList(container: HTMLElement) {
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) ||
- String(asset[ASSET_SCHEMA.ORG.key]||'').toLowerCase().includes(keyword) ||
- String(asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'').toLowerCase().includes(keyword);
- const matchCorp = !corp || asset[ASSET_SCHEMA.CORP.key] === corp;
+ String(asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.CURRENT_DEPT.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MAC_ADDR.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.CURRENT_USER.key]||'').toLowerCase().includes(keyword);
+ const matchCorp = !corp || asset[ASSET_SCHEMA.PURCHASE_CORP.key] === corp;
return matchKeyword && matchCorp;
});
@@ -84,7 +87,7 @@ export function renderPcList(container: HTMLElement) {
tbody.innerHTML = '';
if (filtered.length === 0) {
- tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
+ tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
return;
}
@@ -92,29 +95,21 @@ export function renderPcList(container: HTMLElement) {
const tr = document.createElement('tr');
tr.style.cursor = 'pointer';
- const storage = [asset[ASSET_SCHEMA.STORAGE1.key], asset[ASSET_SCHEMA.STORAGE2.key]].filter(v => v).join(' / ');
-
- const mainManager = asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '';
- const subManager = asset[ASSET_SCHEMA.MANAGER_SUB.key] || '';
- const managerHtml = [
- mainManager ? `${createBadge('정', 'primary')} ${mainManager}` : '',
- subManager ? `${createBadge('부', 'muted')} ${subManager}` : ''
- ].filter(v => v !== '').join(' / ');
-
tr.innerHTML = `
${idx+1} |
- ${asset[ASSET_SCHEMA.CORP.key]} |
- ${asset[ASSET_SCHEMA.ORG.key]||'-'} |
- ${asset[ASSET_SCHEMA.ASSET_CODE.key]} |
- ${asset[ASSET_SCHEMA.USER.key]||''} |
- ${asset[ASSET_SCHEMA.MAINBOARD.key]||'-'} |
+ ${asset[ASSET_SCHEMA.CURRENT_DEPT.key]||'-'} |
+ ${asset[ASSET_SCHEMA.CURRENT_USER.key]||'-'} |
+ ${asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'-'} |
${asset[ASSET_SCHEMA.CPU.key]||''} |
+ ${asset[ASSET_SCHEMA.MAINBOARD.key]||'-'} |
${asset[ASSET_SCHEMA.RAM.key]||''} |
- ${formatInline(storage)} |
- ${asset[ASSET_SCHEMA.PURCHASE_YM.key] || ''} |
- ${Number(asset[ASSET_SCHEMA.PRICE.key]||0).toLocaleString()} |
- ${asset[ASSET_SCHEMA.DOC_NAME.key] ? '' : '-'} |
- ${managerHtml || '-'} |
+ ${asset[ASSET_SCHEMA.GPU.key]||'-'} |
+ ${asset[ASSET_SCHEMA.SSD1.key]||'-'} |
+ ${asset[ASSET_SCHEMA.SSD2.key]||'-'} |
+ ${asset[ASSET_SCHEMA.HDD1.key]||'-'} |
+ ${asset[ASSET_SCHEMA.HDD2.key]||'-'} |
+ ${asset[ASSET_SCHEMA.MAC_ADDR.key]||'-'} |
+ ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} |
`;
tr.addEventListener('click', () => openHwModal(asset, 'view'));
tbody.appendChild(tr);
diff --git a/src/views/List/PcPartListView.ts b/src/views/List/PcPartListView.ts
new file mode 100644
index 0000000..5f190eb
--- /dev/null
+++ b/src/views/List/PcPartListView.ts
@@ -0,0 +1,112 @@
+import { state } from '../../core/state';
+import { openHwModal } from '../../components/Modal/HWModal';
+import { formatInline, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
+import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
+import { setupTableSorting, SortState } from '../../core/tableHandler';
+import { createIcons, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
+
+/**
+ * PC부품 자산 목록 뷰
+ */
+export function renderPcPartList(container: HTMLElement) {
+ // PC부품 데이터는 survey 또는 별도 테이블에 있을 수 있음. 여기선 equipment에서 필터링하거나 빈 배열 지원
+ const fullList = sortAssets(state.masterData.equipment?.filter((a: any) => a.category === 'PC부품') || []);
+ let sortState: SortState = { key: '', direction: 'asc' };
+
+ const filterBar = document.createElement('div');
+ filterBar.className = 'search-bar';
+ filterBar.innerHTML = `
+
+
+
+
+
+ ${getActionButtonsHTML()}
+ `;
+ container.appendChild(filterBar);
+
+ const tableWrapper = document.createElement('div');
+ tableWrapper.className = 'table-container';
+ const table = document.createElement('table');
+ table.innerHTML = `
+
+
+ | No. |
+ ${ASSET_SCHEMA.HW_STATUS.ui} |
+ ${ASSET_SCHEMA.ASSET_TYPE.ui} |
+ ${ASSET_SCHEMA.ASSET_MFR.ui} |
+ ${ASSET_SCHEMA.MODEL_NAME.ui} |
+ ${ASSET_SCHEMA.VOLUME.ui} |
+ ${ASSET_SCHEMA.MONITOR_INCH.ui} |
+ ${ASSET_SCHEMA.ASSET_COUNT.ui} |
+ ${ASSET_SCHEMA.LOCATION.ui}(건물) |
+ ${ASSET_SCHEMA.LOC_DETAIL.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
+
+
+
+ `;
+
+ tableWrapper.appendChild(table);
+ container.appendChild(tableWrapper);
+ const tbody = table.querySelector('tbody')!;
+
+ const updateTable = () => {
+ const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement;
+ const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : '';
+
+ let filtered = fullList.filter(asset => {
+ const matchKeyword = !keyword ||
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.ASSET_TYPE.key]||'').toLowerCase().includes(keyword);
+ return matchKeyword;
+ });
+
+ 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';
+ tr.innerHTML = `
+ ${idx + 1} |
+ ${asset[ASSET_SCHEMA.HW_STATUS.key] || '보관중'} |
+ ${asset[ASSET_SCHEMA.ASSET_TYPE.key] || ''} |
+ ${asset[ASSET_SCHEMA.ASSET_MFR.key] || ''} |
+ ${formatInline(asset[ASSET_SCHEMA.MODEL_NAME.key] || '-')} |
+ ${asset[ASSET_SCHEMA.VOLUME.key] || '-'} |
+ ${asset[ASSET_SCHEMA.MONITOR_INCH.key] || '-'} |
+ ${asset[ASSET_SCHEMA.ASSET_COUNT.key] || '1'} |
+ ${asset[ASSET_SCHEMA.LOCATION.key] || '-'} |
+ ${asset[ASSET_SCHEMA.LOC_DETAIL.key] || '-'} |
+ ${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, Download, Upload, FileSpreadsheet, Plus } });
+ };
+
+ document.getElementById('filter-keyword')?.addEventListener('input', updateTable);
+ document.getElementById('btn-reset-filters')?.addEventListener('click', () => {
+ (document.getElementById('filter-keyword') as HTMLInputElement).value = '';
+ updateTable();
+ });
+
+ updateTable();
+}
diff --git a/src/views/List/ServerListView.ts b/src/views/List/ServerListView.ts
index d215ffc..8c47a03 100644
--- a/src/views/List/ServerListView.ts
+++ b/src/views/List/ServerListView.ts
@@ -1,9 +1,9 @@
import { state } from '../../core/state';
import { openHwModal } from '../../components/Modal/HWModal';
-import { formatInline, createBadge, sortAssets, dynamicSort } from '../../core/utils';
+import { formatInline, createBadge, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
import { setupTableSorting, SortState } from '../../core/tableHandler';
-import { createIcons, RefreshCcw } from 'lucide';
+import { createIcons, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
/**
* 서버 자산 목록 뷰
@@ -16,25 +16,26 @@ export function renderServerList(container: HTMLElement) {
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';
- const corps = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.CORP.key]))).filter(Boolean).sort();
- const orgUnits = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.ORG.key]))).filter(Boolean).sort();
+ const corps = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.PURCHASE_CORP.key]))).filter(Boolean).sort();
+ const orgUnits = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.CURRENT_DEPT.key]))).filter(Boolean).sort();
filterBar.innerHTML = `
-
+
-
+
-
+
+ ${getActionButtonsHTML()}
`;
container.appendChild(filterBar);
@@ -45,13 +46,12 @@ export function renderServerList(container: HTMLElement) {
| No |
- ${ASSET_SCHEMA.CORP.ui} |
- ${ASSET_SCHEMA.ORG.ui} |
- ${ASSET_SCHEMA.ASSET_CODE.ui} |
- ${ASSET_SCHEMA.DETAIL_PURPOSE.ui} |
- 상세 |
- ${ASSET_SCHEMA.LOCATION.ui} |
- 담당자(정/부) |
+ ${ASSET_SCHEMA.CURRENT_DEPT.ui} |
+ ${ASSET_SCHEMA.ASSET_PURPOSE.ui} |
+ ${ASSET_SCHEMA.MODEL_NAME.ui} |
+ ${ASSET_SCHEMA.LOCATION.ui}(건물) |
+ ${ASSET_SCHEMA.LOC_DETAIL.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
@@ -72,11 +72,11 @@ export function renderServerList(container: HTMLElement) {
let filtered = fullList.filter(asset => {
const matchKeyword = !keyword ||
- String(asset[ASSET_SCHEMA.ASSET_CODE.key]||'').toLowerCase().includes(keyword) ||
- String(asset[ASSET_SCHEMA.ORG.key]||'').toLowerCase().includes(keyword) ||
- String(asset[ASSET_SCHEMA.MODEL.key]||'').toLowerCase().includes(keyword);
- const matchCorp = !corp || asset[ASSET_SCHEMA.CORP.key] === corp;
- const matchOrg = !orgUnit || asset[ASSET_SCHEMA.ORG.key] === orgUnit;
+ String(asset[ASSET_SCHEMA.CURRENT_DEPT.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.ASSET_PURPOSE.key]||'').toLowerCase().includes(keyword);
+ const matchCorp = !corp || asset[ASSET_SCHEMA.PURCHASE_CORP.key] === corp;
+ const matchOrg = !orgUnit || asset[ASSET_SCHEMA.CURRENT_DEPT.key] === orgUnit;
return matchKeyword && matchCorp && matchOrg;
});
@@ -86,7 +86,7 @@ export function renderServerList(container: HTMLElement) {
tbody.innerHTML = '';
if (filtered.length === 0) {
- tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
+ tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
return;
}
@@ -94,22 +94,14 @@ export function renderServerList(container: HTMLElement) {
const tr = document.createElement('tr');
tr.style.cursor = 'pointer';
- const mainManager = asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '';
- const subManager = asset[ASSET_SCHEMA.MANAGER_SUB.key] || '';
- const managerHtml = [
- mainManager ? `${createBadge('정', 'primary')} ${mainManager}` : '',
- subManager ? `${createBadge('부', 'muted')} ${subManager}` : ''
- ].filter(v => v !== '').join(' / ');
-
tr.innerHTML = `
${idx+1} |
- ${asset[ASSET_SCHEMA.CORP.key]} |
- ${asset[ASSET_SCHEMA.ORG.key]||'-'} |
- ${asset[ASSET_SCHEMA.ASSET_CODE.key]} |
- ${formatInline(asset[ASSET_SCHEMA.DETAIL_PURPOSE.key])} |
- ${formatInline(asset.상세)} |
+ ${asset[ASSET_SCHEMA.CURRENT_DEPT.key]||'-'} |
+ ${formatInline(asset[ASSET_SCHEMA.ASSET_PURPOSE.key])} |
+ ${formatInline(asset[ASSET_SCHEMA.MODEL_NAME.key]||asset[ASSET_SCHEMA.ASSET_NAME.key]||'-')} |
${formatInline(asset[ASSET_SCHEMA.LOCATION.key])} |
- ${managerHtml || '-'} |
+ ${formatInline(asset[ASSET_SCHEMA.LOC_DETAIL.key]||'-')} |
+ ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} |
`;
tr.addEventListener('click', () => openHwModal(asset, 'view'));
tbody.appendChild(tr);
@@ -132,5 +124,5 @@ export function renderServerList(container: HTMLElement) {
});
updateTable();
- createIcons({ icons: { RefreshCcw } });
+ createIcons({ icons: { RefreshCcw, Download, Upload, FileSpreadsheet, Plus } });
}
diff --git a/src/views/List/SpaceInfoListView.ts b/src/views/List/SpaceInfoListView.ts
new file mode 100644
index 0000000..96d1106
--- /dev/null
+++ b/src/views/List/SpaceInfoListView.ts
@@ -0,0 +1,106 @@
+import { state } from '../../core/state';
+import { openHwModal } from '../../components/Modal/HWModal';
+import { formatInline, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
+import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
+import { setupTableSorting, SortState } from '../../core/tableHandler';
+import { createIcons, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
+
+/**
+ * 공간정보장비 자산 목록 뷰
+ */
+export function renderSpaceInfoList(container: HTMLElement) {
+ // 공간정보장비 데이터는 survey 또는 별도 테이블에 있을 수 있음.
+ const fullList = sortAssets(state.masterData.equipment?.filter((a: any) => a.category === '공간정보장비') || []);
+ let sortState: SortState = { key: '', direction: 'asc' };
+
+ const filterBar = document.createElement('div');
+ filterBar.className = 'search-bar';
+ filterBar.innerHTML = `
+
+
+
+
+
+ ${getActionButtonsHTML()}
+ `;
+ container.appendChild(filterBar);
+
+ const tableWrapper = document.createElement('div');
+ tableWrapper.className = 'table-container';
+ const table = document.createElement('table');
+ table.innerHTML = `
+
+
+ | No. |
+ ${ASSET_SCHEMA.HW_STATUS.ui} |
+ 현 사용자 |
+ 자산명 |
+ ${ASSET_SCHEMA.ASSET_TYPE.ui} |
+ ${ASSET_SCHEMA.LOCATION.ui}(건물) |
+ ${ASSET_SCHEMA.LOC_DETAIL.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
+
+
+
+ `;
+
+ tableWrapper.appendChild(table);
+ container.appendChild(tableWrapper);
+ const tbody = table.querySelector('tbody')!;
+
+ const updateTable = () => {
+ const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement;
+ const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : '';
+
+ let filtered = fullList.filter(asset => {
+ const matchKeyword = !keyword ||
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||asset[ASSET_SCHEMA.PRODUCT_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'').toLowerCase().includes(keyword);
+ return matchKeyword;
+ });
+
+ 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';
+ tr.innerHTML = `
+ ${idx + 1} |
+ ${asset[ASSET_SCHEMA.HW_STATUS.key] || '운영중'} |
+ ${asset[ASSET_SCHEMA.MANAGER_MAIN.key] || '-'} |
+ ${formatInline(asset[ASSET_SCHEMA.PRODUCT_NAME.key] || asset[ASSET_SCHEMA.MODEL_NAME.key] || '-')} |
+ ${asset[ASSET_SCHEMA.ASSET_TYPE.key] || ''} |
+ ${asset[ASSET_SCHEMA.LOCATION.key] || '-'} |
+ ${asset[ASSET_SCHEMA.LOC_DETAIL.key] || '-'} |
+ ${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, Download, Upload, FileSpreadsheet, Plus } });
+ };
+
+ document.getElementById('filter-keyword')?.addEventListener('input', updateTable);
+ document.getElementById('btn-reset-filters')?.addEventListener('click', () => {
+ (document.getElementById('filter-keyword') as HTMLInputElement).value = '';
+ updateTable();
+ });
+
+ updateTable();
+}
diff --git a/src/views/List/StorageListView.ts b/src/views/List/StorageListView.ts
index 1ba89d7..0f6b684 100644
--- a/src/views/List/StorageListView.ts
+++ b/src/views/List/StorageListView.ts
@@ -1,9 +1,9 @@
import { state } from '../../core/state';
import { openHwModal } from '../../components/Modal/HWModal';
-import { formatInline, createBadge, sortAssets, dynamicSort } from '../../core/utils';
+import { formatInline, createBadge, sortAssets, dynamicSort, getActionButtonsHTML } from '../../core/utils';
import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
import { setupTableSorting, SortState } from '../../core/tableHandler';
-import { createIcons, RefreshCcw } from 'lucide';
+import { createIcons, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
/**
* 스토리지 자산 목록 뷰
@@ -16,25 +16,26 @@ export function renderStorageList(container: HTMLElement) {
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';
- const corps = Array.from(new Set(fullList.map(a => (a as any)[ASSET_SCHEMA.CORP.key]))).filter(Boolean).sort();
- const orgUnits = Array.from(new Set(fullList.map(a => (a as any)[ASSET_SCHEMA.ORG.key]))).filter(Boolean).sort();
+ const corps = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.PURCHASE_CORP.key]))).filter(Boolean).sort();
+ const orgUnits = Array.from(new Set(fullList.map(a => a[ASSET_SCHEMA.CURRENT_DEPT.key]))).filter(Boolean).sort();
filterBar.innerHTML = `
-
+
-
+
-
+
+ ${getActionButtonsHTML()}
`;
container.appendChild(filterBar);
@@ -45,13 +46,15 @@ export function renderStorageList(container: HTMLElement) {
| No |
- ${ASSET_SCHEMA.CORP.ui} |
- ${ASSET_SCHEMA.ORG.ui} |
- ${ASSET_SCHEMA.ASSET_CODE.ui} |
- 용도 |
- 상세 |
- ${ASSET_SCHEMA.LOCATION.ui} |
- 담당자(정/부) |
+ ${ASSET_SCHEMA.HW_STATUS.ui} |
+ 현 사용자 |
+ ${ASSET_SCHEMA.ASSET_TYPE.ui} |
+ ${ASSET_SCHEMA.VOLUME.ui} |
+ ${ASSET_SCHEMA.MODEL_NAME.ui} |
+ ${ASSET_SCHEMA.SERIAL_NUM.ui} |
+ ${ASSET_SCHEMA.LOCATION.ui}(건물) |
+ ${ASSET_SCHEMA.LOC_DETAIL.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
@@ -68,14 +71,15 @@ export function renderStorageList(container: HTMLElement) {
const keyword = keywordInput ? keywordInput.value.toLowerCase().trim() : '';
const corp = corpSelect ? corpSelect.value : '';
- const orgUnit = orgSelect ? orgSelect.value : '';
+ const orgUnit = orgSelect ? orgUnit.value : '';
let filtered = fullList.filter(asset => {
const matchKeyword = !keyword ||
- String((asset as any)[ASSET_SCHEMA.ASSET_CODE.key]||'').toLowerCase().includes(keyword) ||
- String((asset as any)[ASSET_SCHEMA.ORG.key]||'').toLowerCase().includes(keyword);
- const matchCorp = !corp || (asset as any)[ASSET_SCHEMA.CORP.key] === corp;
- const matchOrg = !orgUnit || (asset as any)[ASSET_SCHEMA.ORG.key] === orgUnit;
+ String(asset[ASSET_SCHEMA.MODEL_NAME.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'').toLowerCase().includes(keyword) ||
+ String(asset[ASSET_SCHEMA.SERIAL_NUM.key]||'').toLowerCase().includes(keyword);
+ const matchCorp = !corp || asset[ASSET_SCHEMA.PURCHASE_CORP.key] === corp;
+ const matchOrg = !orgUnit || asset[ASSET_SCHEMA.CURRENT_DEPT.key] === orgUnit;
return matchKeyword && matchCorp && matchOrg;
});
@@ -85,7 +89,7 @@ export function renderStorageList(container: HTMLElement) {
tbody.innerHTML = '';
if (filtered.length === 0) {
- tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
+ tbody.innerHTML = `| ${UI_TEXT.MESSAGES.NO_DATA} |
`;
return;
}
@@ -93,22 +97,17 @@ export function renderStorageList(container: HTMLElement) {
const tr = document.createElement('tr');
tr.style.cursor = 'pointer';
- const mainManager = (asset as any)[ASSET_SCHEMA.MANAGER_MAIN.key] || '';
- const subManager = (asset as any)[ASSET_SCHEMA.MANAGER_SUB.key] || '';
- const managerHtml = [
- mainManager ? `${createBadge('정', 'primary')} ${mainManager}` : '',
- subManager ? `${createBadge('부', 'muted')} ${subManager}` : ''
- ].filter(v => v !== '').join(' / ');
-
tr.innerHTML = `
${idx+1} |
- ${(asset as any)[ASSET_SCHEMA.CORP.key]} |
- ${(asset as any)[ASSET_SCHEMA.ORG.key]||'-'} |
- ${(asset as any)[ASSET_SCHEMA.ASSET_CODE.key]} |
- ${formatInline(asset.용도)} |
- ${formatInline(asset.상세)} |
- ${formatInline((asset as any)[ASSET_SCHEMA.LOCATION.key])} |
- ${managerHtml || '-'} |
+ ${asset[ASSET_SCHEMA.HW_STATUS.key]||'-'} |
+ ${asset[ASSET_SCHEMA.MANAGER_MAIN.key]||'-'} |
+ ${asset[ASSET_SCHEMA.ASSET_TYPE.key]||'-'} |
+ ${asset[ASSET_SCHEMA.VOLUME.key]||'-'} |
+ ${formatInline(asset[ASSET_SCHEMA.MODEL_NAME.key]||asset[ASSET_SCHEMA.ASSET_NAME.key]||'-')} |
+ ${asset[ASSET_SCHEMA.SERIAL_NUM.key]||'-'} |
+ ${formatInline(asset[ASSET_SCHEMA.LOCATION.key])} |
+ ${formatInline(asset[ASSET_SCHEMA.LOC_DETAIL.key]||'-')} |
+ ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} |
`;
tr.addEventListener('click', () => openHwModal(asset, 'view'));
tbody.appendChild(tr);
@@ -131,5 +130,5 @@ export function renderStorageList(container: HTMLElement) {
});
updateTable();
- createIcons({ icons: { RefreshCcw } });
+ createIcons({ icons: { RefreshCcw, Download, Upload, FileSpreadsheet, Plus } });
}
diff --git a/src/views/List/SwListView.ts b/src/views/List/SwListView.ts
index 945ce54..6899f60 100644
--- a/src/views/List/SwListView.ts
+++ b/src/views/List/SwListView.ts
@@ -1,15 +1,16 @@
import { state } from '../../core/state';
import { openSwModal } from '../../components/Modal/SWModal';
import { openSwUserModal } from '../../components/Modal/SWUserModal';
-import { sortAssets, dynamicSort, formatPrice } from '../../core/utils';
+import { sortAssets, dynamicSort, formatPrice, getActionButtonsHTML } from '../../core/utils';
import { setupTableSorting, SortState } from '../../core/tableHandler';
+import { ASSET_SCHEMA } from '../../core/schema';
import { CORP_LIST } from '../../components/Modal/SharedData';
import { generateOptionsHTML } from '../../components/Modal/ModalUtils';
-import { createIcons, Edit2, Users, RefreshCcw } from 'lucide';
+import { createIcons, Edit2, Users, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } from 'lucide';
export function renderSwList(container: HTMLElement) {
- const isSub = state.activeSubTab === '구독SW';
- const fullList = sortAssets(isSub ? state.masterData.subSw : state.masterData.permSw);
+ const isInternal = state.activeSubTab === '내부';
+ const fullList = sortAssets(isInternal ? state.masterData.swInternal : state.masterData.swExternal);
let sortState: SortState = { key: '', direction: 'asc' };
@@ -17,11 +18,11 @@ export function renderSwList(container: HTMLElement) {
filterBar.className = 'search-bar';
filterBar.innerHTML = `
-
+
-
+
-
+
+ ${getActionButtonsHTML()}
`;
container.appendChild(filterBar);
const tableWrapper = document.createElement('div');
tableWrapper.className = 'table-container';
const table = document.createElement('table');
- table.innerHTML = `
-
-
- | No. |
- 상태 |
- 분야 |
- 법인 |
- 부서 |
- 제품명 |
- 구매일 |
- 시작일 |
- 만료일 |
- 금액 |
- 수량 |
- 사용가능 |
- 사용자 |
-
-
-
- `;
+
+ if (isInternal) {
+ table.innerHTML = `
+
+
+ | No. |
+ ${ASSET_SCHEMA.SW_FIELD.ui} |
+ ${ASSET_SCHEMA.DEV_OBJ.ui} |
+ ${ASSET_SCHEMA.SW_STATUS.ui} |
+ ${ASSET_SCHEMA.SW_TYPE.ui} |
+ ${ASSET_SCHEMA.MEMO.ui} |
+
+
+
+ `;
+ } else {
+ table.innerHTML = `
+
+
+ | No. |
+ 자산명 |
+ 유형 |
+ ${ASSET_SCHEMA.SW_STATUS.ui} |
+ ${ASSET_SCHEMA.SW_FIELD.ui} |
+ ${ASSET_SCHEMA.CURRENT_DEPT.ui} |
+ 현 사용자 |
+ 구매연월 |
+ 시작일 |
+ 만료일 |
+ ${ASSET_SCHEMA.MEMO.ui} |
+
+
+
+ `;
+ }
tableWrapper.appendChild(table);
container.appendChild(tableWrapper);
@@ -78,9 +95,11 @@ export function renderSwList(container: HTMLElement) {
const corp = corpSelect ? corpSelect.value : '';
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;
+ const matchKeyword = !keyword ||
+ (asset[ASSET_SCHEMA.PRODUCT_NAME.key] || '').toLowerCase().includes(keyword) ||
+ (asset[ASSET_SCHEMA.CURRENT_DEPT.key] || '').toLowerCase().includes(keyword);
+ const matchField = !field || asset[ASSET_SCHEMA.SW_FIELD.key] === field;
+ const matchCorp = !corp || asset[ASSET_SCHEMA.PURCHASE_CORP.key] === corp;
return matchKeyword && matchField && matchCorp;
});
@@ -90,76 +109,46 @@ export function renderSwList(container: HTMLElement) {
tbody.innerHTML = '';
if (filtered.length === 0) {
- tbody.innerHTML = `| 검색 결과가 없습니다. |
`;
+ tbody.innerHTML = `| 검색 결과가 없습니다. |
`;
return;
}
filtered.forEach((asset, idx) => {
- const assigned = state.masterData.swUsers.filter(u => u.sw_id === asset.id).length;
- const qty = typeof asset.수량 === 'number' ? asset.수량 : parseInt(asset.수량||'0', 10);
- const avail = qty - assigned;
-
- let statusHtml = '';
- if (isSub) {
- let isExpired = false;
- if (asset.만료일) {
- const endDateStr = asset.만료일.replace(/\./g, '-');
- const endDate = new Date(endDateStr);
- if (!isNaN(endDate.getTime())) {
- endDate.setHours(23, 59, 59, 999);
- if (endDate < new Date()) isExpired = true;
- }
- }
- if (isExpired) statusHtml = `만료`;
- else statusHtml = `사용중`;
+ if (isInternal) {
+ const tr = document.createElement('tr');
+ tr.style.cursor = 'pointer';
+ tr.innerHTML = `
+ ${idx+1} |
+ ${asset[ASSET_SCHEMA.SW_FIELD.key]||''} |
+ ${asset[ASSET_SCHEMA.DEV_OBJ.key]||''} |
+ ${asset[ASSET_SCHEMA.SW_STATUS.key]||'보유중'} |
+ ${asset[ASSET_SCHEMA.SW_TYPE.key]||'내부'} |
+ ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} |
+ `;
+ tr.addEventListener('click', () => openSwModal(asset, 'view'));
+ tbody.appendChild(tr);
} else {
- let isMaintenance = false;
- if (asset.시작일 && asset.만료일) {
- const startDate = new Date(asset.시작일.replace(/\./g, '-'));
- const endDate = new Date(asset.만료일.replace(/\./g, '-'));
- const today = new Date();
- if (!isNaN(startDate.getTime()) && !isNaN(endDate.getTime())) {
- endDate.setHours(23, 59, 59, 999);
- if (today >= startDate && today <= endDate) isMaintenance = true;
- }
- }
- if (isMaintenance) statusHtml = `유지보수`;
- else statusHtml = `보유중`;
- }
+ const tr = document.createElement('tr');
+ tr.style.cursor = 'pointer';
+ const users = state.masterData.swUsers.filter(u => u.sw_id === asset.id);
+ const userText = users.length > 0 ? `${users[0].user_name}${users.length > 1 ? ' 외 ' + (users.length - 1) : ''}` : '-';
- const tr = document.createElement('tr');
- tr.style.cursor = 'pointer';
-
- tr.innerHTML = `
- ${idx+1} |
- ${statusHtml} |
- ${asset.분야||''} |
- ${asset.법인} |
- ${asset.부서||''} |
- ${asset.제품명} |
- ${asset.구매일||''} |
- ${asset.시작일||''} |
- ${asset.만료일||''} |
- ${formatPrice(asset.금액)} |
- ${qty} |
- ${avail} |
-
-
- |
- `;
-
- const userBtn = tr.querySelector('.btn-user-mgmt');
- userBtn?.addEventListener('click', (e) => {
- e.stopPropagation();
- openSwUserModal(asset);
- });
-
- tr.addEventListener('click', (e) => {
- openSwModal(asset, 'view');
- });
- tbody.appendChild(tr);
+ tr.innerHTML = `
+ ${idx+1} |
+ ${asset[ASSET_SCHEMA.PRODUCT_NAME.key]||''} |
+ ${asset[ASSET_SCHEMA.ASSET_TYPE.key]||'외부'} |
+ ${asset[ASSET_SCHEMA.SW_STATUS.key]||'사용중'} |
+ ${asset[ASSET_SCHEMA.SW_FIELD.key]||''} |
+ ${asset[ASSET_SCHEMA.CURRENT_DEPT.key]||''} |
+ ${userText} |
+ ${asset[ASSET_SCHEMA.PURCHASE_DATE.key]||''} |
+ ${asset[ASSET_SCHEMA.PURCHASE_DATE.key]||''} |
+ ${asset[ASSET_SCHEMA.EXPIRY_DATE.key]||''} |
+ ${formatInline(asset[ASSET_SCHEMA.MEMO.key]||'-')} |
+ `;
+ tr.addEventListener('click', () => openSwModal(asset, 'view'));
+ tbody.appendChild(tr);
+ }
});
setupTableSorting(table, sortState, (key, dir) => {
@@ -167,7 +156,7 @@ export function renderSwList(container: HTMLElement) {
updateTable();
});
- createIcons({ icons: { Edit2, Users, RefreshCcw } });
+ createIcons({ icons: { Edit2, Users, RefreshCcw, Download, Upload, FileSpreadsheet, Plus } });
};
document.getElementById('filter-keyword')?.addEventListener('input', updateTable);
diff --git a/src/views/SW_Table.ts b/src/views/SW_Table.ts
index 0cc05bb..dd94b86 100644
--- a/src/views/SW_Table.ts
+++ b/src/views/SW_Table.ts
@@ -7,6 +7,12 @@ import { renderMobileList } from './List/MobileListView';
import { renderSwList } from './List/SwListView';
import { renderCloudList } from './List/CloudListView';
import { renderDomainList } from './List/DomainListView';
+import { renderNetworkList } from './List/NetworkListView';
+import { renderPcPartList } from './List/PcPartListView';
+import { renderSpaceInfoList } from './List/SpaceInfoListView';
+import { renderGiftList } from './List/GiftListView';
+import { renderFacilityList } from './List/FacilityListView';
+import { renderCostList } from './List/CostListView';
import { createIcons, Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, RefreshCcw } from 'lucide';
/**
@@ -24,26 +30,38 @@ export function renderSWTable(mainContent: HTMLElement) {
const tab = state.activeSubTab;
if (state.activeCategory === 'hw') {
- if (tab === '개인PC') renderPcList(container);
+ if (tab === 'PC') renderPcList(container);
else if (tab === '서버') renderServerList(container);
else if (tab === '스토리지') renderStorageList(container);
- else if (tab === '전산비품') renderEquipmentList(container);
- else if (tab === '모바일기기') renderMobileList(container);
+ else if (tab === '업무지원장비') renderEquipmentList(container);
+ else if (tab === '네트워크') renderNetworkList(container);
+ else if (tab === 'PC부품') renderPcPartList(container);
+ else if (tab === '공간정보장비') renderSpaceInfoList(container);
else {
container.innerHTML = `"${tab}" 탭에 대한 하드웨어 리스트 뷰가 정의되지 않았습니다.
`;
}
} else if (state.activeCategory === 'sw') {
- if (tab === '구독SW' || tab === '영구SW') {
+ if (tab === '외부' || tab === '내부') {
renderSwList(container);
- } else if (tab === '클라우드') {
- renderCloudList(container);
} else {
container.innerHTML = `"${tab}" 탭에 대한 소프트웨어 리스트 뷰가 정의되지 않았습니다.
`;
}
} else if (state.activeCategory === 'ops') {
if (tab === '도메인') renderDomainList(container);
+ else if (tab === '클라우드') renderCloudList(container);
+ else if (tab === '비용관리') renderCostList(container);
else {
- container.innerHTML = `운영 서비스(${tab}) 관리 기능은 현재 준비 중입니다.
`;
+ container.innerHTML = `"${tab}" 탭에 대한 운영지원 리스트 뷰가 정의되지 않았습니다.
`;
+ }
+ } else if (state.activeCategory === 'vip') {
+ if (tab === '선물') renderGiftList(container);
+ else {
+ container.innerHTML = `내빈/외빈(${tab}) 관리 기능은 현재 준비 중입니다.
`;
+ }
+ } else if (state.activeCategory === 'fac') {
+ if (tab === '사무가구') renderFacilityList(container);
+ else {
+ container.innerHTML = `시설자산(${tab}) 관리 기능은 현재 준비 중입니다.
`;
}
}