Add HTML5 metadata authoring form
This commit is contained in:
@@ -233,6 +233,7 @@ def render_html5_editor(
|
||||
{render_html5_project_report(project_id, None)}
|
||||
{render_html5_review(project_id, None)}
|
||||
{render_html5_authoring_preview(project_id, None)}
|
||||
{render_html5_metadata_authoring(project_id)}
|
||||
{render_html5_authoring_changes(project_id, None)}
|
||||
</aside>
|
||||
</section>
|
||||
@@ -508,6 +509,113 @@ def render_html5_authoring_apply_result(project_id: str, result: object | None =
|
||||
"""
|
||||
|
||||
|
||||
def render_html5_metadata_authoring(project_id: str) -> str:
|
||||
return f"""
|
||||
<div class="authoring-preview" data-html5-metadata-authoring>
|
||||
<div class="panel-title">Metadata draft</div>
|
||||
<form
|
||||
class="authoring-preview-form"
|
||||
data-html5-metadata-preview-form
|
||||
method="post"
|
||||
action="/html5/projects/{quote(project_id)}/authoring/metadata-object-preview"
|
||||
hx-post="/html5/projects/{quote(project_id)}/authoring/metadata-object-preview"
|
||||
hx-target="[data-html5-metadata-preview-result]"
|
||||
hx-swap="outerHTML"
|
||||
>
|
||||
<input name="object_kind" value="DOCUMENT" />
|
||||
<input name="name" placeholder="Имя объекта" required />
|
||||
<input name="synonym" placeholder="Синоним" />
|
||||
<input name="attributes" placeholder="Реквизиты: Имя:Тип, ..." />
|
||||
<input name="tabular_sections" placeholder="ТЧ: Товары[Номенклатура:Строка;Количество:Число]" />
|
||||
<input name="forms" placeholder="Формы через запятую" />
|
||||
<input name="commands" placeholder="Команды: Имя:Обработчик" />
|
||||
<input name="task_id" placeholder="task_id" />
|
||||
<input name="session_id" placeholder="session_id" />
|
||||
<input name="user_id" placeholder="user_id" />
|
||||
<button type="submit">Metadata preview</button>
|
||||
</form>
|
||||
{render_html5_metadata_preview_result(project_id)}
|
||||
</div>
|
||||
"""
|
||||
|
||||
|
||||
def render_html5_metadata_preview_result(
|
||||
project_id: str,
|
||||
preview: object | None = None,
|
||||
error: str | None = None,
|
||||
request_payload: dict | None = None,
|
||||
) -> str:
|
||||
if preview is None and error is None:
|
||||
return '<div class="metadata-preview-result" data-html5-metadata-preview-result></div>'
|
||||
if error:
|
||||
return f"""
|
||||
<div class="metadata-preview-result" data-html5-metadata-preview-result>
|
||||
<div class="panel-title">Metadata preview</div>
|
||||
<p class="muted padded">{escape(error)}</p>
|
||||
</div>
|
||||
"""
|
||||
changed = bool(getattr(preview, "changed", False))
|
||||
added = getattr(preview, "added_lines", 0)
|
||||
target = getattr(preview, "target", None)
|
||||
target_name = getattr(target, "qualified_name", None) or getattr(target, "name", None) or "target unavailable"
|
||||
checks = getattr(preview, "checks", []) or []
|
||||
diff = getattr(preview, "semantic_diff", []) or []
|
||||
version_preview = getattr(preview, "version_preview", None)
|
||||
next_version_id = str(getattr(version_preview, "next_version_id", ""))
|
||||
check_rows = "".join(_authoring_check_item(check) for check in checks[:8])
|
||||
diff_rows = "".join(_authoring_diff_item(line) for line in diff[:12]) or '<p class="muted padded">Diff пустой</p>'
|
||||
apply_form = (
|
||||
_metadata_apply_form(project_id, request_payload or {}, next_version_id)
|
||||
if changed and next_version_id
|
||||
else ""
|
||||
)
|
||||
return f"""
|
||||
<div class="metadata-preview-result" data-html5-metadata-preview-result data-html5-project-id="{escape(project_id)}">
|
||||
<div class="panel-title">Metadata preview · {'changed' if changed else 'unchanged'}</div>
|
||||
<article class="authoring-change">
|
||||
<strong>{escape(str(target_name))}</strong>
|
||||
<span>+{escape(str(added))} / -0</span>
|
||||
<small>{escape(next_version_id or "version preview unavailable")}</small>
|
||||
</article>
|
||||
<div class="check-list">{check_rows}</div>
|
||||
<div class="diff-list">{diff_rows}</div>
|
||||
{apply_form}
|
||||
</div>
|
||||
"""
|
||||
|
||||
|
||||
def render_html5_metadata_apply_result(project_id: str, result: object | None = None, error: str | None = None) -> str:
|
||||
if result is None and error is None:
|
||||
return '<div class="metadata-apply-result" data-html5-metadata-apply-result></div>'
|
||||
if error:
|
||||
return f"""
|
||||
<div class="metadata-apply-result" data-html5-metadata-apply-result>
|
||||
<div class="panel-title">Metadata apply</div>
|
||||
<p class="muted padded">{escape(error)}</p>
|
||||
</div>
|
||||
"""
|
||||
status = str(getattr(result, "status", "UNKNOWN"))
|
||||
change_id = str(getattr(result, "change_id", ""))
|
||||
version = getattr(result, "version", None)
|
||||
version_id = str(getattr(version, "version_id", ""))
|
||||
return f"""
|
||||
<div
|
||||
class="metadata-apply-result"
|
||||
data-html5-metadata-apply-result
|
||||
data-html5-authoring-change="{escape(change_id)}"
|
||||
data-html5-version-id="{escape(version_id)}"
|
||||
>
|
||||
<div class="panel-title">Metadata apply</div>
|
||||
<article class="authoring-change">
|
||||
<strong>{escape(status)}</strong>
|
||||
<span>{escape(change_id)}</span>
|
||||
<small>{escape(version_id)}</small>
|
||||
</article>
|
||||
<p class="muted padded">Metadata draft применен в workspace для проекта {escape(project_id)}.</p>
|
||||
</div>
|
||||
"""
|
||||
|
||||
|
||||
def render_html5_authoring_change_detail(project_id: str, preview: object | None) -> str:
|
||||
if preview is None:
|
||||
return f"""
|
||||
@@ -1248,6 +1356,36 @@ def _authoring_apply_change_set_form(project_id: str, payload: dict, next_versio
|
||||
"""
|
||||
|
||||
|
||||
def _metadata_apply_form(project_id: str, payload: dict, next_version_id: str) -> str:
|
||||
return f"""
|
||||
<form
|
||||
class="authoring-preview-form"
|
||||
data-html5-metadata-apply-form
|
||||
method="post"
|
||||
action="/html5/projects/{quote(project_id)}/authoring/apply-metadata-object"
|
||||
hx-post="/html5/projects/{quote(project_id)}/authoring/apply-metadata-object"
|
||||
hx-target="[data-html5-metadata-apply-result]"
|
||||
hx-swap="outerHTML"
|
||||
>
|
||||
<input type="hidden" name="object_kind" value="{escape(str(payload.get("object_kind") or ""))}" />
|
||||
<input type="hidden" name="name" value="{escape(str(payload.get("name") or ""))}" />
|
||||
<input type="hidden" name="synonym" value="{escape(str(payload.get("synonym") or ""))}" />
|
||||
<input type="hidden" name="attributes" value="{escape(str(payload.get("_raw_attributes") or ""))}" />
|
||||
<input type="hidden" name="tabular_sections" value="{escape(str(payload.get("_raw_tabular_sections") or ""))}" />
|
||||
<input type="hidden" name="forms" value="{escape(str(payload.get("_raw_forms") or ""))}" />
|
||||
<input type="hidden" name="commands" value="{escape(str(payload.get("_raw_commands") or ""))}" />
|
||||
<input type="hidden" name="task_id" value="{escape(str(payload.get("task_id") or ""))}" />
|
||||
<input type="hidden" name="session_id" value="{escape(str(payload.get("session_id") or ""))}" />
|
||||
<input type="hidden" name="user_id" value="{escape(str(payload.get("user_id") or ""))}" />
|
||||
<input type="hidden" name="expected_next_version_id" value="{escape(next_version_id)}" />
|
||||
<input name="approved_by" placeholder="approved_by" required />
|
||||
<input name="approval_note" placeholder="Комментарий" />
|
||||
<button type="submit">Apply metadata draft</button>
|
||||
</form>
|
||||
{render_html5_metadata_apply_result(project_id)}
|
||||
"""
|
||||
|
||||
|
||||
def _node_source_text(node: object | None) -> str:
|
||||
if node is None:
|
||||
return "// Модуль не найден в snapshot.\n// HTML5 IDE показывает серверный fallback без клиентского JS."
|
||||
|
||||
Reference in New Issue
Block a user