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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user