UpsellDialog : y faire passer la fenêtre d’incitation de ProfileSwitcher, et fermer sur Échap #451

Open
opened 2026-10-17 00:03:20 +00:00 by maximus · 1 comment
Owner

Contexte

#369 ajoute src/components/shared/UpsellDialog.tsx : l'écran verrouillé (UpsellGate) dans une fenêtre, pour une action gatée dans une page Free (le bouton Répartition de la page Transactions). Son balisage reprend celui de la fenêtre d'incitation de ProfileSwitcher.tsx (l. 142 à 162 sur main 065f580), qui n'a pas été migrée dessus pour garder #369 dans son périmètre.

Les deux ont déjà divergé : UpsellDialog porte role="dialog", aria-modal="true", un nom accessible (upsell.title) et un aria-label sur son bouton de fermeture ; la fenêtre de ProfileSwitcher n'a rien de cela. Aucune des deux ne se ferme sur Échap, alors que TransactionDetailModal, FeedbackConsentDialog et CategoriesMigrationRestoreModal le font (relevé du contrôle du plan de #369).

Travail à faire

  • ProfileSwitcher : remplacer sa fenêtre d'incitation par <UpsellDialog feature="multi-profile" onClose={() => setShowUpsell(false)} />, en gardant la fermeture après « J'ai déjà une clé » (#346).
  • UpsellDialog : fermer sur Échap, sur le modèle de TransactionDetailModal (keydown sur document, retiré au démontage). Le tester avec le harnais src/test/hookHarness.ts (useEffect et commit()), l'écouteur étant simulé sans DOM.

Critères d'acceptation

  • Une seule fenêtre d'incitation, utilisée par ProfileSwitcher et TransactionTable.
  • Échap ferme la fenêtre ; un test rougit si l'écouteur disparaît ou n'est pas retiré au démontage.
  • Les deux usages restent testés : nom accessible, fermeture par le bouton, onNavigate.

Liens

  • #369 (Répartition réservée à l'édition Base), #346 (UpsellGate, onNavigate)
## Contexte #369 ajoute `src/components/shared/UpsellDialog.tsx` : l'écran verrouillé (`UpsellGate`) dans une fenêtre, pour une action gatée dans une page Free (le bouton Répartition de la page Transactions). Son balisage reprend celui de la fenêtre d'incitation de `ProfileSwitcher.tsx` (l. 142 à 162 sur `main` `065f580`), qui n'a pas été migrée dessus pour garder #369 dans son périmètre. Les deux ont déjà divergé : `UpsellDialog` porte `role="dialog"`, `aria-modal="true"`, un nom accessible (`upsell.title`) et un `aria-label` sur son bouton de fermeture ; la fenêtre de `ProfileSwitcher` n'a rien de cela. Aucune des deux ne se ferme sur Échap, alors que `TransactionDetailModal`, `FeedbackConsentDialog` et `CategoriesMigrationRestoreModal` le font (relevé du contrôle du plan de #369). ## Travail à faire - `ProfileSwitcher` : remplacer sa fenêtre d'incitation par `<UpsellDialog feature="multi-profile" onClose={() => setShowUpsell(false)} />`, en gardant la fermeture après « J'ai déjà une clé » (#346). - `UpsellDialog` : fermer sur Échap, sur le modèle de `TransactionDetailModal` (`keydown` sur `document`, retiré au démontage). Le tester avec le harnais `src/test/hookHarness.ts` (`useEffect` et `commit()`), l'écouteur étant simulé sans DOM. ## Critères d'acceptation - [ ] Une seule fenêtre d'incitation, utilisée par `ProfileSwitcher` et `TransactionTable`. - [ ] Échap ferme la fenêtre ; un test rougit si l'écouteur disparaît ou n'est pas retiré au démontage. - [ ] Les deux usages restent testés : nom accessible, fermeture par le bouton, `onNavigate`. ## Liens - #369 (Répartition réservée à l'édition Base), #346 (`UpsellGate`, `onNavigate`)
maximus added the
status:triage
type:refactor
source:human
labels 2026-10-17 00:03:20 +00:00
Author
Owner

Ajout de la revue de la PR #452 (commentaire 24129), à traiter avec Échap : la fenêtre ne prend pas le focus. Au clavier, Entrée sur le bouton Répartition l'ouvre, mais le focus reste sur le bouton, derrière le voile, et Tab parcourt les lignes restantes du tableau avant d'atteindre la fenêtre, rendue après lui. Même défaut dans la fenêtre de ProfileSwitcher. PinDialog et ImportConfirmModal posent un autoFocus.

Critère à ajouter : à l'ouverture, le focus est dans la fenêtre (bouton de fermeture ou premier CTA) ; à la fermeture, il revient au bouton qui l'a ouverte.

Ajout de la revue de la PR #452 (commentaire 24129), à traiter avec Échap : **la fenêtre ne prend pas le focus.** Au clavier, Entrée sur le bouton Répartition l'ouvre, mais le focus reste sur le bouton, derrière le voile, et Tab parcourt les lignes restantes du tableau avant d'atteindre la fenêtre, rendue après lui. Même défaut dans la fenêtre de `ProfileSwitcher`. `PinDialog` et `ImportConfirmModal` posent un `autoFocus`. Critère à ajouter : à l'ouverture, le focus est dans la fenêtre (bouton de fermeture ou premier CTA) ; à la fermeture, il revient au bouton qui l'a ouverte.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#451
No description provided.