@revenexx/studio-integrations 1.1.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +638 -0
- package/README.md +3 -1
- package/dist/module.json +1 -1
- package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +6 -18
- package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +13 -23
- package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +7 -6
- package/dist/runtime/components/Integrations/DeadLettersPanel.vue +15 -4
- package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +4 -0
- package/dist/runtime/components/Integrations/ExpressionInput.vue +45 -19
- package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +4 -0
- package/dist/runtime/components/Integrations/GroupFrameView.vue +5 -4
- package/dist/runtime/components/Integrations/LoadingAnnouncement.d.vue.ts +38 -0
- package/dist/runtime/components/Integrations/LoadingAnnouncement.vue +16 -0
- package/dist/runtime/components/Integrations/LoadingAnnouncement.vue.d.ts +38 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +10 -2
- package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +5 -1
- package/dist/runtime/components/Integrations/NodeConfigField.vue +88 -1
- package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +5 -1
- package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +7 -3
- package/dist/runtime/components/Integrations/NodeInspector.vue +125 -54
- package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +7 -3
- package/dist/runtime/components/Integrations/NodeVersionMoveDialog.d.vue.ts +21 -0
- package/dist/runtime/components/Integrations/NodeVersionMoveDialog.vue +133 -0
- package/dist/runtime/components/Integrations/NodeVersionMoveDialog.vue.d.ts +21 -0
- package/dist/runtime/components/Integrations/RunActionsMenu.vue +2 -1
- package/dist/runtime/components/Integrations/RunDetailPanel.vue +5 -17
- package/dist/runtime/components/Integrations/RunResponseModal.d.vue.ts +30 -8
- package/dist/runtime/components/Integrations/RunResponseModal.vue +92 -24
- package/dist/runtime/components/Integrations/RunResponseModal.vue.d.ts +30 -8
- package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +61 -3
- package/dist/runtime/components/Integrations/RunsTable.vue +129 -18
- package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +61 -3
- package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +10 -1
- package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.d.vue.ts +16 -0
- package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.vue +111 -0
- package/dist/runtime/components/Integrations/StateNamespaceCreateDialog.vue.d.ts +16 -0
- package/dist/runtime/components/Integrations/StickyNoteView.vue +1 -1
- package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +18 -3
- package/dist/runtime/components/Integrations/WorkflowDeleteDialog.d.vue.ts +18 -0
- package/dist/runtime/components/Integrations/WorkflowDeleteDialog.vue +70 -0
- package/dist/runtime/components/Integrations/WorkflowDeleteDialog.vue.d.ts +18 -0
- package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +2 -1
- package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +4 -4
- package/dist/runtime/components/Integrations/WorkflowEditor.vue +78 -30
- package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +17 -6
- package/dist/runtime/components/Integrations/WorkflowNodeView.vue +17 -21
- package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +8 -11
- package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.d.vue.ts +13 -0
- package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.vue +216 -0
- package/dist/runtime/components/Integrations/WorkflowStateNamespacesDialog.vue.d.ts +13 -0
- package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +6 -7
- package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +7 -7
- package/dist/runtime/components/Integrations/WorkflowsTable.vue +10 -48
- package/dist/runtime/components/Integrations/canvasSides.d.ts +48 -0
- package/dist/runtime/components/Integrations/canvasSides.js +22 -0
- package/dist/runtime/composables/useCredentialTypes.js +2 -6
- package/dist/runtime/composables/useIntegrationsAudit.js +2 -2
- package/dist/runtime/composables/useIntegrationsCredentials.js +4 -8
- package/dist/runtime/composables/useIntegrationsDeadLetters.d.ts +4 -0
- package/dist/runtime/composables/useIntegrationsDeadLetters.js +16 -1
- package/dist/runtime/composables/useIntegrationsNodes.js +2 -2
- package/dist/runtime/composables/useIntegrationsRevisions.js +2 -6
- package/dist/runtime/composables/useIntegrationsRuns.d.ts +4 -15
- package/dist/runtime/composables/useIntegrationsRuns.js +49 -34
- package/dist/runtime/composables/useIntegrationsSchedules.js +2 -2
- package/dist/runtime/composables/useIntegrationsSecrets.js +2 -6
- package/dist/runtime/composables/useIntegrationsTemplates.js +7 -5
- package/dist/runtime/composables/useIntegrationsTriggers.js +2 -2
- package/dist/runtime/composables/useIntegrationsWorkflows.js +10 -7
- package/dist/runtime/composables/useNodeConfigResolve.js +2 -2
- package/dist/runtime/composables/useOAuthConnect.d.ts +42 -0
- package/dist/runtime/composables/useOAuthConnect.js +33 -0
- package/dist/runtime/data/expressionEditor.d.ts +17 -5
- package/dist/runtime/data/expressionEditor.js +11 -5
- package/dist/runtime/data/handleId.d.ts +61 -1
- package/dist/runtime/data/handleId.js +8 -1
- package/dist/runtime/data/integrationNodeCatalog.d.ts +25 -0
- package/dist/runtime/data/integrationNodeCatalog.js +8 -0
- package/dist/runtime/data/nodeVersionMove.d.ts +72 -0
- package/dist/runtime/data/nodeVersionMove.js +65 -0
- package/dist/runtime/data/payloadForm.js +3 -2
- package/dist/runtime/i18n/messages/de.json +79 -12
- package/dist/runtime/i18n/messages/en.json +79 -12
- package/dist/runtime/pages/integrations/audit.vue +7 -6
- package/dist/runtime/pages/integrations/credentials.vue +9 -21
- package/dist/runtime/pages/integrations/index.vue +55 -8
- package/dist/runtime/pages/integrations/runs.vue +116 -7
- package/dist/runtime/pages/integrations/secrets.vue +2 -1
- package/dist/runtime/pages/integrations/templates/[slug].vue +2 -1
- package/dist/runtime/pages/integrations/templates/index.vue +18 -15
- package/dist/runtime/pages/integrations/workflows/[id].vue +169 -24
- package/dist/runtime/pages/integrations/workflows/index.vue +23 -4
- package/dist/runtime/types/integrations.d.ts +49 -1
- package/dist/runtime/utils/apiError.d.ts +21 -1
- package/dist/runtime/utils/apiError.js +1 -1
- package/dist/runtime/utils/buildSettle.d.ts +68 -0
- package/dist/runtime/utils/buildSettle.js +29 -0
- package/dist/runtime/utils/clipboard.d.ts +33 -0
- package/dist/runtime/utils/clipboard.js +11 -0
- package/dist/runtime/utils/deepClone.d.ts +41 -0
- package/dist/runtime/utils/deepClone.js +3 -0
- package/dist/runtime/utils/formatDuration.d.ts +44 -0
- package/dist/runtime/utils/formatDuration.js +13 -0
- package/dist/runtime/utils/nodeDisplayName.d.ts +22 -0
- package/dist/runtime/utils/nodeDisplayName.js +6 -0
- package/dist/runtime/utils/notify.d.ts +1 -1
- package/dist/runtime/utils/runEnvelope.d.ts +31 -0
- package/dist/runtime/utils/runEnvelope.js +12 -0
- package/dist/runtime/utils/runFeedQuery.d.ts +135 -0
- package/dist/runtime/utils/runFeedQuery.js +66 -0
- package/dist/runtime/utils/runOutputs.d.ts +33 -0
- package/dist/runtime/utils/runOutputs.js +10 -0
- package/dist/runtime/utils/settingCondition.d.ts +48 -0
- package/dist/runtime/utils/settingCondition.js +84 -0
- package/dist/runtime/utils/stateNamespaceName.d.ts +23 -0
- package/dist/runtime/utils/stateNamespaceName.js +8 -0
- package/dist/runtime/utils/validationFindings.d.ts +26 -3
- package/dist/runtime/utils/validationFindings.js +18 -3
- package/package.json +1 -1
|
@@ -81,6 +81,31 @@ export declare function isVersionExecutable(slug: string, version: string): bool
|
|
|
81
81
|
* only what is wrong.
|
|
82
82
|
*/
|
|
83
83
|
export declare function newestExecutableVersion(slug: string): string | null;
|
|
84
|
+
/**
|
|
85
|
+
* Every version of this node the platform can execute, newest first — the
|
|
86
|
+
* choice offered when a step is moved onto another version (PO-339).
|
|
87
|
+
*
|
|
88
|
+
* Order is the catalogue's own: the registry returns each slug's versions
|
|
89
|
+
* semver-descending, which is the assumption `newestExecutableVersion` above and
|
|
90
|
+
* the palette's own list already rest on. So "newer than the pinned one" is
|
|
91
|
+
* "earlier in this array", and nothing here has to parse a semver.
|
|
92
|
+
*
|
|
93
|
+
* A version whose code was never built is left out, for the reason the palette
|
|
94
|
+
* leaves it out: it is not a choice, it is a dead end with a version number
|
|
95
|
+
* (PO-338). The version a step is pinned to is therefore not guaranteed to be in
|
|
96
|
+
* here — which is exactly the state the move exists to get out of.
|
|
97
|
+
*/
|
|
98
|
+
export declare function executableVersionsOf(slug: string): NodeManifest[];
|
|
99
|
+
/**
|
|
100
|
+
* The versions of this node that are newer than the one pinned, and runnable.
|
|
101
|
+
*
|
|
102
|
+
* Empty when the step is already on the newest — which is the common case, and
|
|
103
|
+
* the reason the inspector can stay silent rather than telling most authors that
|
|
104
|
+
* their node is fine. A pinned version the catalogue does not carry counts as
|
|
105
|
+
* "nothing newer": there is no position to be newer *than*, and inventing one
|
|
106
|
+
* would put an upgrade notice on a node whose real problem is different.
|
|
107
|
+
*/
|
|
108
|
+
export declare function newerExecutableVersions(slug: string, version: string): NodeManifest[];
|
|
84
109
|
export declare function findManifest(slug: string, version?: string): NodeManifest | null;
|
|
85
110
|
export declare const TRIGGER_OUTPUT_PORT = "default";
|
|
86
111
|
export interface TriggerTemplate {
|
|
@@ -34,6 +34,14 @@ export function newestExecutableVersion(slug) {
|
|
|
34
34
|
const hit = INTEGRATION_NODE_CATALOG.find((m) => m.slug === slug && m.__hasBundle !== false);
|
|
35
35
|
return hit?.version ?? null;
|
|
36
36
|
}
|
|
37
|
+
export function executableVersionsOf(slug) {
|
|
38
|
+
return INTEGRATION_NODE_CATALOG.filter((m) => m.slug === slug && m.__hasBundle !== false);
|
|
39
|
+
}
|
|
40
|
+
export function newerExecutableVersions(slug, version) {
|
|
41
|
+
const versions = executableVersionsOf(slug);
|
|
42
|
+
const at = versions.findIndex((m) => m.version === version);
|
|
43
|
+
return at < 0 ? [] : versions.slice(0, at);
|
|
44
|
+
}
|
|
37
45
|
export function findManifest(slug, version) {
|
|
38
46
|
const matches = INTEGRATION_NODE_CATALOG.filter((m) => m.slug === slug);
|
|
39
47
|
if (!matches.length) return null;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ConfigField, NodeManifest } from '../types/integrations.js';
|
|
2
|
+
/**
|
|
3
|
+
* What moving a step onto another version of its node costs (PO-339).
|
|
4
|
+
*
|
|
5
|
+
* A version is chosen when a node is inserted and, until this, never again — so
|
|
6
|
+
* the only route onto another one was to delete the step and build it back,
|
|
7
|
+
* losing its settings, its name, its note and its edges. Moving instead is
|
|
8
|
+
* cheap in the blob (one field changes) and expensive in trust: the two
|
|
9
|
+
* versions may not declare the same settings, and an author who is not told
|
|
10
|
+
* beforehand finds out by a value having quietly gone.
|
|
11
|
+
*
|
|
12
|
+
* This module answers "what would the move cost" and nothing else. It builds no
|
|
13
|
+
* words: labels are localised strings on the manifest, so the caller resolves
|
|
14
|
+
* them and this stays testable without an i18n context.
|
|
15
|
+
*
|
|
16
|
+
* **A value that is not there is not a loss.** Only settings the node actually
|
|
17
|
+
* holds are weighed. A field the author never filled has nothing to carry, drop
|
|
18
|
+
* or check, and listing it would bury the two or three that matter.
|
|
19
|
+
*
|
|
20
|
+
* **The comparison is over the config's own top-level keys**, which is what
|
|
21
|
+
* `nextConfig` can act on: the blob stores settings as one flat object, and
|
|
22
|
+
* removing `attachments` is removing one key from it. A version that changed
|
|
23
|
+
* something *inside* an object or an array element is caught as far as it can
|
|
24
|
+
* be — such a field lands in `review` rather than being silently carried — but
|
|
25
|
+
* the stale value inside it is not pruned. `specs/node-configuration.md`
|
|
26
|
+
* records that limit rather than this pretending to close it.
|
|
27
|
+
*/
|
|
28
|
+
/** A setting the move has something to say about, with the field it was read from. */
|
|
29
|
+
export interface MoveEntry {
|
|
30
|
+
key: string;
|
|
31
|
+
/**
|
|
32
|
+
* The declaration to name it by. For a carried or reviewed setting that is the
|
|
33
|
+
* TARGET's field, because that is what the author will be looking at after the
|
|
34
|
+
* move; for a dropped one it is the SOURCE's, which is the only version that
|
|
35
|
+
* still has a word for it. `null` where neither declares it — a key left behind
|
|
36
|
+
* by an earlier move, which has no label anywhere and shows as its own name.
|
|
37
|
+
*/
|
|
38
|
+
field: ConfigField | null;
|
|
39
|
+
/** Why it needs looking at. Only set on `review`. */
|
|
40
|
+
reason?: 'changed' | 'nowRequired';
|
|
41
|
+
}
|
|
42
|
+
export interface VersionMovePlan {
|
|
43
|
+
/** Settings that travel untouched: the target declares the same key, the same way. */
|
|
44
|
+
carried: MoveEntry[];
|
|
45
|
+
/** Settings the target does not declare. Their values are gone from `nextConfig`. */
|
|
46
|
+
dropped: MoveEntry[];
|
|
47
|
+
/** Settings that arrive but need the author's eye — see `reason`. Values are kept. */
|
|
48
|
+
review: MoveEntry[];
|
|
49
|
+
/** The config to save with the new version: the current one minus what was dropped. */
|
|
50
|
+
nextConfig: Record<string, unknown>;
|
|
51
|
+
/** Nothing is dropped and nothing needs checking — the move is a version change and no more. */
|
|
52
|
+
lossless: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Whether the version being left is still in the catalogue, so the two
|
|
55
|
+
* declarations could actually be held against each other. `false` for a
|
|
56
|
+
* withdrawn version: the move still works and nothing here is wrong, but
|
|
57
|
+
* `carried` then means "kept" rather than "checked and unchanged", and the
|
|
58
|
+
* dialog owes the author that sentence.
|
|
59
|
+
*/
|
|
60
|
+
comparable: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* What it would cost to move a step from `from` to `to`, given the settings it
|
|
64
|
+
* holds today.
|
|
65
|
+
*
|
|
66
|
+
* Either manifest may be `null` — a version the catalogue does not carry, which
|
|
67
|
+
* happens to a workflow pinned to something later withdrawn. A missing SOURCE
|
|
68
|
+
* only costs labels; a missing TARGET would drop every setting, so the caller
|
|
69
|
+
* must not offer a move onto a version it cannot find, and `planVersionMove`
|
|
70
|
+
* does not defend against being asked anyway.
|
|
71
|
+
*/
|
|
72
|
+
export declare function planVersionMove(from: NodeManifest | null, to: NodeManifest | null, config: Record<string, unknown> | null | undefined): VersionMovePlan;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
function hasValue(config, key) {
|
|
2
|
+
if (!(key in config)) return false;
|
|
3
|
+
const v = config[key];
|
|
4
|
+
return v !== void 0 && v !== null && v !== "";
|
|
5
|
+
}
|
|
6
|
+
function byKey(manifest) {
|
|
7
|
+
const map = /* @__PURE__ */ new Map();
|
|
8
|
+
for (const f of manifest?.config ?? []) {
|
|
9
|
+
if (f && typeof f.key === "string" && f.key) map.set(f.key, f);
|
|
10
|
+
}
|
|
11
|
+
return map;
|
|
12
|
+
}
|
|
13
|
+
function shapeOf(field) {
|
|
14
|
+
if (!field) return "";
|
|
15
|
+
return JSON.stringify([
|
|
16
|
+
field.type,
|
|
17
|
+
(field.options ?? []).map((o) => o.value),
|
|
18
|
+
(field.properties ?? []).map((p) => [p.key, p.type]),
|
|
19
|
+
field.items ? [field.items.key, field.items.type, (field.items.properties ?? []).map((p) => [p.key, p.type])] : null
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
export function planVersionMove(from, to, config) {
|
|
23
|
+
const current = config ?? {};
|
|
24
|
+
const sourceFields = byKey(from);
|
|
25
|
+
const targetFields = byKey(to);
|
|
26
|
+
const targetHasDynamicSchema = (to?.config ?? []).some((f) => f?.type === "dynamic-schema");
|
|
27
|
+
const carried = [];
|
|
28
|
+
const dropped = [];
|
|
29
|
+
const review = [];
|
|
30
|
+
const nextConfig = {};
|
|
31
|
+
for (const key of Object.keys(current)) {
|
|
32
|
+
if (!hasValue(current, key)) {
|
|
33
|
+
nextConfig[key] = current[key];
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const target = targetFields.get(key);
|
|
37
|
+
if (!target) {
|
|
38
|
+
if (targetHasDynamicSchema) {
|
|
39
|
+
nextConfig[key] = current[key];
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
dropped.push({ key, field: sourceFields.get(key) ?? null });
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
nextConfig[key] = current[key];
|
|
46
|
+
const source = sourceFields.get(key);
|
|
47
|
+
if (!source || shapeOf(source) === shapeOf(target)) carried.push({ key, field: target });
|
|
48
|
+
else review.push({ key, field: target, reason: "changed" });
|
|
49
|
+
}
|
|
50
|
+
for (const [key, field] of targetFields) {
|
|
51
|
+
if (field.default !== void 0 && !(key in current)) nextConfig[key] = field.default;
|
|
52
|
+
if (field.required !== true) continue;
|
|
53
|
+
if (field.default !== void 0) continue;
|
|
54
|
+
if (hasValue(current, key)) continue;
|
|
55
|
+
review.push({ key, field, reason: "nowRequired" });
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
carried,
|
|
59
|
+
dropped,
|
|
60
|
+
review,
|
|
61
|
+
nextConfig,
|
|
62
|
+
lossless: dropped.length === 0 && review.length === 0,
|
|
63
|
+
comparable: from !== null && from !== void 0
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useIntegrationsT } from "../composables/useIntegrationsT.js";
|
|
2
|
+
import { deepClone } from "../utils/deepClone.js";
|
|
2
3
|
const PAYLOAD_REF_RE = /\$\{\{\s*trigger\.payload\.([a-zA-Z0-9_.-]+)/g;
|
|
3
4
|
const FILE_KEYS = /* @__PURE__ */ new Set(["data", "filename", "contentType", "size"]);
|
|
4
5
|
function collectRefs(value, out) {
|
|
@@ -91,7 +92,7 @@ export function getPath(source, path) {
|
|
|
91
92
|
return cursor;
|
|
92
93
|
}
|
|
93
94
|
export function buildPayload(fields, textValues, files, extras) {
|
|
94
|
-
const payload =
|
|
95
|
+
const payload = deepClone(extras ?? {});
|
|
95
96
|
for (const field of fields) {
|
|
96
97
|
if (field.kind === "file") {
|
|
97
98
|
const file = files[field.path];
|
|
@@ -111,7 +112,7 @@ export function buildPayload(fields, textValues, files, extras) {
|
|
|
111
112
|
return payload;
|
|
112
113
|
}
|
|
113
114
|
export function splitPayload(fields, payload) {
|
|
114
|
-
const extras =
|
|
115
|
+
const extras = deepClone(payload ?? {});
|
|
115
116
|
const textValues = {};
|
|
116
117
|
const files = {};
|
|
117
118
|
const deleteAt = (path) => {
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"integration.audit.table.column.actor": "Akteur",
|
|
29
29
|
"integration.audit.table.column.resource": "Ressource",
|
|
30
30
|
"integration.audit.table.column.when": "Wann",
|
|
31
|
+
"integration.audit.toast.copyFailed": "Kopieren fehlgeschlagen",
|
|
31
32
|
"integration.audit.toast.copied": "Kopiert",
|
|
32
33
|
"integration.canvas.badge.trigger": "Trigger",
|
|
33
34
|
"integration.canvas.color.amber": "Bernstein",
|
|
@@ -70,9 +71,9 @@
|
|
|
70
71
|
"integration.canvas.node.action.duplicate": "Duplizieren",
|
|
71
72
|
"integration.canvas.node.action.duplicateAria": "Node duplizieren",
|
|
72
73
|
"integration.canvas.node.badge.invalidConfig": "Konfiguration unvollständig — {n} Einstellung muss noch behoben werden: {fields} | Konfiguration unvollständig — {n} Einstellungen müssen noch behoben werden: {fields}",
|
|
74
|
+
"integration.canvas.node.badge.loopBody": "Schleife — am Ausgang „Element“ hängt noch nichts, es wiederholt sich also nichts | Schleife — wiederholt den einen Schritt am Ausgang „Element“, einmal pro Element | Schleife — wiederholt die {n} Schritte am Ausgang „Element“, einmal pro Element",
|
|
73
75
|
"integration.canvas.node.badge.noBuiltCode": "Version {version} ist nicht einsatzbereit — dieser Schritt lässt sich nicht testen",
|
|
74
76
|
"integration.canvas.node.badge.repeats": "Wiederholt sich — läuft einmal pro Element von {iterators} | Wiederholt sich — läuft einmal pro Element jeder der {n} Schleifen, in denen er liegt: {iterators}",
|
|
75
|
-
"integration.canvas.node.badge.loopBody": "Schleife — am Ausgang „Element“ hängt noch nichts, es wiederholt sich also nichts | Schleife — wiederholt den einen Schritt am Ausgang „Element“, einmal pro Element | Schleife — wiederholt die {n} Schritte am Ausgang „Element“, einmal pro Element",
|
|
76
77
|
"integration.canvas.node.handle.input": "Eingang",
|
|
77
78
|
"integration.canvas.node.meta.versionTitle": "Version {version}",
|
|
78
79
|
"integration.canvas.node.note.heading": "Notiz",
|
|
@@ -229,6 +230,7 @@
|
|
|
229
230
|
"integration.credentials.sftpImport.empty": "Keine aktiven Plattform-SFTP-Konten. Zuerst eines unter Integration Studio → SFTP anlegen.",
|
|
230
231
|
"integration.credentials.sftpImport.error.importFailed": "Import fehlgeschlagen.",
|
|
231
232
|
"integration.credentials.sftpImport.error.readPassword": "Das Kontopasswort konnte nicht gelesen werden.",
|
|
233
|
+
"integration.credentials.sftpImport.state.loading": "SFTP-Konten werden geladen…",
|
|
232
234
|
"integration.credentials.sftpImport.title": "Plattform-SFTP-Konto importieren",
|
|
233
235
|
"integration.credentials.shared.action.testConnection": "Verbindung testen",
|
|
234
236
|
"integration.credentials.shared.authKind.apiKey": "API-Key",
|
|
@@ -263,6 +265,7 @@
|
|
|
263
265
|
"integration.dashboard.attention.healthy": "Alle Workflows in Ordnung.",
|
|
264
266
|
"integration.dashboard.attention.missedRuns": "{n} verpasster Run | {n} verpasste Runs",
|
|
265
267
|
"integration.dashboard.attention.missedRuns.hint": "Trigger haben ausgelöst, während ihr Workflow nicht laufen konnte — prüfen und erneut ausführen.",
|
|
268
|
+
"integration.dashboard.attention.state.loading": "Es wird geprüft, was Aufmerksamkeit erfordert…",
|
|
266
269
|
"integration.dashboard.attention.title": "Erfordert Aufmerksamkeit",
|
|
267
270
|
"integration.dashboard.head.title": "Dashboard · Integration Studio",
|
|
268
271
|
"integration.dashboard.header.description": "Alles, was die Revenue Cloud mit der Außenwelt verbindet.",
|
|
@@ -276,7 +279,9 @@
|
|
|
276
279
|
"integration.dashboard.kpi.runningNow.sub": "laufende Runs",
|
|
277
280
|
"integration.dashboard.kpi.scheduled.label": "Geplant",
|
|
278
281
|
"integration.dashboard.kpi.scheduled.sub": "aktive Zeitplan-Trigger",
|
|
282
|
+
"integration.dashboard.kpi.state.loading": "Kennzahlen werden geladen…",
|
|
279
283
|
"integration.dashboard.runs.empty": "Noch keine Runs.",
|
|
284
|
+
"integration.dashboard.runs.state.loading": "Letzte Runs werden geladen…",
|
|
280
285
|
"integration.dashboard.runs.title": "Letzte Runs",
|
|
281
286
|
"integration.dashboard.surface.events.hint": "Live-Events der Plattform, die Workflows abonnieren.",
|
|
282
287
|
"integration.dashboard.surface.events.label": "Event-Stream",
|
|
@@ -288,6 +293,7 @@
|
|
|
288
293
|
"integration.dashboard.surface.webhooks.hint": "Eingehende HTTP-Endpoints, die Workflows auslösen.",
|
|
289
294
|
"integration.dashboard.surface.webhooks.label": "Webhooks",
|
|
290
295
|
"integration.dashboard.templates.empty": "Noch keine Vorlagen registriert.",
|
|
296
|
+
"integration.dashboard.templates.state.loading": "Vorlagen werden geladen…",
|
|
291
297
|
"integration.dashboard.templates.title": "Mit einer Vorlage starten",
|
|
292
298
|
"integration.deadLetters.action.discard": "Verwerfen",
|
|
293
299
|
"integration.deadLetters.action.replay": "Wiederholen",
|
|
@@ -300,6 +306,7 @@
|
|
|
300
306
|
"integration.deadLetters.panel.title": "Verpasste Runs",
|
|
301
307
|
"integration.deadLetters.reason.fallback": "Kein Grund erfasst.",
|
|
302
308
|
"integration.deadLetters.state.empty": "Keine verpassten Runs. Jeder Trigger hat einen Run ausgelöst.",
|
|
309
|
+
"integration.deadLetters.state.loading": "Verpasste Runs werden geladen…",
|
|
303
310
|
"integration.deadLetters.status.discarded": "verworfen",
|
|
304
311
|
"integration.deadLetters.status.pending": "wartet",
|
|
305
312
|
"integration.deadLetters.status.replayed": "wiederholt",
|
|
@@ -317,7 +324,8 @@
|
|
|
317
324
|
"integration.editor.action.discard.label": "Verwerfen",
|
|
318
325
|
"integration.editor.action.discard.title": "Nicht gespeicherte Änderungen verwerfen",
|
|
319
326
|
"integration.editor.action.duplicate.label": "Duplizieren",
|
|
320
|
-
"integration.editor.action.
|
|
327
|
+
"integration.editor.action.more.aria": "Weitere Aktionen für diesen Workflow",
|
|
328
|
+
"integration.editor.action.more.label": "Aktionen",
|
|
321
329
|
"integration.editor.action.pause.title": "Workflow pausieren",
|
|
322
330
|
"integration.editor.action.retry": "Erneut versuchen",
|
|
323
331
|
"integration.editor.action.save.label": "Speichern",
|
|
@@ -433,6 +441,7 @@
|
|
|
433
441
|
"integration.editor.tab.editor": "Editor",
|
|
434
442
|
"integration.editor.tab.history": "Verlauf",
|
|
435
443
|
"integration.editor.tab.runs": "Runs",
|
|
444
|
+
"integration.editor.toast.deleted": "„{name}“ gelöscht",
|
|
436
445
|
"integration.editor.toast.duplicated": "Dupliziert als „{name}“",
|
|
437
446
|
"integration.editor.tool.addGroup.label": "Gruppe",
|
|
438
447
|
"integration.editor.tool.addGroup.tooltip": "Gruppenrahmen hinzufügen — hineingezogene Nodes treten ihr bei",
|
|
@@ -446,6 +455,8 @@
|
|
|
446
455
|
"integration.editor.tool.select": "Auswählen",
|
|
447
456
|
"integration.editor.tool.settings.label": "Einstellungen",
|
|
448
457
|
"integration.editor.tool.settings.tooltip": "Workflow-Einstellungen",
|
|
458
|
+
"integration.editor.tool.state.label": "Zustand",
|
|
459
|
+
"integration.editor.tool.state.tooltip": "Was sich dieser Workflow zwischen Läufen merkt",
|
|
449
460
|
"integration.editor.tool.tidyUp": "Aufräumen",
|
|
450
461
|
"integration.editor.tool.variables.label": "Variablen",
|
|
451
462
|
"integration.editor.tool.variables.tooltip": "Workflow-Variablen",
|
|
@@ -472,6 +483,7 @@
|
|
|
472
483
|
"integration.history.preview.title.current": "Aktuelle Version · Revision {revision}",
|
|
473
484
|
"integration.history.preview.title.revision": "Revision {revision} (schreibgeschützt)",
|
|
474
485
|
"integration.history.state.empty": "Noch keine archivierten Revisionen — speichern Sie eine Änderung, um die erste Momentaufnahme zu erstellen.",
|
|
486
|
+
"integration.history.state.loading": "Versionsverlauf wird geladen…",
|
|
475
487
|
"integration.history.toast.loadRevisionFailed": "Die Revision konnte nicht geladen werden.",
|
|
476
488
|
"integration.history.toast.restoreFailed": "Die Revision konnte nicht wiederhergestellt werden.",
|
|
477
489
|
"integration.history.toast.restored": "Revision {revision} wiederhergestellt",
|
|
@@ -519,8 +531,8 @@
|
|
|
519
531
|
"integration.nodeConfig.dynamicSchema.reloading": "Felder werden neu geladen…",
|
|
520
532
|
"integration.nodeConfig.dynamicSchema.resolving": "Felder werden geladen…",
|
|
521
533
|
"integration.nodeConfig.expression.badge.title": "Akzeptiert ${{ … }}-Ausdrücke",
|
|
522
|
-
"integration.nodeConfig.expression.insertTitle": "Ausdruck einfügen",
|
|
523
534
|
"integration.nodeConfig.expression.insertAria": "Ausdruck einfügen — verfügbare Daten für diese Einstellung",
|
|
535
|
+
"integration.nodeConfig.expression.insertTitle": "Ausdruck einfügen",
|
|
524
536
|
"integration.nodeConfig.expression.picker.aria": "Verfügbare Daten für diese Einstellung",
|
|
525
537
|
"integration.nodeConfig.expression.picker.empty": "Nichts entspricht „{query}“.",
|
|
526
538
|
"integration.nodeConfig.expression.picker.filterAria": "Verfügbare Daten filtern",
|
|
@@ -586,6 +598,11 @@
|
|
|
586
598
|
"integration.nodeConfig.resolve.error.generic": "Auflösung fehlgeschlagen",
|
|
587
599
|
"integration.nodeConfig.secretRef.placeholder": "Secret auswählen",
|
|
588
600
|
"integration.nodeConfig.select.placeholder": "Auswählen",
|
|
601
|
+
"integration.nodeConfig.state.action.new": "Neuen Namespace deklarieren…",
|
|
602
|
+
"integration.nodeConfig.state.create.description": "Er wird den Deklarationen dieses Workflows als {role}-Namespace hinzugefügt und hier ausgewählt.",
|
|
603
|
+
"integration.nodeConfig.state.create.title": "Zustands-Namespace deklarieren",
|
|
604
|
+
"integration.nodeConfig.state.empty": "Dieser Workflow deklariert davon noch keinen.",
|
|
605
|
+
"integration.nodeConfig.state.placeholder": "Namespace wählen…",
|
|
589
606
|
"integration.nodeConfig.validation.max": "Muss ≤ {max} sein",
|
|
590
607
|
"integration.nodeConfig.validation.maxLength": "Darf höchstens {max} Zeichen lang sein",
|
|
591
608
|
"integration.nodeConfig.validation.min": "Muss ≥ {min} sein",
|
|
@@ -631,9 +648,9 @@
|
|
|
631
648
|
"integration.nodeInspector.notice.versionNotReady.upgrade": "Version {version} dieses Nodes ist nicht mehr einsatzbereit. Um den Node weiter zu verwenden, ist ein Upgrade auf Version {ready} notwendig.",
|
|
632
649
|
"integration.nodeInspector.output.description": "Was nachgelagerte Nodes von diesem erhalten. Deklariert vom Node-Typ; wird mit echten Werten gefüllt, sobald der Schritt gelaufen ist.",
|
|
633
650
|
"integration.nodeInspector.output.loopBody.heading": "Der Schleifenkörper",
|
|
634
|
-
"integration.nodeInspector.output.loopBody.size": "Am Ausgang „Element“ hängt noch nichts, diese Schleife wiederholt also nichts. | Ein Schritt hängt am Ausgang „Element“ und läuft einmal pro Element. | {n} Schritte hängen am Ausgang „Element“ und laufen jeder einmal pro Element.",
|
|
635
|
-
"integration.nodeInspector.output.loopBody.names": "Diese wiederholen sich: {names}",
|
|
636
651
|
"integration.nodeInspector.output.loopBody.joined": "Einer davon hängt zugleich hinter der Schleife, am Ausgang „Fertig“ — er wiederholt sich also mit dem Schleifenkörper, statt einmal zu laufen: {names} | {n} davon hängen zugleich hinter der Schleife, am Ausgang „Fertig“ — sie wiederholen sich also mit dem Schleifenkörper, statt einmal zu laufen: {names}",
|
|
652
|
+
"integration.nodeInspector.output.loopBody.names": "Diese wiederholen sich: {names}",
|
|
653
|
+
"integration.nodeInspector.output.loopBody.size": "Am Ausgang „Element“ hängt noch nichts, diese Schleife wiederholt also nichts. | Ein Schritt hängt am Ausgang „Element“ und läuft einmal pro Element. | {n} Schritte hängen am Ausgang „Element“ und laufen jeder einmal pro Element.",
|
|
637
654
|
"integration.nodeInspector.output.pin.editAction": "Angeheftetes Beispiel bearbeiten",
|
|
638
655
|
"integration.nodeInspector.output.pin.editorAria": "Angeheftete Beispielausgabe",
|
|
639
656
|
"integration.nodeInspector.output.pin.hint": "Ein angeheftetes Beispiel steht anstelle von Run-Daten, während Sie nachgelagerte Felder zuordnen.",
|
|
@@ -728,6 +745,7 @@
|
|
|
728
745
|
"integration.nodeInspector.toast.configCopyFailed": "Konfiguration konnte nicht kopiert werden",
|
|
729
746
|
"integration.nodeInspector.toast.configPasted": "Konfiguration eingefügt",
|
|
730
747
|
"integration.nodeInspector.toast.expressionCopied": "Ausdruck kopiert. Klicken Sie zuerst in ein Feld, um ihn direkt einzufügen.",
|
|
748
|
+
"integration.nodeInspector.toast.expressionCopyFailed": "Ausdruck konnte nicht kopiert werden. Klicken Sie in ein Feld, um ihn direkt einzufügen.",
|
|
731
749
|
"integration.nodeInspector.toast.rotateFailed": "Secret konnte nicht neu erzeugt werden.",
|
|
732
750
|
"integration.nodeInspector.toast.rotateNoSecret": "Der Endpoint hat kein Secret zurückgegeben.",
|
|
733
751
|
"integration.nodeInspector.toast.samplePinned": "Beispielausgabe angeheftet",
|
|
@@ -789,6 +807,20 @@
|
|
|
789
807
|
"integration.nodeInspector.trigger.webhook.username.hint": "Optional — legt den Basic-Auth-Benutzernamen fest. Das Passwort ist das Endpoint-Secret.",
|
|
790
808
|
"integration.nodeInspector.trigger.webhook.username.label": "Benutzername",
|
|
791
809
|
"integration.nodeInspector.trigger.webhook.username.placeholder": "Beliebiger Benutzername",
|
|
810
|
+
"integration.nodeInspector.version.available": "Version {version} ist verfügbar.",
|
|
811
|
+
"integration.nodeInspector.version.change": "Version wechseln",
|
|
812
|
+
"integration.nodeInspector.version.move.confirm": "Version wechseln",
|
|
813
|
+
"integration.nodeInspector.version.move.description": "Der Schritt behält seine Verbindungen, seinen Namen und seine Notiz. Es ändert sich die Version — und jede Einstellung, die es in der gewählten Version nicht gibt.",
|
|
814
|
+
"integration.nodeInspector.version.move.dropped": "Wird entfernt",
|
|
815
|
+
"integration.nodeInspector.version.move.lossless": "Alle Einstellungen kommen unverändert mit.",
|
|
816
|
+
"integration.nodeInspector.version.move.notComparable": "Version {version} liegt nicht mehr im Katalog, deshalb lässt sich nicht vergleichen, was sich zwischen beiden unterscheidet. Unten steht, was ankommt — nicht, was geprüft wurde.",
|
|
817
|
+
"integration.nodeInspector.version.move.reason.changed": "hat sich zwischen den Versionen geändert",
|
|
818
|
+
"integration.nodeInspector.version.move.reason.nowRequired": "erforderlich und noch nicht ausgefüllt",
|
|
819
|
+
"integration.nodeInspector.version.move.review": "Danach prüfen",
|
|
820
|
+
"integration.nodeInspector.version.move.same": "Auf dieser Version steht der Schritt bereits.",
|
|
821
|
+
"integration.nodeInspector.version.move.targetAria": "Version, auf die dieser Schritt wechselt",
|
|
822
|
+
"integration.nodeInspector.version.move.title": "Version dieses Schritts wechseln",
|
|
823
|
+
"integration.nodeInspector.version.moveTo": "Auf Version {version} wechseln",
|
|
792
824
|
"integration.nodes.category.action": "Aktionen",
|
|
793
825
|
"integration.nodes.category.control": "Ablaufsteuerung",
|
|
794
826
|
"integration.nodes.category.io": "I/O",
|
|
@@ -908,13 +940,15 @@
|
|
|
908
940
|
"integration.runs.payload.parseError": "Das JSON lässt sich nicht parsen — beheben Sie den Fehler, bevor Sie zur Formularansicht zurückwechseln.",
|
|
909
941
|
"integration.runs.response.action.viewRun": "Run ansehen",
|
|
910
942
|
"integration.runs.response.action.viewRunWithId": "Run #{id} ansehen",
|
|
911
|
-
"integration.runs.response.async.started": "Run wurde gestartet
|
|
912
|
-
"integration.runs.response.async.startedWithId": "Run #{id} wurde gestartet
|
|
913
|
-
"integration.runs.response.description.async": "
|
|
943
|
+
"integration.runs.response.async.started": "Run wurde gestartet.",
|
|
944
|
+
"integration.runs.response.async.startedWithId": "Run #{id} wurde gestartet.",
|
|
945
|
+
"integration.runs.response.description.async": "Im Hintergrund gestartet",
|
|
914
946
|
"integration.runs.response.description.sync": "Synchrones Run-Ergebnis",
|
|
915
|
-
"integration.runs.response.
|
|
947
|
+
"integration.runs.response.following": "Warten, bis der Run fertig ist…",
|
|
916
948
|
"integration.runs.response.loading.async": "Wird gestartet…",
|
|
917
949
|
"integration.runs.response.loading.sync": "Wird ausgeführt…",
|
|
950
|
+
"integration.runs.response.nothingReturned": "Der Run hat nichts zurückgegeben.",
|
|
951
|
+
"integration.runs.response.runNumber": "Run #{id}",
|
|
918
952
|
"integration.runs.response.title.async": "Run gestartet",
|
|
919
953
|
"integration.runs.response.title.sync": "Run-Antwort",
|
|
920
954
|
"integration.runs.status.cancelled": "abgebrochen",
|
|
@@ -929,6 +963,8 @@
|
|
|
929
963
|
"integration.runs.table.column.trigger": "Trigger",
|
|
930
964
|
"integration.runs.table.column.workflow": "Workflow",
|
|
931
965
|
"integration.runs.table.empty": "Noch keine Runs — starten Sie einen Workflow, um diese Ansicht zu füllen.",
|
|
966
|
+
"integration.runs.table.empty.narrowed": "Keine Runs passen zu dieser Einschränkung.",
|
|
967
|
+
"integration.runs.table.filter.all": "Alle",
|
|
932
968
|
"integration.runs.table.search.placeholder": "Runs durchsuchen…",
|
|
933
969
|
"integration.runs.tabs.runs.label": "Runs",
|
|
934
970
|
"integration.runs.toast.action.requested": "{action} angefordert",
|
|
@@ -991,6 +1027,7 @@
|
|
|
991
1027
|
"integration.secrets.error.loadFailed": "Secrets konnten nicht geladen werden.",
|
|
992
1028
|
"integration.secrets.error.valueRequired": "Der Wert ist erforderlich.",
|
|
993
1029
|
"integration.secrets.form.error.invalidKey": "Der Schlüssel muss ^[A-Z0-9_]+$ entsprechen (Großbuchstaben, Ziffern, Unterstriche).",
|
|
1030
|
+
"integration.secrets.form.error.saveFailed": "Das Secret konnte nicht gespeichert werden.",
|
|
994
1031
|
"integration.secrets.form.key.label": "Schlüssel",
|
|
995
1032
|
"integration.secrets.form.key.patternLabel": "Muster:",
|
|
996
1033
|
"integration.secrets.form.value.hide": "Wert ausblenden",
|
|
@@ -1129,7 +1166,12 @@
|
|
|
1129
1166
|
"integration.workflows.create.template.noMatch": "Keine Treffer für „{query}“.",
|
|
1130
1167
|
"integration.workflows.create.template.search.aria": "Vorlagen durchsuchen",
|
|
1131
1168
|
"integration.workflows.create.template.search.placeholder": "Vorlagen durchsuchen…",
|
|
1169
|
+
"integration.workflows.create.template.state.loading": "Vorlagen werden geladen…",
|
|
1132
1170
|
"integration.workflows.create.toast.templateError": "Der Workflow konnte nicht aus dieser Vorlage erstellt werden.",
|
|
1171
|
+
"integration.workflows.delete.action.deleting": "Wird gelöscht…",
|
|
1172
|
+
"integration.workflows.delete.dialog.description": "und der gesamte Revisionsverlauf werden endgültig gelöscht.",
|
|
1173
|
+
"integration.workflows.delete.dialog.title": "Workflow löschen?",
|
|
1174
|
+
"integration.workflows.delete.error.generic": "Der Workflow konnte nicht gelöscht werden.",
|
|
1133
1175
|
"integration.workflows.duplicate.dialog.description": "Erstellt eine pausierte Kopie von „{name}“ mit allen Triggern aus.",
|
|
1134
1176
|
"integration.workflows.duplicate.dialog.title": "Workflow duplizieren",
|
|
1135
1177
|
"integration.workflows.duplicate.error.generic": "Der Workflow konnte nicht dupliziert werden.",
|
|
@@ -1167,6 +1209,34 @@
|
|
|
1167
1209
|
"integration.workflows.settings.section.appearance": "Aussehen",
|
|
1168
1210
|
"integration.workflows.settings.section.execution": "Ausführung",
|
|
1169
1211
|
"integration.workflows.settings.section.metadata": "Metadaten",
|
|
1212
|
+
"integration.workflows.state.action.add": "Deklarieren",
|
|
1213
|
+
"integration.workflows.state.action.done": "Fertig",
|
|
1214
|
+
"integration.workflows.state.action.remove": "Deklaration entfernen",
|
|
1215
|
+
"integration.workflows.state.action.remove.hint": "Das Entfernen nimmt diesem Workflow den Zugriff. Die gespeicherten Einträge bleiben bestehen.",
|
|
1216
|
+
"integration.workflows.state.dialog.description": "Was sich dieser Workflow zwischen Läufen merken darf. Er erreicht ausschließlich die hier deklarierten Namespaces — alles andere wird beim Lauf abgewiesen.",
|
|
1217
|
+
"integration.workflows.state.dialog.title": "Zustands-Namespaces",
|
|
1218
|
+
"integration.workflows.state.error.invalidName": "Kleinbuchstaben, Ziffern und . - _, beginnend mit einem Buchstaben — zum Beispiel article oder crm.customers.",
|
|
1219
|
+
"integration.workflows.state.error.nameExists": "Dieser Workflow deklariert diesen Namespace bereits.",
|
|
1220
|
+
"integration.workflows.state.field.newName.label": "Namespace deklarieren",
|
|
1221
|
+
"integration.workflows.state.field.newName.placeholder": "article",
|
|
1222
|
+
"integration.workflows.state.field.newRole.label": "Rolle",
|
|
1223
|
+
"integration.workflows.state.field.newVisibility.label": "Sichtbar für",
|
|
1224
|
+
"integration.workflows.state.field.visibility.label": "Sichtbar für",
|
|
1225
|
+
"integration.workflows.state.role.cursor.hint": "Merkt sich, wie weit ein inkrementeller Import gelesen hat. Es rückt nur vor, wenn der Lauf sauber endet.",
|
|
1226
|
+
"integration.workflows.state.role.cursor.label": "Lesezeichen",
|
|
1227
|
+
"integration.workflows.state.role.dedupe.hint": "Markiert Verarbeitetes, damit eine wiederholte Zustellung nicht doppelt gebucht wird.",
|
|
1228
|
+
"integration.workflows.state.role.dedupe.label": "Dublettenschutz",
|
|
1229
|
+
"integration.workflows.state.role.digest.hint": "Merkt sich den zuletzt geschriebenen Stand, damit unveränderte Datensätze übersprungen werden.",
|
|
1230
|
+
"integration.workflows.state.role.digest.label": "Prüfsumme",
|
|
1231
|
+
"integration.workflows.state.role.fixed": "Die Rolle steht mit der Deklaration fest: Einträge, die mit einer Bedeutung geschrieben wurden, lassen sich nicht mit einer anderen lesen.",
|
|
1232
|
+
"integration.workflows.state.role.mapping.hint": "Verknüpft je eine ID auf beiden Seiten, damit ein späterer Lauf weiß, ob er anlegen oder aktualisieren muss.",
|
|
1233
|
+
"integration.workflows.state.role.mapping.label": "Zuordnung",
|
|
1234
|
+
"integration.workflows.state.row.aria": "Zustands-Namespace {namespace}",
|
|
1235
|
+
"integration.workflows.state.empty": "Dieser Workflow merkt sich noch nichts zwischen Läufen.",
|
|
1236
|
+
"integration.workflows.state.visibility.private.hint": "Nur dieser Workflow liest und schreibt ihn, und er wird mit dem Workflow gelöscht.",
|
|
1237
|
+
"integration.workflows.state.visibility.private.label": "Diesen Workflow",
|
|
1238
|
+
"integration.workflows.state.visibility.shared.hint": "Jeder Workflow dieses Mandanten liest und schreibt diese Einträge, und der Namespace bleibt bestehen, wenn dieser Workflow gelöscht wird.",
|
|
1239
|
+
"integration.workflows.state.visibility.shared.label": "Alle Workflows",
|
|
1170
1240
|
"integration.workflows.table.action.groupByTags": "Nach Tags gruppieren",
|
|
1171
1241
|
"integration.workflows.table.column.build": "Build",
|
|
1172
1242
|
"integration.workflows.table.column.lastRun": "Letzter Run",
|
|
@@ -1175,9 +1245,6 @@
|
|
|
1175
1245
|
"integration.workflows.table.column.status": "Status",
|
|
1176
1246
|
"integration.workflows.table.column.triggers": "Trigger",
|
|
1177
1247
|
"integration.workflows.table.column.updated": "Aktualisiert",
|
|
1178
|
-
"integration.workflows.table.deleteDialog.action.deleting": "Wird gelöscht…",
|
|
1179
|
-
"integration.workflows.table.deleteDialog.description": "und der gesamte Revisionsverlauf werden endgültig gelöscht.",
|
|
1180
|
-
"integration.workflows.table.deleteDialog.title": "Workflow löschen?",
|
|
1181
1248
|
"integration.workflows.table.group.noTags": "Keine Tags",
|
|
1182
1249
|
"integration.workflows.table.lastRun.aria.never": "{name}, letzter Run: Nie ausgeführt",
|
|
1183
1250
|
"integration.workflows.table.menu.action.activate": "Aktivieren",
|