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:46 +02:00
parent 00bec0ed94
commit 0a7bd5b3b4
6 changed files with 23 additions and 4 deletions
+4
View File
@@ -70,6 +70,10 @@ Form definitions should carry:
option, constraint, draft, attachment, signature, policy, and handoff editing. option, constraint, draft, attachment, signature, policy, and handoff editing.
- Forms Runtime performs value validation against the resolved definition; the - Forms Runtime performs value validation against the resolved definition; the
definition owner does not persist submissions. definition owner does not persist submissions.
- Forms consumes Core's title-help and text-help layout contracts for its
catalogue and revision dialog. Workflow books sit beside their heading;
semantic documentation stays beside the Form meaning label for the exact
definition. The placement contract does not move content ownership to Core.
## Recovery And Operations ## Recovery And Operations
+6
View File
@@ -36,3 +36,9 @@ shared section-header toolbar surface. Core therefore owns viewport, search,
state, heading, and narrow-layout geometry. These contracts do not change state, heading, and narrow-layout geometry. These contracts do not change
filter scope, permissions, revision semantics, or publication consequences. filter scope, permissions, revision semantics, or publication consequences.
English and German catalogues cover the owned route and editor vocabulary. English and German catalogues cover the owned route and editor vocabulary.
Documentation books belong immediately beside their contextual text. The
catalogue uses Core's workspace title and `titleHelp`; the revision dialog uses
its title help, and the separate Form meaning label carries semantic help for
that exact definition. Field help stays beside its label. This uses Core layout
contracts and does not change revision, publication, or runtime ownership.
+6 -1
View File
@@ -371,6 +371,8 @@ manifest = ModuleManifest(
title="Reusable form definitions", title="Reusable form definitions",
summary="Create immutable, versioned schemas consumed by Forms Runtime and institutional services.", summary="Create immutable, versioned schemas consumed by Forms Runtime and institutional services.",
body=( body=(
"Documentation books sit beside Form definitions and the revision dialog title. The separate "
"Form meaning label carries the exact definitions semantic documentation book. "
"Each revision fixes field types, options, constraints, draft, attachment, signature, policy, and handoff requirements. " "Each revision fixes field types, options, constraints, draft, attachment, signature, policy, and handoff requirements. "
"Publishing is explicit; existing submissions continue to retain their exact revision. The catalogue, filter, empty states, " "Publishing is explicit; existing submissions continue to retain their exact revision. The catalogue, filter, empty states, "
"section headings, and definition field groups use the shared responsive layout language and reflow at narrow widths without " "section headings, and definition field groups use the shared responsive layout language and reflow at narrow widths without "
@@ -398,6 +400,9 @@ manifest = ModuleManifest(
"Unveränderliche versionierte Schemata erstellen, die Forms Runtime und institutionelle Services verwenden." "Unveränderliche versionierte Schemata erstellen, die Forms Runtime und institutionelle Services verwenden."
), ),
"body": ( "body": (
"Dokumentationsbücher stehen neben Formulardefinitionen und dem Titel des Revisionsdialogs. "
"Die separate Bezeichnung Formularbedeutung trägt das Buch zur semantischen Dokumentation der "
"genauen Definition. "
"Jede Revision legt Feldtypen, Optionen, Einschränkungen sowie Anforderungen an Entwurf, Anlagen, Signaturen, " "Jede Revision legt Feldtypen, Optionen, Einschränkungen sowie Anforderungen an Entwurf, Anlagen, Signaturen, "
"Richtlinien und Übergaben fest. Die Veröffentlichung erfolgt ausdrücklich; vorhandene Einreichungen behalten ihre " "Richtlinien und Übergaben fest. Die Veröffentlichung erfolgt ausdrücklich; vorhandene Einreichungen behalten ihre "
"exakte Revision. Katalog, Filter, Leerzustände, Abschnittsüberschriften und Feldgruppen der Definition verwenden die " "exakte Revision. Katalog, Filter, Leerzustände, Abschnittsüberschriften und Feldgruppen der Definition verwenden die "
@@ -518,7 +523,7 @@ manifest = ModuleManifest(
"workflow instance", "workflow instance",
), ),
reference_packages=("product.service-to-decision",), reference_packages=("product.service-to-decision",),
migration_docs=("docs/FORMS_BOUNDARY.md",), migration_docs=("docs/FORMS_BOUNDARY.md", "docs/INTERFACE_PATTERN_MIGRATION.md"),
recovery_docs=("docs/FORMS_BOUNDARY.md",), recovery_docs=("docs/FORMS_BOUNDARY.md",),
security_docs=("docs/FORMS_BOUNDARY.md",), security_docs=("docs/FORMS_BOUNDARY.md",),
operations_docs=("docs/FORMS_BOUNDARY.md",), operations_docs=("docs/FORMS_BOUNDARY.md",),
@@ -6,6 +6,7 @@ import { FormGrid,
ConfirmDialog, ConfirmDialog,
Dialog, Dialog,
DocumentationHelpLink, DocumentationHelpLink,
TextWithHelp,
DismissibleAlert, DismissibleAlert,
FormField as Field, FormField as Field,
IconButton, IconButton,
@@ -193,6 +194,7 @@ export default function FormDefinitionDialog({
<Dialog <Dialog
open={open} open={open}
title={definition ? `Revise ${definition.title}` : "New Form definition"} title={definition ? `Revise ${definition.title}` : "New Form definition"}
titleHelp={<DocumentationHelpLink reference={FORMS_FIELD_DOCUMENTATION} />}
onClose={requestClose} onClose={requestClose}
closeDisabled={busy} closeDisabled={busy}
portal portal
@@ -207,9 +209,8 @@ export default function FormDefinitionDialog({
}> }>
<div className="form-definition-editor"> <div className="form-definition-editor">
<div className="form-definition-help"> <div className="form-definition-help">
<DocumentationHelpLink reference={FORMS_FIELD_DOCUMENTATION} />
{definition && <> {definition && <>
<DocumentationHelpLink reference={semanticFormDocumentation(definition)} /> <TextWithHelp help={<DocumentationHelpLink reference={semanticFormDocumentation(definition)} />}>Form meaning</TextWithHelp>
<a className="btn btn-secondary" href={semanticAuthoringHref(definition)} target="_blank" rel="noreferrer"> <a className="btn btn-secondary" href={semanticAuthoringHref(definition)} target="_blank" rel="noreferrer">
<BookOpen size={16} aria-hidden="true" /> Document form meaning <BookOpen size={16} aria-hidden="true" /> Document form meaning
</a> </a>
+2 -1
View File
@@ -162,6 +162,8 @@ export default function FormsPage({ settings, auth }: PlatformRouteContext) {
<main className="forms-page"> <main className="forms-page">
<WorkspaceFrame className="forms-shell" label="Form definitions" interfaceId="forms.catalogue" helpContextId="forms.page.catalogue" helpModuleId="forms"> <WorkspaceFrame className="forms-shell" label="Form definitions" interfaceId="forms.catalogue" helpContextId="forms.page.catalogue" helpModuleId="forms">
<WorkspaceActionBar <WorkspaceActionBar
title="Form definitions"
titleHelp={<DocumentationHelpLink reference={FORMS_DOCUMENTATION} />}
scope="workspace" scope="workspace"
variant="collection" variant="collection"
refreshable refreshable
@@ -187,7 +189,6 @@ export default function FormsPage({ settings, auth }: PlatformRouteContext) {
<span className="forms-count">{total}</span> <span className="forms-count">{total}</span>
</>} </>}
createAction={<Button variant="primary" disabled={!canWrite} disabledReason={!canWrite ? FORMS_I18N.writeReason : undefined} onClick={() => setEditing("new")}><Plus size={16} aria-hidden="true" />New definition</Button>} createAction={<Button variant="primary" disabled={!canWrite} disabledReason={!canWrite ? FORMS_I18N.writeReason : undefined} onClick={() => setEditing("new")}><Plus size={16} aria-hidden="true" />New definition</Button>}
helpAction={<DocumentationHelpLink reference={FORMS_DOCUMENTATION} />}
/> />
<PageScrollViewport className="forms-list-viewport"> <PageScrollViewport className="forms-list-viewport">
{error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>} {error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>}
+2
View File
@@ -1,6 +1,7 @@
import type { PlatformTranslations } from "@govoplan/core-webui"; import type { PlatformTranslations } from "@govoplan/core-webui";
const en = { const en = {
"Form meaning": "Form meaning",
"i18n:govoplan-forms.form_definitions": "Form definitions", "i18n:govoplan-forms.form_definitions": "Form definitions",
"i18n:govoplan-forms.loading_reason": "Form definitions are still loading.", "i18n:govoplan-forms.loading_reason": "Form definitions are still loading.",
"i18n:govoplan-forms.busy_reason": "Another Form definition action is still running.", "i18n:govoplan-forms.busy_reason": "Another Form definition action is still running.",
@@ -74,6 +75,7 @@ const en = {
} as const; } as const;
const de: Record<keyof typeof en, string> = { const de: Record<keyof typeof en, string> = {
"Form meaning": "Formularbedeutung",
"i18n:govoplan-forms.form_definitions": "Formulardefinitionen", "i18n:govoplan-forms.form_definitions": "Formulardefinitionen",
"i18n:govoplan-forms.loading_reason": "Formulardefinitionen werden noch geladen.", "i18n:govoplan-forms.loading_reason": "Formulardefinitionen werden noch geladen.",
"i18n:govoplan-forms.busy_reason": "Eine andere Aktion für Formulardefinitionen läuft noch.", "i18n:govoplan-forms.busy_reason": "Eine andere Aktion für Formulardefinitionen läuft noch.",