diff --git a/public/index.html b/public/index.html
index 0ea0568..5da3de3 100644
--- a/public/index.html
+++ b/public/index.html
@@ -78,7 +78,7 @@
-
+
diff --git a/public/packets.js b/public/packets.js
index 56dc2be..46e4867 100644
--- a/public/packets.js
+++ b/public/packets.js
@@ -287,6 +287,7 @@
+
@@ -324,6 +325,11 @@
document.getElementById('fRegion').addEventListener('change', (e) => { filters.region = e.target.value || undefined; loadPackets(); });
document.getElementById('fType').addEventListener('change', (e) => { filters.type = e.target.value !== '' ? e.target.value : undefined; loadPackets(); });
document.getElementById('fGroup').addEventListener('click', () => { groupByHash = !groupByHash; loadPackets(); });
+ document.getElementById('fMyNodes').addEventListener('click', function () {
+ filters.myNodes = !filters.myNodes;
+ this.classList.toggle('active', filters.myNodes);
+ loadPackets();
+ });
// Column visibility toggle (#71)
const COL_DEFS = [
@@ -494,14 +500,34 @@
const groupBtn = document.getElementById('fGroup');
if (groupBtn) groupBtn.classList.toggle('active', groupByHash);
- if (!packets.length) {
- tbody.innerHTML = '
| No packets found |
';
+ // Filter to claimed/favorited nodes if toggle is on
+ let displayPackets = packets;
+ if (filters.myNodes) {
+ const myNodes = JSON.parse(localStorage.getItem('meshcore-my-nodes') || '[]');
+ const myKeys = new Set(myNodes.map(n => n.pubkey));
+ const favs = getFavorites();
+ const allKeys = new Set([...myKeys, ...favs]);
+ displayPackets = packets.filter(p => {
+ try {
+ const d = JSON.parse(p.decoded_json || '{}');
+ const pathHops = JSON.parse(p.path_json || '[]');
+ // Check if any node key in decoded data or path matches
+ return (d.pubkey && allKeys.has(d.pubkey)) ||
+ (d.to && allKeys.has(d.to)) ||
+ (d.from && allKeys.has(d.from)) ||
+ pathHops.some(h => allKeys.has(h));
+ } catch { return false; }
+ });
+ }
+
+ if (!displayPackets.length) {
+ tbody.innerHTML = '| ' + (filters.myNodes ? 'No packets from your claimed/favorited nodes' : 'No packets found') + ' |
';
return;
}
if (groupByHash) {
let html = '';
- for (const p of packets) {
+ for (const p of displayPackets) {
const isExpanded = expandedHashes.has(p.hash);
const groupRegion = p.observer_id ? (observers.find(o => o.id === p.observer_id)?.iata || '') : '';
let groupPath = [];
@@ -551,7 +577,7 @@
return;
}
- tbody.innerHTML = packets.map(p => {
+ tbody.innerHTML = displayPackets.map(p => {
let decoded, pathHops = [];
try { decoded = JSON.parse(p.decoded_json); } catch {}
try { pathHops = JSON.parse(p.path_json || '[]'); } catch {}