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:41 +02:00
parent a6c5bab3a4
commit 4d570b5e9e
3 changed files with 13 additions and 7 deletions
+7 -2
View File
@@ -250,7 +250,9 @@ DOCUMENTATION = localize_documentation_topics((
id="dataflow.workspace-layout", id="dataflow.workspace-layout",
title="Dataflow workspace actions", title="Dataflow workspace actions",
summary="Find collection-wide commands in their consistent workspace position.", summary="Find collection-wide commands in their consistent workspace position.",
body="Reload and New pipeline use the persistent full-width workspace header at the upper right; Reload sits immediately before creation. Selecting a record, changing filters, or opening an editor does not move these collection-wide commands into the left pane. SQL editing, validation, previews, saving, and execution keep their existing editor scope and bounded safety rules. Existing permissions, disabled-state rules, and unsaved-change guards still apply. Administrators configure authority through the existing permission system; no new permission or automatic operation is introduced.", body="The workspace documentation book sits beside Pipelines; automation and run help sits beside "
"the corresponding dialog title, and field help stays with its label. "
"Reload and New pipeline use the persistent full-width workspace header at the upper right; Reload sits immediately before creation. Selecting a record, changing filters, or opening an editor does not move these collection-wide commands into the left pane. SQL editing, validation, previews, saving, and execution keep their existing editor scope and bounded safety rules. Existing permissions, disabled-state rules, and unsaved-change guards still apply. Administrators configure authority through the existing permission system; no new permission or automatic operation is introduced.",
layer="static", layer="static",
documentation_types=("user", "admin"), documentation_types=("user", "admin"),
audience=("user", "module_admin", "operator"), audience=("user", "module_admin", "operator"),
@@ -258,7 +260,10 @@ DOCUMENTATION = localize_documentation_topics((
translations={"de": { translations={"de": {
"title": "Datenflüsse: Aktionen im Arbeitsbereich", "title": "Datenflüsse: Aktionen im Arbeitsbereich",
"summary": "Sammlungsweite Aktionen an ihrer einheitlichen Position im Arbeitsbereich finden.", "summary": "Sammlungsweite Aktionen an ihrer einheitlichen Position im Arbeitsbereich finden.",
"body": "Neu laden und Neue Pipeline stehen oben rechts in der dauerhaft sichtbaren, arbeitsbereichsweiten Leiste; Neu laden steht unmittelbar vor dem Anlegen. Auswahl, Filterwechsel und Bearbeitung verschieben diese sammlungsweiten Aktionen nicht in den linken Bereich. SQL-Bearbeitung, Validierung, Vorschau, Speichern und Ausführung behalten ihren bisherigen Editorbereich und ihre begrenzenden Sicherheitsregeln. Bestehende Berechtigungen, Deaktivierungsregeln und der Schutz ungespeicherter Änderungen gelten weiterhin. Administratoren konfigurieren Rechte im bestehenden Berechtigungssystem; es entstehen weder neue Rechte noch automatische Vorgänge.", "body": "Das Dokumentationsbuch des Arbeitsbereichs steht neben Pipelines; Hilfe zu Automatisierung "
"und Ausführung steht neben dem jeweiligen Dialogtitel, und Feldhilfe bleibt bei der "
"Feldbezeichnung. "
"Neu laden und Neue Pipeline stehen oben rechts in der dauerhaft sichtbaren, arbeitsbereichsweiten Leiste; Neu laden steht unmittelbar vor dem Anlegen. Auswahl, Filterwechsel und Bearbeitung verschieben diese sammlungsweiten Aktionen nicht in den linken Bereich. SQL-Bearbeitung, Validierung, Vorschau, Speichern und Ausführung behalten ihren bisherigen Editorbereich und ihre begrenzenden Sicherheitsregeln. Bestehende Berechtigungen, Deaktivierungsregeln und der Schutz ungespeicherter Änderungen gelten weiterhin. Administratoren konfigurieren Rechte im bestehenden Berechtigungssystem; es entstehen weder neue Rechte noch automatische Vorgänge.",
}}, }},
), ),
DocumentationTopic( DocumentationTopic(
@@ -67,12 +67,13 @@ class DataflowInterfaceDocumentationContractTests(unittest.TestCase):
for component in ( for component in (
"ActionBlockerHint", "ActionBlockerHint",
"DocumentationHelpLink", "titleHelp={<DocumentationHelpLink reference={DATAFLOW_DOCUMENTATION} />}",
"useUnsavedDraftGuard", "useUnsavedDraftGuard",
"ConfirmDialog", "ConfirmDialog",
): ):
self.assertIn(component, page) self.assertIn(component, page)
self.assertIn("DATAFLOW_NODE_DOCUMENTATION", inspector) self.assertIn("DATAFLOW_NODE_DOCUMENTATION", inspector)
self.assertNotIn("helpAction=", page)
if __name__ == "__main__": if __name__ == "__main__":
+4 -4
View File
@@ -668,11 +668,12 @@ export default function DataflowPage({ settings, auth }: { settings: ApiSettings
return ( return (
<WorkspaceFrame as="main" height="viewport" surface="plain" className="dataflow-page" label="Dataflow workspace"> <WorkspaceFrame as="main" height="viewport" surface="plain" className="dataflow-page" label="Dataflow workspace">
<WorkspaceActionBar <WorkspaceActionBar
title="Pipelines"
titleHelp={<DocumentationHelpLink reference={DATAFLOW_DOCUMENTATION} />}
scope="workspace" scope="workspace"
variant="collection" variant="collection"
refreshable refreshable
reloadAction={{ onReload: () => void loadPipelines(draft?.id), loading, label: "Refresh pipelines" }} reloadAction={{ onReload: () => void loadPipelines(draft?.id), loading, label: "Refresh pipelines" }}
contextActions={<strong>Pipelines</strong>}
createAction={<IconButton createAction={<IconButton
label="New pipeline" label="New pipeline"
icon={<Plus size={17} />} icon={<Plus size={17} />}
@@ -759,7 +760,6 @@ export default function DataflowPage({ settings, auth }: { settings: ApiSettings
<option value="archived">Archived</option> <option value="archived">Archived</option>
</select> </select>
</div>} </div>}
helpAction={<DocumentationHelpLink reference={DATAFLOW_DOCUMENTATION} />}
primaryActions={<div className="dataflow-command-bar"> primaryActions={<div className="dataflow-command-bar">
<SegmentedControl<EditorMode> <SegmentedControl<EditorMode>
ariaLabel="Pipeline editor mode" ariaLabel="Pipeline editor mode"
@@ -1953,6 +1953,7 @@ function DataflowTriggersDialog({
<Dialog <Dialog
open={open} open={open}
title={`Automation · ${pipeline?.name ?? "pipeline"}`} title={`Automation · ${pipeline?.name ?? "pipeline"}`}
titleHelp={<DocumentationHelpLink reference={DATAFLOW_FIELDS_DOCUMENTATION} />}
className="dataflow-triggers-dialog" className="dataflow-triggers-dialog"
closeDisabled={busy} closeDisabled={busy}
onClose={close} onClose={close}
@@ -2009,7 +2010,6 @@ function DataflowTriggersDialog({
{!busy && !triggers.length ? <small>No triggers configured</small> : null} {!busy && !triggers.length ? <small>No triggers configured</small> : null}
</div> </div>
<div className="dataflow-trigger-form"> <div className="dataflow-trigger-form">
<DocumentationHelpLink reference={DATAFLOW_FIELDS_DOCUMENTATION} />
{error ? <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert> : null} {error ? <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert> : null}
<FormField label="Name" documentation={DATAFLOW_FIELDS_DOCUMENTATION}> <FormField label="Name" documentation={DATAFLOW_FIELDS_DOCUMENTATION}>
<input disabled={!editable} value={name} onChange={(event) => setName(event.target.value)} /> <input disabled={!editable} value={name} onChange={(event) => setName(event.target.value)} />
@@ -2313,6 +2313,7 @@ function RunPipelineDialog({
<Dialog <Dialog
open={open} open={open}
title={`Run ${pipeline?.name ?? "pipeline"}`} title={`Run ${pipeline?.name ?? "pipeline"}`}
titleHelp={<DocumentationHelpLink reference={DATAFLOW_RUN_DOCUMENTATION} />}
className="dataflow-run-dialog" className="dataflow-run-dialog"
onClose={() => { onClose={() => {
if (!busy) { if (!busy) {
@@ -2349,7 +2350,6 @@ function RunPipelineDialog({
</DismissibleAlert> </DismissibleAlert>
) : null} ) : null}
<div className="dataflow-run-controls"> <div className="dataflow-run-controls">
<DocumentationHelpLink reference={DATAFLOW_RUN_DOCUMENTATION} />
<SegmentedControl<RunMode> <SegmentedControl<RunMode>
ariaLabel="Run output" ariaLabel="Run output"
options={[ options={[