async function updateTable() { const res = await fetch('/api/nodes'); // JSON از reports const data = await res.json(); table.innerHTML = ''; Object.keys(data).forEach(node=>{ const tr = document.createElement('tr'); const tdNode = document.createElement('td'); tdNode.className = 'node'; tdNode.textContent = node; tr.appendChild(tdNode); const tdGraph = document.createElement('td'); tdGraph.className = 'graph'; const canvas = document.createElement('canvas'); canvas.id = 'chart-' + node; tdGraph.appendChild(canvas); tr.appendChild(tdGraph); table.appendChild(tr); const ctx = canvas.getContext('2d'); const labels = Object.keys(data[node]); const latencies = labels.map(p=>data[node][p].latency || 0); const colors = labels.map(p=>data[node][p].status==="UP"?"lime":"red"); if(!charts[node]){ charts[node] = new Chart(ctx, { type:'bar', data:{ labels: labels, datasets:[{ label:'Latency (ms)', data: latencies, backgroundColor: colors }] }, options:{ responsive:true, plugins:{ legend:{ display:false } }, scales:{ y:{ beginAtZero:true } } } }); } else { const chart = charts[node]; chart.data.datasets[0].data = latencies; chart.data.datasets[0].backgroundColor = colors; chart.data.labels = labels; chart.update(); } }); } setInterval(updateTable, 5000); updateTable();