fixed modal UX issue; now persists as intended, until token cost met in all six slots
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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 %}
|
||||||
Reference in New Issue
Block a user