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