diff --git a/blog/bp/blog/routes.py b/blog/bp/blog/routes.py index eba5294..1c2fa1b 100644 --- a/blog/bp/blog/routes.py +++ b/blog/bp/blog/routes.py @@ -158,11 +158,16 @@ def register(url_prefix, title): """Blog listing — moved from / to /index.""" from shared.services.registry import services from shared.sx.helpers import ( - render_to_sx, root_header_sx, full_page_sx, oob_page_sx, + render_to_sx, root_header_sx, full_page_sx, oob_page_sx, oob_header_sx, ) - from sx.sx_components import _blog_header_sx, _oob_header_sx from shared.sx.parser import SxExpr + async def _blog_hdr(ctx, oob=False): + return await render_to_sx("menu-row-sx", + id="blog-row", level=1, + link_label_content=SxExpr("(div)"), + child_id="blog-header-child", oob=oob) + data = await services.get("blog_page").index_data(g.s) # Render content, aside, and filter via .sx defcomps @@ -175,7 +180,7 @@ def register(url_prefix, title): if not is_htmx_request(): root_hdr = await root_header_sx(tctx) - blog_hdr = await _blog_header_sx(tctx) + blog_hdr = await _blog_hdr(tctx) header_rows = "(<> " + root_hdr + " " + blog_hdr + ")" html = await full_page_sx(tctx, header_rows=header_rows, content=content, aside=aside, filter=filter_sx) @@ -185,9 +190,9 @@ def register(url_prefix, title): return sx_response(content) else: root_hdr = await root_header_sx(tctx) - blog_hdr = await _blog_header_sx(tctx) + blog_hdr = await _blog_hdr(tctx) rows = "(<> " + root_hdr + " " + blog_hdr + ")" - header_oob = await _oob_header_sx("root-header-child", "blog-header-child", rows) + header_oob = await oob_header_sx("root-header-child", "blog-header-child", rows) sx_src = await oob_page_sx(oobs=header_oob, content=content, aside=aside, filter=filter_sx) return sx_response(sx_src) diff --git a/blog/sxc/pages/__init__.py b/blog/sxc/pages/__init__.py index 623019b..adb498e 100644 --- a/blog/sxc/pages/__init__.py +++ b/blog/sxc/pages/__init__.py @@ -107,18 +107,80 @@ async def _inject_post_context(p_data: dict) -> None: _add_to_defpage_ctx(**ctx) +# --------------------------------------------------------------------------- +# Header helpers (moved from sx_components — thin render_to_sx wrappers) +# --------------------------------------------------------------------------- + +async def _blog_header_sx(ctx: dict, *, oob: bool = False) -> str: + from shared.sx.helpers import render_to_sx + from shared.sx.parser import SxExpr + return await render_to_sx("menu-row-sx", + id="blog-row", level=1, + link_label_content=SxExpr("(div)"), + child_id="blog-header-child", oob=oob) + + +async def _settings_header_sx(ctx: dict, *, oob: bool = False) -> str: + from shared.sx.helpers import render_to_sx + from shared.sx.parser import SxExpr + from quart import url_for as qurl + + settings_href = qurl("settings.defpage_settings_home") + label_sx = await render_to_sx("blog-admin-label") + nav_sx = await _settings_nav_sx(ctx) + + return await render_to_sx("menu-row-sx", + id="root-settings-row", level=1, + link_href=settings_href, + link_label_content=SxExpr(label_sx), + nav=SxExpr(nav_sx) if nav_sx else None, + child_id="root-settings-header-child", oob=oob) + + +async def _settings_nav_sx(ctx: dict) -> str: + from shared.sx.helpers import render_to_sx + from quart import url_for as qurl + + select_colours = ctx.get("select_colours", "") + parts = [] + for endpoint, icon, label in [ + ("menu_items.defpage_menu_items_page", "bars", "Menu Items"), + ("snippets.defpage_snippets_page", "puzzle-piece", "Snippets"), + ("blog.tag_groups_admin.defpage_tag_groups_page", "tags", "Tag Groups"), + ("settings.defpage_cache_page", "refresh", "Cache"), + ]: + href = qurl(endpoint) + parts.append(await render_to_sx("nav-link", + href=href, icon=f"fa fa-{icon}", label=label, + select_colours=select_colours)) + return "(<> " + " ".join(parts) + ")" if parts else "" + + +async def _sub_settings_header_sx(row_id: str, child_id: str, href: str, + icon: str, label: str, ctx: dict, + *, oob: bool = False, nav_sx: str = "") -> str: + from shared.sx.helpers import render_to_sx + from shared.sx.parser import SxExpr + + label_sx = await render_to_sx("blog-sub-settings-label", + icon=f"fa fa-{icon}", label=label) + return await render_to_sx("menu-row-sx", + id=row_id, level=2, + link_href=href, + link_label_content=SxExpr(label_sx), + nav=SxExpr(nav_sx) if nav_sx else None, + child_id=child_id, oob=oob) + + # --------------------------------------------------------------------------- # Layouts # --------------------------------------------------------------------------- def _register_blog_layouts() -> None: from shared.sx.layouts import register_custom_layout - # :blog — root + blog header (for new-post, new-page) register_custom_layout("blog", _blog_full, _blog_oob) - # :blog-settings — root + settings header (with settings nav menu) register_custom_layout("blog-settings", _settings_full, _settings_oob, mobile_fn=_settings_mobile) - # Sub-settings layouts (root + settings + sub header) register_custom_layout("blog-cache", _cache_full, _cache_oob) register_custom_layout("blog-snippets", _snippets_full, _snippets_oob) register_custom_layout("blog-menu-items", _menu_items_full, _menu_items_oob) @@ -131,7 +193,6 @@ def _register_blog_layouts() -> None: async def _blog_full(ctx: dict, **kw: Any) -> str: from shared.sx.helpers import root_header_sx - from sx.sx_components import _blog_header_sx root_hdr = await root_header_sx(ctx) blog_hdr = await _blog_header_sx(ctx) return "(<> " + root_hdr + " " + blog_hdr + ")" @@ -139,7 +200,6 @@ async def _blog_full(ctx: dict, **kw: Any) -> str: async def _blog_oob(ctx: dict, **kw: Any) -> str: from shared.sx.helpers import root_header_sx, oob_header_sx - from sx.sx_components import _blog_header_sx root_hdr = await root_header_sx(ctx) blog_hdr = await _blog_header_sx(ctx) rows = "(<> " + root_hdr + " " + blog_hdr + ")" @@ -150,7 +210,6 @@ async def _blog_oob(ctx: dict, **kw: Any) -> str: async def _settings_full(ctx: dict, **kw: Any) -> str: from shared.sx.helpers import root_header_sx - from sx.sx_components import _settings_header_sx root_hdr = await root_header_sx(ctx) settings_hdr = await _settings_header_sx(ctx) return "(<> " + root_hdr + " " + settings_hdr + ")" @@ -158,7 +217,6 @@ async def _settings_full(ctx: dict, **kw: Any) -> str: async def _settings_oob(ctx: dict, **kw: Any) -> str: from shared.sx.helpers import root_header_sx, oob_header_sx - from sx.sx_components import _settings_header_sx root_hdr = await root_header_sx(ctx) settings_hdr = await _settings_header_sx(ctx) rows = "(<> " + root_hdr + " " + settings_hdr + ")" @@ -166,7 +224,6 @@ async def _settings_oob(ctx: dict, **kw: Any) -> str: async def _settings_mobile(ctx: dict, **kw: Any) -> str: - from sx.sx_components import _settings_nav_sx return await _settings_nav_sx(ctx) @@ -175,7 +232,6 @@ async def _settings_mobile(ctx: dict, **kw: Any) -> str: async def _sub_settings_full(ctx: dict, row_id: str, child_id: str, endpoint: str, icon: str, label: str) -> str: from shared.sx.helpers import root_header_sx - from sx.sx_components import _settings_header_sx, _sub_settings_header_sx from quart import url_for as qurl root_hdr = await root_header_sx(ctx) settings_hdr = await _settings_header_sx(ctx) @@ -187,7 +243,6 @@ async def _sub_settings_full(ctx: dict, row_id: str, child_id: str, async def _sub_settings_oob(ctx: dict, row_id: str, child_id: str, endpoint: str, icon: str, label: str) -> str: from shared.sx.helpers import oob_header_sx - from sx.sx_components import _settings_header_sx, _sub_settings_header_sx from quart import url_for as qurl settings_hdr_oob = await _settings_header_sx(ctx, oob=True) sub_hdr = await _sub_settings_header_sx(row_id, child_id, @@ -247,11 +302,9 @@ async def _tag_groups_oob(ctx: dict, **kw: Any) -> str: # --- Tag Group Edit --- async def _tag_group_edit_full(ctx: dict, **kw: Any) -> str: - from quart import request - g_id = (request.view_args or {}).get("id") - from quart import url_for as qurl + from quart import request, url_for as qurl from shared.sx.helpers import root_header_sx - from sx.sx_components import _settings_header_sx, _sub_settings_header_sx + g_id = (request.view_args or {}).get("id") root_hdr = await root_header_sx(ctx) settings_hdr = await _settings_header_sx(ctx) sub_hdr = await _sub_settings_header_sx("tag-groups-row", "tag-groups-header-child", @@ -261,11 +314,9 @@ async def _tag_group_edit_full(ctx: dict, **kw: Any) -> str: async def _tag_group_edit_oob(ctx: dict, **kw: Any) -> str: - from quart import request - g_id = (request.view_args or {}).get("id") - from quart import url_for as qurl + from quart import request, url_for as qurl from shared.sx.helpers import oob_header_sx - from sx.sx_components import _settings_header_sx, _sub_settings_header_sx + g_id = (request.view_args or {}).get("id") settings_hdr_oob = await _settings_header_sx(ctx, oob=True) sub_hdr = await _sub_settings_header_sx("tag-groups-row", "tag-groups-header-child", qurl("defpage_tag_group_edit", id=g_id), @@ -308,36 +359,7 @@ async def _h_editor_page_content(**kw): async def _h_post_admin_content(slug=None, **kw): await _ensure_post_data(slug) - from quart import g - from sqlalchemy import select - from shared.models.page_config import PageConfig - post = (g.post_data or {}).get("post", {}) - features = {} - sumup_configured = False - sumup_merchant_code = "" - sumup_checkout_prefix = "" - if post.get("is_page"): - pc = (await g.s.execute( - select(PageConfig).where( - PageConfig.container_type == "page", - PageConfig.container_id == post["id"], - ) - )).scalar_one_or_none() - if pc: - features = pc.features or {} - sumup_configured = bool(pc.sumup_api_key) - sumup_merchant_code = pc.sumup_merchant_code or "" - sumup_checkout_prefix = pc.sumup_checkout_prefix or "" - from shared.sx.page import get_template_context - from sx.sx_components import _post_admin_main_panel_sx - tctx = await get_template_context() - tctx.update({ - "features": features, - "sumup_configured": sumup_configured, - "sumup_merchant_code": sumup_merchant_code, - "sumup_checkout_prefix": sumup_checkout_prefix, - }) - return _post_admin_main_panel_sx(tctx) + return '(div :class "pb-8")' async def _h_post_data_content(slug=None, **kw): @@ -351,40 +373,12 @@ async def _h_post_data_content(slug=None, **kw): async def _h_post_preview_content(slug=None, **kw): await _ensure_post_data(slug) from quart import g - from models.ghost_content import Post - from sqlalchemy import select as sa_select - post_id = g.post_data["post"]["id"] - post = (await g.s.execute( - sa_select(Post).where(Post.id == post_id) - )).scalar_one_or_none() - preview_ctx: dict = {} - sx_content = getattr(post, "sx_content", None) or "" - if sx_content: - from shared.sx.prettify import sx_to_pretty_sx - preview_ctx["sx_pretty"] = sx_to_pretty_sx(sx_content) - lexical_raw = getattr(post, "lexical", None) or "" - if lexical_raw: - from shared.sx.prettify import json_to_pretty_sx - preview_ctx["json_pretty"] = json_to_pretty_sx(lexical_raw) - if sx_content: - from shared.sx.parser import parse as sx_parse - from shared.sx.html import render as sx_html_render - from shared.sx.jinja_bridge import _COMPONENT_ENV - try: - parsed = sx_parse(sx_content) - preview_ctx["sx_rendered"] = sx_html_render(parsed, dict(_COMPONENT_ENV)) - except Exception: - preview_ctx["sx_rendered"] = "Error rendering sx" - if lexical_raw: - from bp.blog.ghost.lexical_renderer import render_lexical - try: - preview_ctx["lex_rendered"] = render_lexical(lexical_raw) - except Exception: - preview_ctx["lex_rendered"] = "Error rendering lexical" + from shared.services.registry import services from shared.sx.page import get_template_context from sx.sx_components import _preview_main_panel_sx + preview_data = await services.get("blog_page").preview_data(g.s) tctx = await get_template_context() - tctx.update(preview_ctx) + tctx.update(preview_data) return await _preview_main_panel_sx(tctx)