diff --git a/bp/page/routes.py b/bp/page/routes.py index 8f49367..cbcee8d 100644 --- a/bp/page/routes.py +++ b/bp/page/routes.py @@ -9,7 +9,7 @@ Routes: """ from __future__ import annotations -from quart import Blueprint, g, request, render_template, make_response +from quart import Blueprint, g, request, render_template, render_template_string, make_response from shared.browser.app.utils.htmx import is_htmx_request from shared.infrastructure.cart_identity import current_cart_identity @@ -81,7 +81,7 @@ def register() -> Blueprint: @bp.post("/tickets/adjust") async def adjust_ticket(): - """Adjust ticket quantity and refresh the page.""" + """Adjust ticket quantity, return updated widget + OOB cart-mini.""" ident = current_cart_identity() form = await request.form entry_id = int(form.get("entry_id", 0)) @@ -96,8 +96,33 @@ def register() -> Blueprint: ticket_type_id=ticket_type_id, ) - resp = await make_response("", 200) - resp.headers["HX-Refresh"] = "true" - return resp + # Get updated ticket count for this entry + tickets = await services.calendar.pending_tickets( + g.s, user_id=ident["user_id"], session_id=ident["session_id"], + ) + qty = sum(1 for t in tickets if t.entry_id == entry_id) + + # Load entry DTO for the widget template + entry = await services.calendar.entry_by_id(g.s, entry_id) + + # Updated cart count for OOB mini-cart + summary = await services.cart.cart_summary( + g.s, user_id=ident["user_id"], session_id=ident["session_id"], + ) + cart_count = summary.count + summary.calendar_count + summary.ticket_count + + # Render widget + OOB cart-mini + widget_html = await render_template( + "_types/page_summary/_ticket_widget.html", + entry=entry, + qty=qty, + ticket_url=f"/{g.post_slug}/tickets/adjust", + ) + mini_html = await render_template_string( + '{% from "_types/cart/_mini.html" import mini with context %}' + '{{ mini(oob="true") }}', + cart_count=cart_count, + ) + return await make_response(widget_html + mini_html, 200) return bp diff --git a/templates/_types/page_summary/_card.html b/templates/_types/page_summary/_card.html index 3d9b76c..dfee007 100644 --- a/templates/_types/page_summary/_card.html +++ b/templates/_types/page_summary/_card.html @@ -31,63 +31,7 @@
{% set qty = pending_tickets.get(entry.id, 0) %} {% set ticket_url = url_for('page_summary.adjust_ticket') %} -
- £{{ '%.2f'|format(entry.ticket_price) }} - - {% if qty == 0 %} -
- - - - -
- {% else %} -
- - - - -
- - - - - - {{ qty }} - - - - -
- - - - -
- {% endif %} -
+ {% include '_types/page_summary/_ticket_widget.html' %}
{% endif %} diff --git a/templates/_types/page_summary/_card_tile.html b/templates/_types/page_summary/_card_tile.html index 992b451..dd82390 100644 --- a/templates/_types/page_summary/_card_tile.html +++ b/templates/_types/page_summary/_card_tile.html @@ -28,58 +28,10 @@ {# Ticket widget below card #} {% if entry.ticket_price is not none %} -
- £{{ '%.2f'|format(entry.ticket_price) }}/ticket - +
{% set qty = pending_tickets.get(entry.id, 0) %} {% set ticket_url = url_for('page_summary.adjust_ticket') %} - - {% if qty == 0 %} -
- - - - -
- {% else %} -
-
- - - - -
- - {{ qty }} - -
- - - - -
-
- {% endif %} + {% include '_types/page_summary/_ticket_widget.html' %}
{% endif %} diff --git a/templates/_types/page_summary/_ticket_widget.html b/templates/_types/page_summary/_ticket_widget.html new file mode 100644 index 0000000..6e90871 --- /dev/null +++ b/templates/_types/page_summary/_ticket_widget.html @@ -0,0 +1,63 @@ +{# Inline ticket +/- widget for page summary cards. + Variables: entry, qty, ticket_url + Wrapped in a div with stable ID for HTMX targeting. #} +
+ £{{ '%.2f'|format(entry.ticket_price) }} + + {% if qty == 0 %} +
+ + + + +
+ {% else %} +
+ + + + +
+ + + + + + {{ qty }} + + + + +
+ + + + +
+ {% endif %} +