From 3f1564817c26b79d246ed8c648b4c8d6dc8e76aa Mon Sep 17 00:00:00 2001 From: James Smith Date: Thu, 19 Mar 2026 16:41:55 +0000 Subject: [PATCH] Stabilize satellite pass target switching --- templates/satellite_dashboard.html | 34 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/templates/satellite_dashboard.html b/templates/satellite_dashboard.html index 2cd270e..32c40bf 100644 --- a/templates/satellite_dashboard.html +++ b/templates/satellite_dashboard.html @@ -1796,7 +1796,8 @@ async function calculatePasses() { const lat = parseFloat(document.getElementById('obsLat').value); const lon = parseFloat(document.getElementById('obsLon').value); - const requestKey = getActivePassRequestKey(selectedSatellite); + const requestedSatellite = selectedSatellite; + const requestKey = getActivePassRequestKey(requestedSatellite); const container = document.getElementById('passList'); const button = document.querySelector('.controls-bar .btn.primary'); @@ -1838,7 +1839,7 @@ longitude: lon, hours: 48, minEl: 5, - satellites: [selectedSatellite] + satellites: [requestedSatellite] }) }); if (_passTimeoutId) { @@ -1858,9 +1859,13 @@ } const data = await response.json(); if (requestId !== _passRequestId) return; + const stillSelected = requestedSatellite === selectedSatellite; if (data.status === 'success') { - passes = Array.isArray(data.passes) ? data.passes : []; - cacheCurrentPasses(selectedSatellite, passes); + const resolvedPasses = Array.isArray(data.passes) ? data.passes : []; + cacheCurrentPasses(requestedSatellite, resolvedPasses); + if (!stillSelected) return; + + passes = resolvedPasses; try { renderPassList(); @@ -1906,16 +1911,24 @@ document.getElementById('trackingDot').style.background = 'var(--accent-green)'; _dashboardRetryAttempts = 0; } else { - const cached = getCachedPasses(selectedSatellite); + const cached = getCachedPasses(requestedSatellite); + if (!stillSelected) return; if (cached?.passes?.length) { passes = cached.passes; renderPassList(); updateStats(); updateMissionDrawerInfo(); + if (!Number.isInteger(selectedPass) || !passes[selectedPass]) { + selectedPass = 0; + } + if (passes[selectedPass]) { + selectPass(selectedPass); + } document.getElementById('trackingStatus').textContent = 'TRACKING'; document.getElementById('trackingDot').style.background = 'var(--accent-green)'; } else { passes = []; + selectedPass = null; renderPassList(); updateMissionDrawerInfo(); document.getElementById('trackingStatus').textContent = 'ERROR'; @@ -1942,15 +1955,24 @@ return; } console.error('Pass calculation error:', err); - const cached = getCachedPasses(selectedSatellite); + const cached = getCachedPasses(requestedSatellite); + if (requestedSatellite !== selectedSatellite) return; if (cached?.passes?.length) { passes = cached.passes; renderPassList(); updateStats(); + updateMissionDrawerInfo(); + if (!Number.isInteger(selectedPass) || !passes[selectedPass]) { + selectedPass = 0; + } + if (passes[selectedPass]) { + selectPass(selectedPass); + } document.getElementById('trackingStatus').textContent = 'TRACKING'; document.getElementById('trackingDot').style.background = 'var(--accent-green)'; } else { passes = []; + selectedPass = null; if (container) { container.innerHTML = '
Failed to calculate passes
'; } else {