fix: le bouton close de Settings ferme en un clic (v7.69.4)
Le bouton close de Settings devait être cliqué deux fois. Symptomatique depuis
le menu utilisateur ; depuis /workspaces ça marchait.
Cause : closeSettings() faisait history.back() PUIS window.location.reload()
après un délai FIXE de 100 ms. Le retour est une navigation asynchrone : quand
elle n'est pas terminée en 100 ms, le reload() retombe sur /settings et le
panneau « se ferme puis revient ». La profondeur d'historique diffère selon le
parcours — d'où le caractère intermittent et le fait que /workspaces
échappait au symptôme.
Correctif : location.replace() vers la page d'origine. Une seule navigation
déterministe — ni history.back(), ni popstate, ni rechargement différé. Aucun
chemin ne peut plus se terminer sans navigation. Effet secondaire assumé et
souhaitable : « Retour » ne rouvre plus Settings.
La branche window.opener ne fait plus de return inconditionnel : window.close()
échoue en silence quand l'onglet n'a pas été ouvert par du script, et l'ancien
code abandonnait alors sans navigation de repli — le bouton semblait mort.
CONTRÔLE NÉGATIF FAIT — le même spec a été exécuté contre deux builds :
ancien closeSettings() -> le parcours menu-utilisateur ÉCHOUE
(Received: "…/settings"), /workspaces passe ;
correctif -> les deux passent.
Le test verrouille aussi que le panneau position:fixed n'est plus peint
(.settings-overlay absent), qui est le symptôme exact rapporté.
Correction de diagnostic : le diagnostic posé en v7.69.3 (« Alpine ne lie pas
le composant x-data="settingsInit()" ») était FAUX — un artefact de mon banc
d'essai target="_blank", pas le parcours réel. La page étant réactive après le
premier clic, le handler s'exécutait bien. ROADMAP.md et CHANGELOG.md § v7.69.3
corrigés pour ne pas laisser une piste fausse en héritage.
pytest 1421 passed / 0 failed · ruff OK · OpenAPI 526 chemins / 7.69.4
e2e 18/18 verts sur l'instance déployée
This commit is contained in:
+19
-18
@@ -1215,26 +1215,27 @@ function settingsInit() {
|
||||
finally { this.backupRunning = false; }
|
||||
},
|
||||
closeSettings() {
|
||||
if (window.opener && !window.opener.closed) {
|
||||
window.opener.location.reload();
|
||||
window.close();
|
||||
return;
|
||||
}
|
||||
// If navigated directly to settings, redirect to workspaces (forces refresh)
|
||||
if (!document.referrer || document.referrer === window.location.href) {
|
||||
window.location.href = '/workspaces?ts=' + Date.now();
|
||||
return;
|
||||
}
|
||||
// Go back and force refresh
|
||||
// v7.69.4 — « ça ferme mais ça reste ouvert » quand Settings est ouvert
|
||||
// depuis le menu utilisateur : `shouldIntercept()` accepte `/settings`,
|
||||
// donc ce clic passe par fdLoad() (htmx + history.pushState) SANS
|
||||
// rechargement de page. L'ancien history.back() déclenchait alors un
|
||||
// popstate → swap PARTIEL de .main-wrapper, et le panneau `position:
|
||||
// fixed` restait peint au-dessus. Depuis /workspaces c'est un
|
||||
// chargement complet, d'où l'absence de symptôme.
|
||||
// → navigation explicite et déterministe : une seule requête, tout le
|
||||
// document est détruit, aucun chemin ne peut se terminer sans bouger.
|
||||
var prev = document.referrer;
|
||||
if (prev && prev.includes('/settings')) {
|
||||
// Came from another settings tab — go back two steps then refresh
|
||||
history.go(-2);
|
||||
setTimeout(function() { window.location.reload(); }, 100);
|
||||
} else {
|
||||
history.back();
|
||||
setTimeout(function() { window.location.reload(); }, 100);
|
||||
if (window.opener && !window.opener.closed) {
|
||||
// fermeture au mieux — on ne peut PAS vérifier qu'elle a réussi,
|
||||
// donc on enchaîne toujours sur la navigation ci-dessous.
|
||||
try { window.opener.location.reload(); } catch (e) { /* opener cross-origin */ }
|
||||
try { window.close(); } catch (e) { /* ignoré */ }
|
||||
}
|
||||
var back = '/workspaces';
|
||||
if (prev && prev.indexOf(location.origin) === 0 && prev.indexOf('/settings') < 0) {
|
||||
back = prev.split('#')[0];
|
||||
}
|
||||
location.replace(back + (back.indexOf('?') >= 0 ? '&' : '?') + 'ts=' + Date.now());
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user