From f5d5dd6049262b901dc69893bf405f3576d209e4 Mon Sep 17 00:00:00 2001 From: pablorevilla-meshtastic Date: Thu, 29 Oct 2026 13:10:17 -0700 Subject: [PATCH] more updates --- meshview/templates/stats.html | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/meshview/templates/stats.html b/meshview/templates/stats.html index 6763729..a56701c 100644 --- a/meshview/templates/stats.html +++ b/meshview/templates/stats.html @@ -97,7 +97,7 @@ Loading… - +

Top 10 senders from the latest 500 text packets across all channels. Only packets on the sender’s recorded main channel count; unknown channels are excluded.

@@ -107,7 +107,7 @@ Loading… - +

Latest reported altitude in meters above sea level. Only ROUTER, ROUTER_CLIENT, and ROUTER_LATE nodes with known altitude are included. Click a bar to view the node.

@@ -215,6 +215,7 @@ const PORTNUM_LABELS = window.PORT_LABEL_MAP; let statsNodesPromise; let textNodeRows = []; +let textNodeExportRows = []; function rankMainChannelTextSenders(packets, nodes) { const byId = new Map(nodes.map(node => [String(node.node_id), node])); const counts = new Map(); @@ -245,6 +246,7 @@ async function loadTextNodes() { const chart = initMeshChart(document.getElementById("chart_text_nodes")); status.textContent = "Loading…"; textNodeRows = []; + textNodeExportRows = []; chart.clear(); chart.off("click"); chart.on("click", openTextSender); @@ -259,7 +261,8 @@ async function loadTextNodes() { if (request !== textNodesRequest) return; const sample = data.packets.slice(0, 500); const ranked = rankMainChannelTextSenders(sample, nodes); - textNodeRows = ranked.slice(0, 10); + textNodeExportRows = ranked.slice(0, 50); + textNodeRows = textNodeExportRows.slice(0, 10); const matched = ranked.reduce((sum, node) => sum + node.packet_count, 0); status.textContent = matched ? `${matched} of ${sample.length} sampled packets match main channels` @@ -297,12 +300,12 @@ document.getElementById("text-nodes-refresh").addEventListener("click", loadText loadTextNodes(); let altitudeRows = []; +let altitudeExportRows = []; function rankAltitudeNodes(nodes) { return nodes .filter(node => Number.isFinite(node.last_altitude) && node.node_id != null && ["ROUTER", "ROUTER_CLIENT", "ROUTER_LATE"].includes((node.role || "").toUpperCase())) - .sort((a, b) => b.last_altitude - a.last_altitude || a.node_id - b.node_id) - .slice(0, 10); + .sort((a, b) => b.last_altitude - a.last_altitude || a.node_id - b.node_id); } function openAltitudeNode(event) { const node = altitudeRows[event.dataIndex]; @@ -320,7 +323,8 @@ async function loadAltitudeNodes(refreshNodes = false) { chart.off("click"); chart.on("click", openAltitudeNode); try { - altitudeRows = rankAltitudeNodes(await fetchStatsNodes(refreshNodes)); + altitudeExportRows = rankAltitudeNodes(await fetchStatsNodes(refreshNodes)).slice(0, 50); + altitudeRows = altitudeExportRows.slice(0, 10); chart.setOption({ tooltip: {trigger:"axis", renderMode:"richText", valueFormatter:value => `${value} m`}, grid: {left:10, right:20, top:55, bottom:10, containLabel:true}, @@ -337,6 +341,7 @@ async function loadAltitudeNodes(refreshNodes = false) { : "No routers have reported altitude yet."; } catch (error) { altitudeRows = []; + altitudeExportRows = []; chart.clear(); status.textContent = "Unable to load altitudes. Use Refresh report to retry."; console.error(error); @@ -824,13 +829,13 @@ document.querySelectorAll(".export-btn").forEach(btn=>{ let rows=[]; if (chartId === "chart_altitude") { rows = [["Node ID", "Short Name", "Long Name", "Altitude (m above sea level)"], - ...altitudeRows.map(node => [node.node_id, node.short_name || "", node.long_name || "", node.last_altitude])]; + ...altitudeExportRows.map(node => [node.node_id, node.short_name || "", node.long_name || "", node.last_altitude])]; downloadCSV(chartId + ".csv", rows); return; } if (chartId === "chart_text_nodes") { rows = [["Node ID", "Short Name", "Long Name", "Main Channel", "Text Packets"], - ...textNodeRows.map(row => [row.node_id, row.short_name || "", row.long_name || "", row.channel, row.packet_count])]; + ...textNodeExportRows.map(row => [row.node_id, row.short_name || "", row.long_name || "", row.channel, row.packet_count])]; downloadCSV(chartId + ".csv", rows); return; }