// v7.69.4 — le bouton close de Settings doit fermer le panneau, y compris // quand Settings est ouvert depuis le MENU UTILISATEUR (navigation partielle). // // `shouldIntercept()` accepte `/settings`, donc ce clic passe par fdLoad() // (htmx + history.pushState) SANS rechargement de page. L'ancien closeSettings() // faisait `history.back()` → popstate → swap PARTIEL de .main-wrapper, et le // panneau `position:fixed` restait peint : « ça ferme mais ça reste ouvert ». // Depuis /workspaces, c'est un chargement complet → pas de symptôme. const { test, expect } = require('@playwright/test'); const FD_BASE = process.env.FD_BASE_URL || 'http://localhost:8081'; const USER = process.env.FD_USER || 'e2e@flowdeck.local'; const PASS = process.env.FD_PASS || 'e2e-secret-123'; async function login(page) { await page.goto(`${FD_BASE}/auth/login?provider=local`, { waitUntil: 'domcontentloaded' }); await page.fill('#email', USER); await page.fill('#password', PASS); await page.click('.btn-primary'); await page.waitForURL('**/workspaces', { timeout: 8000 }).catch(() => {}); } const csrfOf = async (page) => { const c = await page.context().cookies(); return (c.find((x) => x.name === 'csrf_token') || {}).value || ''; }; async function makeWorkspace(page) { const r = await page.request.post(`${FD_BASE}/api/workspaces`, { headers: { 'X-CSRF-Token': await csrfOf(page) }, data: { name: `e2e-cls-${Date.now()}-${Math.random().toString(16).slice(2, 6)}` }, }); const j = await r.json(); return j.id || (j.workspace && j.workspace.id); } // ouvre Settings depuis le menu utilisateur — le chemin qui provoque le bug async function openSettingsFromUserMenu(page) { await page.locator('.workspace-avatar, .user-avatar').first().click(); await page.locator('.um-item[href="/settings"]').first().click(); await page.waitForSelector('button.settings-close', { timeout: 8000 }); } test('close ferme Settings ouvert depuis le menu utilisateur (nav partielle)', async ({ page }) => { await login(page); const id = await makeWorkspace(page); await page.goto(`${FD_BASE}/local-workspace?ws=${id}`, { waitUntil: 'domcontentloaded' }); await openSettingsFromUserMenu(page); expect(page.url()).toContain('/settings'); await page.locator('button.settings-close').click(); await page.waitForTimeout(900); // plus sur /settings… expect(page.url()).not.toContain('/settings'); expect(page.url()).toContain('/local-workspace'); // …et surtout : le panneau `position:fixed` ne doit PLUS être peint. C'est // le symptôme exact rapporté (« ça ferme mais ça reste ouvert »). expect(await page.locator('.settings-overlay').count()).toBe(0); await expect(page.locator('button.settings-close')).toHaveCount(0); }); test('close ferme Settings ouvert par chargement complet depuis /workspaces', async ({ page }) => { await login(page); await page.goto(`${FD_BASE}/workspaces`, { waitUntil: 'domcontentloaded' }); await openSettingsFromUserMenu(page); expect(page.url()).toContain('/settings'); await page.locator('button.settings-close').click(); await page.waitForTimeout(900); expect(page.url()).not.toContain('/settings'); expect(await page.locator('.settings-overlay').count()).toBe(0); });