From 94b358f686b107135a62ee60ea9f377ca39736c6 Mon Sep 17 00:00:00 2001 From: Smittix Date: Mon, 23 Feb 2026 14:28:57 +0000 Subject: [PATCH] Commit all pending workspace changes --- static/css/settings.css | 53 +++ static/images/globe/earth-dark.jpg | Bin 0 -> 94795 bytes static/js/core/settings-manager.js | 57 +-- static/js/modes/websdr.js | 474 ++++++++++++++++++++++--- templates/adsb_dashboard.html | 2 +- templates/adsb_history.html | 2 +- templates/agents.html | 2 +- templates/ais_dashboard.html | 2 +- templates/index.html | 2 +- templates/network_monitor.html | 2 +- templates/partials/settings-modal.html | 1 + templates/satellite_dashboard.html | 2 +- 12 files changed, 529 insertions(+), 70 deletions(-) create mode 100644 static/images/globe/earth-dark.jpg diff --git a/static/css/settings.css b/static/css/settings.css index c717b3c..36f2987 100644 --- a/static/css/settings.css +++ b/static/css/settings.css @@ -479,6 +479,10 @@ filter: sepia(0.35) hue-rotate(185deg) saturate(1.75) brightness(1.06) contrast(1.05); } +.tile-layer-flir { + filter: grayscale(1) sepia(1) hue-rotate(-18deg) saturate(4.85) brightness(0.96) contrast(1.34); +} + /* Global Leaflet map theme: cyber overlay */ .leaflet-container.map-theme-cyber { position: relative; @@ -527,6 +531,55 @@ html.map-cyber-enabled .leaflet-container::after { background-size: 52px 52px, 52px 52px; } +/* Global Leaflet map theme: FLIR thermal overlay */ +.leaflet-container.map-theme-flir { + position: relative; + background: #090602; + isolation: isolate; +} + +.leaflet-container.map-theme-flir .leaflet-tile-pane { + filter: grayscale(1) sepia(1) hue-rotate(-18deg) saturate(4.85) brightness(0.96) contrast(1.34); + opacity: 1; +} + +/* Hard global fallback: enforce FLIR tint on all Leaflet tile images */ +html.map-flir-enabled .leaflet-container .leaflet-tile { + filter: grayscale(1) sepia(1) hue-rotate(-18deg) saturate(4.85) brightness(0.96) contrast(1.34) !important; +} + +/* Hard global fallback: thermal glow + scanline/grid overlay */ +html.map-flir-enabled .leaflet-container { + position: relative; + isolation: isolate; +} + +html.map-flir-enabled .leaflet-container::before { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + z-index: 620; + background: + radial-gradient(115% 90% at 50% 40%, rgba(255, 132, 28, 0.22), rgba(255, 132, 28, 0) 63%), + linear-gradient(180deg, rgba(14, 229, 255, 0.08) 0%, rgba(255, 96, 18, 0.15) 58%, rgba(255, 233, 128, 0.11) 100%); +} + +html.map-flir-enabled .leaflet-container::after { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + z-index: 621; + opacity: 0.32; + mix-blend-mode: screen; + background-image: + repeating-linear-gradient(0deg, rgba(255, 188, 92, 0.08) 0 1px, transparent 1px 3px), + linear-gradient(90deg, rgba(255, 141, 66, 0.12) 1px, transparent 1px), + linear-gradient(rgba(0, 240, 255, 0.07) 1px, transparent 1px); + background-size: 100% 3px, 68px 68px, 68px 68px; +} + /* Responsive */ @media (max-width: 960px) { .settings-tabs { diff --git a/static/images/globe/earth-dark.jpg b/static/images/globe/earth-dark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..222bd939d5bf2067910ef4f9da2ea9092dfd6abb GIT binary patch literal 94795 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 Z`oH@t|Ln8>|5^UC@4$cE@5g>^`)^we#C!k% literal 0 HcmV?d00001 diff --git a/static/js/core/settings-manager.js b/static/js/core/settings-manager.js index f883130..676c588 100644 --- a/static/js/core/settings-manager.js +++ b/static/js/core/settings-manager.js @@ -33,6 +33,15 @@ const Settings = { mapTheme: 'cyber', options: {} }, + cartodb_dark_flir: { + url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', + attribution: '© OSM © CARTO', + subdomains: 'abcd', + mapTheme: 'flir', + options: { + className: 'tile-layer-flir' + } + }, cartodb_light: { url: 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', attribution: '© OSM © CARTO', @@ -98,24 +107,16 @@ const Settings = { localStorage.setItem('intercept_map_theme_pref', pref); }, - /** - * Whether Cyber map theme should be considered active globally. - * @param {Object} [config] - * @returns {boolean} - */ - _isCyberThemeEnabled(config) { - const resolvedConfig = config || this.getTileConfig(); - return this._getMapThemeClass(resolvedConfig) === 'map-theme-cyber'; - }, - /** * Toggle root class used for hard global Leaflet theming. * @param {Object} [config] */ _syncRootMapThemeClass(config) { if (typeof document === 'undefined' || !document.documentElement) return; - const enabled = this._isCyberThemeEnabled(config); - document.documentElement.classList.toggle('map-cyber-enabled', enabled); + const resolvedConfig = config || this.getTileConfig(); + const themeClass = this._getMapThemeClass(resolvedConfig); + document.documentElement.classList.toggle('map-cyber-enabled', themeClass === 'map-theme-cyber'); + document.documentElement.classList.toggle('map-flir-enabled', themeClass === 'map-theme-flir'); }, /** @@ -350,6 +351,7 @@ const Settings = { _getMapThemeClass(config) { if (!config || !config.mapTheme) return null; if (config.mapTheme === 'cyber') return 'map-theme-cyber'; + if (config.mapTheme === 'flir') return 'map-theme-flir'; return null; }, @@ -373,7 +375,7 @@ const Settings = { container.style.background = ''; } - container.classList.remove('map-theme-cyber'); + container.classList.remove('map-theme-cyber', 'map-theme-flir'); const resolvedConfig = config || this.getTileConfig(); const themeClass = this._getMapThemeClass(resolvedConfig); @@ -381,17 +383,28 @@ const Settings = { container.classList.add(themeClass); - if (container.style) { - container.style.background = '#020813'; - } - if (tilePane && tilePane.style) { - tilePane.style.filter = 'sepia(0.74) hue-rotate(176deg) saturate(1.72) brightness(1.05) contrast(1.08)'; - tilePane.style.opacity = '1'; - tilePane.style.willChange = 'filter'; + if (themeClass === 'map-theme-cyber') { + if (container.style) { + container.style.background = '#020813'; + } + if (tilePane && tilePane.style) { + tilePane.style.filter = 'sepia(0.74) hue-rotate(176deg) saturate(1.72) brightness(1.05) contrast(1.08)'; + tilePane.style.opacity = '1'; + tilePane.style.willChange = 'filter'; + } + } else if (themeClass === 'map-theme-flir') { + if (container.style) { + container.style.background = '#090602'; + } + if (tilePane && tilePane.style) { + tilePane.style.filter = 'grayscale(1) sepia(1) hue-rotate(-18deg) saturate(4.85) brightness(0.96) contrast(1.34)'; + tilePane.style.opacity = '1'; + tilePane.style.willChange = 'filter'; + } } - // Grid/glow overlays are rendered via CSS pseudo elements on - // `html.map-cyber-enabled .leaflet-container` for consistent stacking. + // Map overlays are rendered via CSS pseudo elements on + // `html.map-*-enabled .leaflet-container` for consistent stacking. }, /** diff --git a/static/js/modes/websdr.js b/static/js/modes/websdr.js index 72ade80..280dbde 100644 --- a/static/js/modes/websdr.js +++ b/static/js/modes/websdr.js @@ -9,6 +9,20 @@ let websdrMarkers = []; let websdrReceivers = []; let websdrInitialized = false; let websdrSpyStationsLoaded = false; +let websdrMapType = null; +let websdrGlobe = null; +let websdrGlobePopup = null; +let websdrSelectedReceiverIndex = null; +let websdrGlobeScriptPromise = null; +let websdrResizeObserver = null; +let websdrResizeHooked = false; +let websdrGlobeFallbackNotified = false; + +const WEBSDR_GLOBE_SCRIPT_URLS = [ + 'https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js', + 'https://cdn.jsdelivr.net/npm/globe.gl@2.33.1/dist/globe.gl.min.js', +]; +const WEBSDR_GLOBE_TEXTURE_URL = '/static/images/globe/earth-dark.jpg'; // KiwiSDR audio state let kiwiWebSocket = null; @@ -29,54 +43,39 @@ const KIWI_SAMPLE_RATE = 12000; async function initWebSDR() { if (websdrInitialized) { - if (websdrMap) { - setTimeout(() => websdrMap.invalidateSize(), 100); - } + setTimeout(invalidateWebSDRViewport, 100); return; } const mapEl = document.getElementById('websdrMap'); - if (!mapEl || typeof L === 'undefined') return; + if (!mapEl) return; - // Calculate minimum zoom so tiles fill the container vertically - const mapHeight = mapEl.clientHeight || 500; - const minZoom = Math.ceil(Math.log2(mapHeight / 256)); - - websdrMap = L.map('websdrMap', { - center: [20, 0], - zoom: Math.max(minZoom, 2), - minZoom: Math.max(minZoom, 2), - zoomControl: true, - maxBounds: [[-85, -360], [85, 360]], - maxBoundsViscosity: 1.0, - }); - - if (typeof Settings !== 'undefined' && Settings.createTileLayer) { - await Settings.init(); - Settings.createTileLayer().addTo(websdrMap); - Settings.registerMap(websdrMap); + const globeReady = await ensureWebsdrGlobeLibrary(); + if (globeReady && initWebsdrGlobe(mapEl)) { + websdrMapType = 'globe'; + } else if (typeof L !== 'undefined' && await initWebsdrLeaflet(mapEl)) { + websdrMapType = 'leaflet'; + if (!websdrGlobeFallbackNotified && typeof showNotification === 'function') { + showNotification('WebSDR', '3D globe unavailable, using fallback map'); + websdrGlobeFallbackNotified = true; + } } else { - L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', { - attribution: '© OpenStreetMap contributors © CARTO', - subdomains: 'abcd', - maxZoom: 19, - className: 'tile-layer-cyan', - }).addTo(websdrMap); + console.error('[WEBSDR] Unable to initialize globe or map renderer'); + return; } - // Match background to tile ocean color so any remaining edge is seamless - mapEl.style.background = '#1a1d29'; - websdrInitialized = true; if (!websdrSpyStationsLoaded) { loadSpyStationPresets(); } + setupWebsdrResizeHandling(mapEl); + if (websdrReceivers.length > 0) { + plotReceiversOnMap(websdrReceivers); + } [100, 300, 600, 1000].forEach(delay => { - setTimeout(() => { - if (websdrMap) websdrMap.invalidateSize(); - }, delay); + setTimeout(invalidateWebSDRViewport, delay); }); } @@ -94,6 +93,8 @@ function searchReceivers(refresh) { .then(data => { if (data.status === 'success') { websdrReceivers = data.receivers || []; + websdrSelectedReceiverIndex = null; + hideWebsdrGlobePopup(); renderReceiverList(websdrReceivers); plotReceiversOnMap(websdrReceivers); @@ -107,6 +108,11 @@ function searchReceivers(refresh) { // ============== MAP ============== function plotReceiversOnMap(receivers) { + if (websdrMapType === 'globe' && websdrGlobe) { + plotReceiversOnGlobe(receivers); + return; + } + if (!websdrMap) return; websdrMarkers.forEach(m => websdrMap.removeLayer(m)); @@ -144,6 +150,369 @@ function plotReceiversOnMap(receivers) { } } +async function ensureWebsdrGlobeLibrary() { + if (typeof window.Globe === 'function') return true; + if (!isWebglSupported()) return false; + + if (!websdrGlobeScriptPromise) { + websdrGlobeScriptPromise = WEBSDR_GLOBE_SCRIPT_URLS + .reduce( + (promise, src) => promise.then(() => loadWebsdrScript(src)), + Promise.resolve() + ) + .then(() => typeof window.Globe === 'function') + .catch((error) => { + console.warn('[WEBSDR] Failed to load globe scripts:', error); + return false; + }); + } + + const loaded = await websdrGlobeScriptPromise; + if (!loaded) { + websdrGlobeScriptPromise = null; + } + return loaded; +} + +function loadWebsdrScript(src) { + return new Promise((resolve, reject) => { + const selector = `script[data-websdr-src="${src}"]`; + const existing = document.querySelector(selector); + + if (existing) { + if (existing.dataset.loaded === 'true') { + resolve(); + return; + } + if (existing.dataset.failed === 'true') { + existing.remove(); + } else { + existing.addEventListener('load', () => resolve(), { once: true }); + existing.addEventListener('error', () => reject(new Error(`Failed to load ${src}`)), { once: true }); + return; + } + } + + const script = document.createElement('script'); + script.src = src; + script.async = true; + script.crossOrigin = 'anonymous'; + script.dataset.websdrSrc = src; + script.onload = () => { + script.dataset.loaded = 'true'; + resolve(); + }; + script.onerror = () => { + script.dataset.failed = 'true'; + reject(new Error(`Failed to load ${src}`)); + }; + document.head.appendChild(script); + }); +} + +function isWebglSupported() { + try { + const canvas = document.createElement('canvas'); + return !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl')); + } catch (_) { + return false; + } +} + +function initWebsdrGlobe(mapEl) { + if (typeof window.Globe !== 'function' || !isWebglSupported()) return false; + + mapEl.innerHTML = ''; + mapEl.style.background = 'radial-gradient(circle at 30% 20%, rgba(14, 42, 68, 0.9), rgba(4, 9, 16, 0.95) 58%, rgba(2, 4, 9, 0.98) 100%)'; + mapEl.style.cursor = 'grab'; + + websdrGlobe = window.Globe()(mapEl) + .backgroundColor('rgba(0,0,0,0)') + .globeImageUrl(WEBSDR_GLOBE_TEXTURE_URL) + .showAtmosphere(true) + .atmosphereColor('#3bb9ff') + .atmosphereAltitude(0.17) + .pointRadius('radius') + .pointAltitude('altitude') + .pointColor('color') + .pointsTransitionDuration(250) + .pointLabel(point => point.label || '') + .onPointHover(point => { + mapEl.style.cursor = point ? 'pointer' : 'grab'; + }) + .onPointClick((point, event) => { + if (!point) return; + showWebsdrGlobePopup(point, event); + }); + + const controls = websdrGlobe.controls(); + if (controls) { + controls.autoRotate = true; + controls.autoRotateSpeed = 0.25; + controls.enablePan = false; + controls.minDistance = 140; + controls.maxDistance = 380; + controls.rotateSpeed = 0.7; + controls.zoomSpeed = 0.8; + } + + ensureWebsdrGlobePopup(mapEl); + resizeWebsdrGlobe(); + return true; +} + +async function initWebsdrLeaflet(mapEl) { + if (typeof L === 'undefined') return false; + + mapEl.innerHTML = ''; + const mapHeight = mapEl.clientHeight || 500; + const minZoom = Math.ceil(Math.log2(mapHeight / 256)); + + websdrMap = L.map('websdrMap', { + center: [20, 0], + zoom: Math.max(minZoom, 2), + minZoom: Math.max(minZoom, 2), + zoomControl: true, + maxBounds: [[-85, -360], [85, 360]], + maxBoundsViscosity: 1.0, + }); + + if (typeof Settings !== 'undefined' && Settings.createTileLayer) { + await Settings.init(); + Settings.createTileLayer().addTo(websdrMap); + Settings.registerMap(websdrMap); + } else { + L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', { + attribution: '© OpenStreetMap contributors © CARTO', + subdomains: 'abcd', + maxZoom: 19, + className: 'tile-layer-cyan', + }).addTo(websdrMap); + } + + mapEl.style.background = '#1a1d29'; + return true; +} + +function setupWebsdrResizeHandling(mapEl) { + if (typeof ResizeObserver !== 'undefined') { + if (websdrResizeObserver) { + websdrResizeObserver.disconnect(); + } + websdrResizeObserver = new ResizeObserver(() => invalidateWebSDRViewport()); + websdrResizeObserver.observe(mapEl); + } + + if (!websdrResizeHooked) { + window.addEventListener('resize', invalidateWebSDRViewport); + window.addEventListener('orientationchange', () => setTimeout(invalidateWebSDRViewport, 120)); + websdrResizeHooked = true; + } +} + +function invalidateWebSDRViewport() { + if (websdrMapType === 'globe') { + resizeWebsdrGlobe(); + return; + } + if (websdrMap && typeof websdrMap.invalidateSize === 'function') { + websdrMap.invalidateSize({ pan: false, animate: false }); + } +} + +function resizeWebsdrGlobe() { + if (!websdrGlobe) return; + const mapEl = document.getElementById('websdrMap'); + if (!mapEl) return; + + const width = mapEl.clientWidth; + const height = mapEl.clientHeight; + if (!width || !height) return; + + websdrGlobe.width(width); + websdrGlobe.height(height); +} + +function plotReceiversOnGlobe(receivers) { + if (!websdrGlobe) return; + + const points = []; + receivers.forEach((rx, idx) => { + const lat = Number(rx.lat); + const lon = Number(rx.lon); + if (!Number.isFinite(lat) || !Number.isFinite(lon)) return; + + const selected = idx === websdrSelectedReceiverIndex; + points.push({ + lat: lat, + lng: lon, + receiverIndex: idx, + radius: selected ? 0.52 : 0.38, + altitude: selected ? 0.1 : 0.04, + color: selected ? '#00ff88' : (rx.available ? '#00d4ff' : '#5f6976'), + label: buildWebsdrPointLabel(rx, idx), + }); + }); + + websdrGlobe.pointsData(points); + + if (points.length > 0) { + if (websdrSelectedReceiverIndex != null) { + const selectedPoint = points.find(point => point.receiverIndex === websdrSelectedReceiverIndex); + if (selectedPoint) { + websdrGlobe.pointOfView({ lat: selectedPoint.lat, lng: selectedPoint.lng, altitude: 1.45 }, 900); + return; + } + } + + const center = computeWebsdrGlobeCenter(points); + websdrGlobe.pointOfView(center, 900); + } +} + +function computeWebsdrGlobeCenter(points) { + if (!points.length) return { lat: 20, lng: 0, altitude: 2.1 }; + + let x = 0; + let y = 0; + let z = 0; + points.forEach(point => { + const latRad = point.lat * Math.PI / 180; + const lonRad = point.lng * Math.PI / 180; + x += Math.cos(latRad) * Math.cos(lonRad); + y += Math.cos(latRad) * Math.sin(lonRad); + z += Math.sin(latRad); + }); + + const count = points.length; + x /= count; + y /= count; + z /= count; + + const hyp = Math.sqrt((x * x) + (y * y)); + const centerLat = Math.atan2(z, hyp) * 180 / Math.PI; + const centerLng = Math.atan2(y, x) * 180 / Math.PI; + + let meanAngularDistance = 0; + const centerLatRad = centerLat * Math.PI / 180; + const centerLngRad = centerLng * Math.PI / 180; + points.forEach(point => { + const latRad = point.lat * Math.PI / 180; + const lonRad = point.lng * Math.PI / 180; + const cosAngle = ( + (Math.sin(centerLatRad) * Math.sin(latRad)) + + (Math.cos(centerLatRad) * Math.cos(latRad) * Math.cos(lonRad - centerLngRad)) + ); + const safeCos = Math.max(-1, Math.min(1, cosAngle)); + meanAngularDistance += Math.acos(safeCos) * 180 / Math.PI; + }); + meanAngularDistance /= count; + + const altitude = Math.min(2.9, Math.max(1.35, 1.35 + (meanAngularDistance / 45))); + return { lat: centerLat, lng: centerLng, altitude: altitude }; +} + +function ensureWebsdrGlobePopup(mapEl) { + if (websdrGlobePopup) { + if (websdrGlobePopup.parentElement !== mapEl) { + mapEl.appendChild(websdrGlobePopup); + } + return; + } + + websdrGlobePopup = document.createElement('div'); + websdrGlobePopup.id = 'websdrGlobePopup'; + websdrGlobePopup.style.position = 'absolute'; + websdrGlobePopup.style.minWidth = '220px'; + websdrGlobePopup.style.maxWidth = '260px'; + websdrGlobePopup.style.padding = '10px'; + websdrGlobePopup.style.borderRadius = '8px'; + websdrGlobePopup.style.border = '1px solid rgba(0, 212, 255, 0.35)'; + websdrGlobePopup.style.background = 'rgba(5, 13, 20, 0.92)'; + websdrGlobePopup.style.backdropFilter = 'blur(4px)'; + websdrGlobePopup.style.boxShadow = '0 8px 24px rgba(0, 0, 0, 0.4)'; + websdrGlobePopup.style.color = 'var(--text-primary)'; + websdrGlobePopup.style.display = 'none'; + websdrGlobePopup.style.zIndex = '20'; + mapEl.appendChild(websdrGlobePopup); + + if (!mapEl.dataset.websdrPopupHooked) { + mapEl.addEventListener('click', (event) => { + if (!websdrGlobePopup || websdrGlobePopup.style.display === 'none') return; + if (event.target.closest('#websdrGlobePopup')) return; + hideWebsdrGlobePopup(); + }); + mapEl.dataset.websdrPopupHooked = 'true'; + } +} + +function showWebsdrGlobePopup(point, event) { + if (!websdrGlobePopup || !point || point.receiverIndex == null) return; + const rx = websdrReceivers[point.receiverIndex]; + if (!rx) return; + + const mapEl = document.getElementById('websdrMap'); + if (!mapEl) return; + + websdrSelectedReceiverIndex = point.receiverIndex; + renderReceiverList(websdrReceivers); + plotReceiversOnGlobe(websdrReceivers); + + websdrGlobePopup.innerHTML = ` +
+ ${escapeHtmlWebsdr(rx.name)} + +
+ ${rx.location ? `
${escapeHtmlWebsdr(rx.location)}
` : ''} +
Antenna: ${escapeHtmlWebsdr(rx.antenna || 'Unknown')}
+
Users: ${rx.users}/${rx.users_max}
+ + `; + websdrGlobePopup.style.display = 'block'; + + const rect = mapEl.getBoundingClientRect(); + const x = event && Number.isFinite(event.clientX) ? (event.clientX - rect.left) : (rect.width / 2); + const y = event && Number.isFinite(event.clientY) ? (event.clientY - rect.top) : (rect.height / 2); + const popupWidth = 260; + const popupHeight = 155; + const left = Math.max(12, Math.min(rect.width - popupWidth - 12, x + 12)); + const top = Math.max(12, Math.min(rect.height - popupHeight - 12, y + 12)); + websdrGlobePopup.style.left = `${left}px`; + websdrGlobePopup.style.top = `${top}px`; + + const closeBtn = websdrGlobePopup.querySelector('[data-websdr-popup-close]'); + if (closeBtn) { + closeBtn.onclick = () => hideWebsdrGlobePopup(); + } + const listenBtn = websdrGlobePopup.querySelector('[data-websdr-listen]'); + if (listenBtn) { + listenBtn.onclick = () => selectReceiver(point.receiverIndex); + } + + if (event && typeof event.stopPropagation === 'function') { + event.stopPropagation(); + } +} + +function hideWebsdrGlobePopup() { + if (websdrGlobePopup) { + websdrGlobePopup.style.display = 'none'; + } +} + +function buildWebsdrPointLabel(rx, idx) { + const location = rx.location ? escapeHtmlWebsdr(rx.location) : 'Unknown location'; + const antenna = escapeHtmlWebsdr(rx.antenna || 'Unknown antenna'); + return ` +
+
${escapeHtmlWebsdr(rx.name)}
+
${location}
+
${antenna} · ${rx.users}/${rx.users_max}
+
Receiver #${idx + 1}
+
+ `; +} + // ============== RECEIVER LIST ============== function renderReceiverList(receivers) { @@ -155,12 +524,16 @@ function renderReceiverList(receivers) { return; } - container.innerHTML = receivers.slice(0, 50).map((rx, idx) => ` -
{ + const selected = idx === websdrSelectedReceiverIndex; + const baseBg = selected ? 'rgba(0,212,255,0.14)' : 'transparent'; + const hoverBg = selected ? 'rgba(0,212,255,0.18)' : 'rgba(0,212,255,0.05)'; + return ` +
- ${escapeHtmlWebsdr(rx.name)} + ${escapeHtmlWebsdr(rx.name)} ${rx.users}/${rx.users_max}
@@ -168,7 +541,8 @@ function renderReceiverList(receivers) { ${rx.distance_km !== undefined ? ` · ${rx.distance_km} km` : ''}
- `).join(''); + `; + }).join(''); } // ============== SELECT RECEIVER ============== @@ -180,14 +554,30 @@ function selectReceiver(index) { const freqKhz = parseFloat(document.getElementById('websdrFrequency')?.value || 7000); const mode = document.getElementById('websdrMode_select')?.value || 'am'; + websdrSelectedReceiverIndex = index; + renderReceiverList(websdrReceivers); + focusReceiverOnMap(rx); + hideWebsdrGlobePopup(); + kiwiReceiverName = rx.name; // Connect via backend proxy connectToReceiver(rx.url, freqKhz, mode); +} - // Highlight on map - if (websdrMap && rx.lat != null && rx.lon != null) { - websdrMap.setView([rx.lat, rx.lon], 6); +function focusReceiverOnMap(rx) { + const lat = Number(rx.lat); + const lon = Number(rx.lon); + if (!Number.isFinite(lat) || !Number.isFinite(lon)) return; + + if (websdrMapType === 'globe' && websdrGlobe) { + plotReceiversOnGlobe(websdrReceivers); + websdrGlobe.pointOfView({ lat: lat, lng: lon, altitude: 1.4 }, 900); + return; + } + + if (websdrMap) { + websdrMap.setView([lat, lon], 6); } } @@ -551,6 +941,8 @@ function tuneToSpyStation(stationId, freqKhz) { .then(data => { if (data.status === 'success') { websdrReceivers = data.receivers || []; + websdrSelectedReceiverIndex = null; + hideWebsdrGlobePopup(); renderReceiverList(websdrReceivers); plotReceiversOnMap(websdrReceivers); diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html index 82119dc..47a7b19 100644 --- a/templates/adsb_dashboard.html +++ b/templates/adsb_dashboard.html @@ -1,5 +1,5 @@ - + diff --git a/templates/adsb_history.html b/templates/adsb_history.html index b7dee83..3d3b810 100644 --- a/templates/adsb_history.html +++ b/templates/adsb_history.html @@ -1,5 +1,5 @@ - + diff --git a/templates/agents.html b/templates/agents.html index 5faa911..6cb3398 100644 --- a/templates/agents.html +++ b/templates/agents.html @@ -1,5 +1,5 @@ - + diff --git a/templates/ais_dashboard.html b/templates/ais_dashboard.html index aadcd42..eab16c4 100644 --- a/templates/ais_dashboard.html +++ b/templates/ais_dashboard.html @@ -1,5 +1,5 @@ - + diff --git a/templates/index.html b/templates/index.html index d9fb0b0..cb729b5 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,5 @@ - + diff --git a/templates/network_monitor.html b/templates/network_monitor.html index be9e0bf..48c2f9b 100644 --- a/templates/network_monitor.html +++ b/templates/network_monitor.html @@ -1,5 +1,5 @@ - + diff --git a/templates/partials/settings-modal.html b/templates/partials/settings-modal.html index 93c07cc..ff10382 100644 --- a/templates/partials/settings-modal.html +++ b/templates/partials/settings-modal.html @@ -73,6 +73,7 @@