Files
html/wiki/doctrine-101-ux-zero-spinner-fantome.md
opus c97f02370b
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-sync via WEVIA git_sync_all intent 2026-04-21T11:37:48+02:00
2026-04-21 11:37:49 +02:00

2.2 KiB

Doctrine 101 — UX Zero Spinner Fantome

Date: 2026-04-21
Issue root cause: login.html affichait "Redirection SSO Authentik..." avec spinner en permanence alors que l'auto-redirect était desactivée. L'utilisateur voyait un faux etat de chargement infini.

Regle

Un spinner, un loader, un message "Redirection en cours..." ou "Chargement..." ne doit jamais etre affiche sans une action reelle en cours derriere.

  • Si l'action est desactivee par defaut → le loader doit etre cache par defaut
  • Si une condition active l'action → afficher le loader UNIQUEMENT dans cette branche
  • Toujours tester la logique inversee : if(condition_inactive){...}else{hide} est un anti-pattern

Pattern correct

// CORRECT — cache par defaut, affiche si action reelle
el.style.display = 'none';
if (should_redirect) {
  el.style.display = 'block';
  doRedirect();
}

Anti-pattern a proscrire

// INTERDIT — logique inversee, loader reste visible par defaut
if (!should_redirect) {
  // branche vide, loader reste visible sans raison
} else {
  el.style.display = 'none';
}

Points UX premium associes

  • Auto-focus : quand un formulaire s'ouvre manuellement (click toggle), focus auto sur le premier champ pour gain de temps
  • CSS guards globaux : sur page non-authentifiee (login, reset-password) bloquer tout bouton Logout ou badge session injecte par scripts globaux
  • Zero bouton fantome : un bouton ne doit rien presenter qui contredit l'etat courant (ex: Logout sur page login)

Tests obligatoires avant commit

# Playwright assertions minimales
const spinnerHidden = !(await p.isVisible('#auto-redirect'));
const logoutCount = await p.locator('[class*="logout"]:visible').count();
assert(spinnerHidden === true);
assert(logoutCount === 0);

Integration pipeline

  • Intent WEVIA Master : fix_login_ux (priority-intents-nl.json)
  • Intent WEVIA Master : playwright_screenshot (pour verification visuelle)
  • NonReg category : UI (a creer si besoin)
  • L99 layer : PLAYWRIGHT-VISUAL (deja present)

Refs

  • Fix commit : c49928485 (2026-04-21 11:28:41)
  • GOLD backup : login.html.GOLD-20260421-112638-pre-auth-fix
  • Test Playwright : 5/5 pass (spinner hidden, logout hidden, focus auto, login redirect, final URL)