From afe47259d71dd8e5ba3ce276b473c132184f4cf8 Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:53:36 +0100 Subject: [PATCH] fix(unlock): focus the username first when it is empty, on the quick-search path too The autofill hotkey already picked whichever field still needed filling; quick search forced the password, so a first unlock or one without a remembered username landed the cursor in the second field. --- TEST_SCENARIOS.md | 3 ++- js/app.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/TEST_SCENARIOS.md b/TEST_SCENARIOS.md index 27fa89c..4a38175 100644 --- a/TEST_SCENARIOS.md +++ b/TEST_SCENARIOS.md @@ -460,7 +460,8 @@ l'éditeur slideover : créer + éditer une entrée, ajouter/retirer des tags, ### H5 · coffre verrouillé ✅ - **ACTION** : verrouiller → `Ctrl+Shift+T`, puis **`Ctrl+Shift+Q`**, depuis une autre application (Notepad). -- **ATTENDU** : l'app revient au premier plan **et y reste**, focus sur le master password. Pas de no-op silencieux, et **aucun clignotement** : elle ne doit pas apparaître puis rendre la main à l'application de départ. +- **ATTENDU** : l'app revient au premier plan **et y reste**. Pas de no-op silencieux, et **aucun clignotement** : elle ne doit pas apparaître puis rendre la main à l'application de départ. +- **Où atterrit le curseur** : sur l'**identifiant** s'il est vide, sinon sur le mot de passe — même règle pour les quatre hotkeys. La quick search forçait le mot de passe, ce qui plaçait le curseur dans le second champ lors d'un premier déverrouillage ou sans identifiant mémorisé. - **Historique** : les deux chemins « coffre verrouillé » annulaient l'autofill avec le refocus **par défaut**, qui rend volontairement le premier plan à la fenêtre cible — juste après que Delphi ait affiché notre fenêtre. Sur `Ctrl+Shift+Q` ça se voyait comme un flash d'une frame avant le retour à Notepad ; sur `Ctrl+Shift+L` le `focusApp()` qui suit reprenait le focus, donc deux déplacements de fenêtre pour finir là où un seul suffit. Les deux passent maintenant `refocus=false` (cf. B17 : **un refus ne doit jamais déplacer une fenêtre**). ### H9 · retour au tray après un pick dans le picker ✅ diff --git a/js/app.js b/js/app.js index 9cc8a98..4323007 100644 --- a/js/app.js +++ b/js/app.js @@ -543,9 +543,17 @@ const Bridge = (() => { // Locked vault → fall through to the master-password screen. openQuickSearch(wasHidden, forFill) { if (state.locked || !state.cryptoKey || !state.token) { - const pwd = document.getElementById('loginPassword'); + const pwd = document.getElementById('loginPassword'); + const user = document.getElementById('loginUsername'); if (pwd && !document.getElementById('authScreen').classList.contains('is-hidden')) { - setTimeout(() => pwd.focus(), 60); + // Same rule as the autofill hotkey: land on whichever field + // still needs filling. Forcing the password meant a first + // unlock, or one without a remembered username, put the + // cursor in the second field. + setTimeout(() => { + if (user && !user.value) user.focus(); + else pwd.focus(); + }, 60); } if (typeof toast === 'function') toast('Vault is locked — unlock to search', 'warning');