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.
This commit is contained in:
r-zakarya
2026-08-07 14:53:36 +01:00
parent 476d6660ad
commit afe47259d7
2 changed files with 12 additions and 3 deletions
+2 -1
View File
@@ -460,7 +460,8 @@ l'éditeur slideover : créer + éditer une entrée, ajouter/retirer des tags,
### H5 · coffre verrouillé ✅ ### H5 · coffre verrouillé ✅
- **ACTION** : verrouiller → `Ctrl+Shift+T`, puis **`Ctrl+Shift+Q`**, depuis une autre application (Notepad). - **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**). - **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 ✅ ### H9 · retour au tray après un pick dans le picker ✅
+9 -1
View File
@@ -544,8 +544,16 @@ const Bridge = (() => {
openQuickSearch(wasHidden, forFill) { openQuickSearch(wasHidden, forFill) {
if (state.locked || !state.cryptoKey || !state.token) { 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')) { 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') if (typeof toast === 'function')
toast('Vault is locked — unlock to search', 'warning'); toast('Vault is locked — unlock to search', 'warning');