From 7dcf671b2e7e28f299a925fd0f75959cc8ed4c6d Mon Sep 17 00:00:00 2001 From: Sameh Khamis Date: Sun, 8 Nov 2026 14:51:34 -0800 Subject: [PATCH] fix(satellites): a hidden class stays out of analyst and voice answers; the tracked satellite still answers --- src/data/satellites.analyst.test.mjs | 49 ++++++++++++++++++++++++++++ src/layers/satellites/records.js | 6 ++++ src/layers/satellites/testing.js | 8 ++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/data/satellites.analyst.test.mjs b/src/data/satellites.analyst.test.mjs index 9f1e9bd3f..543014f21 100644 --- a/src/data/satellites.analyst.test.mjs +++ b/src/data/satellites.analyst.test.mjs @@ -152,3 +152,52 @@ test('satellite getAnalystRecords: core rows beat dense extras under the cap', ( _clearDenseCatalogStateForTest(); } }); + +test('satellite getAnalystRecords: a hidden class stays out, the tracked one stays in', () => { + const satrec = twoline2satrec(ISS_L1, ISS_L2); + const at = (lon, alt) => ({ + position: Cesium.Cartesian3.fromDegrees(lon, 10, alt), + }); + _setTrackedSatelliteRefreshStateForTest({ + noradId: ISS_NORAD, + name: 'ISS (ZARYA)', + satrec, + entity: {}, + point: at(-97, 420_000), + viewer: {}, + now: () => Date.now(), + satelliteClass: 'stations', + classes: { + stations: false, + imaging: true, + telecom: false, + starlink: false, + probes: true, + debris: true, + }, + neighbours: [ + { + noradId: 24876, + name: 'GPS BIIR-2', + group: 'gps-ops', + satelliteClass: 'telecom', + point: at(-100, 20_200_000), + }, + { + noradId: 90001, + name: 'TEST IMAGER', + group: 'resource', + satelliteClass: 'imaging', + point: at(-80, 700_000), + }, + ], + }); + try { + assert.deepEqual( + satellitesLayer.getAnalystRecords(10).map((r) => r.noradId), + ['25544', '90001'], + ); + } finally { + _clearDenseCatalogStateForTest(); + } +}); diff --git a/src/layers/satellites/records.js b/src/layers/satellites/records.js index a25a92bf3..84ca0e3ff 100644 --- a/src/layers/satellites/records.js +++ b/src/layers/satellites/records.js @@ -86,6 +86,12 @@ export function createRecords({ state, parts }) { const result = []; const emit = (noradId, sat) => { if (result.length >= limit) return false; + // A class the user hid stays out of answers too; the tracked one stays. + if ( + noradId !== state._trackedNorad && + parts.controls?._classVisible?.(noradId) === false + ) + return true; const pos = analystGeo(noradId, sat, now); if (!pos) return true; result.push( diff --git a/src/layers/satellites/testing.js b/src/layers/satellites/testing.js index e0f394a50..28f3b09d1 100644 --- a/src/layers/satellites/testing.js +++ b/src/layers/satellites/testing.js @@ -26,10 +26,14 @@ export function createTesting({ state: layerState, services, parts, source }) { // Extra catalog/point rows so a test can exercise a docked cluster (and a // control satellite that must NOT be treated as part of it). neighbours = [], + // Optional class of the tracked satellite and class visibility, e.g. + // { telecom: false }. + satelliteClass = undefined, + classes = null, }) { layerState._viewer = viewer; layerState._catalog = new Map([ - [noradId, { name, satrec, group: 'stations' }], + [noradId, { name, satrec, group: 'stations', satelliteClass }], ]); layerState._points = new Map([[noradId, point]]); for (const neighbour of neighbours) { @@ -37,6 +41,7 @@ export function createTesting({ state: layerState, services, parts, source }) { name: neighbour.name, satrec: neighbour.satrec || satrec, group: neighbour.group || 'stations', + satelliteClass: neighbour.satelliteClass, }); layerState._points.set(neighbour.noradId, neighbour.point); } @@ -51,6 +56,7 @@ export function createTesting({ state: layerState, services, parts, source }) { catalog: 'core', showPoints: false, showOrbits: false, + ...(classes ? { classes } : {}), }; layerState._enabled = true; }