// Linux BenchTools - Dashboard Logic // Access utilities and API const utils = window.BenchUtils; const apiClient = window.BenchAPI; // Global state let allDevices = []; let isLoading = false; let apiToken = null; let iperfServer = null; // Load backend config (API token, etc.) async function loadBackendConfig() { try { const response = await fetch(`${window.BenchConfig.backendApiUrl}/config`); if (response.ok) { const config = await response.json(); apiToken = config.api_token; iperfServer = config.iperf_server || '10.0.0.50'; updateBenchCommandDisplay(); } else { console.error('Failed to load backend config - HTTP', response.status); // Set default values to allow the page to render apiToken = 'LOADING_ERROR'; iperfServer = '10.0.0.50'; updateBenchCommandDisplay(); } } catch (error) { console.error('Failed to load backend config:', error); // Set default values to allow the page to render apiToken = 'LOADING_ERROR'; iperfServer = '10.0.0.50'; updateBenchCommandDisplay(); } } // Load dashboard data async function loadDashboard() { if (isLoading) return; isLoading = true; updateRefreshButton(true); try { await Promise.all([ loadStats(), loadTopDevices() ]); // Update last refresh time updateLastRefreshTime(); } catch (error) { console.error('Failed to load dashboard:', error); utils.showToast('Erreur lors du chargement des données', 'error'); } finally { isLoading = false; updateRefreshButton(false); } } // Update refresh button state function updateRefreshButton(loading) { const btn = document.getElementById('refreshBtn'); if (!btn) return; if (loading) { btn.disabled = true; btn.innerHTML = '⏳ Chargement...'; } else { btn.disabled = false; btn.innerHTML = '🔄 Actualiser'; } } async function backupDatabase() { const btn = document.getElementById('backupBtn'); if (btn) { btn.disabled = true; btn.textContent = '💾 Backup...'; } try { const result = await apiClient.backupDatabase(); const files = (result.backups || []).map(b => b.filename).join(', '); utils.showToast(`Backup créé${files ? `: ${files}` : ''}`, 'success'); } catch (error) { console.error('Backup failed:', error); utils.showToast(`Backup échoué: ${error.message}`, 'error'); } finally { if (btn) { btn.disabled = false; btn.textContent = '💾 Backup DB'; } } } // Update last refresh time function updateLastRefreshTime() { const element = document.getElementById('lastUpdate'); if (!element) return; const now = new Date(); element.textContent = `Mis à jour: ${now.toLocaleTimeString('fr-FR')}`; } // Load statistics async function loadStats() { try { const devices = await apiClient.getDevices({ page_size: 100 }); const totalDevices = devices.total || 0; let totalBenchmarks = 0; let scoreSum = 0; let scoreCount = 0; let lastBenchDate = null; // Calculate stats from devices devices.items.forEach(device => { if (device.last_benchmark) { totalBenchmarks++; if (device.last_benchmark.global_score !== null) { scoreSum += device.last_benchmark.global_score; scoreCount++; } const benchDate = new Date(device.last_benchmark.run_at); if (!lastBenchDate || benchDate > lastBenchDate) { lastBenchDate = benchDate; } } }); const avgScore = scoreCount > 0 ? Math.ceil(scoreSum / scoreCount) : 0; // Update UI document.getElementById('totalDevices').textContent = totalDevices; document.getElementById('totalBenchmarks').textContent = totalBenchmarks; document.getElementById('avgScore').textContent = avgScore; document.getElementById('lastBench').textContent = lastBenchDate ? utils.formatRelativeTime(lastBenchDate.toISOString()) : 'Aucun'; } catch (error) { console.error('Failed to load stats:', error); // Set default values on error document.getElementById('totalDevices').textContent = '0'; document.getElementById('totalBenchmarks').textContent = '0'; document.getElementById('avgScore').textContent = '0'; document.getElementById('lastBench').textContent = 'N/A'; } } // Load top devices async function loadTopDevices() { const container = document.getElementById('devicesTable'); try { const data = await apiClient.getDevices({ page_size: 50 }); if (!data.items || data.items.length === 0) { utils.showEmptyState(container, 'Aucun device trouvé. Exécutez un benchmark sur une machine pour commencer.', '📊'); allDevices = []; return; } // Store all devices for filtering allDevices = data.items; // Sort by global_score descending const sortedDevices = allDevices.sort((a, b) => { const scoreA = a.last_benchmark?.global_score ?? -1; const scoreB = b.last_benchmark?.global_score ?? -1; return scoreB - scoreA; }); // Render devices renderDevicesTable(sortedDevices); } catch (error) { console.error('Failed to load devices:', error); container.innerHTML = `
❌ Impossible de charger les devices
${utils.escapeHtml(error.message)}
Aucun device trouvé avec ces critères de recherche.
| # | Hostname | Description | Score Global | CPU | MEM | DISK | NET | GPU | Dernier Bench | Action |
|---|