[fix](trx-frontend-http): make map links work before the map has loaded
The AIS and APRS mini views link each position to the map, and neither did anything: the map module installs itself lazily, and it was the one defining window.navigateToAprsMap, so until something had opened the Map tab the global did not exist. AIS calls it inline from onclick and threw "not a function"; APRS guards the call and so failed silently. The grid links on FT8, FT4, FT2 and WSPR rows went the same way through navigateToMapLocator. The app owns both globals now, installed at startup. They record the target, switch tabs through navigateToTab — the only path that materialises the panel from its template, loads the module and updates the history entry, none of which the module's own hand-rolled tab switch did — and the target is applied once the module reports ready. The module keeps the focusing, which is its job, and exposes it as focusMapPosition and focusMapLocator. The smoke test now calls the link from a cold page, asserting the map module is not loaded first so the check cannot pass by accident. Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -7,7 +7,7 @@ import { chromium } from "playwright-core";
|
||||
import { startBrowser, startWebFixture } from "./web-fixture.mjs";
|
||||
|
||||
// page.evaluate callbacks run in the browser, not in this Node process.
|
||||
/* global document, getComputedStyle */
|
||||
/* global document, getComputedStyle, window, location */
|
||||
|
||||
const fixture = await startWebFixture();
|
||||
const { selectedRigs } = fixture;
|
||||
@@ -23,6 +23,33 @@ try {
|
||||
await page.locator("summary", { hasText: "Audio controls" }).click();
|
||||
assert.equal(await page.locator("#rx-audio-btn").count(), 1);
|
||||
|
||||
// Map links from decode rows, before anything has opened the Map tab. The
|
||||
// lazy map module used to install these globals itself, so an AIS pin threw
|
||||
// "not a function" and an APRS link silently did nothing until the tab had
|
||||
// been visited once.
|
||||
const mapLinkReady = await page.evaluate(() => ({
|
||||
position: typeof window.navigateToAprsMap,
|
||||
locator: typeof window.navigateToMapLocator,
|
||||
mapModuleLoaded: !!window.trx.modules.map,
|
||||
}));
|
||||
assert.equal(mapLinkReady.position, "function", "navigateToAprsMap is missing before the map loads");
|
||||
assert.equal(mapLinkReady.locator, "function", "navigateToMapLocator is missing before the map loads");
|
||||
assert.equal(mapLinkReady.mapModuleLoaded, false, "the map module was already loaded, so this proves nothing");
|
||||
|
||||
await page.evaluate(() => { window.navigateToAprsMap(52.2, 21.0); });
|
||||
await page.locator("#aprs-map .leaflet-pane").first().waitFor({ state: "attached" });
|
||||
await page.waitForTimeout(500);
|
||||
const followed = await page.evaluate(() => ({
|
||||
path: location.pathname,
|
||||
active: [...document.querySelectorAll(".tab-bar .tab.active")].map((tab) => tab.dataset.tab || tab.id),
|
||||
mapHeight: Math.round(document.getElementById("aprs-map").getBoundingClientRect().height),
|
||||
}));
|
||||
assert.equal(followed.path, "/map", `the map link left the page on ${followed.path}`);
|
||||
assert.ok(followed.active.includes("map"), `the strip marks ${JSON.stringify(followed.active)}`);
|
||||
assert.ok(followed.mapHeight > 100, `the map came up ${followed.mapHeight}px tall`);
|
||||
await page.locator('.tab[data-tab="main"]').click();
|
||||
await page.waitForTimeout(200);
|
||||
|
||||
// Section order in the tray. "Advanced radio controls" is built at runtime,
|
||||
// so it lands wherever ui-core puts it rather than where the markup says —
|
||||
// appending, as it once did, always left it last.
|
||||
|
||||
Reference in New Issue
Block a user