diff --git a/src/engineering_platform/assets/dashboard.js b/src/engineering_platform/assets/dashboard.js index 424b487d..cff34902 100644 --- a/src/engineering_platform/assets/dashboard.js +++ b/src/engineering_platform/assets/dashboard.js @@ -5845,6 +5845,12 @@ function initializeNoProjectSelectedBanner() { banner.hidden = true; try { localStorage.setItem(noProjectDismissalStorageKey, "true"); } catch {} }); + $("dashboardProject")?.addEventListener("change", (event) => { + // Choosing the explicit global/no-project context is a fresh operator + // choice, rather than a continuation of a formerly dismissed notice. + if (event.currentTarget.value !== "") return; + try { localStorage.removeItem(noProjectDismissalStorageKey); } catch {} + }); } initializeNoProjectSelectedBanner(); applyDashboardLocale(); diff --git a/tests/engineering/dashboard.spec.mjs b/tests/engineering/dashboard.spec.mjs index 797c1517..23987cf1 100644 --- a/tests/engineering/dashboard.spec.mjs +++ b/tests/engineering/dashboard.spec.mjs @@ -141,6 +141,19 @@ test("dismisses the no-project banner for the current browser", async ({ page }) await expect(banner).toBeHidden(); }); +test("shows the no-project banner again after explicitly choosing no project", async ({ page }) => { + const noProjectUrl = new URL(dashboardUrl); + noProjectUrl.search = ""; + await page.goto(noProjectUrl.href, { waitUntil: "domcontentloaded" }); + const banner = page.getByTestId("no-project-selected"); + await page.locator("#noProjectSelectedDismiss").click(); + await expect(banner).toBeHidden(); + const navigation = page.waitForNavigation({ waitUntil: "domcontentloaded" }); + await page.locator("#dashboardProject").dispatchEvent("change"); + await navigation; + await expect(banner).toBeVisible(); +}); + test.afterAll(async () => { if (dashboard && dashboard.exitCode === null && dashboard.signalCode === null) { const exited = new Promise((resolve) => dashboard.once("exit", resolve));