diff --git a/src/engineering_platform/assets/dashboard.js b/src/engineering_platform/assets/dashboard.js index 5b5c40d6..3afd90c4 100644 --- a/src/engineering_platform/assets/dashboard.js +++ b/src/engineering_platform/assets/dashboard.js @@ -5854,6 +5854,16 @@ replaceWithLocalFilesystemLink(workspaceLocation); replaceWithLocalFilesystemLink($("rateLimitProviderPath")); const noProjectDismissalStorageKey = "engineering-platform.no-project-selected.dismissed.v1"; function initializeNoProjectSelectedBanner() { + const projectSelector = $("dashboardProject"); + if (projectSelector && !projectSelector.dataset.noProjectDismissalResetBound) { + projectSelector.dataset.noProjectDismissalResetBound = "true"; + projectSelector.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 {} + }); + } const banner = $("noProjectSelected"), dismiss = $("noProjectSelectedDismiss"); if (!banner || !dismiss || dismiss.dataset.dismissBound) return; dismiss.dataset.dismissBound = "true"; @@ -5864,12 +5874,6 @@ 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 dbf88e23..d5d6de93 100644 --- a/tests/engineering/dashboard.spec.mjs +++ b/tests/engineering/dashboard.spec.mjs @@ -142,15 +142,14 @@ test("dismisses the no-project banner for the current browser", async ({ page }) }); 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" }); + await page.goto(dashboardUrl, { waitUntil: "domcontentloaded" }); + await page.evaluate(() => { + localStorage.setItem("engineering-platform.no-project-selected.dismissed.v1", "true"); + }); + const selector = page.locator("#dashboardProject"); + await expect(selector).not.toHaveValue(""); + await selector.selectOption(""); 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(); });