feat(frontend): ajoute les menus Panneaux/Paramètres à la version web (#90)

WebWorkspace gagne un menu « Panneaux » qui route la surface principale du
projet ouvert vers les panneaux transport-neutres déjà réutilisables
(contexte, agents, templates, skills, permissions, mémoire, git) en plus des
surfaces web existantes (travail live, tickets, sprints), ainsi qu'un variant
web du panneau Projets (création par chemin serveur saisi manuellement, sans
browse natif). WebApp gagne un menu « Paramètres » (Profils IA, Appareils,
Déploiement désactivé "Desktop uniquement") qui remplace l'ancien bouton
unique "Appareils".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-21 18:33:22 +02:00
parent 678ff3011b
commit 30f6415d51
7 changed files with 710 additions and 167 deletions

View File

@ -74,28 +74,28 @@ function renderWorkspace(gateways: Gateways) {
);
}
async function openProjectAndTab(gateways: Gateways, tabName: string) {
/** Opens the panel named `panelLabel` ("Tickets"/"Sprints"/…) via the "Panneaux" menu. */
async function openProjectAndTab(gateways: Gateways, panelLabel: string) {
renderWorkspace(gateways);
fireEvent.click(await screen.findByText("IdeA"));
await screen.findByRole("tablist", { name: "Navigation du projet" });
fireEvent.click(screen.getByRole("tab", { name: tabName }));
fireEvent.click(await screen.findByRole("button", { name: /^Panneaux :/ }));
fireEvent.click(await screen.findByRole("button", { name: panelLabel }));
}
describe("WebWorkspace — project tabs (ticket #86)", () => {
it("defaults to the Live tab and lets the user switch to Tickets/Sprints", async () => {
it("defaults to the Travail panel and lets the user switch to Tickets/Sprints via Panneaux", async () => {
const { gateways } = await setup();
renderWorkspace(gateways);
fireEvent.click(await screen.findByText("IdeA"));
const tablist = await screen.findByRole("tablist", { name: "Navigation du projet" });
const tabs = within(tablist).getAllByRole("tab");
expect(tabs.map((t) => t.textContent)).toEqual(["Live", "Tickets", "Sprints"]);
expect(screen.getByRole("tab", { name: "Live" }).getAttribute("aria-selected")).toBe("true");
expect(await screen.findByRole("button", { name: "Panneaux : Travail" })).toBeTruthy();
fireEvent.click(screen.getByRole("tab", { name: "Tickets" }));
fireEvent.click(screen.getByRole("button", { name: "Panneaux : Travail" }));
fireEvent.click(await screen.findByRole("button", { name: "Tickets" }));
expect(await screen.findByRole("heading", { name: "Tickets" })).toBeTruthy();
fireEvent.click(screen.getByRole("tab", { name: "Sprints" }));
fireEvent.click(screen.getByRole("button", { name: "Panneaux : Tickets" }));
fireEvent.click(await screen.findByRole("button", { name: "Sprints" }));
expect(await screen.findByRole("heading", { name: "Sprints" })).toBeTruthy();
});