fix(frontend,application): lot utilisateur #315 — détachement Paramètres projet, couleurs projet fiables, restauration conversation custom CLI, images post-aller-retour projet, retrait menus Projects/Project Context (QA verte)

- détachement: le panneau Paramètres du projet devient détachable (mapping historique panel=context → projectSettings dans parseViewWindowParams, DETACHABLE/ViewPanelBody alignés, ProjectsView ne court-circuitant plus le refus); Retry d'échec de détachement préservé
- couleurs projet: projectTheme publie idea:project-theme-changed localement + BroadcastChannel inter-webviews (fenêtres OS détachées), garde de révision par projet dans ProjectsView/ViewWindow contre les lectures settings en course — plus de flash/retour au bleu par défaut
- conversation custom CLI: transcript_restore_expected ne considère plus l'absence de scrollback volatile comme une restauration échouée quand la session rouvre en SessionPlan::None (continuation vide valide); CustomAgentChatView n'affiche plus le faux « conversation liée n'a pas pu être restaurée »
- images: conservation des images de conversation après changement de projet puis retour
- menus Panneaux: retrait des entrées Projects et Project Context (panelOrder WebWorkspace, création/switch via tab-bar +, contexte projet fusionné dans Paramètres du projet)
- QA verte: tests frontend ciblés window/ViewWindow/ProjectSettingsPanel/ProjectsView.detach/projects/CustomAgentChatView/WebDesktopWorkspace + cargo test -p application lifecycle transcript_restore_expected; fichiers .ideai/* (tickets 308-315, index/counter, agents/test, chat-drafts, system-permissions, project-settings.json, attachments/) et scripts/ hors périmètre préservés en worktree; aucun push
This commit is contained in:
2026-09-11 11:27:09 +02:00
parent 352ec2d8b7
commit 45f819e1e8
15 changed files with 434 additions and 82 deletions

View File

@ -89,19 +89,15 @@ describe("WebWorkspace desktop layout", () => {
expect(screen.queryByRole("button", { name: /detached/i })).toBeNull();
});
it("can dock a panel to the left from the menu bar while keeping the grid in the main area", async () => {
it("omits Projects and Project context from Panneaux while keeping project access", async () => {
renderPairedWebApp(await seededGateways());
fireEvent.click(await screen.findByText("Demo"));
await screen.findByTestId("layout-grid");
fireEvent.click(screen.getByRole("button", { name: "Panneaux" }));
const menu = await screen.findByRole("menu", { name: "Panneaux" });
fireEvent.click(within(menu).getByRole("button", { name: "Project context" }));
const submenu = await screen.findByRole("menu", { name: "Project context" });
fireEvent.click(within(submenu).getByRole("button", { name: "Ancré à gauche" }));
expect(await screen.findByLabelText("left dock")).toBeTruthy();
expect(await screen.findByLabelText("Project context panel")).toBeTruthy();
expect(screen.getByTestId("layout-grid")).toBeTruthy();
expect(within(menu).queryByRole("button", { name: "Contexte projet" })).toBeNull();
expect(within(menu).queryByRole("button", { name: "Projets" })).toBeNull();
expect(screen.getByRole("button", { name: "Projets" })).toBeTruthy();
});
});