diff --git a/public/analytics.js b/public/analytics.js
index 32d9665d..49a7b909 100644
--- a/public/analytics.js
+++ b/public/analytics.js
@@ -1349,29 +1349,52 @@
}
// Top hops leaderboard
- html += `
π Top 20 Longest Hops
| # | From | To | Distance (km) | Type | SNR | Packet |
`;
+ html += `π Top 20 Longest Hops
| # | From | To | Distance (km) | Type | SNR | Packet | |
`;
const top20 = data.topHops.slice(0, 20);
top20.forEach((h, i) => {
const fromLink = h.fromPk ? `${esc(h.fromName)}` : esc(h.fromName || '?');
const toLink = h.toPk ? `${esc(h.toName)}` : esc(h.toName || '?');
const snr = h.snr != null ? h.snr + ' dB' : 'β';
const pktLink = h.hash ? `${esc(h.hash.slice(0, 12))}β¦` : 'β';
- html += `| ${i+1} | ${fromLink} | ${toLink} | ${h.dist} | ${esc(h.type)} | ${snr} | ${pktLink} |
`;
+ const mapBtn = h.fromPk && h.toPk ? `` : '';
+ html += `| ${i+1} | ${fromLink} | ${toLink} | ${h.dist} | ${esc(h.type)} | ${snr} | ${pktLink} | ${mapBtn} |
`;
});
html += `
`;
// Top paths
if (data.topPaths.length) {
- html += `π€οΈ Top 10 Longest Multi-Hop Paths
| # | Total Distance (km) | Hops | Route | Packet |
`;
+ html += `π€οΈ Top 10 Longest Multi-Hop Paths
| # | Total Distance (km) | Hops | Route | Packet | |
`;
data.topPaths.slice(0, 10).forEach((p, i) => {
const route = p.hops.map(h => esc(h.fromName)).concat(esc(p.hops[p.hops.length-1].toName)).join(' β ');
const pktLink = p.hash ? `${esc(p.hash.slice(0, 12))}β¦` : 'β';
- html += `| ${i+1} | ${p.totalDist} | ${p.hopCount} | ${route} | ${pktLink} |
`;
+ // Collect all unique pubkeys in path order
+ const pathPks = [];
+ p.hops.forEach(h => { if (h.fromPk && !pathPks.includes(h.fromPk)) pathPks.push(h.fromPk); });
+ if (p.hops.length && p.hops[p.hops.length-1].toPk) { const last = p.hops[p.hops.length-1].toPk; if (!pathPks.includes(last)) pathPks.push(last); }
+ const mapBtn = pathPks.length >= 2 ? `` : '';
+ html += `| ${i+1} | ${p.totalDist} | ${p.hopCount} | ${route} | ${pktLink} | ${mapBtn} |
`;
});
html += `
`;
}
el.innerHTML = html;
+
+ // Wire up map buttons
+ el.querySelectorAll('.dist-map-hop').forEach(btn => {
+ btn.addEventListener('click', () => {
+ sessionStorage.setItem('map-route-hops', JSON.stringify({ hops: [btn.dataset.from, btn.dataset.to] }));
+ window.location.hash = '#/map?route=1';
+ });
+ });
+ el.querySelectorAll('.dist-map-path').forEach(btn => {
+ btn.addEventListener('click', () => {
+ try {
+ const hops = JSON.parse(btn.dataset.hops);
+ sessionStorage.setItem('map-route-hops', JSON.stringify({ hops }));
+ window.location.hash = '#/map?route=1';
+ } catch {}
+ });
+ });
} catch (e) {
el.innerHTML = `Failed to load distance analytics: ${esc(e.message)}
`;
}
diff --git a/public/index.html b/public/index.html
index e5502570..fb7cd35f 100644
--- a/public/index.html
+++ b/public/index.html
@@ -88,11 +88,11 @@
-
+
-
+