Migrate Dataflow interface patterns
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
# Dataflow Interface Pattern Migration
|
||||
|
||||
This migration applies the GovOPlaN interface pattern language to the pipeline
|
||||
library, graphical and constrained-SQL editors, node inspector, intermediate
|
||||
preview, automation triggers, and durable run/deployment surfaces.
|
||||
|
||||
## Surface Inventory
|
||||
|
||||
| Surface | Archetype | Consequence class | Contract |
|
||||
| --- | --- | --- | --- |
|
||||
| `/dataflow` library | Governed directory | Select, create, reuse, or retire a pipeline | Stable loading, empty, permission, read-only, disabled-reason, and help states |
|
||||
| Graph/SQL workspace | Consequential definition editor | Append immutable revision | One canonical graph, guarded draft, constrained SQL compilation, diagnostics, and explicit save/discard |
|
||||
| Node inspector | Typed configuration editor | Change transform semantics | Contextual node/expression help, typed validation, bounded intermediate preview, and read-only state |
|
||||
| Trigger editor | Governed automation editor | Create, enable, change, or delete trigger | Guarded nested draft, pinned revision/grant, authorization recheck, and destructive confirmation |
|
||||
| Preview/results | Bounded evidence preview | Read transient intermediate rows | Selected-node context, diagnostics, privacy boundary, row limit, and no retained preview contents |
|
||||
| Runs/deployments | Asynchronous command register | Queue, publish, cancel, reconcile, or promote | Explicit consequence confirmation, durable command identity, progress, recovery state, and retained evidence |
|
||||
|
||||
## Consequence And Availability Rules
|
||||
|
||||
- Saving appends an immutable definition revision. Derivation creates a
|
||||
separately governed copy pinned to the source revision and content hash.
|
||||
- SQL is parsed and compiled into the canonical graph. It is never passed
|
||||
directly to a database or execution provider.
|
||||
- Preview is bounded and transient. A saved run is revision-pinned and records
|
||||
actor, authority, idempotency, progress, output, and recovery evidence.
|
||||
- Publishing appends a governed Datasource materialization. Unknown external
|
||||
outcomes require reconciliation before retry.
|
||||
- Staging and production promotion require confirmation and never rewrite a
|
||||
revision. Cancellation cannot promise reversal of acknowledged external
|
||||
effects.
|
||||
- Missing optional Datasources or automation capabilities disable only their
|
||||
associated actions; local graph, SQL, validation, and preview behavior stays
|
||||
available where authorized.
|
||||
|
||||
Backend and WebUI manifests publish matching surface identifiers. English and
|
||||
German catalogues cover module-owned navigation, states, and core commands.
|
||||
Contextual help resolves from manifest documentation, main and nested drafts
|
||||
are guarded, and unavailable actions carry stable reasons.
|
||||
@@ -181,6 +181,113 @@ DOCUMENTATION = (
|
||||
"Output publication uses forward recovery and blocks blind retry "
|
||||
"when provider acknowledgement is uncertain."
|
||||
),
|
||||
"help_contexts": [
|
||||
"dataflow.page",
|
||||
"dataflow.library",
|
||||
"dataflow.graph",
|
||||
"dataflow.sql",
|
||||
"dataflow.inspector",
|
||||
"dataflow.results",
|
||||
"dataflow.state.read-only",
|
||||
],
|
||||
},
|
||||
),
|
||||
DocumentationTopic(
|
||||
id="dataflow.reference.nodes-and-expressions",
|
||||
title="Dataflow nodes and expressions",
|
||||
summary="Typed node inputs, expressions, schema propagation, and bounded intermediate previews.",
|
||||
body=(
|
||||
"Every graph node declares typed inputs, configuration, output schema, and validation rules. "
|
||||
"Source nodes pin inline content or governed Datasource references; combine, filter, transform, "
|
||||
"quality, reconciliation, reusable-subflow, and output nodes remain explicit in the canonical graph. "
|
||||
"Expressions use the typed Dataflow expression language and never execute arbitrary host or database "
|
||||
"code. Selecting a node may request a bounded intermediate preview; preview rows are transient, "
|
||||
"privacy-filtered for the actor, and are not retained as run output. SQL editing compiles into the same "
|
||||
"canonical graph, so unsupported statements are diagnostics rather than pass-through SQL."
|
||||
),
|
||||
layer="available",
|
||||
documentation_types=("admin", "user"),
|
||||
audience=("operator", "module_admin", "power_user", "data_steward"),
|
||||
order=76,
|
||||
related_modules=("datasources", "connectors", "policy", "audit"),
|
||||
metadata={
|
||||
"help_contexts": [
|
||||
"dataflow.field.node-name",
|
||||
"dataflow.field.source",
|
||||
"dataflow.field.expression",
|
||||
"dataflow.field.schema",
|
||||
"dataflow.action.preview-node",
|
||||
],
|
||||
},
|
||||
),
|
||||
DocumentationTopic(
|
||||
id="dataflow.reference.fields-and-consequences",
|
||||
title="Dataflow fields and lifecycle consequences",
|
||||
summary="Definition scope, revision, reuse, automation, execution, publication, promotion, and deletion semantics.",
|
||||
body=(
|
||||
"Scope determines ownership and Policy inheritance. Templates can be derived but not run; complete "
|
||||
"flows may be previewed, revisioned, automated, and executed when effective Policy allows it. Saving "
|
||||
"appends an immutable revision. A scoped copy pins its source revision and content hash. Triggers pin "
|
||||
"the revision and authorization grant, then re-evaluate authority for every delivery. Runs create "
|
||||
"durable command and recovery evidence. Publishing creates a governed Datasource materialization, and "
|
||||
"environment promotion changes which immutable revision is eligible for staging or production runs. "
|
||||
"Deletion prevents future use while retained run, deployment, lineage, audit, and recovery evidence "
|
||||
"continues under its retention policy."
|
||||
),
|
||||
layer="available",
|
||||
documentation_types=("admin", "user"),
|
||||
audience=("operator", "module_admin", "power_user", "product_owner"),
|
||||
order=77,
|
||||
related_modules=("datasources", "workflow_engine", "notifications", "policy", "audit"),
|
||||
metadata={
|
||||
"help_contexts": [
|
||||
"dataflow.field.scope",
|
||||
"dataflow.field.definition-kind",
|
||||
"dataflow.action.save",
|
||||
"dataflow.action.derive",
|
||||
"dataflow.action.trigger",
|
||||
"dataflow.action.delete",
|
||||
],
|
||||
"consequence_classes": {
|
||||
"save_revision": "Appends an immutable pipeline definition revision.",
|
||||
"derive_copy": "Creates a separately governed copy pinned to the source revision and hash.",
|
||||
"configure_trigger": "Creates or changes an automation command with revision and authorization evidence.",
|
||||
"delete_pipeline": "Prevents future use while retained evidence remains governed.",
|
||||
},
|
||||
},
|
||||
),
|
||||
DocumentationTopic(
|
||||
id="dataflow.execution-and-recovery",
|
||||
title="Dataflow execution, publication, and recovery",
|
||||
summary="Pinned runs, environment promotion, output publication, cancellation, reconciliation, and retained evidence.",
|
||||
body=(
|
||||
"Every run is pinned to an immutable revision and idempotency key. The queue records actor, authority, "
|
||||
"environment, progress, cancellation, output, and recovery state. Database-only runs commit atomically. "
|
||||
"Publication to a governed Datasource uses forward recovery: an unknown provider outcome is reconciled "
|
||||
"before retry so output is not duplicated. Staging and production promotion is explicit and does not "
|
||||
"rewrite a revision. Cancellation is best effort once external work has started; the final evidence "
|
||||
"states whether work stopped, completed, failed, or requires operator reconciliation."
|
||||
),
|
||||
layer="available",
|
||||
documentation_types=("admin", "user"),
|
||||
audience=("operator", "module_admin", "power_user", "security_admin"),
|
||||
order=78,
|
||||
related_modules=("datasources", "notifications", "policy", "audit", "ops"),
|
||||
metadata={
|
||||
"help_contexts": [
|
||||
"dataflow.runs",
|
||||
"dataflow.action.queue-run",
|
||||
"dataflow.action.publish",
|
||||
"dataflow.action.promote-staging",
|
||||
"dataflow.action.promote-production",
|
||||
"dataflow.state.recovery-attention",
|
||||
],
|
||||
"consequence_classes": {
|
||||
"queue_run": "Creates a durable asynchronous command and authorization evidence.",
|
||||
"publish_output": "Creates or updates a governed Datasource and appends a materialization.",
|
||||
"promote_revision": "Makes an immutable revision eligible in a higher execution environment.",
|
||||
"cancel_run": "Requests cancellation; already acknowledged external effects may remain.",
|
||||
},
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -374,6 +481,69 @@ manifest = ModuleManifest(
|
||||
),
|
||||
),
|
||||
view_surfaces=(
|
||||
ViewSurface(
|
||||
id="dataflow.page",
|
||||
module_id=MODULE_ID,
|
||||
kind="route",
|
||||
label="Dataflow",
|
||||
order=72,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.library",
|
||||
module_id=MODULE_ID,
|
||||
kind="section",
|
||||
label="Pipeline library",
|
||||
parent_id="dataflow.page",
|
||||
order=10,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.graph",
|
||||
module_id=MODULE_ID,
|
||||
kind="section",
|
||||
label="Graph editor",
|
||||
parent_id="dataflow.page",
|
||||
order=20,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.sql",
|
||||
module_id=MODULE_ID,
|
||||
kind="section",
|
||||
label="Constrained SQL editor",
|
||||
parent_id="dataflow.page",
|
||||
order=30,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.inspector",
|
||||
module_id=MODULE_ID,
|
||||
kind="section",
|
||||
label="Node inspector",
|
||||
parent_id="dataflow.page",
|
||||
order=40,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.results",
|
||||
module_id=MODULE_ID,
|
||||
kind="section",
|
||||
label="Preview and diagnostics",
|
||||
parent_id="dataflow.page",
|
||||
order=50,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.triggers",
|
||||
module_id=MODULE_ID,
|
||||
kind="action",
|
||||
label="Automation triggers",
|
||||
parent_id="dataflow.page",
|
||||
order=60,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.runs",
|
||||
module_id=MODULE_ID,
|
||||
kind="action",
|
||||
label="Runs and deployments",
|
||||
parent_id="dataflow.page",
|
||||
order=70,
|
||||
),
|
||||
ViewSurface(
|
||||
id="dataflow.widget.pipelines",
|
||||
module_id=MODULE_ID,
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
import unittest
|
||||
|
||||
from govoplan_dataflow.backend.manifest import get_manifest
|
||||
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parents[1]
|
||||
|
||||
|
||||
class DataflowInterfaceDocumentationContractTests(unittest.TestCase):
|
||||
def test_backend_surfaces_and_hierarchy_remain_declared(self) -> None:
|
||||
frontend = get_manifest().frontend
|
||||
self.assertIsNotNone(frontend)
|
||||
surfaces = {item.id: item for item in frontend.view_surfaces} # type: ignore[union-attr]
|
||||
self.assertEqual(
|
||||
{
|
||||
"dataflow.page",
|
||||
"dataflow.library",
|
||||
"dataflow.graph",
|
||||
"dataflow.sql",
|
||||
"dataflow.inspector",
|
||||
"dataflow.results",
|
||||
"dataflow.triggers",
|
||||
"dataflow.runs",
|
||||
"dataflow.widget.pipelines",
|
||||
},
|
||||
set(surfaces),
|
||||
)
|
||||
for surface_id in (
|
||||
"dataflow.library",
|
||||
"dataflow.graph",
|
||||
"dataflow.sql",
|
||||
"dataflow.inspector",
|
||||
"dataflow.results",
|
||||
"dataflow.triggers",
|
||||
"dataflow.runs",
|
||||
):
|
||||
self.assertEqual("dataflow.page", surfaces[surface_id].parent_id)
|
||||
|
||||
def test_help_and_consequence_metadata_remain_published(self) -> None:
|
||||
topics = {topic.id: topic for topic in get_manifest().documentation}
|
||||
boundary = topics["dataflow.module-boundary"]
|
||||
fields = topics["dataflow.reference.fields-and-consequences"]
|
||||
nodes = topics["dataflow.reference.nodes-and-expressions"]
|
||||
execution = topics["dataflow.execution-and-recovery"]
|
||||
|
||||
self.assertIn("dataflow.state.read-only", boundary.metadata["help_contexts"])
|
||||
self.assertIn("dataflow.field.expression", nodes.metadata["help_contexts"])
|
||||
self.assertIn("save_revision", fields.metadata["consequence_classes"])
|
||||
self.assertIn("delete_pipeline", fields.metadata["consequence_classes"])
|
||||
self.assertIn("publish_output", execution.metadata["consequence_classes"])
|
||||
self.assertIn("promote_revision", execution.metadata["consequence_classes"])
|
||||
|
||||
def test_webui_uses_shared_help_guard_and_consequence_components(self) -> None:
|
||||
page = (REPO_ROOT / "webui/src/features/dataflow/DataflowPage.tsx").read_text(
|
||||
encoding="utf-8"
|
||||
)
|
||||
inspector = (
|
||||
REPO_ROOT / "webui/src/features/dataflow/NodeInspector.tsx"
|
||||
).read_text(encoding="utf-8")
|
||||
|
||||
for component in (
|
||||
"ActionBlockerHint",
|
||||
"DocumentationHelpLink",
|
||||
"useUnsavedDraftGuard",
|
||||
"ConfirmDialog",
|
||||
):
|
||||
self.assertIn(component, page)
|
||||
self.assertIn("DATAFLOW_NODE_DOCUMENTATION", inspector)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import { useEffect, useState, type ComponentProps } from "react";
|
||||
import { Play, Trash2 } from "lucide-react";
|
||||
import {
|
||||
DismissibleAlert,
|
||||
FormField,
|
||||
FormField as CoreFormField,
|
||||
IconButton
|
||||
} from "@govoplan/core-webui";
|
||||
import type {
|
||||
@@ -10,6 +10,18 @@ import type {
|
||||
PipelineGraphNode,
|
||||
TabularSource
|
||||
} from "../../api/dataflow";
|
||||
import { DATAFLOW_NODE_DOCUMENTATION } from "./interfacePatterns";
|
||||
|
||||
type NodeFormFieldProps = ComponentProps<typeof CoreFormField>;
|
||||
|
||||
function FormField({ documentation, ...props }: NodeFormFieldProps) {
|
||||
return (
|
||||
<CoreFormField
|
||||
{...props}
|
||||
documentation={documentation ?? DATAFLOW_NODE_DOCUMENTATION}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
type NodeInspectorProps = {
|
||||
node: PipelineGraphNode | null;
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
import type { DocumentationHelpReference } from "@govoplan/core-webui";
|
||||
|
||||
export const DATAFLOW_DOCUMENTATION = {
|
||||
topicId: "dataflow.module-boundary",
|
||||
documentationType: "user"
|
||||
} satisfies DocumentationHelpReference;
|
||||
|
||||
export const DATAFLOW_FIELDS_DOCUMENTATION = {
|
||||
topicId: "dataflow.reference.fields-and-consequences",
|
||||
documentationType: "admin"
|
||||
} satisfies DocumentationHelpReference;
|
||||
|
||||
export const DATAFLOW_NODE_DOCUMENTATION = {
|
||||
topicId: "dataflow.reference.nodes-and-expressions",
|
||||
documentationType: "user"
|
||||
} satisfies DocumentationHelpReference;
|
||||
|
||||
export const DATAFLOW_RUN_DOCUMENTATION = {
|
||||
topicId: "dataflow.execution-and-recovery",
|
||||
documentationType: "admin"
|
||||
} satisfies DocumentationHelpReference;
|
||||
|
||||
export const DATAFLOW_I18N = {
|
||||
loading: "i18n:govoplan-dataflow.loading_reason",
|
||||
working: "i18n:govoplan-dataflow.working_reason",
|
||||
writeReason: "i18n:govoplan-dataflow.write_reason",
|
||||
runReason: "i18n:govoplan-dataflow.run_reason",
|
||||
noSelection: "i18n:govoplan-dataflow.no_selection_reason",
|
||||
noChanges: "i18n:govoplan-dataflow.no_changes_reason",
|
||||
saveFirst: "i18n:govoplan-dataflow.save_first_reason",
|
||||
requiredAction: "i18n:govoplan-dataflow.required_action",
|
||||
actor: "i18n:govoplan-dataflow.actor",
|
||||
destination: "i18n:govoplan-dataflow.destination",
|
||||
permissionAction: "i18n:govoplan-dataflow.permission_action",
|
||||
permissionActor: "i18n:govoplan-dataflow.permission_actor",
|
||||
permissionDestination: "i18n:govoplan-dataflow.permission_destination"
|
||||
} as const;
|
||||
@@ -0,0 +1,163 @@
|
||||
import type { PlatformTranslations } from "@govoplan/core-webui";
|
||||
|
||||
const en = {
|
||||
"i18n:govoplan-dataflow.dataflow": "Dataflow",
|
||||
"i18n:govoplan-dataflow.library": "Pipeline library",
|
||||
"i18n:govoplan-dataflow.graph": "Graph editor",
|
||||
"i18n:govoplan-dataflow.sql": "Constrained SQL editor",
|
||||
"i18n:govoplan-dataflow.inspector": "Node inspector",
|
||||
"i18n:govoplan-dataflow.results": "Preview and diagnostics",
|
||||
"i18n:govoplan-dataflow.triggers": "Automation triggers",
|
||||
"i18n:govoplan-dataflow.runs": "Runs and deployments",
|
||||
"i18n:govoplan-dataflow.widget": "Dataflows widget",
|
||||
"i18n:govoplan-dataflow.loading_reason": "The pipeline library is still loading.",
|
||||
"i18n:govoplan-dataflow.working_reason": "Another Dataflow operation is still running.",
|
||||
"i18n:govoplan-dataflow.write_reason": "Your account may not create or change pipeline definitions.",
|
||||
"i18n:govoplan-dataflow.run_reason": "Your account may not preview or run pipelines.",
|
||||
"i18n:govoplan-dataflow.no_selection_reason": "Select or create a pipeline first.",
|
||||
"i18n:govoplan-dataflow.no_changes_reason": "There are no unsaved pipeline changes.",
|
||||
"i18n:govoplan-dataflow.save_first_reason": "Save the pipeline before starting a revision-pinned run.",
|
||||
"i18n:govoplan-dataflow.required_action": "Required action",
|
||||
"i18n:govoplan-dataflow.actor": "Responsible actor",
|
||||
"i18n:govoplan-dataflow.destination": "Where to continue",
|
||||
"i18n:govoplan-dataflow.permission_action": "Ask for Dataflow definition or run permission for the intended operation.",
|
||||
"i18n:govoplan-dataflow.permission_actor": "A tenant administrator or Dataflow manager",
|
||||
"i18n:govoplan-dataflow.permission_destination": "Access administration for Dataflow",
|
||||
"i18n:govoplan-dataflow.unsaved_title": "Unsaved pipeline",
|
||||
"i18n:govoplan-dataflow.unsaved_message": "Save or discard the pipeline changes before leaving this workspace.",
|
||||
"i18n:govoplan-dataflow.unsaved_copy_title": "Uncreated pipeline copy",
|
||||
"i18n:govoplan-dataflow.unsaved_copy_message": "Create the scoped copy or discard its changed settings before leaving.",
|
||||
"i18n:govoplan-dataflow.unsaved_source_title": "Unstaged datasource",
|
||||
"i18n:govoplan-dataflow.unsaved_source_message": "Import the datasource snapshot or discard its staged content before leaving.",
|
||||
"i18n:govoplan-dataflow.unsaved_trigger_title": "Unsaved automation trigger",
|
||||
"i18n:govoplan-dataflow.unsaved_trigger_message": "Save or discard the trigger changes before leaving this editor.",
|
||||
"i18n:govoplan-dataflow.queue_title": "Queue pipeline run",
|
||||
"i18n:govoplan-dataflow.queue_message": "Queue this pinned pipeline revision? The run and its authorization evidence will be retained.",
|
||||
"i18n:govoplan-dataflow.publish_title": "Queue and publish pipeline output",
|
||||
"i18n:govoplan-dataflow.publish_message": "Queue this pinned revision and publish its output to the selected governed Datasource target?",
|
||||
"i18n:govoplan-dataflow.promote_staging_title": "Promote revision to staging",
|
||||
"i18n:govoplan-dataflow.promote_staging_message": "Promote this immutable pipeline revision to the staging execution environment?",
|
||||
"i18n:govoplan-dataflow.promote_production_title": "Promote revision to production",
|
||||
"i18n:govoplan-dataflow.promote_production_message": "Promote this immutable pipeline revision to production? Future production runs may use it.",
|
||||
"Pipelines": "Pipelines",
|
||||
"Search pipelines": "Search pipelines",
|
||||
"No matching pipelines": "No matching pipelines",
|
||||
"No pipelines yet": "No pipelines yet",
|
||||
"Graph": "Graph",
|
||||
"SQL": "SQL",
|
||||
"Validate": "Validate",
|
||||
"Preview": "Preview",
|
||||
"Refresh": "Refresh",
|
||||
"Run": "Run",
|
||||
"Save": "Save",
|
||||
"Saving...": "Saving...",
|
||||
"Nodes": "Nodes",
|
||||
"No pipeline selected": "No pipeline selected",
|
||||
"New pipeline": "New pipeline",
|
||||
"Definition settings": "Definition settings",
|
||||
"Reuse as scoped copy": "Reuse as scoped copy",
|
||||
"Automation triggers": "Automation triggers",
|
||||
"Discard changes": "Discard changes",
|
||||
"Delete pipeline": "Delete pipeline",
|
||||
"Constrained Dataflow SQL": "Constrained Dataflow SQL",
|
||||
"Apply SQL": "Apply SQL",
|
||||
"Stage datasource": "Stage datasource",
|
||||
"Run only": "Run only",
|
||||
"Publish result": "Publish result",
|
||||
"Environment": "Environment",
|
||||
"Development": "Development",
|
||||
"Staging": "Staging",
|
||||
"Production": "Production",
|
||||
"Promote to staging": "Promote to staging",
|
||||
"Promote to production": "Promote to production",
|
||||
"Recent runs": "Recent runs",
|
||||
"Queue run": "Queue run",
|
||||
"New trigger": "New trigger",
|
||||
"Save trigger": "Save trigger",
|
||||
"Delete trigger": "Delete trigger",
|
||||
"Delete automation trigger": "Delete automation trigger",
|
||||
"Pipeline definition is read-only": "Pipeline definition is read-only",
|
||||
"Working...": "Working..."
|
||||
} as const;
|
||||
|
||||
const de: Record<keyof typeof en, string> = {
|
||||
"i18n:govoplan-dataflow.dataflow": "Datenfluss",
|
||||
"i18n:govoplan-dataflow.library": "Datenflussbibliothek",
|
||||
"i18n:govoplan-dataflow.graph": "Graph-Editor",
|
||||
"i18n:govoplan-dataflow.sql": "Eingeschränkter SQL-Editor",
|
||||
"i18n:govoplan-dataflow.inspector": "Knoteninspektor",
|
||||
"i18n:govoplan-dataflow.results": "Vorschau und Diagnosen",
|
||||
"i18n:govoplan-dataflow.triggers": "Automatisierungsauslöser",
|
||||
"i18n:govoplan-dataflow.runs": "Ausführungen und Bereitstellungen",
|
||||
"i18n:govoplan-dataflow.widget": "Datenfluss-Widget",
|
||||
"i18n:govoplan-dataflow.loading_reason": "Die Datenflussbibliothek wird noch geladen.",
|
||||
"i18n:govoplan-dataflow.working_reason": "Eine andere Datenflussoperation läuft noch.",
|
||||
"i18n:govoplan-dataflow.write_reason": "Ihr Konto darf keine Datenflussdefinitionen erstellen oder ändern.",
|
||||
"i18n:govoplan-dataflow.run_reason": "Ihr Konto darf Datenflüsse nicht prüfen oder ausführen.",
|
||||
"i18n:govoplan-dataflow.no_selection_reason": "Wählen oder erstellen Sie zuerst einen Datenfluss.",
|
||||
"i18n:govoplan-dataflow.no_changes_reason": "Es gibt keine ungespeicherten Datenflussänderungen.",
|
||||
"i18n:govoplan-dataflow.save_first_reason": "Speichern Sie den Datenfluss vor einer revisionsgebundenen Ausführung.",
|
||||
"i18n:govoplan-dataflow.required_action": "Erforderliche Aktion",
|
||||
"i18n:govoplan-dataflow.actor": "Verantwortliche Stelle",
|
||||
"i18n:govoplan-dataflow.destination": "Fortsetzung",
|
||||
"i18n:govoplan-dataflow.permission_action": "Fordern Sie die für den Vorgang erforderliche Datenfluss- oder Ausführungsberechtigung an.",
|
||||
"i18n:govoplan-dataflow.permission_actor": "Mandantenadministration oder Datenflussverwaltung",
|
||||
"i18n:govoplan-dataflow.permission_destination": "Zugriffsverwaltung für Datenflüsse",
|
||||
"i18n:govoplan-dataflow.unsaved_title": "Ungespeicherter Datenfluss",
|
||||
"i18n:govoplan-dataflow.unsaved_message": "Speichern oder verwerfen Sie die Datenflussänderungen, bevor Sie diesen Arbeitsbereich verlassen.",
|
||||
"i18n:govoplan-dataflow.unsaved_copy_title": "Nicht erstellte Datenflusskopie",
|
||||
"i18n:govoplan-dataflow.unsaved_copy_message": "Erstellen Sie die eingegrenzte Kopie oder verwerfen Sie ihre geänderten Einstellungen.",
|
||||
"i18n:govoplan-dataflow.unsaved_source_title": "Nicht bereitgestellte Datenquelle",
|
||||
"i18n:govoplan-dataflow.unsaved_source_message": "Importieren Sie den Datenquellenstand oder verwerfen Sie dessen bereitgestellten Inhalt.",
|
||||
"i18n:govoplan-dataflow.unsaved_trigger_title": "Ungespeicherter Automatisierungsauslöser",
|
||||
"i18n:govoplan-dataflow.unsaved_trigger_message": "Speichern oder verwerfen Sie die Änderungen am Auslöser, bevor Sie diesen Editor verlassen.",
|
||||
"i18n:govoplan-dataflow.queue_title": "Datenflussausführung einreihen",
|
||||
"i18n:govoplan-dataflow.queue_message": "Diese gebundene Datenflussrevision einreihen? Ausführung und Berechtigungsnachweis werden aufbewahrt.",
|
||||
"i18n:govoplan-dataflow.publish_title": "Datenflussausgabe einreihen und veröffentlichen",
|
||||
"i18n:govoplan-dataflow.publish_message": "Diese gebundene Revision einreihen und ihre Ausgabe in der ausgewählten verwalteten Datenquelle veröffentlichen?",
|
||||
"i18n:govoplan-dataflow.promote_staging_title": "Revision nach Staging übernehmen",
|
||||
"i18n:govoplan-dataflow.promote_staging_message": "Diese unveränderliche Datenflussrevision in die Staging-Ausführungsumgebung übernehmen?",
|
||||
"i18n:govoplan-dataflow.promote_production_title": "Revision in Produktion übernehmen",
|
||||
"i18n:govoplan-dataflow.promote_production_message": "Diese unveränderliche Datenflussrevision in Produktion übernehmen? Künftige Produktionsausführungen können sie verwenden.",
|
||||
"Pipelines": "Datenflüsse",
|
||||
"Search pipelines": "Datenflüsse suchen",
|
||||
"No matching pipelines": "Keine passenden Datenflüsse",
|
||||
"No pipelines yet": "Noch keine Datenflüsse",
|
||||
"Graph": "Graph",
|
||||
"SQL": "SQL",
|
||||
"Validate": "Validieren",
|
||||
"Preview": "Vorschau",
|
||||
"Refresh": "Aktualisieren",
|
||||
"Run": "Ausführen",
|
||||
"Save": "Speichern",
|
||||
"Saving...": "Speichert...",
|
||||
"Nodes": "Knoten",
|
||||
"No pipeline selected": "Kein Datenfluss ausgewählt",
|
||||
"New pipeline": "Neuer Datenfluss",
|
||||
"Definition settings": "Definitionseinstellungen",
|
||||
"Reuse as scoped copy": "Als eingegrenzte Kopie verwenden",
|
||||
"Automation triggers": "Automatisierungsauslöser",
|
||||
"Discard changes": "Änderungen verwerfen",
|
||||
"Delete pipeline": "Datenfluss löschen",
|
||||
"Constrained Dataflow SQL": "Eingeschränktes Datenfluss-SQL",
|
||||
"Apply SQL": "SQL anwenden",
|
||||
"Stage datasource": "Datenquelle bereitstellen",
|
||||
"Run only": "Nur ausführen",
|
||||
"Publish result": "Ergebnis veröffentlichen",
|
||||
"Environment": "Umgebung",
|
||||
"Development": "Entwicklung",
|
||||
"Staging": "Staging",
|
||||
"Production": "Produktion",
|
||||
"Promote to staging": "Nach Staging übernehmen",
|
||||
"Promote to production": "In Produktion übernehmen",
|
||||
"Recent runs": "Letzte Ausführungen",
|
||||
"Queue run": "Ausführung einreihen",
|
||||
"New trigger": "Neuer Auslöser",
|
||||
"Save trigger": "Auslöser speichern",
|
||||
"Delete trigger": "Auslöser löschen",
|
||||
"Delete automation trigger": "Automatisierungsauslöser löschen",
|
||||
"Pipeline definition is read-only": "Datenflussdefinition ist schreibgeschützt",
|
||||
"Working...": "Vorgang läuft..."
|
||||
};
|
||||
|
||||
export const generatedTranslations: PlatformTranslations = { en, de };
|
||||
+75
-3
@@ -4,6 +4,7 @@ import type {
|
||||
PlatformWebModule
|
||||
} from "@govoplan/core-webui";
|
||||
import DataflowPipelinesWidget from "./features/dataflow/DataflowPipelinesWidget";
|
||||
import { generatedTranslations } from "./i18n/generatedTranslations";
|
||||
import "@xyflow/react/dist/style.css";
|
||||
import "./styles/dataflow.css";
|
||||
|
||||
@@ -57,7 +58,7 @@ const dataflowDashboardWidgets: DashboardWidgetsUiCapability = {
|
||||
|
||||
export const dataflowModule: PlatformWebModule = {
|
||||
id: "dataflow",
|
||||
label: "Dataflow",
|
||||
label: "i18n:govoplan-dataflow.dataflow",
|
||||
version: "0.1.14",
|
||||
optionalDependencies: [
|
||||
"access",
|
||||
@@ -70,23 +71,94 @@ export const dataflowModule: PlatformWebModule = {
|
||||
"risk_compliance",
|
||||
"workflow"
|
||||
],
|
||||
translations: generatedTranslations,
|
||||
viewSurfaces: [
|
||||
{
|
||||
id: "dataflow.page",
|
||||
moduleId: "dataflow",
|
||||
kind: "route",
|
||||
label: "i18n:govoplan-dataflow.dataflow",
|
||||
order: 72
|
||||
},
|
||||
{
|
||||
id: "dataflow.library",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "i18n:govoplan-dataflow.library",
|
||||
parentId: "dataflow.page",
|
||||
order: 10
|
||||
},
|
||||
{
|
||||
id: "dataflow.graph",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "i18n:govoplan-dataflow.graph",
|
||||
parentId: "dataflow.page",
|
||||
order: 20
|
||||
},
|
||||
{
|
||||
id: "dataflow.sql",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "i18n:govoplan-dataflow.sql",
|
||||
parentId: "dataflow.page",
|
||||
order: 30
|
||||
},
|
||||
{
|
||||
id: "dataflow.inspector",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "i18n:govoplan-dataflow.inspector",
|
||||
parentId: "dataflow.page",
|
||||
order: 40
|
||||
},
|
||||
{
|
||||
id: "dataflow.results",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "i18n:govoplan-dataflow.results",
|
||||
parentId: "dataflow.page",
|
||||
order: 50
|
||||
},
|
||||
{
|
||||
id: "dataflow.triggers",
|
||||
moduleId: "dataflow",
|
||||
kind: "action",
|
||||
label: "i18n:govoplan-dataflow.triggers",
|
||||
parentId: "dataflow.page",
|
||||
order: 60
|
||||
},
|
||||
{
|
||||
id: "dataflow.runs",
|
||||
moduleId: "dataflow",
|
||||
kind: "action",
|
||||
label: "i18n:govoplan-dataflow.runs",
|
||||
parentId: "dataflow.page",
|
||||
order: 70
|
||||
},
|
||||
{
|
||||
id: "dataflow.widget.pipelines",
|
||||
moduleId: "dataflow",
|
||||
kind: "section",
|
||||
label: "Dataflows widget",
|
||||
label: "i18n:govoplan-dataflow.widget",
|
||||
order: 70
|
||||
}
|
||||
],
|
||||
navItems: [
|
||||
{ to: "/dataflow", label: "Dataflow", iconName: "waypoints", anyOf: readScopes, order: 72 }
|
||||
{
|
||||
to: "/dataflow",
|
||||
label: "i18n:govoplan-dataflow.dataflow",
|
||||
iconName: "waypoints",
|
||||
anyOf: readScopes,
|
||||
order: 72
|
||||
}
|
||||
],
|
||||
routes: [
|
||||
{
|
||||
path: "/dataflow",
|
||||
anyOf: readScopes,
|
||||
order: 72,
|
||||
surfaceId: "dataflow.page",
|
||||
render: ({ settings, auth }) => createElement(DataflowPage, { settings, auth })
|
||||
}
|
||||
],
|
||||
|
||||
@@ -290,6 +290,10 @@
|
||||
background: var(--bg);
|
||||
}
|
||||
|
||||
.dataflow-action-guidance {
|
||||
padding: 0 10px 8px;
|
||||
}
|
||||
|
||||
.dataflow-workspace-toolbar {
|
||||
min-height: 58px;
|
||||
padding: 8px 10px;
|
||||
|
||||
Reference in New Issue
Block a user