diff --git a/src/components/DetailPanel.tsx b/src/components/DetailPanel.tsx index 0b833bb..3b25973 100644 --- a/src/components/DetailPanel.tsx +++ b/src/components/DetailPanel.tsx @@ -19,7 +19,7 @@ export function Field({ label, value }: { label: string; value: ReactNode }) { } // Minimize/expand toggle for the mobile overlay only; at md+ the panel is a sidebar so it's hidden. -function MinimizeButton({ collapsed, onToggle }: { collapsed: boolean; onToggle: () => void }) { +export function MinimizeButton({ collapsed, onToggle }: { collapsed: boolean; onToggle: () => void }) { return ( + {/* below md the dashboard overlays the list, like the node detail panel */} + {id ?
+
+ {t("observerPage.detail")} +
+ setMinimized(v => !v)} /> + select(null)} label={t("observerPage.back")} /> +
-
+
{t("common.loading")}

}> diff --git a/src/features/observers/ObserverSidebar.tsx b/src/features/observers/ObserverSidebar.tsx index 1d59cbf..c6077cd 100644 --- a/src/features/observers/ObserverSidebar.tsx +++ b/src/features/observers/ObserverSidebar.tsx @@ -61,7 +61,7 @@ export function ObserverSidebar({ observers, filtered, isPending, isError, onRet active ? "border-primary bg-primary/10" : "border-transparent hover:bg-text-normal/3" }`} > - {count != null &&
} + {count != null &&
}
{nameOf(o)} diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 0c8c5dc..45df1cc 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -258,6 +258,7 @@ }, "observerPage": { "back": "Back to observers", + "detail": "Observer detail", "range": "Time range", "open": "Open observer dashboard", "legacy": "Legacy presence count", @@ -309,7 +310,6 @@ "recording": "Loading observer…", "hour": "hour", "day": "day", - "directory": "All observers", "sidebarSearch": "Search observers", "noMatches": "No matches", "none": "No observers", diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index a919723..1be2ee5 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -262,6 +262,7 @@ }, "observerPage": { "back": "Retour aux observateurs", + "detail": "Détail de l'observateur", "range": "Période", "open": "Ouvrir le tableau de bord", "legacy": "Ancien compteur de présence", @@ -313,7 +314,6 @@ "recording": "Chargement de l’observateur…", "hour": "heure", "day": "jour", - "directory": "Tous les observateurs", "sidebarSearch": "Rechercher les observateurs", "noMatches": "Aucun résultat", "none": "Aucun observateur", diff --git a/tests/features/observers/ObserverPage.test.tsx b/tests/features/observers/ObserverPage.test.tsx index 6620222..43550de 100644 --- a/tests/features/observers/ObserverPage.test.tsx +++ b/tests/features/observers/ObserverPage.test.tsx @@ -116,15 +116,26 @@ describe("Observer destination", () => { expect(within(header).getByRole("button", { name: "Copy observer link" })).toHaveTextContent("Copy link"); expect(screen.getAllByRole("button", { name: "Compare with…" })).toHaveLength(1); }); - it("only offers a return to the list on mobile, where the list is hidden", async () => { + it("closes the mobile overlay from its header, back to the list", async () => { view("?tab=Observers&observer=observer-a&range=7d"); await screen.findByRole("heading"); - const back = screen.getByRole("button", { name: /Back to observers/ }); - expect(back.closest(".md\\:hidden")).not.toBeNull(); - fireEvent.click(back); + const header = screen.getByText("Observer detail").parentElement!; + expect(header).toHaveClass("md:hidden"); + fireEvent.click(within(header).getByRole("button", { name: "Back to observers" })); expect(screen.queryByRole("heading")).not.toBeInTheDocument(); expect(screen.getByRole("status").textContent).not.toContain("observer="); }); + it("minimizes the mobile overlay over the list and expands for the next pick", async () => { + view("?tab=Observers&observer=observer-a&range=7d"); + const body = () => screen.getByRole("heading").closest(".overflow-auto")!; + await screen.findByRole("heading"); + expect(list().getAllByRole("button")).toHaveLength(2); + fireEvent.click(screen.getByRole("button", { name: "Minimize detail panel" })); + expect(body()).toHaveClass("hidden"); + fireEvent.click(list().getByText("Basement B")); + expect(await screen.findByRole("heading")).toHaveTextContent("observer-b"); + expect(body()).not.toHaveClass("hidden"); + }); }); it("anchors a new comparison at the click time and accepts Refresh across an hour boundary", async () => {