Link HTML5 object selection to flowchart
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-17 00:40:22 +03:00
parent 7583851dc4
commit 70c6424c8c
3 changed files with 34 additions and 16 deletions
+15 -3
View File
@@ -247,15 +247,26 @@ def render_html5_editor(
return _page(f"SFERA HTML5 - {project_id}", content)
def render_html5_flowchart(project_id: str, flowchart: object | None) -> str:
def render_html5_flowchart(
project_id: str,
flowchart: object | None,
*,
focus: str | None = None,
oob: bool = False,
) -> str:
hx_url = f"/html5/projects/{quote(project_id)}/flowchart"
if focus:
hx_url = f"{hx_url}?focus={quote(focus, safe='')}"
oob_attr = ' hx-swap-oob="outerHTML"' if oob else ""
if flowchart is None:
return f"""
<div
class="flowchart-panel"
data-html5-flowchart
hx-get="/html5/projects/{quote(project_id)}/flowchart"
hx-get="{hx_url}"
hx-trigger="load"
hx-swap="outerHTML"
{oob_attr}
>
<div class="panel-title">Карта связей</div>
<p class="muted padded">Сервер собирает граф проекта.</p>
@@ -273,9 +284,10 @@ def render_html5_flowchart(project_id: str, flowchart: object | None) -> str:
<div
class="flowchart-panel"
data-html5-flowchart
hx-get="/html5/projects/{quote(project_id)}/flowchart"
hx-get="{hx_url}"
hx-trigger="every 30s"
hx-swap="outerHTML"
{oob_attr}
>
<div class="panel-title">Карта связей · {escape(mode)}</div>
<dl class="report-grid">
+6 -4
View File
@@ -1751,7 +1751,7 @@ async def html5_project_flowchart(
) -> Response:
flowchart = await project_flowchart(project_id, focus=focus, depth=depth, limit=limit)
return Response(
render_html5_flowchart(project_id, flowchart),
render_html5_flowchart(project_id, flowchart, focus=focus),
media_type="text/html; charset=utf-8",
)
@@ -1767,8 +1767,7 @@ async def html5_project_object_context(project_id: str, object_name: str) -> Res
flowchart = await project_flowchart(project_id, focus=object_name, depth=1, limit=40)
runtime = _runtime_for_object_context(project_id, impact)
knowledge = _knowledge_for_object_context(schema, impact, ui)
return Response(
render_html5_object_context(
object_context = render_html5_object_context(
project_id,
schema,
impact,
@@ -1779,7 +1778,10 @@ async def html5_project_object_context(project_id: str, object_name: str) -> Res
privacy,
integrations,
flowchart,
),
)
flowchart_context = render_html5_flowchart(project_id, flowchart, focus=object_name, oob=True)
return Response(
object_context + flowchart_context,
media_type="text/html; charset=utf-8",
)
+4
View File
@@ -325,6 +325,9 @@ def test_html5_object_context_fragment(tmp_path: Path):
assert "https://api.example.local/orders" in context.text
assert "OUTBOUND" in context.text
assert "data-html5-object-context-item=\"flow-edge\"" in context.text
assert "data-html5-flowchart" in context.text
assert 'hx-swap-oob="outerHTML"' in context.text
assert "Карта связей · focus" in context.text
assert "1 signals" in context.text
assert "1 errors" in context.text
assert "125.0 ms" in context.text
@@ -362,6 +365,7 @@ def test_html5_flowchart_fragment(tmp_path: Path):
assert flowchart.status_code == 200
assert "text/html" in flowchart.headers["content-type"]
assert "data-html5-flowchart" in flowchart.text
assert 'hx-swap-oob="outerHTML"' not in flowchart.text
assert "Карта связей" in flowchart.text
assert "Nodes" in flowchart.text
assert "Edges" in flowchart.text