From dde672202ca16fc01e1f388705ed05fb3f552d44 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 17 May 2026 02:15:40 +0300 Subject: [PATCH] Add HTML5 authoring result summaries --- services/api-server/src/api_server/html5.py | 18 ++++++++++++++++++ services/api-server/tests/test_api.py | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/services/api-server/src/api_server/html5.py b/services/api-server/src/api_server/html5.py index 2c3af4a..9bdaedb 100644 --- a/services/api-server/src/api_server/html5.py +++ b/services/api-server/src/api_server/html5.py @@ -756,6 +756,7 @@ def render_html5_authoring_preview_result(project_id: str, preview: object | Non {escape(str(routine_name))} {escape(insert_text[:180] or "insert text unavailable")} + {_authoring_result_summary("allowed" if allowed else "blocked", diff, checks)}
{check_rows}
{diff_rows}
@@ -801,6 +802,7 @@ def render_html5_authoring_diff_result( +{escape(str(added))} / -{escape(str(removed))} {escape(next_version_id or "version preview unavailable")} + {_authoring_result_summary("changed" if changed else "unchanged", diff, checks)}
{check_rows}
{diff_rows}
{apply_form} @@ -1719,6 +1721,22 @@ def _authoring_changes_summary(changes: Iterable[object]) -> str: """ +def _authoring_result_summary(state: str, diff: Iterable[object], checks: Iterable[object]) -> str: + diff_list = list(diff) + check_list = list(checks) + diff_kinds = Counter(str(getattr(line, "kind", "") or "CHANGE") for line in diff_list) + check_statuses = Counter(str(getattr(check, "status", "") or "UNKNOWN") for check in check_list) + added = sum(1 for line in diff_list if str(getattr(line, "kind", "")) == "ADD") + removed = sum(1 for line in diff_list if str(getattr(line, "kind", "")) == "REMOVE") + diff_text = ", ".join(f"{name}: {count}" for name, count in sorted(diff_kinds.items())) or "empty diff" + check_text = ", ".join(f"{name}: {count}" for name, count in sorted(check_statuses.items())) or "no checks" + return f""" +

+ {escape(state)} · {escape(str(len(diff_list)))} diff lines · +{escape(str(added))} / -{escape(str(removed))} · {escape(diff_text)} · {escape(check_text)} +

+ """ + + def _authoring_detail_summary(diff: Iterable[object], checks: Iterable[object], apply_available: bool) -> str: diff_list = list(diff) check_list = list(checks) diff --git a/services/api-server/tests/test_api.py b/services/api-server/tests/test_api.py index 45f6509..0b7b199 100644 --- a/services/api-server/tests/test_api.py +++ b/services/api-server/tests/test_api.py @@ -2558,6 +2558,8 @@ def test_authoring_context_and_completion_preview(tmp_path: Path): assert html5_preview.status_code == 200 assert "text/html" in html5_preview.headers["content-type"] assert "data-html5-authoring-preview-result" in html5_preview.text + assert "data-html5-authoring-result-summary" in html5_preview.text + assert "diff lines" in html5_preview.text assert "ЗначениеЗаполнено(Контрагент)" in html5_preview.text assert "BLOCKED" in html5_preview.text assert "ADD" in html5_preview.text @@ -2581,6 +2583,8 @@ def test_authoring_context_and_completion_preview(tmp_path: Path): assert html5_diff_preview.status_code == 200 assert "text/html" in html5_diff_preview.headers["content-type"] assert "data-html5-authoring-diff-result" in html5_diff_preview.text + assert "data-html5-authoring-result-summary" in html5_diff_preview.text + assert "changed" in html5_diff_preview.text assert "data-html5-authoring-apply-form" in html5_diff_preview.text assert f'hx-post="/html5/projects/{project_id}/authoring/apply-change-set"' in html5_diff_preview.text assert "data-html5-authoring-apply-result" in html5_diff_preview.text