diff --git a/changelog.d/1387-awareness-distance-kilometre.md b/changelog.d/1387-awareness-distance-kilometre.md new file mode 100644 index 000000000..4414b7c5f --- /dev/null +++ b/changelog.d/1387-awareness-distance-kilometre.md @@ -0,0 +1,3 @@ +- Show a Contacts entry 999.5 m or more away as 1.0 km. The panel kept meters + below 1000, then rounded 999.6 m up to "1000 m" + (Rudy Celekli, @rudycelekli, #1387). diff --git a/src/data/militaryAwareness.test.mjs b/src/data/militaryAwareness.test.mjs index 64104953e..ccb5739f2 100644 --- a/src/data/militaryAwareness.test.mjs +++ b/src/data/militaryAwareness.test.mjs @@ -42,7 +42,10 @@ import { formatAwarenessLabel, getAwarenessNavigationTargets, } from './militaryAwarenessEngine.js'; -import { formatAwarenessCount } from '../layers/awareness/panel.js'; +import { + formatAwarenessCount, + presentAwarenessDistance, +} from '../layers/awareness/panel.js'; import { NAVIGATION_AUTHORITY_EVENT } from '../navigationPolicy.js'; const militaryAwarenessSource = readLayerSource( @@ -69,6 +72,12 @@ test('Contacts labels a capped cohort as a lower bound', () => { assert.equal(formatAwarenessCount({ count: null }), '?'); }); +test('Contacts moves a distance that rounds to 1,000 m into kilometres', () => { + assert.equal(presentAwarenessDistance(999.4), '999\u00a0m'); + assert.equal(presentAwarenessDistance(999.6), '1.0\u00a0km'); + assert.equal(presentAwarenessDistance(4600), '4.6\u00a0km'); +}); + function installAwarenessRuntime({ isEnabled = () => true, isEffectivelyEnabled = isEnabled, diff --git a/src/layers/awareness/panel.js b/src/layers/awareness/panel.js index 5fe2a0ac8..120e91b2c 100644 --- a/src/layers/awareness/panel.js +++ b/src/layers/awareness/panel.js @@ -25,9 +25,10 @@ function presentAwarenessCount(summary = {}) { } /** A distance as the panel shows it: 850 m, 4.6 km, 120 km, in the UI language. */ -function presentAwarenessDistance(meters) { +export function presentAwarenessDistance(meters) { if (!Number.isFinite(meters) || meters < 0) return '—'; - if (meters < 1000) return formatQuantity(Math.round(meters), 'm'); + const wholeMeters = Math.round(meters); + if (wholeMeters < 1000) return formatQuantity(wholeMeters, 'm'); const digits = meters < 10000 ? 1 : 0; return formatQuantity(meters / 1000, 'km', { minimumFractionDigits: digits,