fix: prevent duplicate scanner markers when viewing peer nodes

- Use viewing scanner name (peer or local) for center marker
- Filter out the peer being viewed from peer markers list
- Fixes duplicate grokbox markers when viewing grokbox from master

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
User
2026-02-01 12:44:31 +01:00
parent b695e19079
commit 446bec278d

View File

@@ -938,8 +938,9 @@ function updateMapMarkers() {
const lat = parseFloat(document.getElementById('lat-input').value);
const lon = parseFloat(document.getElementById('lon-input').value);
// Add center marker (this scanner) - distinct star shape
const localScannerName = APP_CONFIG.scanner?.name || APP_CONFIG.scanner?.id || 'Scanner';
// Add center marker (viewing scanner) - distinct star shape
// When viewing a peer, show that peer's name; otherwise show local scanner name
const viewingScannerName = activeNodeInfo?.name || APP_CONFIG.scanner?.name || APP_CONFIG.scanner?.id || 'Scanner';
const scannerIcon = `
<div style="position:relative;width:24px;height:24px;">
<svg viewBox="0 0 24 24" style="width:24px;height:24px;filter:drop-shadow(0 0 4px rgba(255,0,128,0.8));">
@@ -953,14 +954,17 @@ function updateMapMarkers() {
iconSize: [24, 24],
iconAnchor: [12, 12]
})
}).addTo(map).bindPopup(`<strong>📍 ${escapeHtml(localScannerName)}</strong><br><span style="color:#4dabf7;">WiFi</span> · <span style="color:#9b59b6;">Bluetooth</span>`);
}).addTo(map).bindPopup(`<strong>📍 ${escapeHtml(viewingScannerName)}</strong><br><span style="color:#4dabf7;">WiFi</span> · <span style="color:#9b59b6;">Bluetooth</span>`);
markers.push(centerMarker);
// Add peer scanner markers (async, won't block)
// Skip the peer we're currently viewing (it's shown as center marker)
fetch('/api/peers')
.then(r => r.json())
.then(data => {
(data.peers || []).forEach(peer => {
// Skip if this is the peer we're currently viewing
if (activeNodeInfo && peer.scanner_id === activeNodeInfo.id) return;
if (peer.latitude && peer.longitude) {
const peerName = peer.name || peer.scanner_id;
const peerIcon = `
@@ -1845,11 +1849,12 @@ function update3DMarkers() {
const groundFloor = buildingConfig.groundFloorNumber || 0;
// Add scanner position marker at center (draggable for fine-grained positioning)
const scannerName = APP_CONFIG.scanner?.name || APP_CONFIG.scanner?.id || 'Scanner';
// When viewing a peer, show that peer's name; otherwise show local scanner name
const viewingScannerName = activeNodeInfo?.name || APP_CONFIG.scanner?.name || APP_CONFIG.scanner?.id || 'Scanner';
const scannerEl = document.createElement('div');
scannerEl.className = 'marker-3d center draggable';
scannerEl.innerHTML = `<div class="marker-icon">📍</div><div class="marker-floor">F${scannerFloor}</div>`;
scannerEl.title = `${scannerName} - Floor ${scannerFloor} (drag to reposition)`;
scannerEl.title = `${viewingScannerName} - Floor ${scannerFloor} (drag to reposition)`;
const scannerOffset = (scannerFloor - groundFloor) * pixelsPerFloor;
const scannerMarker = new maplibregl.Marker({
@@ -1859,7 +1864,7 @@ function update3DMarkers() {
})
.setLngLat([lon, lat])
.setPopup(new maplibregl.Popup().setHTML(`
<strong>📍 ${escapeHtml(scannerName)}</strong><br>
<strong>📍 ${escapeHtml(viewingScannerName)}</strong><br>
<span style="color:#4dabf7;">WiFi</span> · <span style="color:#9b59b6;">Bluetooth</span><br>
Floor: ${scannerFloor}<br>
<span style="font-size:0.8rem;color:#888;">${lat.toFixed(6)}, ${lon.toFixed(6)}</span>
@@ -1873,10 +1878,13 @@ function update3DMarkers() {
map3dMarkers.push(scannerMarker);
// Add peer scanner markers (absolute positions)
// Skip the peer we're currently viewing (it's shown as center marker)
fetch('/api/peers')
.then(r => r.json())
.then(data => {
(data.peers || []).forEach(peer => {
// Skip if this is the peer we're currently viewing
if (activeNodeInfo && peer.scanner_id === activeNodeInfo.id) return;
if (peer.latitude && peer.longitude) {
const peerFloor = peer.floor ?? 0;
const peerOffset = (peerFloor - groundFloor) * pixelsPerFloor;