fix(ui): align contextual documentation with headings

Verified with the coordinated workspace changes by devkit full run
2026-09-08T225814-186389-0000-3e3ed7cd (all seven phases passed).
This shared UI pass does not mark the individual module reviews complete.
This commit is contained in:
2026-09-09 02:03:29 +02:00
parent 0337e0cf0b
commit 0e03c3e77e
6 changed files with 15 additions and 8 deletions
+5
View File
@@ -951,6 +951,8 @@ manifest = ModuleManifest(
title="Case lifecycle, access, and evidence reference", title="Case lifecycle, access, and evidence reference",
summary="Explains revision, status, access, and reference fields together with their durable consequences.", summary="Explains revision, status, access, and reference fields together with their durable consequences.",
body=( body=(
"Documentation books sit beside the Cases collection heading, the selected case title, and "
"the access or decision dialog title; field help stays with its label. "
"Title and status changes append an immutable case revision guarded by the " "Title and status changes append an immutable case revision guarded by the "
"expected revision and a stable idempotency key. Every accepted change also " "expected revision and a stable idempotency key. Every accepted change also "
"appends a timeline entry with actor, time, and change reason; a terminal " "appends a timeline entry with actor, time, and change reason; a terminal "
@@ -979,6 +981,9 @@ manifest = ModuleManifest(
"Revisions-, Status-, Zugriffs- und Verweisfelder gemeinsam mit ihren dauerhaften Folgen erläutern." "Revisions-, Status-, Zugriffs- und Verweisfelder gemeinsam mit ihren dauerhaften Folgen erläutern."
), ),
"body": ( "body": (
"Dokumentationsbücher stehen neben der Überschrift der Vorgangsliste, dem Titel des "
"ausgewählten Vorgangs und dem Titel des Zugriffs- oder Entscheidungsdialogs; Feldhilfe "
"bleibt bei der Feldbezeichnung. "
"Änderungen an Titel und Status ergänzen eine unveränderliche Vorgangsrevision, geschützt durch erwartete Revision und " "Änderungen an Titel und Status ergänzen eine unveränderliche Vorgangsrevision, geschützt durch erwartete Revision und "
"stabilen Idempotenzschlüssel. Jede akzeptierte Änderung ergänzt außerdem einen Timeline-Eintrag mit handelnder Person, " "stabilen Idempotenzschlüssel. Jede akzeptierte Änderung ergänzt außerdem einen Timeline-Eintrag mit handelnder Person, "
"Zeitpunkt und Änderungsgrund; ein abschließender Status verlangt zusätzlich die Berechtigung zum Schließen. Die Sichtbarkeit " "Zeitpunkt und Änderungsgrund; ein abschließender Status verlangt zusätzlich die Berechtigung zum Schließen. Die Sichtbarkeit "
@@ -92,10 +92,11 @@ class CasesInterfaceDocumentationContractTests(unittest.TestCase):
REPO_ROOT / "webui/src/features/cases/CaseShareDialog.tsx" REPO_ROOT / "webui/src/features/cases/CaseShareDialog.tsx"
).read_text(encoding="utf-8") ).read_text(encoding="utf-8")
self.assertIn("DocumentationHelpLink", list_page) self.assertIn("titleHelp={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}", list_page)
self.assertNotIn("helpAction=", list_page)
for component in ( for component in (
"ActionBlockerHint", "ActionBlockerHint",
"DocumentationHelpLink", 'TextWithHelp as="div" help={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}',
"FormField", "FormField",
"useUnsavedDraftGuard", "useUnsavedDraftGuard",
"QUICK_ACCESS_RESULT_EVENT", "QUICK_ACCESS_RESULT_EVENT",
@@ -105,7 +106,7 @@ class CasesInterfaceDocumentationContractTests(unittest.TestCase):
self.assertIn(component, detail_page) self.assertIn(component, detail_page)
for component in ( for component in (
"ConfirmDialog", "ConfirmDialog",
"DocumentationHelpLink", "titleHelp={<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />}",
"ReferenceSelect", "ReferenceSelect",
"useUnsavedDraftGuard", "useUnsavedDraftGuard",
): ):
@@ -103,6 +103,7 @@ export default function CaseDecisionDialog({
<Dialog <Dialog
open={open} open={open}
title={i18nMessage("i18n:govoplan-cases.decision_title", { value0: record.case_number })} title={i18nMessage("i18n:govoplan-cases.decision_title", { value0: record.case_number })}
titleHelp={<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />}
onClose={onClose} onClose={onClose}
closeDisabled={busy} closeDisabled={busy}
portal portal
@@ -123,7 +124,6 @@ export default function CaseDecisionDialog({
} }
> >
<div className="case-decision-content" data-help-context-id="cases.decision.editor"> <div className="case-decision-content" data-help-context-id="cases.decision.editor">
<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />
{error ? <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert> : null} {error ? <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert> : null}
<p className="case-decision-explanation"> <p className="case-decision-explanation">
The server verifies your current acting assignment, the effective Mandate, the exact Case revision, evidence, and legal basis before recording the outcome. The server verifies your current acting assignment, the effective Mandate, the exact Case revision, evidence, and legal basis before recording the outcome.
+2 -2
View File
@@ -5,6 +5,7 @@ import { ActionToolbar,
ActionBlockerHint, ActionBlockerHint,
Button, Button,
DocumentationHelpLink, DocumentationHelpLink,
TextWithHelp,
DismissibleAlert, DismissibleAlert,
FormField, FormField,
IconButton, IconButton,
@@ -335,7 +336,6 @@ export default function CaseDetailPage({ settings, auth }: PlatformRouteContext)
/> />
</div> </div>
) : null} ) : null}
<DocumentationHelpLink reference={CASES_DOCUMENTATION} />
</ActionToolbar> </ActionToolbar>
<PageScrollViewport className="case-detail-viewport"> <PageScrollViewport className="case-detail-viewport">
{error && {error &&
@@ -350,7 +350,7 @@ export default function CaseDetailPage({ settings, auth }: PlatformRouteContext)
<div className="case-detail-title-row"> <div className="case-detail-title-row">
<div> <div>
<span className="case-detail-eyebrow">{humanize(record.case_type_key)}</span> <span className="case-detail-eyebrow">{humanize(record.case_type_key)}</span>
<h1>{record.title}</h1> <TextWithHelp as="div" help={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}><h1>{record.title}</h1></TextWithHelp>
</div> </div>
<StatusBadge status={record.closed_at ? "inactive" : "active"} label={humanize(record.status_key)} /> <StatusBadge status={record.closed_at ? "inactive" : "active"} label={humanize(record.status_key)} />
</div> </div>
+1 -1
View File
@@ -173,6 +173,7 @@ export default function CaseShareDialog({
<Dialog <Dialog
open={open} open={open}
title={i18nMessage("i18n:govoplan-cases.case_access_title", { value0: record.case_number })} title={i18nMessage("i18n:govoplan-cases.case_access_title", { value0: record.case_number })}
titleHelp={<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />}
onClose={close} onClose={close}
closeDisabled={busy} closeDisabled={busy}
portal portal
@@ -193,7 +194,6 @@ export default function CaseShareDialog({
} }
> >
<div className="case-share-content"> <div className="case-share-content">
<DocumentationHelpLink reference={CASES_FIELDS_DOCUMENTATION} />
{error ? ( {error ? (
<DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert> <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>
) : null} ) : null}
+2 -1
View File
@@ -90,6 +90,8 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
<main className="cases-page"> <main className="cases-page">
<WorkspaceFrame className="cases-shell" label="Cases" interfaceId="cases.catalogue" helpContextId="cases.page.catalogue" helpModuleId="cases"> <WorkspaceFrame className="cases-shell" label="Cases" interfaceId="cases.catalogue" helpContextId="cases.page.catalogue" helpModuleId="cases">
<WorkspaceActionBar <WorkspaceActionBar
title="Cases"
titleHelp={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}
scope="collection-pane" scope="collection-pane"
variant="collection" variant="collection"
refreshable refreshable
@@ -131,7 +133,6 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
</label> </label>
<span className="cases-count">{i18nMessage("i18n:govoplan-cases.case_count", { value0: total })}</span> <span className="cases-count">{i18nMessage("i18n:govoplan-cases.case_count", { value0: total })}</span>
</>} </>}
helpAction={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}
/> />
<PageScrollViewport className="cases-list-viewport"> <PageScrollViewport className="cases-list-viewport">
{error && {error &&