document.addEventListener('DOMContentLoaded', () => { const nodeGridContainer = document.getElementById('node-grid-container'); const nodeCountSpan = document.getElementById('node-count'); const POLLING_INTERVAL_MS = 3000; // Poll every 3 seconds async function fetchNodeData() { try { // Use window.API_BASE_PATH for dynamic base URL const response = await fetch(`${window.API_BASE_PATH}/nodes/status`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); renderNodeGrid(data.nodes); } catch (error) { console.error("Error fetching node data:", error); nodeGridContainer.innerHTML = '
'; } } function renderNodeGrid(nodes) { nodeGridContainer.innerHTML = ''; nodeCountSpan.textContent = nodes.length; if (nodes.length === 0) { nodeGridContainer.innerHTML = ' '; return; } // Create a dynamic grid container const grid = document.createElement('div'); grid.classList.add('connection-grid'); // Dynamically set grid columns based on number of nodes + 1 for the header column // minmax(100px, 1fr) for the row header, then repeat for each node column grid.style.gridTemplateColumns = `minmax(100px, 1fr) repeat(${nodes.length}, minmax(100px, 1fr))`; // Add header row for column UUIDs const headerRow = document.createElement('div'); headerRow.classList.add('grid-row', 'header-row'); headerRow.appendChild(createEmptyCell()); // Top-left corner nodes.forEach(node => { const headerCell = document.createElement('div'); headerCell.classList.add('grid-cell', 'header-cell'); const displayUuid = node.uuid.substring(0, 8) + '...'; headerCell.innerHTML = `UUID: ${rowNode.uuid}
IP: ${rowNode.ip}
Last Seen: ${new Date(rowNode.last_seen).toLocaleTimeString()}
Uptime: ${rowNode.uptime_seconds ? formatUptime(rowNode.uptime_seconds) : 'N/A'}
Load Avg (1m, 5m, 15m): ${rowNode.load_avg ? rowNode.load_avg.map(l => l.toFixed(2)).join(', ') : 'N/A'}
Memory Usage: ${rowNode.memory_usage_percent ? rowNode.memory_usage_percent.toFixed(2) + '%' : 'N/A'}
From: ${rowNode.uuid.substring(0, 8)}...
to: ${colNode.uuid.substring(0, 8)}...
Latency: ${displayLatency}