Migrate all apps to defpage declarative page routes
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m41s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m41s
Replace Python GET page handlers with declarative defpage definitions in .sx files across all 8 apps (sx docs, orders, account, market, cart, federation, events, blog). Each app now has sxc/pages/ with setup functions, layout registrations, page helpers, and .sx defpage declarations. Core infrastructure: add g I/O primitive, PageDef support for auth/layout/ data/content/filter/aside/menu slots, post_author auth level, and custom layout registration. Remove ~1400 lines of render_*_page/render_*_oob boilerplate. Update all endpoint references in routes, sx_components, and templates to defpage_* naming. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -191,11 +191,11 @@ def _calendar_nav_sx(ctx: dict) -> str:
|
||||
select_colours = ctx.get("select_colours", "")
|
||||
|
||||
parts = []
|
||||
slots_href = url_for("calendar.slots.get", calendar_slug=cal_slug)
|
||||
slots_href = url_for("calendar.slots.defpage_slots_listing", calendar_slug=cal_slug)
|
||||
parts.append(sx_call("nav-link", href=slots_href, icon="fa fa-clock",
|
||||
label="Slots", select_colours=select_colours))
|
||||
if is_admin:
|
||||
admin_href = url_for("calendar.admin.admin", calendar_slug=cal_slug)
|
||||
admin_href = url_for("calendar.admin.defpage_calendar_admin", calendar_slug=cal_slug)
|
||||
parts.append(sx_call("nav-link", href=admin_href, icon="fa fa-cog",
|
||||
select_colours=select_colours))
|
||||
return "".join(parts)
|
||||
@@ -319,7 +319,7 @@ def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
nav_parts = []
|
||||
if cal_slug:
|
||||
for endpoint, label in [
|
||||
("calendar.slots.get", "slots"),
|
||||
("calendar.slots.defpage_slots_listing", "slots"),
|
||||
("calendar.admin.calendar_description_edit", "description"),
|
||||
]:
|
||||
href = url_for(endpoint, calendar_slug=cal_slug)
|
||||
@@ -339,7 +339,7 @@ def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _markets_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build the markets section header row."""
|
||||
from quart import url_for
|
||||
link_href = url_for("markets.home")
|
||||
link_href = url_for("markets.defpage_events_markets")
|
||||
return sx_call("menu-row-sx", id="markets-row", level=3,
|
||||
link_href=link_href,
|
||||
link_label_content=SxExpr(sx_call("events-markets-label")),
|
||||
@@ -594,7 +594,7 @@ def _day_row_html(ctx: dict, entry) -> str:
|
||||
# Slot/Time
|
||||
slot = getattr(entry, "slot", None)
|
||||
if slot:
|
||||
slot_href = url_for("calendar.slots.slot.get", calendar_slug=cal_slug, slot_id=slot.id)
|
||||
slot_href = url_for("calendar.slots.slot.defpage_slot_detail", calendar_slug=cal_slug, slot_id=slot.id)
|
||||
time_start = slot.time_start.strftime("%H:%M") if slot.time_start else ""
|
||||
time_end = f" \u2192 {slot.time_end.strftime('%H:%M')}" if slot.time_end else ""
|
||||
slot_html = sx_call("events-day-row-slot",
|
||||
@@ -774,7 +774,7 @@ def _tickets_main_panel_html(ctx: dict, tickets: list) -> str:
|
||||
ticket_cards = []
|
||||
if tickets:
|
||||
for ticket in tickets:
|
||||
href = url_for("tickets.ticket_detail", code=ticket.code)
|
||||
href = url_for("tickets.defpage_ticket_detail", code=ticket.code)
|
||||
entry = getattr(ticket, "entry", None)
|
||||
entry_name = entry.name if entry else "Unknown event"
|
||||
tt = getattr(ticket, "ticket_type", None)
|
||||
@@ -819,7 +819,7 @@ def _ticket_detail_panel_html(ctx: dict, ticket) -> str:
|
||||
bg_map = {"confirmed": "bg-emerald-50", "checked_in": "bg-blue-50", "reserved": "bg-amber-50"}
|
||||
header_bg = bg_map.get(state, "bg-stone-50")
|
||||
entry_name = entry.name if entry else "Ticket"
|
||||
back_href = url_for("tickets.my_tickets")
|
||||
back_href = url_for("tickets.defpage_my_tickets")
|
||||
|
||||
# Badge with larger sizing
|
||||
badge = _ticket_state_badge_html(state).replace('px-2 py-0.5 text-xs', 'px-3 py-1 text-sm')
|
||||
@@ -1400,42 +1400,7 @@ async def render_day_oob(ctx: dict) -> str:
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Day admin
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_day_admin_page(ctx: dict) -> str:
|
||||
"""Full page: day admin."""
|
||||
content = _day_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
root_hdr = root_header_sx(ctx)
|
||||
post_hdr = _post_header_sx(ctx)
|
||||
admin_hdr = post_admin_header_sx(ctx, slug, selected="calendars")
|
||||
child = (admin_hdr + _calendar_header_sx(ctx) + _day_header_sx(ctx)
|
||||
+ _day_admin_header_sx(ctx))
|
||||
hdr = root_hdr + post_hdr + header_child_sx(child)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_day_admin_oob(ctx: dict) -> str:
|
||||
"""OOB response: day admin."""
|
||||
content = _day_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
oobs = (post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
|
||||
+ _calendar_header_sx(ctx, oob=True))
|
||||
oobs += oob_header_sx("day-header-child", "day-admin-header-child",
|
||||
_day_admin_header_sx(ctx))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"post-admin-row", "post-admin-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"day-row", "day-header-child",
|
||||
"day-admin-row", "day-admin-header-child")
|
||||
return oob_page_sx(oobs=oobs, content=content)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Calendar admin
|
||||
# Calendar admin helper
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _events_post_admin_header_sx(ctx: dict, *, oob: bool = False,
|
||||
@@ -1445,140 +1410,6 @@ def _events_post_admin_header_sx(ctx: dict, *, oob: bool = False,
|
||||
return post_admin_header_sx(ctx, slug, oob=oob, selected=selected)
|
||||
|
||||
|
||||
async def render_calendar_admin_page(ctx: dict) -> str:
|
||||
"""Full page: calendar admin."""
|
||||
content = _calendar_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
root_hdr = root_header_sx(ctx)
|
||||
post_hdr = _post_header_sx(ctx)
|
||||
admin_hdr = post_admin_header_sx(ctx, slug, selected="calendars")
|
||||
child = admin_hdr + _calendar_header_sx(ctx) + _calendar_admin_header_sx(ctx)
|
||||
hdr = root_hdr + post_hdr + header_child_sx(child)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_calendar_admin_oob(ctx: dict) -> str:
|
||||
"""OOB response: calendar admin."""
|
||||
content = _calendar_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
oobs = (post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
|
||||
+ _calendar_header_sx(ctx, oob=True))
|
||||
oobs += oob_header_sx("calendar-header-child", "calendar-admin-header-child",
|
||||
_calendar_admin_header_sx(ctx))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"post-admin-row", "post-admin-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"calendar-admin-row", "calendar-admin-header-child")
|
||||
return oob_page_sx(oobs=oobs, content=content)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Slots
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_slots_page(ctx: dict) -> str:
|
||||
"""Full page: slots listing."""
|
||||
from quart import g
|
||||
slots = ctx.get("slots") or []
|
||||
calendar = ctx.get("calendar")
|
||||
content = render_slots_table(slots, calendar)
|
||||
ctx = await _ensure_container_nav({**ctx, "is_admin_section": True})
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
root_hdr = root_header_sx(ctx)
|
||||
post_hdr = _post_header_sx(ctx)
|
||||
admin_hdr = post_admin_header_sx(ctx, slug, selected="calendars")
|
||||
child = admin_hdr + _calendar_header_sx(ctx) + _calendar_admin_header_sx(ctx)
|
||||
hdr = root_hdr + post_hdr + header_child_sx(child)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_slots_oob(ctx: dict) -> str:
|
||||
"""OOB response: slots listing."""
|
||||
slots = ctx.get("slots") or []
|
||||
calendar = ctx.get("calendar")
|
||||
content = render_slots_table(slots, calendar)
|
||||
ctx = await _ensure_container_nav({**ctx, "is_admin_section": True})
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
oobs = (post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
|
||||
+ _calendar_admin_header_sx(ctx, oob=True))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"post-admin-row", "post-admin-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"calendar-admin-row", "calendar-admin-header-child")
|
||||
return oob_page_sx(oobs=oobs, content=content)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tickets
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_tickets_page(ctx: dict, tickets: list) -> str:
|
||||
"""Full page: my tickets."""
|
||||
content = _tickets_main_panel_html(ctx, tickets)
|
||||
hdr = root_header_sx(ctx)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_tickets_oob(ctx: dict, tickets: list) -> str:
|
||||
"""OOB response: my tickets."""
|
||||
content = _tickets_main_panel_html(ctx, tickets)
|
||||
return oob_page_sx(content=content)
|
||||
|
||||
|
||||
async def render_ticket_detail_page(ctx: dict, ticket) -> str:
|
||||
"""Full page: ticket detail with QR."""
|
||||
content = _ticket_detail_panel_html(ctx, ticket)
|
||||
hdr = root_header_sx(ctx)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_ticket_detail_oob(ctx: dict, ticket) -> str:
|
||||
"""OOB response: ticket detail."""
|
||||
content = _ticket_detail_panel_html(ctx, ticket)
|
||||
return oob_page_sx(content=content)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Ticket admin
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_ticket_admin_page(ctx: dict, tickets: list, stats: dict) -> str:
|
||||
"""Full page: ticket admin dashboard."""
|
||||
content = _ticket_admin_main_panel_html(ctx, tickets, stats)
|
||||
hdr = root_header_sx(ctx)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_ticket_admin_oob(ctx: dict, tickets: list, stats: dict) -> str:
|
||||
"""OOB response: ticket admin dashboard."""
|
||||
content = _ticket_admin_main_panel_html(ctx, tickets, stats)
|
||||
return oob_page_sx(content=content)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Markets
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_markets_page(ctx: dict) -> str:
|
||||
"""Full page: markets listing."""
|
||||
content = _markets_main_panel_html(ctx)
|
||||
hdr = root_header_sx(ctx)
|
||||
child = _post_header_sx(ctx) + _markets_header_sx(ctx)
|
||||
hdr += header_child_sx(child)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_markets_oob(ctx: dict) -> str:
|
||||
"""OOB response: markets listing."""
|
||||
content = _markets_main_panel_html(ctx)
|
||||
oobs = _post_header_sx(ctx, oob=True)
|
||||
oobs += oob_header_sx("post-header-child", "markets-header-child",
|
||||
_markets_header_sx(ctx))
|
||||
return oob_page_sx(oobs=oobs, content=content)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# POST / PUT / DELETE response components
|
||||
# ===========================================================================
|
||||
@@ -1939,36 +1770,6 @@ def _entry_nav_html(ctx: dict) -> str:
|
||||
return "".join(parts)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Entry page / OOB rendering
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def render_entry_page(ctx: dict) -> str:
|
||||
"""Full page: entry detail."""
|
||||
content = _entry_main_panel_html(ctx)
|
||||
hdr = root_header_sx(ctx)
|
||||
child = (_post_header_sx(ctx)
|
||||
+ _calendar_header_sx(ctx) + _day_header_sx(ctx)
|
||||
+ _entry_header_html(ctx))
|
||||
hdr += header_child_sx(child)
|
||||
nav_html = _entry_nav_html(ctx)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content, menu=nav_html)
|
||||
|
||||
|
||||
async def render_entry_oob(ctx: dict) -> str:
|
||||
"""OOB response: entry detail."""
|
||||
content = _entry_main_panel_html(ctx)
|
||||
oobs = _day_header_sx(ctx, oob=True)
|
||||
oobs += oob_header_sx("day-header-child", "entry-header-child",
|
||||
_entry_header_html(ctx))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"day-row", "day-header-child",
|
||||
"entry-row", "entry-header-child")
|
||||
nav_html = _entry_nav_html(ctx)
|
||||
return oob_page_sx(oobs=oobs, content=content, menu=nav_html)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Entry optioned (confirm/decline/provisional response)
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -2364,7 +2165,7 @@ def render_slots_table(slots, calendar) -> str:
|
||||
rows_html = ""
|
||||
if slots:
|
||||
for s in slots:
|
||||
slot_href = url_for("calendar.slots.slot.get", calendar_slug=cal_slug, slot_id=s.id)
|
||||
slot_href = url_for("calendar.slots.slot.defpage_slot_detail", calendar_slug=cal_slug, slot_id=s.id)
|
||||
del_url = url_for("calendar.slots.slot.slot_delete", calendar_slug=cal_slug, slot_id=s.id)
|
||||
desc = getattr(s, "description", "") or ""
|
||||
|
||||
@@ -2508,7 +2309,7 @@ def render_buy_result(entry, created_tickets, remaining, cart_count) -> str:
|
||||
|
||||
tickets_html = ""
|
||||
for ticket in created_tickets:
|
||||
href = url_for("tickets.ticket_detail", code=ticket.code)
|
||||
href = url_for("tickets.defpage_ticket_detail", code=ticket.code)
|
||||
tickets_html += sx_call("events-buy-result-ticket",
|
||||
href=href, code_short=ticket.code[:12] + "...")
|
||||
|
||||
@@ -2518,7 +2319,7 @@ def render_buy_result(entry, created_tickets, remaining, cart_count) -> str:
|
||||
remaining_html = sx_call("events-buy-result-remaining",
|
||||
text=f"{remaining} ticket{r_suffix} remaining")
|
||||
|
||||
my_href = url_for("tickets.my_tickets")
|
||||
my_href = url_for("tickets.defpage_my_tickets")
|
||||
|
||||
return cart_html + sx_call("events-buy-result",
|
||||
entry_id=str(entry.id),
|
||||
@@ -2610,7 +2411,7 @@ def _ticket_adjust_controls(csrf, adjust_url, target, entry_id, count, *, ticket
|
||||
return _adj_form(1, sx_call("events-adjust-cart-plus"),
|
||||
extra_cls="flex items-center")
|
||||
|
||||
my_tickets_href = url_for("tickets.my_tickets")
|
||||
my_tickets_href = url_for("tickets.defpage_my_tickets")
|
||||
minus = _adj_form(count - 1, sx_call("events-adjust-minus"))
|
||||
cart_icon = sx_call("events-adjust-cart-icon",
|
||||
href=my_tickets_href, count=str(count))
|
||||
@@ -2960,40 +2761,6 @@ def _entry_admin_main_panel_html(ctx: dict) -> str:
|
||||
is_selected=False)
|
||||
|
||||
|
||||
async def render_entry_admin_page(ctx: dict) -> str:
|
||||
"""Full page: entry admin."""
|
||||
content = _entry_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
root_hdr = root_header_sx(ctx)
|
||||
post_hdr = _post_header_sx(ctx)
|
||||
admin_hdr = post_admin_header_sx(ctx, slug, selected="calendars")
|
||||
child = (admin_hdr + _calendar_header_sx(ctx) + _day_header_sx(ctx)
|
||||
+ _entry_header_html(ctx) + _entry_admin_header_html(ctx))
|
||||
hdr = root_hdr + post_hdr + header_child_sx(child)
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content, menu=nav_html)
|
||||
|
||||
|
||||
async def render_entry_admin_oob(ctx: dict) -> str:
|
||||
"""OOB response: entry admin."""
|
||||
content = _entry_admin_main_panel_html(ctx)
|
||||
ctx = await _ensure_container_nav(ctx)
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
oobs = (post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
|
||||
+ _entry_header_html(ctx, oob=True))
|
||||
oobs += oob_header_sx("entry-header-child", "entry-admin-header-child",
|
||||
_entry_admin_header_html(ctx))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"post-admin-row", "post-admin-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"day-row", "day-header-child",
|
||||
"entry-row", "entry-header-child",
|
||||
"entry-admin-row", "entry-admin-header-child")
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return oob_page_sx(oobs=oobs, content=content, menu=nav_html)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# Slot page / OOB (extends slots)
|
||||
# ===========================================================================
|
||||
@@ -3027,45 +2794,6 @@ def _slot_header_html(ctx: dict, *, oob: bool = False) -> str:
|
||||
child_id="slot-header-child", oob=oob)
|
||||
|
||||
|
||||
async def render_slot_page(ctx: dict) -> str:
|
||||
"""Full page: slot detail (extends slots page)."""
|
||||
slot = ctx.get("slot")
|
||||
calendar = ctx.get("calendar")
|
||||
if not slot or not calendar:
|
||||
return ""
|
||||
content = render_slot_main_panel(slot, calendar)
|
||||
ctx = await _ensure_container_nav({**ctx, "is_admin_section": True})
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
root_hdr = root_header_sx(ctx)
|
||||
post_hdr = _post_header_sx(ctx)
|
||||
admin_hdr = post_admin_header_sx(ctx, slug, selected="calendars")
|
||||
child = (admin_hdr + _calendar_header_sx(ctx) + _calendar_admin_header_sx(ctx)
|
||||
+ _slot_header_html(ctx))
|
||||
hdr = root_hdr + post_hdr + header_child_sx(child)
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content)
|
||||
|
||||
|
||||
async def render_slot_oob(ctx: dict) -> str:
|
||||
"""OOB response: slot detail."""
|
||||
slot = ctx.get("slot")
|
||||
calendar = ctx.get("calendar")
|
||||
if not slot or not calendar:
|
||||
return ""
|
||||
content = render_slot_main_panel(slot, calendar)
|
||||
ctx = await _ensure_container_nav({**ctx, "is_admin_section": True})
|
||||
slug = (ctx.get("post") or {}).get("slug", "")
|
||||
oobs = (post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
|
||||
+ _calendar_admin_header_sx(ctx, oob=True))
|
||||
oobs += oob_header_sx("calendar-admin-header-child", "slot-header-child",
|
||||
_slot_header_html(ctx))
|
||||
oobs += _clear_deeper_oob("post-row", "post-header-child",
|
||||
"post-admin-row", "post-admin-header-child",
|
||||
"calendar-row", "calendar-header-child",
|
||||
"calendar-admin-row", "calendar-admin-header-child",
|
||||
"slot-row", "slot-header-child")
|
||||
return oob_page_sx(oobs=oobs, content=content)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# Slot edit form
|
||||
# ===========================================================================
|
||||
@@ -3243,40 +2971,6 @@ def _ticket_types_header_html(ctx: dict, *, oob: bool = False) -> str:
|
||||
nav=SxExpr(nav_html) if nav_html else None, child_id="ticket_type-header-child", oob=oob)
|
||||
|
||||
|
||||
async def render_ticket_types_page(ctx: dict) -> str:
|
||||
"""Full page: ticket types listing (extends entry admin)."""
|
||||
ticket_types = ctx.get("ticket_types") or []
|
||||
entry = ctx.get("entry")
|
||||
calendar = ctx.get("calendar")
|
||||
day = ctx.get("day")
|
||||
month = ctx.get("month")
|
||||
year = ctx.get("year")
|
||||
content = render_ticket_types_table(ticket_types, entry, calendar, day, month, year)
|
||||
hdr = root_header_sx(ctx)
|
||||
child = (_post_header_sx(ctx)
|
||||
+ _calendar_header_sx(ctx) + _day_header_sx(ctx)
|
||||
+ _entry_header_html(ctx) + _entry_admin_header_html(ctx)
|
||||
+ _ticket_types_header_html(ctx))
|
||||
hdr += header_child_sx(child)
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content, menu=nav_html)
|
||||
|
||||
|
||||
async def render_ticket_types_oob(ctx: dict) -> str:
|
||||
"""OOB response: ticket types listing."""
|
||||
ticket_types = ctx.get("ticket_types") or []
|
||||
entry = ctx.get("entry")
|
||||
calendar = ctx.get("calendar")
|
||||
day = ctx.get("day")
|
||||
month = ctx.get("month")
|
||||
year = ctx.get("year")
|
||||
content = render_ticket_types_table(ticket_types, entry, calendar, day, month, year)
|
||||
oobs = _entry_admin_header_html(ctx, oob=True)
|
||||
oobs += oob_header_sx("entry-admin-header-child", "ticket_types-header-child",
|
||||
_ticket_types_header_html(ctx))
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return oob_page_sx(oobs=oobs, content=content, menu=nav_html)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# Ticket type page / OOB
|
||||
@@ -3317,41 +3011,6 @@ def _ticket_type_header_html(ctx: dict, *, oob: bool = False) -> str:
|
||||
nav=SxExpr(nav_html) if nav_html else None, child_id="ticket_type-header-child-inner", oob=oob)
|
||||
|
||||
|
||||
async def render_ticket_type_page(ctx: dict) -> str:
|
||||
"""Full page: single ticket type detail (extends ticket types)."""
|
||||
ticket_type = ctx.get("ticket_type")
|
||||
entry = ctx.get("entry")
|
||||
calendar = ctx.get("calendar")
|
||||
day = ctx.get("day")
|
||||
month = ctx.get("month")
|
||||
year = ctx.get("year")
|
||||
content = render_ticket_type_main_panel(ticket_type, entry, calendar, day, month, year)
|
||||
hdr = root_header_sx(ctx)
|
||||
child = (_post_header_sx(ctx)
|
||||
+ _calendar_header_sx(ctx) + _day_header_sx(ctx)
|
||||
+ _entry_header_html(ctx) + _entry_admin_header_html(ctx)
|
||||
+ _ticket_types_header_html(ctx) + _ticket_type_header_html(ctx))
|
||||
hdr += header_child_sx(child)
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return full_page_sx(ctx, header_rows=hdr, content=content, menu=nav_html)
|
||||
|
||||
|
||||
async def render_ticket_type_oob(ctx: dict) -> str:
|
||||
"""OOB response: single ticket type detail."""
|
||||
ticket_type = ctx.get("ticket_type")
|
||||
entry = ctx.get("entry")
|
||||
calendar = ctx.get("calendar")
|
||||
day = ctx.get("day")
|
||||
month = ctx.get("month")
|
||||
year = ctx.get("year")
|
||||
content = render_ticket_type_main_panel(ticket_type, entry, calendar, day, month, year)
|
||||
oobs = _ticket_types_header_html(ctx, oob=True)
|
||||
oobs += oob_header_sx("ticket_types-header-child", "ticket_type-header-child",
|
||||
_ticket_type_header_html(ctx))
|
||||
nav_html = sx_call("events-admin-placeholder-nav")
|
||||
return oob_page_sx(oobs=oobs, content=content, menu=nav_html)
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# Ticket type edit form
|
||||
# ===========================================================================
|
||||
|
||||
Reference in New Issue
Block a user