Remove render_to_sx from public API: enforce sx_call for all service code
Replace ~250 render_to_sx calls across all services with sync sx_call, converting many async functions to sync where no other awaits remained. Make render_to_sx/render_to_sx_with_env private (_render_to_sx). Add (post-header-ctx) IO primitive and shared post/post-admin defmacros. Convert built-in post/post-admin layouts from Python to register_sx_layout with .sx defcomps. Remove dead post_admin_mobile_nav_sx. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from shared.sx.helpers import (
|
||||
call_url, render_to_sx, render_to_sx_with_env,
|
||||
call_url, sx_call, render_to_sx_with_env,
|
||||
post_admin_header_sx,
|
||||
)
|
||||
from shared.sx.parser import SxExpr
|
||||
@@ -23,7 +23,7 @@ async def _post_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
return await post_header_sx(ctx, oob=oob)
|
||||
|
||||
|
||||
async def _post_nav_sx(ctx: dict) -> str:
|
||||
def _post_nav_sx(ctx: dict) -> str:
|
||||
"""Post desktop nav: calendar links + container nav (markets, etc.)."""
|
||||
from quart import url_for, g
|
||||
|
||||
@@ -37,7 +37,7 @@ async def _post_nav_sx(ctx: dict) -> str:
|
||||
cal_name = getattr(cal, "name", "") if hasattr(cal, "name") else cal.get("name", "")
|
||||
href = url_for("calendar.get", calendar_slug=cal_slug)
|
||||
is_sel = (cal_slug == current_cal_slug)
|
||||
parts.append(await render_to_sx("nav-link", href=href, icon="fa fa-calendar",
|
||||
parts.append(sx_call("nav-link", href=href, icon="fa fa-calendar",
|
||||
label=cal_name, select_colours=select_colours,
|
||||
is_selected=is_sel))
|
||||
# Container nav fragments (markets, etc.)
|
||||
@@ -72,13 +72,13 @@ async def _post_nav_sx(ctx: dict) -> str:
|
||||
# Calendars header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build the calendars section header row."""
|
||||
from quart import url_for
|
||||
link_href = url_for("calendars.home")
|
||||
return await render_to_sx("menu-row-sx", id="calendars-row", level=3,
|
||||
return sx_call("menu-row-sx", id="calendars-row", level=3,
|
||||
link_href=link_href,
|
||||
link_label_content=SxExpr(await render_to_sx("events-calendars-label")),
|
||||
link_label_content=SxExpr(sx_call("events-calendars-label")),
|
||||
child_id="calendars-header-child", oob=oob)
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ async def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
# Calendar header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build a single calendar's header row."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -97,18 +97,18 @@ async def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
cal_desc = getattr(calendar, "description", "") or ""
|
||||
|
||||
link_href = url_for("calendar.get", calendar_slug=cal_slug)
|
||||
label_html = await render_to_sx("events-calendar-label",
|
||||
label_html = sx_call("events-calendar-label",
|
||||
name=cal_name, description=cal_desc)
|
||||
|
||||
# Desktop nav: slots + admin
|
||||
nav_html = await _calendar_nav_sx(ctx)
|
||||
nav_html = _calendar_nav_sx(ctx)
|
||||
|
||||
return await render_to_sx("menu-row-sx", id="calendar-row", level=3,
|
||||
return sx_call("menu-row-sx", id="calendar-row", level=3,
|
||||
link_href=link_href, link_label_content=SxExpr(label_html),
|
||||
nav=SxExpr(nav_html) if nav_html else None, child_id="calendar-header-child", oob=oob)
|
||||
|
||||
|
||||
async def _calendar_nav_sx(ctx: dict) -> str:
|
||||
def _calendar_nav_sx(ctx: dict) -> str:
|
||||
"""Calendar desktop nav: Slots + admin link."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -121,11 +121,11 @@ async def _calendar_nav_sx(ctx: dict) -> str:
|
||||
|
||||
parts = []
|
||||
slots_href = url_for("defpage_slots_listing", calendar_slug=cal_slug)
|
||||
parts.append(await render_to_sx("nav-link", href=slots_href, icon="fa fa-clock",
|
||||
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("defpage_calendar_admin", calendar_slug=cal_slug)
|
||||
parts.append(await render_to_sx("nav-link", href=admin_href, icon="fa fa-cog",
|
||||
parts.append(sx_call("nav-link", href=admin_href, icon="fa fa-cog",
|
||||
select_colours=select_colours))
|
||||
return "(<> " + " ".join(parts) + ")" if parts else ""
|
||||
|
||||
@@ -134,7 +134,7 @@ async def _calendar_nav_sx(ctx: dict) -> str:
|
||||
# Day header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build day detail header row."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -152,17 +152,17 @@ async def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
month=day_date.month,
|
||||
day=day_date.day,
|
||||
)
|
||||
label_html = await render_to_sx("events-day-label",
|
||||
label_html = sx_call("events-day-label",
|
||||
date_str=day_date.strftime("%A %d %B %Y"))
|
||||
|
||||
nav_html = await _day_nav_sx(ctx)
|
||||
nav_html = _day_nav_sx(ctx)
|
||||
|
||||
return await render_to_sx("menu-row-sx", id="day-row", level=4,
|
||||
return sx_call("menu-row-sx", id="day-row", level=4,
|
||||
link_href=link_href, link_label_content=SxExpr(label_html),
|
||||
nav=SxExpr(nav_html) if nav_html else None, child_id="day-header-child", oob=oob)
|
||||
|
||||
|
||||
async def _day_nav_sx(ctx: dict) -> str:
|
||||
def _day_nav_sx(ctx: dict) -> str:
|
||||
"""Day desktop nav: confirmed entries scrolling menu + admin link."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -189,11 +189,11 @@ async def _day_nav_sx(ctx: dict) -> str:
|
||||
)
|
||||
start = entry.start_at.strftime("%H:%M") if entry.start_at else ""
|
||||
end = f" \u2013 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
|
||||
entry_links.append(await render_to_sx("events-day-entry-link",
|
||||
entry_links.append(sx_call("events-day-entry-link",
|
||||
href=href, name=entry.name,
|
||||
time_str=f"{start}{end}"))
|
||||
inner = "".join(entry_links)
|
||||
parts.append(await render_to_sx("events-day-entries-nav", inner=SxExpr(inner)))
|
||||
parts.append(sx_call("events-day-entries-nav", inner=SxExpr(inner)))
|
||||
|
||||
if is_admin and day_date:
|
||||
admin_href = url_for(
|
||||
@@ -203,7 +203,7 @@ async def _day_nav_sx(ctx: dict) -> str:
|
||||
month=day_date.month,
|
||||
day=day_date.day,
|
||||
)
|
||||
parts.append(await render_to_sx("nav-link", href=admin_href, icon="fa fa-cog"))
|
||||
parts.append(sx_call("nav-link", href=admin_href, icon="fa fa-cog"))
|
||||
return "".join(parts)
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ async def _day_nav_sx(ctx: dict) -> str:
|
||||
# Day admin header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build day admin header row."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -229,7 +229,7 @@ async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
month=day_date.month,
|
||||
day=day_date.day,
|
||||
)
|
||||
return await render_to_sx("menu-row-sx", id="day-admin-row", level=5,
|
||||
return sx_call("menu-row-sx", id="day-admin-row", level=5,
|
||||
link_href=link_href, link_label="admin", icon="fa fa-cog",
|
||||
child_id="day-admin-header-child", oob=oob)
|
||||
|
||||
@@ -238,7 +238,7 @@ async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
# Calendar admin header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
"""Build calendar admin header row with nav links."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -252,11 +252,11 @@ async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
("calendar.admin.calendar_description_edit", "description"),
|
||||
]:
|
||||
href = url_for(endpoint, calendar_slug=cal_slug)
|
||||
nav_parts.append(await render_to_sx("nav-link", href=href, label=label,
|
||||
nav_parts.append(sx_call("nav-link", href=href, label=label,
|
||||
select_colours=select_colours))
|
||||
|
||||
nav_html = "".join(nav_parts)
|
||||
return await render_to_sx("menu-row-sx", id="calendar-admin-row", level=4,
|
||||
return sx_call("menu-row-sx", id="calendar-admin-row", level=4,
|
||||
link_label="admin", icon="fa fa-cog",
|
||||
nav=SxExpr(nav_html) if nav_html else None, child_id="calendar-admin-header-child", oob=oob)
|
||||
|
||||
@@ -265,13 +265,13 @@ async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
# Markets header
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _markets_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("defpage_events_markets")
|
||||
return await render_to_sx("menu-row-sx", id="markets-row", level=3,
|
||||
return sx_call("menu-row-sx", id="markets-row", level=3,
|
||||
link_href=link_href,
|
||||
link_label_content=SxExpr(await render_to_sx("events-markets-label")),
|
||||
link_label_content=SxExpr(sx_call("events-markets-label")),
|
||||
child_id="markets-header-child", oob=oob)
|
||||
|
||||
|
||||
@@ -279,7 +279,7 @@ async def _markets_header_sx(ctx: dict, *, oob: bool = False) -> str:
|
||||
# Calendars main panel
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendars_main_panel_sx(ctx: dict) -> str:
|
||||
def _calendars_main_panel_sx(ctx: dict) -> str:
|
||||
"""Render the calendars list + create form panel."""
|
||||
from quart import url_for
|
||||
rights = ctx.get("rights") or {}
|
||||
@@ -294,18 +294,18 @@ async def _calendars_main_panel_sx(ctx: dict) -> str:
|
||||
form_html = ""
|
||||
if can_create:
|
||||
create_url = url_for("calendars.create_calendar")
|
||||
form_html = await render_to_sx("crud-create-form",
|
||||
form_html = sx_call("crud-create-form",
|
||||
create_url=create_url, csrf=csrf,
|
||||
errors_id="cal-create-errors", list_id="calendars-list",
|
||||
placeholder="e.g. Events, Gigs, Meetings", btn_label="Add calendar")
|
||||
|
||||
list_html = await _calendars_list_sx(ctx, calendars)
|
||||
return await render_to_sx("crud-panel",
|
||||
list_html = _calendars_list_sx(ctx, calendars)
|
||||
return sx_call("crud-panel",
|
||||
form=SxExpr(form_html), list=SxExpr(list_html),
|
||||
list_id="calendars-list")
|
||||
|
||||
|
||||
async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
|
||||
def _calendars_list_sx(ctx: dict, calendars: list) -> str:
|
||||
"""Render the calendars list items."""
|
||||
from quart import url_for
|
||||
from shared.utils import route_prefix
|
||||
@@ -314,7 +314,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
|
||||
prefix = route_prefix()
|
||||
|
||||
if not calendars:
|
||||
return await render_to_sx("empty-state", message="No calendars yet. Create one above.",
|
||||
return sx_call("empty-state", message="No calendars yet. Create one above.",
|
||||
cls="text-gray-500 mt-4")
|
||||
|
||||
parts = []
|
||||
@@ -324,7 +324,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
|
||||
href = prefix + url_for("calendar.get", calendar_slug=cal_slug)
|
||||
del_url = url_for("calendar.delete", calendar_slug=cal_slug)
|
||||
csrf_hdr = f'{{"X-CSRFToken":"{csrf}"}}'
|
||||
parts.append(await render_to_sx("crud-item",
|
||||
parts.append(sx_call("crud-item",
|
||||
href=href, name=cal_name, slug=cal_slug,
|
||||
del_url=del_url, csrf_hdr=csrf_hdr,
|
||||
list_id="calendars-list",
|
||||
@@ -337,7 +337,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
|
||||
# Calendar month grid
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
"""Render the calendar month grid."""
|
||||
from quart import url_for
|
||||
from quart import session as qsession
|
||||
@@ -375,10 +375,10 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
("\u2039", prev_month_year, prev_month),
|
||||
]:
|
||||
href = nav_link(yr, mn)
|
||||
nav_arrows.append(await render_to_sx("events-calendar-nav-arrow",
|
||||
nav_arrows.append(sx_call("events-calendar-nav-arrow",
|
||||
pill_cls=pill_cls, href=href, label=label))
|
||||
|
||||
nav_arrows.append(await render_to_sx("events-calendar-month-label",
|
||||
nav_arrows.append(sx_call("events-calendar-month-label",
|
||||
month_name=month_name, year=str(year)))
|
||||
|
||||
for label, yr, mn in [
|
||||
@@ -386,13 +386,13 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
("\u00bb", next_year, month),
|
||||
]:
|
||||
href = nav_link(yr, mn)
|
||||
nav_arrows.append(await render_to_sx("events-calendar-nav-arrow",
|
||||
nav_arrows.append(sx_call("events-calendar-nav-arrow",
|
||||
pill_cls=pill_cls, href=href, label=label))
|
||||
|
||||
# Weekday headers
|
||||
wd_parts = []
|
||||
for wd in weekday_names:
|
||||
wd_parts.append(await render_to_sx("events-calendar-weekday", name=wd))
|
||||
wd_parts.append(sx_call("events-calendar-weekday", name=wd))
|
||||
wd_html = "".join(wd_parts)
|
||||
|
||||
# Day cells
|
||||
@@ -423,9 +423,9 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
calendar_slug=cal_slug,
|
||||
year=day_date.year, month=day_date.month, day=day_date.day,
|
||||
)
|
||||
day_short_html = await render_to_sx("events-calendar-day-short",
|
||||
day_short_html = sx_call("events-calendar-day-short",
|
||||
day_str=day_date.strftime("%a"))
|
||||
day_num_html = await render_to_sx("events-calendar-day-num",
|
||||
day_num_html = sx_call("events-calendar-day-num",
|
||||
pill_cls=pill_cls, href=day_href,
|
||||
num=str(day_date.day))
|
||||
|
||||
@@ -443,12 +443,12 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
else:
|
||||
bg_cls = "bg-sky-100 text-sky-800" if is_mine else "bg-stone-100 text-stone-700"
|
||||
state_label = (e.state or "pending").replace("_", " ")
|
||||
entry_badges.append(await render_to_sx("events-calendar-entry-badge",
|
||||
entry_badges.append(sx_call("events-calendar-entry-badge",
|
||||
bg_cls=bg_cls, name=e.name,
|
||||
state_label=state_label))
|
||||
|
||||
badges_html = "(<> " + "".join(entry_badges) + ")" if entry_badges else ""
|
||||
cells.append(await render_to_sx("events-calendar-cell",
|
||||
cells.append(sx_call("events-calendar-cell",
|
||||
cell_cls=cell_cls, day_short=SxExpr(day_short_html),
|
||||
day_num=SxExpr(day_num_html),
|
||||
badges=SxExpr(badges_html) if badges_html else None))
|
||||
@@ -456,7 +456,7 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
cells_html = "(<> " + "".join(cells) + ")"
|
||||
arrows_html = "(<> " + "".join(nav_arrows) + ")"
|
||||
wd_html = "(<> " + wd_html + ")"
|
||||
return await render_to_sx("events-calendar-grid",
|
||||
return sx_call("events-calendar-grid",
|
||||
arrows=SxExpr(arrows_html), weekdays=SxExpr(wd_html),
|
||||
cells=SxExpr(cells_html))
|
||||
|
||||
@@ -465,7 +465,7 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
|
||||
# Day main panel
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _day_main_panel_html(ctx: dict) -> str:
|
||||
def _day_main_panel_html(ctx: dict) -> str:
|
||||
"""Render the day entries table + add button."""
|
||||
from quart import url_for
|
||||
|
||||
@@ -488,10 +488,10 @@ async def _day_main_panel_html(ctx: dict) -> str:
|
||||
if day_entries:
|
||||
row_parts = []
|
||||
for entry in day_entries:
|
||||
row_parts.append(await _day_row_html(ctx, entry))
|
||||
row_parts.append(_day_row_html(ctx, entry))
|
||||
rows_html = "".join(row_parts)
|
||||
else:
|
||||
rows_html = await render_to_sx("events-day-empty-row")
|
||||
rows_html = sx_call("events-day-empty-row")
|
||||
|
||||
add_url = url_for(
|
||||
"calendar.day.calendar_entries.add_form",
|
||||
@@ -499,12 +499,12 @@ async def _day_main_panel_html(ctx: dict) -> str:
|
||||
day=day, month=month, year=year,
|
||||
)
|
||||
|
||||
return await render_to_sx("events-day-table",
|
||||
return sx_call("events-day-table",
|
||||
list_container=list_container, rows=SxExpr(rows_html),
|
||||
pre_action=pre_action, add_url=add_url)
|
||||
|
||||
|
||||
async def _day_row_html(ctx: dict, entry) -> str:
|
||||
def _day_row_html(ctx: dict, entry) -> str:
|
||||
"""Render a single day table row."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -523,7 +523,7 @@ async def _day_row_html(ctx: dict, entry) -> str:
|
||||
)
|
||||
|
||||
# Name
|
||||
name_html = await render_to_sx("events-day-row-name",
|
||||
name_html = sx_call("events-day-row-name",
|
||||
href=entry_href, pill_cls=pill_cls, name=entry.name)
|
||||
|
||||
# Slot/Time
|
||||
@@ -532,38 +532,38 @@ async def _day_row_html(ctx: dict, entry) -> str:
|
||||
slot_href = url_for("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 = await render_to_sx("events-day-row-slot",
|
||||
slot_html = sx_call("events-day-row-slot",
|
||||
href=slot_href, pill_cls=pill_cls, slot_name=slot.name,
|
||||
time_str=f"({time_start}{time_end})")
|
||||
else:
|
||||
start = entry.start_at.strftime("%H:%M") if entry.start_at else ""
|
||||
end = f" \u2192 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
|
||||
slot_html = await render_to_sx("events-day-row-time", start=start, end=end)
|
||||
slot_html = sx_call("events-day-row-time", start=start, end=end)
|
||||
|
||||
# State
|
||||
state = getattr(entry, "state", "pending") or "pending"
|
||||
state_badge = await _entry_state_badge_html(state)
|
||||
state_td = await render_to_sx("events-day-row-state",
|
||||
state_badge = _entry_state_badge_html(state)
|
||||
state_td = sx_call("events-day-row-state",
|
||||
state_id=f"entry-state-{entry.id}", badge=SxExpr(state_badge))
|
||||
|
||||
# Cost
|
||||
cost = getattr(entry, "cost", None)
|
||||
cost_str = f"\u00a3{cost:.2f}" if cost is not None else "\u00a30.00"
|
||||
cost_td = await render_to_sx("events-day-row-cost", cost_str=cost_str)
|
||||
cost_td = sx_call("events-day-row-cost", cost_str=cost_str)
|
||||
|
||||
# Tickets
|
||||
tp = getattr(entry, "ticket_price", None)
|
||||
if tp is not None:
|
||||
tc = getattr(entry, "ticket_count", None)
|
||||
tc_str = f"{tc} tickets" if tc is not None else "Unlimited"
|
||||
tickets_td = await render_to_sx("events-day-row-tickets",
|
||||
tickets_td = sx_call("events-day-row-tickets",
|
||||
price_str=f"\u00a3{tp:.2f}", count_str=tc_str)
|
||||
else:
|
||||
tickets_td = await render_to_sx("events-day-row-no-tickets")
|
||||
tickets_td = sx_call("events-day-row-no-tickets")
|
||||
|
||||
actions_td = await render_to_sx("events-day-row-actions")
|
||||
actions_td = sx_call("events-day-row-actions")
|
||||
|
||||
return await render_to_sx("events-day-row",
|
||||
return sx_call("events-day-row",
|
||||
tr_cls=tr_cls, name=SxExpr(name_html), slot=SxExpr(slot_html),
|
||||
state=SxExpr(state_td), cost=SxExpr(cost_td),
|
||||
tickets=SxExpr(tickets_td), actions=SxExpr(actions_td))
|
||||
@@ -573,16 +573,16 @@ async def _day_row_html(ctx: dict, entry) -> str:
|
||||
# Day admin main panel
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _day_admin_main_panel_html(ctx: dict) -> str:
|
||||
def _day_admin_main_panel_html(ctx: dict) -> str:
|
||||
"""Render day admin panel (placeholder nav)."""
|
||||
return await render_to_sx("events-day-admin-panel")
|
||||
return sx_call("events-day-admin-panel")
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Calendar admin main panel
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _calendar_admin_main_panel_html(ctx: dict) -> str:
|
||||
def _calendar_admin_main_panel_html(ctx: dict) -> str:
|
||||
"""Render calendar admin config panel with description editor."""
|
||||
from quart import url_for
|
||||
calendar = ctx.get("calendar")
|
||||
@@ -595,17 +595,17 @@ async def _calendar_admin_main_panel_html(ctx: dict) -> str:
|
||||
hx_select = ctx.get("hx_select_search", "#main-panel")
|
||||
|
||||
desc_edit_url = url_for("calendar.admin.calendar_description_edit", calendar_slug=cal_slug)
|
||||
description_html = await _calendar_description_display_html(calendar, desc_edit_url)
|
||||
description_html = _calendar_description_display_html(calendar, desc_edit_url)
|
||||
|
||||
return await render_to_sx("events-calendar-admin-panel",
|
||||
return sx_call("events-calendar-admin-panel",
|
||||
description_content=SxExpr(description_html), csrf=csrf,
|
||||
description=desc)
|
||||
|
||||
|
||||
async def _calendar_description_display_html(calendar, edit_url: str) -> str:
|
||||
def _calendar_description_display_html(calendar, edit_url: str) -> str:
|
||||
"""Render calendar description display with edit button."""
|
||||
desc = getattr(calendar, "description", "") or ""
|
||||
return await render_to_sx("events-calendar-description-display",
|
||||
return sx_call("events-calendar-description-display",
|
||||
description=desc, edit_url=edit_url)
|
||||
|
||||
|
||||
@@ -613,7 +613,7 @@ async def _calendar_description_display_html(calendar, edit_url: str) -> str:
|
||||
# Markets main panel
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
async def _markets_main_panel_html(ctx: dict) -> str:
|
||||
def _markets_main_panel_html(ctx: dict) -> str:
|
||||
"""Render markets list + create form panel."""
|
||||
from quart import url_for
|
||||
rights = ctx.get("rights") or {}
|
||||
@@ -627,18 +627,18 @@ async def _markets_main_panel_html(ctx: dict) -> str:
|
||||
form_html = ""
|
||||
if can_create:
|
||||
create_url = url_for("markets.create_market")
|
||||
form_html = await render_to_sx("crud-create-form",
|
||||
form_html = sx_call("crud-create-form",
|
||||
create_url=create_url, csrf=csrf,
|
||||
errors_id="market-create-errors", list_id="markets-list",
|
||||
placeholder="e.g. Farm Shop, Bakery", btn_label="Add market")
|
||||
|
||||
list_html = await _markets_list_html(ctx, markets)
|
||||
return await render_to_sx("crud-panel",
|
||||
list_html = _markets_list_html(ctx, markets)
|
||||
return sx_call("crud-panel",
|
||||
form=SxExpr(form_html), list=SxExpr(list_html),
|
||||
list_id="markets-list")
|
||||
|
||||
|
||||
async def _markets_list_html(ctx: dict, markets: list) -> str:
|
||||
def _markets_list_html(ctx: dict, markets: list) -> str:
|
||||
"""Render markets list items."""
|
||||
from quart import url_for
|
||||
csrf_token = ctx.get("csrf_token")
|
||||
@@ -647,7 +647,7 @@ async def _markets_list_html(ctx: dict, markets: list) -> str:
|
||||
slug = post.get("slug", "")
|
||||
|
||||
if not markets:
|
||||
return await render_to_sx("empty-state", message="No markets yet. Create one above.",
|
||||
return sx_call("empty-state", message="No markets yet. Create one above.",
|
||||
cls="text-gray-500 mt-4")
|
||||
|
||||
parts = []
|
||||
@@ -657,7 +657,7 @@ async def _markets_list_html(ctx: dict, markets: list) -> str:
|
||||
market_href = call_url(ctx, "market_url", f"/{slug}/{m_slug}/")
|
||||
del_url = url_for("markets.delete_market", market_slug=m_slug)
|
||||
csrf_hdr = f'{{"X-CSRFToken":"{csrf}"}}'
|
||||
parts.append(await render_to_sx("crud-item",
|
||||
parts.append(sx_call("crud-item",
|
||||
href=market_href, name=m_name,
|
||||
slug=m_slug, del_url=del_url,
|
||||
csrf_hdr=csrf_hdr,
|
||||
|
||||
Reference in New Issue
Block a user