diff --git a/services/api-server/src/api_server/html5.py b/services/api-server/src/api_server/html5.py index df803fd..c8950d3 100644 --- a/services/api-server/src/api_server/html5.py +++ b/services/api-server/src/api_server/html5.py @@ -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"""
Карта связей

Сервер собирает граф проекта.

@@ -273,9 +284,10 @@ def render_html5_flowchart(project_id: str, flowchart: object | None) -> str:
Карта связей · {escape(mode)}
diff --git a/services/api-server/src/api_server/main.py b/services/api-server/src/api_server/main.py index 7b3ecaf..cf33628 100644 --- a/services/api-server/src/api_server/main.py +++ b/services/api-server/src/api_server/main.py @@ -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,19 +1767,21 @@ 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) + object_context = render_html5_object_context( + project_id, + schema, + impact, + access, + ui, + runtime, + knowledge, + privacy, + integrations, + flowchart, + ) + flowchart_context = render_html5_flowchart(project_id, flowchart, focus=object_name, oob=True) return Response( - render_html5_object_context( - project_id, - schema, - impact, - access, - ui, - runtime, - knowledge, - privacy, - integrations, - flowchart, - ), + object_context + flowchart_context, media_type="text/html; charset=utf-8", ) diff --git a/services/api-server/tests/test_api.py b/services/api-server/tests/test_api.py index 2e765d9..3bf4e9a 100644 --- a/services/api-server/tests/test_api.py +++ b/services/api-server/tests/test_api.py @@ -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