feat: monitoring view

This commit is contained in:
2025-09-20 12:49:44 +02:00
parent e0e86f88a9
commit c13d544e54
5 changed files with 920 additions and 3 deletions

View File

@@ -1357,7 +1357,7 @@ p {
}
/* Special handling for cluster and firmware views to ensure proper width */
#cluster-view.active, #firmware-view.active {
#cluster-view.active, #firmware-view.active, #monitoring-view.active {
display: flex; /* Use flex display for proper layout */
flex-direction: column; /* Stack content vertically */
overflow-y: auto; /* Allow vertical scrolling */
@@ -3987,3 +3987,314 @@ html {
border-color: rgba(139, 92, 246, 0.5) !important;
background: rgba(139, 92, 246, 0.08) !important;
}
/* Monitoring View Styles */
.monitoring-section {
background: var(--bg-secondary);
border-radius: 16px;
backdrop-filter: var(--backdrop-blur);
box-shadow: var(--shadow-primary);
border: 1px solid var(--border-primary);
padding: 1rem;
margin-bottom: 1rem;
position: relative;
overflow: visible;
}
.monitoring-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
}
.monitoring-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--border-primary);
}
.monitoring-header h2 {
color: var(--text-primary);
margin: 0;
font-size: 1.5rem;
font-weight: 600;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.monitoring-content {
display: flex;
flex-direction: column;
gap: 1.5rem;
}
/* Cluster Summary Styles */
.cluster-summary-content {
/*background: var(--bg-tertiary);
border-radius: 12px;
padding: 1.5rem;
border: 1px solid var(--border-primary);*/
}
.summary-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.5rem;
}
.summary-header h3 {
color: var(--text-primary);
margin: 0;
font-size: 1.25rem;
font-weight: 600;
}
.last-updated {
color: var(--text-secondary);
font-size: 0.875rem;
opacity: 0.8;
}
.summary-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
.stat-card {
background: var(--bg-primary);
border-radius: 10px;
padding: 1.25rem;
border: 1px solid var(--border-primary);
display: flex;
align-items: center;
gap: 1rem;
transition: all 0.2s ease;
}
.stat-card:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.stat-icon {
font-size: 2rem;
opacity: 0.8;
}
.stat-content {
flex: 1;
}
.stat-label {
color: var(--text-secondary);
font-size: 0.875rem;
margin-bottom: 0.25rem;
}
.stat-value {
color: var(--text-primary);
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.5rem;
}
.stat-utilization {
display: flex;
align-items: center;
gap: 0.5rem;
}
.utilization-bar {
flex: 1;
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
overflow: hidden;
}
.utilization-fill {
height: 100%;
background: linear-gradient(90deg, #4ade80, #22c55e);
border-radius: 3px;
transition: width 0.3s ease;
}
.utilization-text {
color: var(--text-secondary);
font-size: 0.75rem;
font-weight: 500;
min-width: 3rem;
}
/* Nodes Monitoring Styles */
.nodes-monitoring-content h3 {
color: var(--text-primary);
margin: 0 0 1rem 0;
font-size: 1.25rem;
font-weight: 600;
}
.nodes-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
}
.node-card {
background: var(--bg-tertiary);
border-radius: 12px;
padding: 1.25rem;
border: 1px solid var(--border-primary);
transition: all 0.2s ease;
}
.node-card:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.node-card.error {
border-color: rgba(239, 68, 68, 0.3);
background: rgba(239, 68, 68, 0.05);
}
.node-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid var(--border-primary);
}
.node-title {
color: var(--text-primary);
font-size: 1.1rem;
font-weight: 600;
}
.node-ip {
color: var(--text-secondary);
font-size: 0.875rem;
font-family: 'Courier New', monospace;
}
.node-status {
margin-bottom: 0.75rem;
}
.status-badge {
display: inline-block;
padding: 0.25rem 0.5rem;
border-radius: 6px;
font-size: 0.75rem;
font-weight: 500;
}
.status-badge.error {
background: rgba(239, 68, 68, 0.2);
color: #fca5a5;
border: 1px solid rgba(239, 68, 68, 0.3);
}
.status-badge.success {
background: rgba(34, 197, 94, 0.2);
color: #86efac;
border: 1px solid rgba(34, 197, 94, 0.3);
}
.status-badge.warning {
background: rgba(245, 158, 11, 0.2);
color: #fcd34d;
border: 1px solid rgba(245, 158, 11, 0.3);
}
.node-error {
color: var(--text-secondary);
font-size: 0.875rem;
font-style: italic;
}
.node-resources {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.resource-item {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.resource-label {
color: var(--text-secondary);
font-size: 0.875rem;
font-weight: 500;
}
.resource-value {
color: var(--text-primary);
font-size: 1rem;
font-weight: 600;
}
.resource-utilization {
display: flex;
align-items: center;
gap: 0.5rem;
}
/* Error and Loading States */
.error {
text-align: center;
padding: 2rem;
color: #fca5a5;
background: rgba(239, 68, 68, 0.05);
border: 1px solid rgba(239, 68, 68, 0.2);
border-radius: 8px;
}
.no-data {
text-align: center;
padding: 2rem;
color: var(--text-secondary);
background: var(--bg-tertiary);
border: 1px solid var(--border-primary);
border-radius: 8px;
}
/* Responsive Design */
@media (max-width: 768px) {
.summary-stats {
grid-template-columns: 1fr;
}
.nodes-grid {
grid-template-columns: 1fr;
}
.monitoring-header {
flex-direction: column;
gap: 1rem;
align-items: flex-start;
}
.stat-card {
flex-direction: column;
text-align: center;
gap: 0.75rem;
}
.stat-icon {
font-size: 1.5rem;
}
}