3 Commits

Author SHA1 Message Date
4d22bb5d04 Merge main into feature/ui-host-phase-action-guards-68
All checks were successful
CI / test-and-quality (pull_request) Successful in 1m47s
CI / test-and-quality (push) Successful in 1m47s
2026-02-28 02:28:37 +01:00
2a488c6530 Merge pull request 'UI: host action guards ved manglende kontekst (#66)' (#67) from feature/ui-host-action-guards into main
All checks were successful
CI / test-and-quality (push) Successful in 1m28s
2026-02-28 02:14:56 +01:00
c9b4fe0077 UI: guard host actions on missing context (#66)
All checks were successful
CI / test-and-quality (push) Successful in 1m35s
CI / test-and-quality (pull_request) Successful in 1m37s
2026-02-28 02:09:05 +01:00
2 changed files with 4 additions and 0 deletions

View File

@@ -9,6 +9,7 @@
<button id="startRoundBtn" onclick="startRound()" disabled>2) Start runde</button> <button id="startRoundBtn" onclick="startRound()" disabled>2) Start runde</button>
<p id="startRoundHint">Kræver mindst 3 spillere i lobbyen.</p> <p id="startRoundHint">Kræver mindst 3 spillere i lobbyen.</p>
<p id="playerCountStatus">Spillere i session: ukendt</p> <p id="playerCountStatus">Spillere i session: ukendt</p>
<p id="phaseStatus">Fase: ukendt (opdatér session-status).</p> <p id="phaseStatus">Fase: ukendt (opdatér session-status).</p>
<button id="showQuestionBtn" onclick="showQuestion()" disabled>3) Vis spørgsmål</button> <button id="showQuestionBtn" onclick="showQuestion()" disabled>3) Vis spørgsmål</button>
<input id="roundQuestionId" placeholder="Round question id"> <input id="roundQuestionId" placeholder="Round question id">
@@ -25,6 +26,7 @@ var currentSessionStatus="";
function csrf(){var m=document.cookie.match(/csrftoken=([^;]+)/);return m?m[1]:"";} function csrf(){var m=document.cookie.match(/csrftoken=([^;]+)/);return m?m[1]:"";}
function code(){return document.getElementById("code").value.trim().toUpperCase();} function code(){return document.getElementById("code").value.trim().toUpperCase();}
function rq(){return document.getElementById("roundQuestionId").value.trim();} function rq(){return document.getElementById("roundQuestionId").value.trim();}
function saveHostContext(){try{localStorage.setItem("wppHostContext",JSON.stringify({code:code(),round_question_id:rq(),session_status:currentSessionStatus||""}));}catch(_e){}} function saveHostContext(){try{localStorage.setItem("wppHostContext",JSON.stringify({code:code(),round_question_id:rq(),session_status:currentSessionStatus||""}));}catch(_e){}}
function restoreHostContext(){try{var raw=localStorage.getItem("wppHostContext");if(!raw){return false;}var ctx=JSON.parse(raw);if(ctx.code){document.getElementById("code").value=(ctx.code||"").toUpperCase();}if(ctx.round_question_id){document.getElementById("roundQuestionId").value=ctx.round_question_id;}if(ctx.session_status){currentSessionStatus=ctx.session_status;}return !!ctx.code;}catch(_e){return false;}} function restoreHostContext(){try{var raw=localStorage.getItem("wppHostContext");if(!raw){return false;}var ctx=JSON.parse(raw);if(ctx.code){document.getElementById("code").value=(ctx.code||"").toUpperCase();}if(ctx.round_question_id){document.getElementById("roundQuestionId").value=ctx.round_question_id;}if(ctx.session_status){currentSessionStatus=ctx.session_status;}return !!ctx.code;}catch(_e){return false;}}
function phaseLabel(status){if(status==="lobby"){return"Lobby";}if(status==="lie"){return"Løgn";}if(status==="guess"){return"Gæt";}if(status==="reveal"){return"Reveal";}if(status==="finished"){return"Afsluttet";}return"Ukendt";} function phaseLabel(status){if(status==="lobby"){return"Lobby";}if(status==="lie"){return"Løgn";}if(status==="guess"){return"Gæt";}if(status==="reveal"){return"Reveal";}if(status==="finished"){return"Afsluttet";}return"Ukendt";}
@@ -42,6 +44,7 @@ function showScoreboard(){return api("/lobby/sessions/"+code()+"/scoreboard","GE
function nextRound(){return api("/lobby/sessions/"+code()+"/rounds/next","POST",{});} function nextRound(){return api("/lobby/sessions/"+code()+"/rounds/next","POST",{});}
function finishGame(){return api("/lobby/sessions/"+code()+"/finish","POST",{});} function finishGame(){return api("/lobby/sessions/"+code()+"/finish","POST",{});}
["code","roundQuestionId"].forEach(function(fieldId){var field=document.getElementById(fieldId);if(!field){return;}field.addEventListener("input",function(){syncStartRoundGuard(null);updateHostActionState();saveHostContext();});field.addEventListener("change",function(){syncStartRoundGuard(null);updateHostActionState();saveHostContext();});}); ["code","roundQuestionId"].forEach(function(fieldId){var field=document.getElementById(fieldId);if(!field){return;}field.addEventListener("input",function(){syncStartRoundGuard(null);updateHostActionState();saveHostContext();});field.addEventListener("change",function(){syncStartRoundGuard(null);updateHostActionState();saveHostContext();});});
updatePhaseStatus();syncStartRoundGuard(null);updateHostActionState(); updatePhaseStatus();syncStartRoundGuard(null);updateHostActionState();
if(restoreHostContext()){updatePhaseStatus();sessionDetail();}else{saveHostContext();} if(restoreHostContext()){updatePhaseStatus();sessionDetail();}else{saveHostContext();}
</script> </script>

View File

@@ -778,6 +778,7 @@ class UiScreenTests(TestCase):
self.assertContains(response, "id=\"showQuestionBtn\"") self.assertContains(response, "id=\"showQuestionBtn\"")
self.assertContains(response, "id=\"mixAnswersBtn\"") self.assertContains(response, "id=\"mixAnswersBtn\"")
self.assertContains(response, "id=\"hostActionHint\"") self.assertContains(response, "id=\"hostActionHint\"")
self.assertContains(response, "id=\"phaseStatus\"") self.assertContains(response, "id=\"phaseStatus\"")
self.assertContains(response, "updateHostActionState") self.assertContains(response, "updateHostActionState")
self.assertContains(response, "phaseLabel") self.assertContains(response, "phaseLabel")