import type { Locator, Page } from '@playwright/test' export type AdminLinkSlug = 'users' | 'roles' | 'sites' | 'categories' | 'audit-log' /** * Page Object de la sidebar (MalioSidebar), scope sur les items "admin". * * Strategie selecteur : `a[href=...]` plutot que le texte i18n. Le slug de * route ne change pas quand on retraduit ou renomme une entree — c'est le * selecteur le plus stable pour cette suite. * * Si un jour la sidebar change et les slugs bougent, on met a jour CE * fichier uniquement ; les specs continuent de passer. */ export class SidebarComponent { readonly page: Page constructor(page: Page) { this.page = page } adminLink(slug: AdminLinkSlug): Locator { return this.page.locator(`a[href="/admin/${slug}"]`) } accountDashboardLink(): Locator { return this.page.locator('a[href="/"]').first() } /** * Bloc « compte connecte » du footer de la sidebar. Cible de survol qui * revele le bouton de deconnexion (la deconnexion n'est plus un item de nav * `/logout` mais un lien du footer, cf. default.vue + useLogout). */ accountBlock(): Locator { return this.page.locator('[data-test="sidebar-account"]') } /** * Bouton de deconnexion du footer (revele au survol du bloc compte en mode * deplie, ou directement la pastille en mode replie). Selecteur par * `data-test` : stable au renommage/retraduction du label. */ logoutButton(): Locator { return this.page.locator('[data-test="sidebar-logout"]') } }