feat: 자산 카테고리별 6개 전용 테이블 분리 및 백엔드 API, 프론트엔드 상태 관리 전면 개편 (개인PC, 서버, 스토리지, 전산비품, 구독SW, 영구SW)

This commit is contained in:
2026-04-17 17:25:52 +09:00
parent 6904925146
commit 415727a866
11 changed files with 409 additions and 593 deletions

View File

@@ -4,7 +4,7 @@ import { formatInline } from '../../core/utils';
import { createIcons, RefreshCcw } from 'lucide';
export function renderEquipmentList(container: HTMLElement) {
const fullList = state.masterData.hw.filter(a => a.type === '전산비품');
const fullList = state.masterData.equip;
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';

View File

@@ -4,7 +4,7 @@ import { formatInline } from '../../core/utils';
import { createIcons, Paperclip, RefreshCcw } from 'lucide';
export function renderPcList(container: HTMLElement) {
const fullList = state.masterData.hw.filter(a => a.type === '개인PC');
const fullList = state.masterData.pc;
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';

View File

@@ -4,7 +4,7 @@ import { formatInline, createBadge } from '../../core/utils';
import { createIcons, RefreshCcw } from 'lucide';
export function renderServerList(container: HTMLElement) {
const fullList = state.masterData.hw.filter(a => a.type === '서버');
const fullList = state.masterData.server;
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';
@@ -17,7 +17,7 @@ export function renderServerList(container: HTMLElement) {
<input type="text" id="filter-keyword" placeholder="검색어를 입력하세요..." autocomplete="off">
</div>
<div class="search-item">
<label>법인</label>
<label>구매법인</label>
<select id="filter-corp"><option value="">전체 법인</option>${corps.map(c => `<option value="${c}">${c}</option>`).join('')}</select>
</div>
<div class="search-item">
@@ -33,7 +33,7 @@ export function renderServerList(container: HTMLElement) {
const tableWrapper = document.createElement('div');
tableWrapper.className = 'table-container';
const table = document.createElement('table');
table.innerHTML = `<thead><tr><th>No</th><th>법인</th><th>현 사용조직</th><th>자산번호</th><th>용도</th><th>상세</th><th>설치위치</th><th>담당자</th><th>IP주소</th><th>모델명</th><th>OS</th><th>CPU/RAM</th><th>Storage</th><th>관리</th></tr></thead><tbody id="dynamic-tbody"></tbody>`;
table.innerHTML = `<thead><tr><th>No</th><th>구매법인</th><th>현 사용조직</th><th>자산번호</th><th>용도</th><th>상세</th><th>설치위치</th><th>담당자</th><th>IP주소</th><th>모델명</th><th>OS</th><th>CPU/RAM</th><th>Storage</th><th>관리</th></tr></thead><tbody id="dynamic-tbody"></tbody>`;
tableWrapper.appendChild(table);
container.appendChild(tableWrapper);

View File

@@ -4,7 +4,7 @@ import { formatInline } from '../../core/utils';
import { createIcons, RefreshCcw } from 'lucide';
export function renderStorageList(container: HTMLElement) {
const fullList = state.masterData.hw.filter(a => a.type === '스토리지');
const fullList = state.masterData.storage;
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';

View File

@@ -4,8 +4,8 @@ import { openSwUserModal } from '../../components/Modal/SWUserModal';
import { createIcons, Edit2, Users, RefreshCcw } from 'lucide';
export function renderSwList(container: HTMLElement) {
const fullList = state.masterData.sw.filter(a => a.type === state.activeSubTab);
const isSub = state.activeSubTab === '구독SW';
const fullList = isSub ? state.masterData.subSw : state.masterData.permSw;
const filterBar = document.createElement('div');
filterBar.className = 'search-bar';