diff --git a/bp/calendar_entry/routes.py b/bp/calendar_entry/routes.py index 53e675e..7b5f668 100644 --- a/bp/calendar_entry/routes.py +++ b/bp/calendar_entry/routes.py @@ -27,6 +27,8 @@ from datetime import datetime, timezone import math import logging +from shared.services.widget_registry import widgets + from ..ticket_types.routes import register as register_ticket_types from .admin.routes import register as register_admin @@ -220,6 +222,26 @@ def register(): ticket_type_id=tt.id, ) + # Widget-driven container nav (market links, etc.) + container_nav_loaded = [] + post_data = getattr(g, "post_data", None) + if post_data: + post_id = post_data["post"]["id"] + post_slug = post_data["post"]["slug"] + for w in widgets.container_nav: + if w.domain.startswith("calendar"): + continue # skip — we're already on a calendar page + try: + wctx = await w.context_fn( + g.s, container_type="page", container_id=post_id, + post_slug=post_slug, + ) + has_data = any(v for v in wctx.values() if isinstance(v, list) and v) + if has_data: + container_nav_loaded.append({"widget": w, "ctx": wctx}) + except Exception: + pass + return { "entry": calendar_entry, "entry_posts": entry_posts, @@ -227,7 +249,8 @@ def register(): "ticket_sold_count": ticket_sold_count, "user_ticket_count": user_ticket_count, "user_ticket_counts_by_type": user_ticket_counts_by_type, - } + "container_nav_widgets": container_nav_loaded, + } @bp.get("/") @require_admin async def get(entry_id: int, **rest): diff --git a/bp/day/routes.py b/bp/day/routes.py index 50202c3..f7fc74a 100644 --- a/bp/day/routes.py +++ b/bp/day/routes.py @@ -11,6 +11,7 @@ from bp.calendar_entries.routes import register as register_calendar_entries from .admin.routes import register as register_admin from shared.browser.app.redis_cacher import cache_page +from shared.services.widget_registry import widgets from models.calendars import CalendarSlot # add this import @@ -77,6 +78,26 @@ def register(): result = await g.s.execute(stmt) day_slots = list(result.scalars()) + # Widget-driven container nav (market links, etc.) + container_nav_loaded = [] + post_data = getattr(g, "post_data", None) + if post_data: + post_id = post_data["post"]["id"] + post_slug = post_data["post"]["slug"] + for w in widgets.container_nav: + if w.domain.startswith("calendar"): + continue # skip — we're already on a calendar page + try: + wctx = await w.context_fn( + g.s, container_type="page", container_id=post_id, + post_slug=post_slug, + ) + has_data = any(v for v in wctx.values() if isinstance(v, list) and v) + if has_data: + container_nav_loaded.append({"widget": w, "ctx": wctx}) + except Exception: + pass + return { "qsession": qsession, "day_date": day_date, @@ -86,7 +107,8 @@ def register(): "day_entries": visible.merged_entries, "user_entries": visible.user_entries, "confirmed_entries": visible.confirmed_entries, - "day_slots": day_slots, # <-- NEW + "day_slots": day_slots, + "container_nav_widgets": container_nav_loaded, } @@ -118,5 +140,25 @@ def register(): ) return await make_response(html) - + @bp.get("/w//") + async def widget_paginate(widget_domain: str, **kwargs): + """Generic paginated widget endpoint for infinite scroll.""" + page = int(request.args.get("page", 1)) + post_data = getattr(g, "post_data", None) + if not post_data: + abort(404) + post_id = post_data["post"]["id"] + post_slug = post_data["post"]["slug"] + for w in widgets.container_nav: + if w.domain == widget_domain: + ctx = await w.context_fn( + g.s, container_type="page", container_id=post_id, + post_slug=post_slug, page=page, + ) + html = await render_template( + w.template, ctx=ctx, post=post_data["post"], + ) + return await make_response(html) + abort(404) + return bp diff --git a/shared b/shared index eec750a..d0b1ede 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit eec750a69969bdda0dd853e57462f646297a7e00 +Subproject commit d0b1edea7af8229935b81f8dde456b31c5b32448