billboard applets: single-root wrapper for HTMX swap; full context on toggle — TDD
- _applets.html wraps menu + container in one #id_billboard_applets_wrapper div; form's hx-target is now the wrapper, so OK no longer leaves a stale duplicate menu in the DOM (which previously caused the next OK to revert prior toggles) - toggle_billboard_applets passes full context (recent_room, recent_events, viewer, my_rooms) via factored _billboard_context helper, so Most Recent + My Scrolls keep their content after a toggle instead of falling through to the empty fallback - applets.js: register id_billboard_applets_wrapper as an applet container so post-swap menu cleanup runs - BillboardAppletsTest: portrait viewport in setUp; FT covers content preservation, no-revert on second toggle, & post-refresh state - 4 new ITs: Most Recent renders Coin-on-a-String after toggle; My Scrolls renders room name; response has single menu div; second toggle preserves prior hidden state Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -28,13 +28,12 @@ def _recent_posts(user, limit=3):
|
||||
)
|
||||
|
||||
|
||||
@login_required(login_url="/")
|
||||
def billboard(request):
|
||||
my_rooms = rooms_for_user(request.user).order_by("-created_at")
|
||||
def _billboard_context(user):
|
||||
my_rooms = rooms_for_user(user).order_by("-created_at")
|
||||
|
||||
recent_room = (
|
||||
Room.objects.filter(
|
||||
Q(owner=request.user) | Q(gate_slots__gamer=request.user)
|
||||
Q(owner=user) | Q(gate_slots__gamer=user)
|
||||
)
|
||||
.annotate(last_event=Max("events__timestamp"))
|
||||
.filter(last_event__isnull=False)
|
||||
@@ -53,14 +52,21 @@ def billboard(request):
|
||||
if recent_room else []
|
||||
)
|
||||
|
||||
return render(request, "apps/billboard/billboard.html", {
|
||||
return {
|
||||
"my_rooms": my_rooms,
|
||||
"recent_room": recent_room,
|
||||
"recent_events": recent_events,
|
||||
"viewer": request.user,
|
||||
"applets": applet_context(request.user, "billboard"),
|
||||
"viewer": user,
|
||||
"applets": applet_context(user, "billboard"),
|
||||
"form": LineForm(),
|
||||
"recent_posts": _recent_posts(request.user),
|
||||
"recent_posts": _recent_posts(user),
|
||||
}
|
||||
|
||||
|
||||
@login_required(login_url="/")
|
||||
def billboard(request):
|
||||
return render(request, "apps/billboard/billboard.html", {
|
||||
**_billboard_context(request.user),
|
||||
"page_class": "page-billboard",
|
||||
})
|
||||
|
||||
@@ -70,11 +76,11 @@ def toggle_billboard_applets(request):
|
||||
checked = request.POST.getlist("applets")
|
||||
apply_applet_toggle(request.user, "billboard", checked)
|
||||
if request.headers.get("HX-Request"):
|
||||
return render(request, "apps/billboard/_partials/_applets.html", {
|
||||
"applets": applet_context(request.user, "billboard"),
|
||||
"form": LineForm(),
|
||||
"recent_posts": _recent_posts(request.user),
|
||||
})
|
||||
return render(
|
||||
request,
|
||||
"apps/billboard/_partials/_applets.html",
|
||||
_billboard_context(request.user),
|
||||
)
|
||||
return redirect("billboard:billboard")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user