From 3d6caf8a9ed4b10d145eefa6ac661900739b41a0 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Wed, 9 Sep 2026 02:03:58 +0200 Subject: [PATCH] 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. --- src/govoplan_policy/backend/manifest.py | 14 +++++++++++++- .../src/features/policy/RetentionPoliciesPanel.tsx | 8 ++++---- webui/src/features/policy/ViewPoliciesPanel.tsx | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/govoplan_policy/backend/manifest.py b/src/govoplan_policy/backend/manifest.py index 9a5b97f..78c45f9 100644 --- a/src/govoplan_policy/backend/manifest.py +++ b/src/govoplan_policy/backend/manifest.py @@ -346,6 +346,9 @@ manifest = ModuleManifest( title="Govern View availability and actions", summary="View policy limits which definitions and surfaces remain available and which View actions lower scopes may perform.", body=( + "Documentation books sit immediately beside the visible heading or contextual label for View " + "policy and retention settings, not among operational action buttons. Field help remains " + "beside its label. " "System, tenant, group, and user View policies form a restrictive hierarchy. Each scope may inherit, allow, or block viewing, selecting, assigning, editing, deriving, and workflow activation. Optional View-ID and surface-ID ceilings are intersected through the hierarchy, so a lower scope cannot restore an item excluded above it. Available, default, and required View assignments remain owned by Views; Policy supplies the action and catalogue ceiling and records provenance and malformed-policy diagnostics." ), layer="configured", @@ -360,6 +363,9 @@ manifest = ModuleManifest( "Ebenen ausführen dürfen." ), "body": ( + "Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder " + "Kontextbezeichnung für Ansichtsrichtlinien und Aufbewahrungseinstellungen, nicht zwischen " + "ausführbaren Aktionsschaltflächen. Feldhilfe bleibt neben der Feldbezeichnung. " "View-Richtlinien auf System-, Mandanten-, Gruppen- und Benutzerebene bilden eine einschränkende Hierarchie. Jede Ebene " "kann Anzeigen, Auswählen, Zuweisen, Bearbeiten, Ableiten und Workflow-Aktivierung erben, erlauben oder blockieren. " "Optionale Obergrenzen für View- und Oberflächenkennungen werden entlang der Hierarchie geschnitten, sodass eine " @@ -601,6 +607,9 @@ manifest = ModuleManifest( title="Administer policy hierarchy and overrides", summary="Policy evaluates versioned system, tenant, group, and user rules for retention and module-owned governed actions.", body=( + "Documentation books sit immediately beside the visible heading or contextual label for View " + "policy and retention settings, not among operational action buttons. Field help remains " + "beside its label. " "Retention fields govern separate data classes: raw campaign JSON, generated EML artifacts, stored report details, mock-mailbox records, and audit details. A blank system day limit keeps the class indefinitely; a blank lower-scope value inherits its parent. Lower scopes may only shorten an allowed limit or reduce audit detail. Disabling raw campaign JSON makes it immediately eligible for redaction when retention is applied. Audit detail level controls how new audit details are recorded, while audit-detail retention redacts eligible historical detail but preserves the audit record and a bounded retention marker. The lower-level switch controls whether child scopes may narrow that specific field. Inspect the effective value and source path before saving." ), documentation_types=("admin",), @@ -621,7 +630,10 @@ manifest = ModuleManifest( "de": { "title": "Richtlinienhierarchie und Aufbewahrung verwalten", "summary": "Policy wertet versionierte System-, Mandanten-, Gruppen- und Benutzerregeln für Aufbewahrung sowie modulbezogene Steuerungsentscheidungen aus.", - "body": "Die Felder steuern getrennte Datenklassen: Kampagnen-Rohdaten im JSON-Format, erzeugte EML-Dateien, gespeicherte Berichtsdetails, Einträge im Testpostfach und Auditdetails. Ein leeres Tageslimit auf Systemebene bedeutet unbegrenzte Aufbewahrung; auf tieferen Ebenen wird der Elternwert geerbt. Tiefere Ebenen dürfen ein erlaubtes Limit nur verkürzen oder Auditdetails weiter reduzieren. Wenn die Speicherung von Kampagnen-Rohdaten deaktiviert wird, werden diese bei der nächsten Ausführung sofort zur Schwärzung vorgemerkt. Die Auditdetailstufe steuert neue Auditdetails; die Aufbewahrungsfrist für Auditdetails schwärzt historische Details, erhält aber den Auditdatensatz und einen begrenzten Aufbewahrungsnachweis. Der Schalter für tiefere Ebenen bestimmt, ob Kindebenen genau dieses Feld weiter einschränken dürfen. Prüfen Sie vor dem Speichern den effektiven Wert und seinen Quellenpfad.", + "body": "Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder " + "Kontextbezeichnung für Ansichtsrichtlinien und Aufbewahrungseinstellungen, nicht zwischen " + "ausführbaren Aktionsschaltflächen. Feldhilfe bleibt neben der Feldbezeichnung. " + "Die Felder steuern getrennte Datenklassen: Kampagnen-Rohdaten im JSON-Format, erzeugte EML-Dateien, gespeicherte Berichtsdetails, Einträge im Testpostfach und Auditdetails. Ein leeres Tageslimit auf Systemebene bedeutet unbegrenzte Aufbewahrung; auf tieferen Ebenen wird der Elternwert geerbt. Tiefere Ebenen dürfen ein erlaubtes Limit nur verkürzen oder Auditdetails weiter reduzieren. Wenn die Speicherung von Kampagnen-Rohdaten deaktiviert wird, werden diese bei der nächsten Ausführung sofort zur Schwärzung vorgemerkt. Die Auditdetailstufe steuert neue Auditdetails; die Aufbewahrungsfrist für Auditdetails schwärzt historische Details, erhält aber den Auditdatensatz und einen begrenzten Aufbewahrungsnachweis. Der Schalter für tiefere Ebenen bestimmt, ob Kindebenen genau dieses Feld weiter einschränken dürfen. Prüfen Sie vor dem Speichern den effektiven Wert und seinen Quellenpfad.", } }, metadata={ diff --git a/webui/src/features/policy/RetentionPoliciesPanel.tsx b/webui/src/features/policy/RetentionPoliciesPanel.tsx index eeb6529..d909726 100644 --- a/webui/src/features/policy/RetentionPoliciesPanel.tsx +++ b/webui/src/features/policy/RetentionPoliciesPanel.tsx @@ -189,7 +189,7 @@ export default function RetentionPoliciesPanel({ settings, scopeType, canWrite } return ( <> } description={labels.description} helpContextId="policy.retention" loading={loadingTargets} @@ -209,7 +209,7 @@ export default function RetentionPoliciesPanel({ settings, scopeType, canWrite } )} - + } > @@ -226,9 +226,9 @@ export default function RetentionPoliciesPanel({ settings, scopeType, canWrite } {scopeType === "system" && (
} helpContextId="policy.retention.execution" - actions={} + >

Run the saved effective retention policy against retained platform data.

diff --git a/webui/src/features/policy/ViewPoliciesPanel.tsx b/webui/src/features/policy/ViewPoliciesPanel.tsx index 8970416..fba42d9 100644 --- a/webui/src/features/policy/ViewPoliciesPanel.tsx +++ b/webui/src/features/policy/ViewPoliciesPanel.tsx @@ -315,7 +315,7 @@ export default function ViewPoliciesPanel({ settings, scopeType, canWrite }: Pro return ( <> } description="Control which Views and surfaces are available, forced by assignment, selectable, editable, derivable, or workflow-activatable at this scope." loading={loading} error={error} @@ -329,7 +329,7 @@ export default function ViewPoliciesPanel({ settings, scopeType, canWrite }: Pro - + } >