From 1ff98f5e92c03b081e52f1f7de6cef6fce0fdd7f Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Sat, 28 Feb 2026 06:35:51 +0100 Subject: [PATCH] UI: lock session-detail while join is in-flight (#111) --- lobby/templates/lobby/player_screen.html | 2 +- lobby/tests.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lobby/templates/lobby/player_screen.html b/lobby/templates/lobby/player_screen.html index 5c94f1a..67a35ed 100644 --- a/lobby/templates/lobby/player_screen.html +++ b/lobby/templates/lobby/player_screen.html @@ -78,7 +78,7 @@ function stopPlayerAutoRefresh(reason){playerAutoRefreshEnabled=false;if(playerA function startPlayerAutoRefresh(){if(!code()){updatePlayerAutoRefreshUi();return;}playerAutoRefreshEnabled=true;if(playerAutoRefreshTimer){clearInterval(playerAutoRefreshTimer);}playerAutoRefreshTimer=setInterval(function(){if(!code()||sessionDetailInFlight){return;}if(currentSessionStatus==="finished"){stopPlayerAutoRefresh("Auto-refresh stoppet: spillet er afsluttet.");return;}sessionDetail();},10000);updatePlayerAutoRefreshUi();savePlayerContext();} function togglePlayerAutoRefresh(){if(playerAutoRefreshEnabled){stopPlayerAutoRefresh();return;}startPlayerAutoRefresh();} function updatePlayerErrorHint(status,data){var el=document.getElementById("playerErrorHint");if(!el){return;}if(status>=200&&status<300){el.textContent="Ingen fejl.";return;}var errKey=normalizeApiError(data);el.textContent="Fejl: "+mapUiErrorMessage(errKey)+" ("+(errKey||("http_"+status))+")";} -function updateSessionDetailState(){var btn=document.getElementById("sessionDetailBtn");var hint=document.getElementById("sessionRefreshHint");if(btn){btn.disabled=sessionDetailInFlight||!code();}if(!hint){updatePlayerAutoRefreshUi();return;}if(sessionDetailInFlight){hint.textContent="Opdaterer session-status…";updatePlayerAutoRefreshUi();return;}if(!code()){hint.textContent="Angiv sessionkode for at opdatere session-status.";updatePlayerAutoRefreshUi();return;}hint.textContent="Session-opdatering klar.";updatePlayerAutoRefreshUi();} +function updateSessionDetailState(){var btn=document.getElementById("sessionDetailBtn");var hint=document.getElementById("sessionRefreshHint");if(btn){btn.disabled=sessionDetailInFlight||joinInFlight||!code();}if(!hint){updatePlayerAutoRefreshUi();return;}if(sessionDetailInFlight){hint.textContent="Opdaterer session-status…";updatePlayerAutoRefreshUi();return;}if(joinInFlight){hint.textContent="Session-opdatering er låst mens join kører.";updatePlayerAutoRefreshUi();return;}if(!code()){hint.textContent="Angiv sessionkode for at opdatere session-status.";updatePlayerAutoRefreshUi();return;}hint.textContent="Session-opdatering klar.";updatePlayerAutoRefreshUi();} function updateJoinState(){var btn=document.getElementById("joinBtn");var status=document.getElementById("joinStatus");var joined=!!(pid()&&document.getElementById("sessionToken").value.trim());var canJoin=canAttemptJoin();if(btn){btn.disabled=joinInFlight||sessionDetailInFlight||joined||!canJoin;}if(!status){updateContextLockState();return;}if(joinInFlight){status.textContent="Joiner…";updateContextLockState();return;}if(sessionDetailInFlight&&!joined){status.textContent="Afvent aktiv session-opdatering før join.";updateContextLockState();return;}if(joined){status.textContent="Join gennemført.";updateContextLockState();return;}if(!canJoin){status.textContent="Udfyld kode og nickname for at join.";updateContextLockState();return;}status.textContent="Klar til join.";updateContextLockState();} function guessStorageKey(){var c=code();var p=pid();var q=rq();if(!c||!p||!q){return "";}return ["wppGuess",c,p,q].join(":");} diff --git a/lobby/tests.py b/lobby/tests.py index 57ad7fc..1880560 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -868,7 +868,7 @@ class UiScreenTests(TestCase): self.assertContains(response, "resetRoundContextForManualChange") self.assertContains(response, "Runde-kontekst afventer session-opdatering.") self.assertContains(response, "togglePlayerAutoRefresh") - self.assertContains(response, "btn.disabled=sessionDetailInFlight||!code()") + self.assertContains(response, "btn.disabled=sessionDetailInFlight||joinInFlight||!code()") self.assertContains(response, "Auto-refresh-lås: afvent aktiv session-opdatering.") self.assertContains(response, "Auto-refresh kræver sessionkode.") self.assertContains(response, "markPlayerSessionRefresh") @@ -876,6 +876,7 @@ class UiScreenTests(TestCase): self.assertContains(response, "updateSessionDetailState") self.assertContains(response, "session_detail_in_flight") self.assertContains(response, "Opdaterer session-status…") + self.assertContains(response, "Session-opdatering er låst mens join kører.") self.assertContains(response, "Session-data ikke opdateret endnu.") self.assertContains(response, "Sidst opdateret:") self.assertContains(response, "Session-data kan være forældet")