fixed modal UX issue; now persists as intended, until token cost met in all six slots

This commit is contained in:
Disco DeDisco
2026-03-14 00:34:07 -04:00
parent af3523c9bb
commit d780115515
6 changed files with 74 additions and 46 deletions

View File

@@ -1,3 +1,5 @@
import time
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
from .base import FunctionalTest from .base import FunctionalTest
@@ -195,6 +197,23 @@ class GatekeeperTest(FunctionalTest):
)) ))
self.assertFalse(Room.objects.filter(name="Doomed Room").exists()) self.assertFalse(Room.objects.filter(name="Doomed Room").exists())
def test_gatekeeper_overlay_persists_after_htmx_poll(self):
# 1. Create room directly (GATHERING) and navigate to its gate URL
self.create_pre_authenticated_session("founder@test.io")
founder = User.objects.get(email="founder@test.io")
room = Room.objects.create(name="Persistent Room", owner=founder)
self.browser.get(self.live_server_url + f"/gameboard/room/{room.id}/gate/")
# 2. Assert overlay visible on initial page load
self.wait_for(
lambda: self.browser.find_element(By.CSS_SELECTOR, ".gate-overlay")
)
# 3. Wait for HTMX poll cycle to fire (poll interval is 3s)
time.sleep(4)
# 4. Assert overlay still present and visible after poll
overlays = self.browser.find_elements(By.CSS_SELECTOR, ".gate-overlay")
self.assertEqual(len(overlays), 1)
self.assertTrue(overlays[0].is_displayed())
def test_gamer_can_abandon_room_via_gear_menu(self): def test_gamer_can_abandon_room_via_gear_menu(self):
founder = User.objects.create(email="founder@test.io") founder = User.objects.create(email="founder@test.io")
room = Room.objects.create(name="Dragon's Den", owner=founder) room = Room.objects.create(name="Dragon's Den", owner=founder)

View File

@@ -93,6 +93,15 @@ body.page-gameboard {
} }
} }
#id_applet_my_games {
ul {
display: flex;
flex-direction: column;
}
}
#id_tooltip_portal { #id_tooltip_portal {
position: fixed; position: fixed;
z-index: 9999; z-index: 9999;

View File

@@ -7,7 +7,7 @@
{% for room in my_games %} {% for room in my_games %}
<li><a href="{% url 'epic:gatekeeper' room.id %}">{{ room.name }}</a></li> <li><a href="{% url 'epic:gatekeeper' room.id %}">{{ room.name }}</a></li>
{% empty %} {% empty %}
<li><small>No games yet</small></li> <li class="game-list-item"><small>No games yet</small></li>
{% endfor %} {% endfor %}
</ul> </ul>
</section> </section>

View File

@@ -6,6 +6,6 @@
<form method="POST" action="{% url "epic:create_room" %}"> <form method="POST" action="{% url "epic:create_room" %}">
{% csrf_token %} {% csrf_token %}
<input id="id_new_game_name" name="name" type="text" placeholder="Room name" /> <input id="id_new_game_name" name="name" type="text" placeholder="Room name" />
<button type="submit" id="id_create_game_btn" class="btn btn-primary btn-xl">Start<br>Game</button> <button type="submit" id="id_create_game_btn" class="btn btn-confirm">OK</button>
</form> </form>
</section> </section>

View File

@@ -1,4 +1,11 @@
<div class="gate-modal" role="dialog" aria-label="Gatekeeper"> <div
id="id_gate_wrapper"
hx-get="{% url 'epic:gate_status' room.id %}"
hx-trigger="every 3s"
hx-swap="outerHTML"
>
<div class="gate-overlay">
<div class="gate-modal" role="dialog" aria-label="Gatekeeper">
<header class="gate-header"> <header class="gate-header">
<h1>{{ room.name }}</h1> <h1>{{ room.name }}</h1>
<span class="gate-status">{{ room.gate_status }}</span> <span class="gate-status">{{ room.gate_status }}</span>
@@ -33,4 +40,6 @@
<button type="submit" id="id_invite_btn" class="btn btn-primary btn-xl">Invite</button> <button type="submit" id="id_invite_btn" class="btn btn-primary btn-xl">Invite</button>
</form> </form>
{% endif %} {% endif %}
</div>
</div>
</div> </div>

View File

@@ -10,18 +10,9 @@
<div class="room-table"></div> <div class="room-table"></div>
</div> </div>
<div
id="id_gate_wrapper"
hx-get="{% url 'epic:gate_status' room.id %}"
hx-trigger="every 3s"
hx-swap="outerHTML"
>
{% if room.gate_status == "GATHERING" %} {% if room.gate_status == "GATHERING" %}
<div class="gate-overlay">
{% include "apps/gameboard/_partials/_gatekeeper.html" %} {% include "apps/gameboard/_partials/_gatekeeper.html" %}
</div>
{% endif %} {% endif %}
</div>
{% include "apps/gameboard/_partials/_room_gear.html" %} {% include "apps/gameboard/_partials/_room_gear.html" %}
</div> </div>
{% endblock content %} {% endblock content %}