from fastapi import Request from fastapi.responses import HTMLResponse, RedirectResponse from core.layout import layout # ---- Page helpers ---- def page(request: Request, title: str, buttons, body: str, header: str | None = None) -> HTMLResponse: return HTMLResponse(layout(request, title, buttons, header, body)) # ---- Page types ---- def menu(request: Request, title: str, entries: list[tuple[str, str]]): lines = [] for label, href in entries: lines.append(f"[{label}]") body = "
" + "\n".join(lines) + "
" return page(request, title, [("BACK", "/")], body) def message(request: Request, title: str, text: str, ok_href: str = "/"): body = f"""
{text}
[ OK ]
""" return page(request, title, [("BACK", ok_href)], body) def form(request: Request, title: str, action: str, fields: list[dict], error: str | None = None): rows = [] for f in fields: if f.get("type") == "textarea": rows.append(f"
") else: rows.append(f"
") err = f"
ERROR: {error}
" if error else "" body = f""" {err}
{'
'.join(rows)}
""" return page(request, title, [("BACK", "/")], body) def static_html(request: Request, title: str, html: str): return page(request, title, [("BACK", "/")], html)