release: 0.2.2

This commit is contained in:
2026-01-15 17:24:54 +01:00
parent fb096f7897
commit 835244b7e0
134 changed files with 563 additions and 168 deletions

View File

@ -95,6 +95,30 @@
</div>
</div>
<!-- System Information Section -->
<section id="systemSection" class="panel-section hidden">
<h3><i data-lucide="monitor"></i> System Information</h3>
<div class="metrics" id="systemMetrics">
<div class="metric-card" id="metricCpu">
<div class="label"><i data-lucide="cpu"></i> CPU</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricRam">
<div class="label"><i data-lucide="memory-stick"></i> RAM</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricGpu">
<div class="label"><i data-lucide="monitor"></i> GPU</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricNet">
<div class="label"><i data-lucide="network"></i> Netzwerk</div>
<div class="value">-</div>
</div>
</div>
<div class="text-muted" style="font-size: 0.75rem; margin-top: 0.5rem;">Aktualisierung alle 5 Sekunden.</div>
</section>
<!-- User Management Section -->
<section id="userSection" class="panel-section hidden">
<h3><i data-lucide="users"></i> Nutzerverwaltung</h3>
@ -326,14 +350,24 @@
showApp();
document.getElementById('userSection').classList.remove('hidden');
document.getElementById('updateSection').classList.remove('hidden');
document.getElementById('systemSection').classList.remove('hidden');
await refreshUsers();
await refreshUpdateStatus();
await refreshSystemMetrics();
if (!window.systemMetricsTimer) {
window.systemMetricsTimer = setInterval(refreshSystemMetrics, 5000);
}
return true;
} catch (err) {
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
showLanding();
document.getElementById('userSection').classList.add('hidden');
document.getElementById('updateSection').classList.add('hidden');
document.getElementById('systemSection').classList.add('hidden');
if (window.systemMetricsTimer) {
clearInterval(window.systemMetricsTimer);
window.systemMetricsTimer = null;
}
return false;
}
}
@ -513,6 +547,29 @@
}
}
async function refreshSystemMetrics() {
try {
const data = await api('/system/metrics');
document.querySelector('#metricCpu .value').textContent = `${data.cpu_percent.toFixed(1)}%`;
const ramGb = data.ram_total_mb / 1024.0;
document.querySelector('#metricRam .value').textContent = `${data.ram_used_percent.toFixed(1)}% (${ramGb.toFixed(1)} GB)`;
if (data.gpu_present && data.gpu_vram_total_mb) {
const gpuGb = data.gpu_vram_total_mb / 1024.0;
const gpuPct = data.gpu_vram_used_percent ?? 0;
document.querySelector('#metricGpu .value').textContent = `${gpuPct.toFixed(1)}% (${gpuGb.toFixed(1)} GB)`;
} else {
document.querySelector('#metricGpu .value').textContent = 'Nicht verfuegbar';
}
document.querySelector('#metricNet .value').textContent = `${data.net_rx_mbps.toFixed(1)} / ${data.net_tx_mbps.toFixed(1)} Mbps`;
lucide.createIcons();
} catch (err) {
document.querySelector('#metricCpu .value').textContent = 'Fehler';
document.querySelector('#metricRam .value').textContent = 'Fehler';
document.querySelector('#metricGpu .value').textContent = 'Fehler';
document.querySelector('#metricNet .value').textContent = 'Fehler';
}
}
// Event listeners
document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault();