diff --git a/repub/pages/shim.py b/repub/pages/shim.py index 40859d1..e66d255 100644 --- a/repub/pages/shim.py +++ b/repub/pages/shim.py @@ -3,6 +3,8 @@ from __future__ import annotations import htpy as h from htpy import Node, Renderable +from repub.components import admin_sidebar + ON_LOAD_JS = ( "@post(window.location.pathname + " "(window.location.search + '&u=').replace(/^&/,'?'), " @@ -12,7 +14,9 @@ ON_LOAD_JS = ( TAB_ID_JS = "self.crypto.randomUUID().substring(0,8)" -def shim_page(*, datastar_src: str, head: Node | None = None) -> Renderable: +def shim_page( + *, datastar_src: str, current_path: str, head: Node | None = None +) -> Renderable: return h.html(lang="en")[ h.head[ h.meta(charset="UTF-8"), @@ -29,6 +33,42 @@ def shim_page(*, datastar_src: str, head: Node | None = None) -> Renderable: } ), h.noscript["Your browser does not support JavaScript!"], - h.main(id="morph"), + h.main( + id="morph", + class_="min-h-screen lg:grid lg:grid-cols-[18rem_minmax(0,1fr)]", + )[ + admin_sidebar(current_path=current_path), + h.div(class_="px-4 py-4 sm:px-5 lg:px-6 lg:py-5")[ + h.div(class_="mx-auto max-w-7xl space-y-5")[ + h.section[ + h.div( + class_="flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between" + )[ + h.div(class_="max-w-3xl")[ + h.p( + class_="text-xs font-semibold uppercase tracking-[0.22em] text-amber-600" + )["Connecting"], + h.h1( + class_="mt-1 text-3xl font-semibold tracking-tight text-slate-950" + )["Loading page"], + h.p(class_="mt-1 text-sm text-slate-600")[ + "Rendering the latest server view for this route." + ], + ], + ] + ], + h.section( + class_="overflow-hidden rounded-2xl bg-white shadow-sm ring-1 ring-slate-200" + )[ + h.div(class_="animate-pulse space-y-4 p-6")[ + h.div(class_="h-5 w-40 rounded-full bg-stone-100"), + h.div(class_="h-12 rounded-2xl bg-stone-100"), + h.div(class_="h-12 rounded-2xl bg-stone-100"), + h.div(class_="h-12 rounded-2xl bg-stone-100"), + ] + ], + ] + ], + ], ], ] diff --git a/repub/web.py b/repub/web.py index a216448..f380bb4 100644 --- a/repub/web.py +++ b/repub/web.py @@ -81,12 +81,16 @@ DEFAULT_PANGEA_MAX_ARTICLES = "10" DEFAULT_PANGEA_OLDEST_ARTICLE = "3" -def _render_shim_page(*, stylesheet_href: str, datastar_src: str) -> tuple[str, str]: +def _render_shim_page( + *, stylesheet_href: str, datastar_src: str, current_path: str +) -> tuple[str, str]: head = ( h.title["Republisher Admin UI"], h.link(rel="stylesheet", href=stylesheet_href), ) - body = str(shim_page(datastar_src=datastar_src, head=head)) + body = str( + shim_page(datastar_src=datastar_src, current_path=current_path, head=head) + ) etag = hashlib.sha256(body.encode("utf-8")).hexdigest() return body, etag @@ -116,6 +120,7 @@ def create_app() -> Quart: body, etag = _render_shim_page( stylesheet_href=url_for("static", filename="app.css"), datastar_src=url_for("static", filename="datastar@1.0.0-RC.8.js"), + current_path=request.path, ) if request.if_none_match.contains(etag): response = Response(status=304) diff --git a/tests/test_web.py b/tests/test_web.py index 257f88b..cc7deb8 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -52,7 +52,10 @@ def test_root_get_serves_datastar_shim() -> None: assert 'data-init="@post(window.location.pathname +' in body assert "retryMaxCount: Infinity" in body assert "data-on:online__window=" in body - assert '
' in body + assert '