From 0b2e59bc2c4a2887acf47676829aa6ed66ac4071 Mon Sep 17 00:00:00 2001 From: giles Date: Tue, 24 Feb 2026 09:11:50 +0000 Subject: [PATCH] Add cart-mini and account-nav-item fragment handlers Phase 2 of fragment composition: cart exposes cart-mini fragment (icon + item count badge) and account-nav-item fragment (orders link) via /internal/fragments/ endpoint. Updates shared submodule. Co-Authored-By: Claude Opus 4.6 --- bp/fragments/routes.py | 44 +++++++++++++++++++++++++++--- shared | 2 +- templates/fragments/cart_mini.html | 27 ++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 templates/fragments/cart_mini.html diff --git a/bp/fragments/routes.py b/bp/fragments/routes.py index f6ed02c..6724837 100644 --- a/bp/fragments/routes.py +++ b/bp/fragments/routes.py @@ -2,11 +2,15 @@ Exposes HTML fragments at ``/internal/fragments/`` for consumption by other coop apps via the fragment client. + +Fragments: + cart-mini Cart icon with badge (or logo when empty) + account-nav-item "orders" link for account dashboard """ from __future__ import annotations -from quart import Blueprint, Response, request +from quart import Blueprint, Response, request, render_template, g from shared.infrastructure.fragments import FRAGMENT_HEADER @@ -14,7 +18,41 @@ from shared.infrastructure.fragments import FRAGMENT_HEADER def register(): bp = Blueprint("fragments", __name__, url_prefix="/internal/fragments") - _handlers: dict[str, object] = {} + # --------------------------------------------------------------- + # Fragment handlers + # --------------------------------------------------------------- + + async def _cart_mini(): + from shared.services.registry import services + + user_id = request.args.get("user_id", type=int) + session_id = request.args.get("session_id") + + summary = await services.cart.cart_summary( + g.s, user_id=user_id, session_id=session_id, + ) + count = summary.count + summary.calendar_count + summary.ticket_count + return await render_template("fragments/cart_mini.html", cart_count=count) + + async def _account_nav_item(): + from shared.infrastructure.urls import cart_url + + href = cart_url("/orders/") + return ( + '' + ) + + _handlers = { + "cart-mini": _cart_mini, + "account-nav-item": _account_nav_item, + } + + # --------------------------------------------------------------- + # Routing + # --------------------------------------------------------------- @bp.before_request async def _require_fragment_header(): @@ -29,6 +67,4 @@ def register(): html = await handler() return Response(html, status=200, content_type="text/html") - bp._fragment_handlers = _handlers - return bp diff --git a/shared b/shared index b882770..2a9dfaa 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit b882770828be7c62bbd047146e03b83511a2397d +Subproject commit 2a9dfaa749be414903b5edf834fbb201e6466498 diff --git a/templates/fragments/cart_mini.html b/templates/fragments/cart_mini.html new file mode 100644 index 0000000..4a1c23d --- /dev/null +++ b/templates/fragments/cart_mini.html @@ -0,0 +1,27 @@ +
+ {% if cart_count == 0 %} +
+ + + +
+ {% else %} + + + + {{ cart_count }} + + + {% endif %} +