feat: 하드웨어 자산 관리 고도화 및 자동 이력 시스템 구축

- 통합 원격 접속 정보 UI 구현 (IP/MAC 및 계정 정보 통합)
- 서버 측 스냅샷 비교 기반 자동 이력(Log) 생성 로직 도입
- 타임라인 UI 개선 (이벤트별 색상 뱃지 및 변동 사항 강조)
- 자산 상세 필드 확장 (서비스 구분, 용도 등)
- 테스트 데이터 생성기 및 이력 계획서 추가
This commit is contained in:
2026-06-10 09:51:03 +09:00
parent 25ebaf4685
commit ce1ed40561
10 changed files with 617 additions and 140 deletions

View File

@@ -379,16 +379,21 @@
flex: 1;
overflow-y: auto;
max-height: 500px;
padding-right: 0.5rem;
padding-right: 8px;
margin-top: 8px;
}
.history-item {
position: relative;
padding-left: 1.25rem;
padding-bottom: 1.5rem;
padding-left: 20px;
padding-bottom: 20px;
border-left: 2px solid var(--border-color);
}
.history-item:last-child {
border-left: 2px solid transparent;
}
.history-item::before {
content: '';
position: absolute;
@@ -399,34 +404,68 @@
border-radius: 50%;
background-color: var(--white);
border: 2px solid var(--primary-color);
z-index: 1;
}
.history-item:last-child {
border-left: 2px solid transparent;
/* Event Specific Markers */
.history-item.evt-dept::before { border-color: #3b82f6; }
.history-item.evt-user::before { border-color: #8b5cf6; }
.history-item.evt-role::before { border-color: #10b981; }
.history-item.evt-status::before { border-color: #f59e0b; }
.history-header-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.history-date {
font-size: 0.75rem;
font-size: 11px;
color: var(--text-muted);
font-weight: 500;
margin-bottom: 0.25rem;
}
.history-tag {
font-size: 10px;
font-weight: 700;
padding: 2px 6px;
border-radius: 10px;
text-transform: uppercase;
}
.tag-dept { background: #eff6ff; color: #3b82f6; }
.tag-user { background: #f5f3ff; color: #8b5cf6; }
.tag-role { background: #ecfdf5; color: #10b981; }
.tag-status { background: #fffbeb; color: #f59e0b; }
.tag-default { background: #f3f4f6; color: #6b7280; }
.history-user {
font-size: 0.75rem;
font-size: 11px;
font-weight: 600;
color: var(--primary-color);
margin-bottom: 0.25rem;
color: var(--text-main);
margin-bottom: 6px;
display: block;
}
.history-details {
font-size: 0.8125rem;
font-size: 12.5px;
color: var(--text-main);
line-height: 1.4;
white-space: pre-wrap;
line-height: 1.5;
background: #f8fafc;
padding: 8px 10px;
border-radius: 6px;
border: 1px solid #f1f5f9;
word-break: break-all;
}
.history-arrow {
display: inline-block;
margin: 0 4px;
color: var(--text-muted);
font-weight: 400;
}
.empty-history {
padding: 2rem 0;
text-align: center;
@@ -691,3 +730,100 @@
.location-detail-container select {
flex: 1;
}
/* Dynamic Remote Info Row */
.remote-info-row {
display: flex;
flex-direction: column;
gap: 8px;
padding: 8px 0;
border-bottom: 1px dashed var(--border-color);
}
.remote-info-row:last-child {
border-bottom: none;
}
.ri-line {
display: flex;
gap: 8px;
align-items: center;
}
.ri-line select,
.ri-line input {
height: 38px;
box-sizing: border-box;
font-size: 13px;
padding: 0 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
outline: none;
background-color: var(--white);
color: var(--text-main);
transition: border-color 0.2s;
}
.ri-line select:disabled,
.ri-line input[readonly] {
background-color: var(--bg-muted);
border-color: transparent;
cursor: default;
}
.ri-line select:focus,
.ri-line input:focus {
border-color: var(--primary-color);
box-shadow: 0 0 0 2px rgba(30, 81, 73, 0.1);
}
.ri-type, .ri-tool {
width: 110px;
flex-shrink: 0;
}
.ri-val1, .ri-id, .ri-pw {
flex: 1;
min-width: 0;
}
.ri-remove-btn {
height: 38px;
width: 38px;
padding: 0;
color: #E11D48;
border: 1px solid #E11D48;
background: transparent;
border-radius: 4px;
cursor: pointer;
flex-shrink: 0;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 18px;
transition: all 0.2s;
}
.ri-remove-btn:hover {
background-color: #FFF1F2;
}
.ri-spacer {
width: 46px; /* 38px btn + 8px gap */
flex-shrink: 0;
}
.ri-connector {
width: 24px;
height: 24px;
border-left: 1.5px solid #94a3b8;
border-bottom: 1.5px solid #94a3b8;
margin-top: -24px;
margin-left: 12px;
border-bottom-left-radius: 6px;
flex-shrink: 0;
}
.ri-cred-line {
margin-top: -4px;
}