@revenexx/studio-integrations 0.1.4 → 0.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/README.md +31 -0
- package/dist/module.d.mts +2 -2
- package/dist/module.json +1 -1
- package/dist/runtime/components/Integrations/CredentialCreateDialog.d.vue.ts +13 -0
- package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +279 -0
- package/dist/runtime/components/Integrations/CredentialCreateDialog.vue.d.ts +13 -0
- package/dist/runtime/components/Integrations/CredentialDetailDialog.d.vue.ts +20 -0
- package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +342 -0
- package/dist/runtime/components/Integrations/CredentialDetailDialog.vue.d.ts +20 -0
- package/dist/runtime/components/Integrations/CredentialLogo.d.vue.ts +14 -0
- package/dist/runtime/components/Integrations/CredentialLogo.vue +37 -0
- package/dist/runtime/components/Integrations/CredentialLogo.vue.d.ts +14 -0
- package/dist/runtime/components/Integrations/CredentialRevenexxSource.d.vue.ts +12 -0
- package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +364 -0
- package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue.d.ts +12 -0
- package/dist/runtime/components/Integrations/CredentialTypePicker.d.vue.ts +15 -0
- package/dist/runtime/components/Integrations/CredentialTypePicker.vue +71 -0
- package/dist/runtime/components/Integrations/CredentialTypePicker.vue.d.ts +15 -0
- package/dist/runtime/components/Integrations/DeadLettersPanel.d.vue.ts +5 -0
- package/dist/runtime/components/Integrations/DeadLettersPanel.vue +151 -0
- package/dist/runtime/components/Integrations/DeadLettersPanel.vue.d.ts +5 -0
- package/dist/runtime/components/Integrations/EditorTip.d.vue.ts +17 -0
- package/dist/runtime/components/Integrations/EditorTip.vue +46 -0
- package/dist/runtime/components/Integrations/EditorTip.vue.d.ts +17 -0
- package/dist/runtime/components/Integrations/EventTypeCombobox.d.vue.ts +9 -0
- package/dist/runtime/components/Integrations/EventTypeCombobox.vue +64 -0
- package/dist/runtime/components/Integrations/EventTypeCombobox.vue.d.ts +9 -0
- package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +19 -0
- package/dist/runtime/components/Integrations/ExpressionInput.vue +236 -0
- package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +19 -0
- package/dist/runtime/components/Integrations/GroupFrameView.d.vue.ts +28 -0
- package/dist/runtime/components/Integrations/GroupFrameView.vue +222 -0
- package/dist/runtime/components/Integrations/GroupFrameView.vue.d.ts +28 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicField.d.vue.ts +14 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue +184 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue.d.ts +14 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.d.vue.ts +16 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +102 -0
- package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue.d.ts +16 -0
- package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +23 -0
- package/dist/runtime/components/Integrations/NodeConfigField.vue +587 -0
- package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +23 -0
- package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.d.vue.ts +14 -0
- package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.vue +80 -0
- package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.vue.d.ts +14 -0
- package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +22 -3
- package/dist/runtime/components/Integrations/NodeInspector.vue +1074 -294
- package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +22 -3
- package/dist/runtime/components/Integrations/NodeLogo.d.vue.ts +9 -0
- package/dist/runtime/components/Integrations/NodeLogo.vue +38 -0
- package/dist/runtime/components/Integrations/NodeLogo.vue.d.ts +9 -0
- package/dist/runtime/components/Integrations/NodePalette.d.vue.ts +22 -1
- package/dist/runtime/components/Integrations/NodePalette.vue +411 -90
- package/dist/runtime/components/Integrations/NodePalette.vue.d.ts +22 -1
- package/dist/runtime/components/Integrations/QueryBuilder.d.vue.ts +9 -0
- package/dist/runtime/components/Integrations/QueryBuilder.vue +239 -0
- package/dist/runtime/components/Integrations/QueryBuilder.vue.d.ts +9 -0
- package/dist/runtime/components/Integrations/{RunDetailDialog.d.vue.ts → RunActionsMenu.d.vue.ts} +3 -4
- package/dist/runtime/components/Integrations/RunActionsMenu.vue +86 -0
- package/dist/runtime/components/Integrations/{RunDetailDialog.vue.d.ts → RunActionsMenu.vue.d.ts} +3 -4
- package/dist/runtime/components/Integrations/RunDetailPanel.d.vue.ts +14 -0
- package/dist/runtime/components/Integrations/RunDetailPanel.vue +777 -0
- package/dist/runtime/components/Integrations/RunDetailPanel.vue.d.ts +14 -0
- package/dist/runtime/components/Integrations/RunPayloadInput.d.vue.ts +13 -0
- package/dist/runtime/components/Integrations/RunPayloadInput.vue +175 -0
- package/dist/runtime/components/Integrations/RunPayloadInput.vue.d.ts +13 -0
- package/dist/runtime/components/Integrations/RunResponseModal.d.vue.ts +27 -0
- package/dist/runtime/components/Integrations/RunResponseModal.vue +84 -0
- package/dist/runtime/components/Integrations/RunResponseModal.vue.d.ts +27 -0
- package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +21 -0
- package/dist/runtime/components/Integrations/RunsTable.vue +114 -0
- package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +21 -0
- package/dist/runtime/components/Integrations/SftpAccountImportDialog.d.vue.ts +11 -0
- package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +91 -0
- package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue.d.ts +11 -0
- package/dist/runtime/components/Integrations/StickyNoteView.d.vue.ts +28 -0
- package/dist/runtime/components/Integrations/StickyNoteView.vue +208 -0
- package/dist/runtime/components/Integrations/StickyNoteView.vue.d.ts +28 -0
- package/dist/runtime/components/Integrations/TemplateFlowPreview.d.vue.ts +29 -0
- package/dist/runtime/components/Integrations/TemplateFlowPreview.vue +201 -0
- package/dist/runtime/components/Integrations/TemplateFlowPreview.vue.d.ts +29 -0
- package/dist/runtime/components/Integrations/WorkflowContextMenu.d.vue.ts +32 -0
- package/dist/runtime/components/Integrations/WorkflowContextMenu.vue +138 -0
- package/dist/runtime/components/Integrations/WorkflowContextMenu.vue.d.ts +32 -0
- package/dist/runtime/components/Integrations/WorkflowCreateDialog.d.vue.ts +9 -0
- package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +322 -0
- package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue.d.ts +9 -0
- package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.d.vue.ts +18 -0
- package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +63 -0
- package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue.d.ts +18 -0
- package/dist/runtime/components/Integrations/WorkflowEdgeView.d.vue.ts +12 -1
- package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +68 -6
- package/dist/runtime/components/Integrations/WorkflowEdgeView.vue.d.ts +12 -1
- package/dist/runtime/components/Integrations/WorkflowEditor.d.vue.ts +8 -1
- package/dist/runtime/components/Integrations/WorkflowEditor.vue +1424 -144
- package/dist/runtime/components/Integrations/WorkflowEditor.vue.d.ts +8 -1
- package/dist/runtime/components/Integrations/WorkflowHistoryPanel.d.vue.ts +12 -0
- package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +417 -0
- package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue.d.ts +12 -0
- package/dist/runtime/components/Integrations/WorkflowIconPicker.d.vue.ts +10 -0
- package/dist/runtime/components/Integrations/WorkflowIconPicker.vue +89 -0
- package/dist/runtime/components/Integrations/WorkflowIconPicker.vue.d.ts +10 -0
- package/dist/runtime/components/Integrations/WorkflowIconView.d.vue.ts +10 -0
- package/dist/runtime/components/Integrations/WorkflowIconView.vue +35 -0
- package/dist/runtime/components/Integrations/WorkflowIconView.vue.d.ts +10 -0
- package/dist/runtime/components/Integrations/WorkflowNodeView.d.vue.ts +5 -1
- package/dist/runtime/components/Integrations/WorkflowNodeView.vue +114 -84
- package/dist/runtime/components/Integrations/WorkflowNodeView.vue.d.ts +5 -1
- package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.d.vue.ts +12 -0
- package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +654 -0
- package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue.d.ts +12 -0
- package/dist/runtime/components/Integrations/WorkflowSettingsDialog.d.vue.ts +36 -0
- package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue +136 -0
- package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue.d.ts +36 -0
- package/dist/runtime/components/Integrations/WorkflowTagsInput.d.vue.ts +14 -0
- package/dist/runtime/components/Integrations/WorkflowTagsInput.vue +63 -0
- package/dist/runtime/components/Integrations/WorkflowTagsInput.vue.d.ts +14 -0
- package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +35 -15
- package/dist/runtime/components/Integrations/WorkflowVariablesDialog.d.vue.ts +13 -0
- package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +265 -0
- package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue.d.ts +13 -0
- package/dist/runtime/components/Integrations/WorkflowsTable.d.vue.ts +4 -1
- package/dist/runtime/components/Integrations/WorkflowsTable.vue +122 -39
- package/dist/runtime/components/Integrations/WorkflowsTable.vue.d.ts +4 -1
- package/dist/runtime/components/Integrations/workflowLayout.d.ts +5 -0
- package/dist/runtime/components/Integrations/workflowLayout.js +5 -3
- package/dist/runtime/composables/integrationsApi.d.ts +6 -7
- package/dist/runtime/composables/integrationsApi.js +6 -12
- package/dist/runtime/composables/useCanvasShortcuts.d.ts +37 -0
- package/dist/runtime/composables/useCanvasShortcuts.js +62 -0
- package/dist/runtime/composables/useCredentialTypes.js +2 -1
- package/dist/runtime/composables/useIntegrationsAudit.js +2 -1
- package/dist/runtime/composables/useIntegrationsCredentials.js +2 -1
- package/dist/runtime/composables/useIntegrationsDeadLetters.d.ts +22 -0
- package/dist/runtime/composables/useIntegrationsDeadLetters.js +50 -0
- package/dist/runtime/composables/useIntegrationsNodes.d.ts +4 -0
- package/dist/runtime/composables/useIntegrationsNodes.js +8 -4
- package/dist/runtime/composables/useIntegrationsRevisions.d.ts +40 -0
- package/dist/runtime/composables/useIntegrationsRevisions.js +52 -0
- package/dist/runtime/composables/useIntegrationsRuns.d.ts +21 -1
- package/dist/runtime/composables/useIntegrationsRuns.js +94 -5
- package/dist/runtime/composables/useIntegrationsSecrets.js +2 -1
- package/dist/runtime/composables/useIntegrationsTemplates.d.ts +1 -0
- package/dist/runtime/composables/useIntegrationsTemplates.js +34 -5
- package/dist/runtime/composables/useIntegrationsTriggers.js +2 -1
- package/dist/runtime/composables/useIntegrationsWorkflows.d.ts +1 -0
- package/dist/runtime/composables/useIntegrationsWorkflows.js +59 -2
- package/dist/runtime/composables/useMiniMapLayout.d.ts +34 -0
- package/dist/runtime/composables/useMiniMapLayout.js +119 -0
- package/dist/runtime/composables/useNodeConfigResolve.d.ts +43 -0
- package/dist/runtime/composables/useNodeConfigResolve.js +124 -0
- package/dist/runtime/composables/useNodeDrag.d.ts +22 -0
- package/dist/runtime/composables/useNodeDrag.js +10 -0
- package/dist/runtime/composables/usePaletteLayout.d.ts +41 -0
- package/dist/runtime/composables/usePaletteLayout.js +113 -0
- package/dist/runtime/data/expressionEditor.d.ts +22 -0
- package/dist/runtime/data/expressionEditor.js +40 -0
- package/dist/runtime/data/integrationNodeCatalog.js +8 -8
- package/dist/runtime/data/nodeInputData.d.ts +37 -0
- package/dist/runtime/data/nodeInputData.js +62 -0
- package/dist/runtime/data/nodeRunData.d.ts +56 -0
- package/dist/runtime/data/nodeRunData.js +91 -0
- package/dist/runtime/data/payloadForm.d.ts +44 -0
- package/dist/runtime/data/payloadForm.js +126 -0
- package/dist/runtime/data/workflowIconCatalog.d.ts +34 -0
- package/dist/runtime/data/workflowIconCatalog.js +116 -0
- package/dist/runtime/pages/integrations/audit.vue +25 -35
- package/dist/runtime/pages/integrations/credentials.vue +117 -122
- package/dist/runtime/pages/integrations/index.vue +133 -36
- package/dist/runtime/pages/integrations/runs.vue +125 -75
- package/dist/runtime/pages/integrations/schedules.vue +5 -16
- package/dist/runtime/pages/integrations/secrets.vue +1 -3
- package/dist/runtime/pages/integrations/workflows/[id].vue +599 -194
- package/dist/runtime/pages/integrations/workflows/index.vue +10 -8
- package/dist/runtime/types/integrations.d.ts +190 -4
- package/dist/runtime/utils/apiError.d.ts +17 -0
- package/dist/runtime/utils/apiError.js +8 -0
- package/dist/runtime/utils/credentialState.d.ts +28 -0
- package/dist/runtime/utils/credentialState.js +29 -0
- package/dist/runtime/utils/localize.d.ts +3 -1
- package/dist/runtime/utils/localize.js +1 -2
- package/dist/runtime/utils/statusStyle.d.ts +6 -0
- package/dist/runtime/utils/statusStyle.js +15 -0
- package/package.json +20 -3
- package/dist/runtime/components/Integrations/RunDetailDialog.vue +0 -169
- package/dist/runtime/pages/integrations/workflows/new.d.vue.ts +0 -2
- package/dist/runtime/pages/integrations/workflows/new.vue +0 -153
- package/dist/runtime/pages/integrations/workflows/new.vue.d.ts +0 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Workflow, WorkflowIcon } from '../../types/integrations.js';
|
|
2
|
+
export interface ExecutionModeOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
hint: string;
|
|
6
|
+
}
|
|
7
|
+
type __VLS_Props = {
|
|
8
|
+
open: boolean;
|
|
9
|
+
workflow: Workflow;
|
|
10
|
+
modes: ExecutionModeOption[];
|
|
11
|
+
modeDraft: string;
|
|
12
|
+
savingMode?: boolean;
|
|
13
|
+
savingMeta?: boolean;
|
|
14
|
+
/** Tag suggestions (tags already used across the tenant's workflows). */
|
|
15
|
+
tagSuggestions?: string[];
|
|
16
|
+
};
|
|
17
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
18
|
+
"update:open": (args_0: boolean) => any;
|
|
19
|
+
"change-mode": (mode: string) => any;
|
|
20
|
+
"save-meta": (meta: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
tags: string[];
|
|
24
|
+
icon: WorkflowIcon | null;
|
|
25
|
+
}) => any;
|
|
26
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
27
|
+
"onUpdate:open"?: ((args_0: boolean) => any) | undefined;
|
|
28
|
+
"onChange-mode"?: ((mode: string) => any) | undefined;
|
|
29
|
+
"onSave-meta"?: ((meta: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
tags: string[];
|
|
33
|
+
icon: WorkflowIcon | null;
|
|
34
|
+
}) => any) | undefined;
|
|
35
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
36
|
+
export default _default;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, watch } from "vue";
|
|
3
|
+
import { RefreshCircle as Loader2 } from "#solar-icons";
|
|
4
|
+
import {
|
|
5
|
+
Button,
|
|
6
|
+
Dialog,
|
|
7
|
+
DialogContent,
|
|
8
|
+
DialogDescription,
|
|
9
|
+
DialogHeader,
|
|
10
|
+
DialogTitle,
|
|
11
|
+
Input,
|
|
12
|
+
Select,
|
|
13
|
+
SelectContent,
|
|
14
|
+
SelectItem,
|
|
15
|
+
SelectTrigger,
|
|
16
|
+
SelectValue,
|
|
17
|
+
Textarea
|
|
18
|
+
} from "@revenexx/studio";
|
|
19
|
+
import WorkflowIconPicker from "./WorkflowIconPicker.vue";
|
|
20
|
+
import WorkflowTagsInput from "./WorkflowTagsInput.vue";
|
|
21
|
+
const props = defineProps({
|
|
22
|
+
open: { type: Boolean, required: true },
|
|
23
|
+
workflow: { type: Object, required: true },
|
|
24
|
+
modes: { type: Array, required: true },
|
|
25
|
+
modeDraft: { type: String, required: true },
|
|
26
|
+
savingMode: { type: Boolean, required: false },
|
|
27
|
+
savingMeta: { type: Boolean, required: false },
|
|
28
|
+
tagSuggestions: { type: Array, required: false }
|
|
29
|
+
});
|
|
30
|
+
const emit = defineEmits(["update:open", "change-mode", "save-meta"]);
|
|
31
|
+
const nameDraft = ref("");
|
|
32
|
+
const descriptionDraft = ref("");
|
|
33
|
+
const tagsDraft = ref([]);
|
|
34
|
+
const iconDraft = ref(null);
|
|
35
|
+
watch(() => props.open, (v) => {
|
|
36
|
+
if (!v) return;
|
|
37
|
+
nameDraft.value = props.workflow.name;
|
|
38
|
+
descriptionDraft.value = props.workflow.description ?? "";
|
|
39
|
+
tagsDraft.value = [...props.workflow.blob.tags ?? []];
|
|
40
|
+
iconDraft.value = props.workflow.blob.icon ?? null;
|
|
41
|
+
}, { immediate: true });
|
|
42
|
+
function formatDateTime(iso) {
|
|
43
|
+
if (!iso) return "\u2014";
|
|
44
|
+
try {
|
|
45
|
+
return new Date(iso).toLocaleString();
|
|
46
|
+
} catch {
|
|
47
|
+
return String(iso);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<template>
|
|
53
|
+
<Dialog :open="open" @update:open="(v) => emit('update:open', v)">
|
|
54
|
+
<DialogContent class="sm:max-w-lg">
|
|
55
|
+
<DialogHeader>
|
|
56
|
+
<DialogTitle>Workflow settings</DialogTitle>
|
|
57
|
+
<DialogDescription class="text-sm">
|
|
58
|
+
Execution behavior and metadata for “{{ workflow.name }}”.
|
|
59
|
+
</DialogDescription>
|
|
60
|
+
</DialogHeader>
|
|
61
|
+
|
|
62
|
+
<div class="space-y-4 text-sm">
|
|
63
|
+
<div class="rounded-lg border border-black/[0.06] bg-white p-4 space-y-3">
|
|
64
|
+
<div class="text-mono text-muted-foreground">Execution</div>
|
|
65
|
+
<div class="flex items-center gap-2">
|
|
66
|
+
<Select
|
|
67
|
+
:model-value="modeDraft"
|
|
68
|
+
:disabled="savingMode"
|
|
69
|
+
@update:model-value="(v) => emit('change-mode', v)"
|
|
70
|
+
>
|
|
71
|
+
<SelectTrigger class="h-8 w-full bg-white text-sm">
|
|
72
|
+
<SelectValue placeholder="Pick a mode" />
|
|
73
|
+
</SelectTrigger>
|
|
74
|
+
<SelectContent>
|
|
75
|
+
<SelectItem v-for="m in modes" :key="m.value" :value="m.value">
|
|
76
|
+
{{ m.label }}
|
|
77
|
+
</SelectItem>
|
|
78
|
+
</SelectContent>
|
|
79
|
+
</Select>
|
|
80
|
+
<Loader2 v-if="savingMode" :size="14" class="shrink-0 animate-spin text-muted-foreground" />
|
|
81
|
+
</div>
|
|
82
|
+
<p class="text-xs text-muted-foreground">
|
|
83
|
+
{{ modes.find((m2) => m2.value === modeDraft)?.hint }}
|
|
84
|
+
</p>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div class="rounded-lg border border-black/[0.06] bg-white p-4 space-y-3">
|
|
88
|
+
<div class="text-mono text-muted-foreground">Appearance</div>
|
|
89
|
+
<div class="space-y-1.5">
|
|
90
|
+
<div class="text-sm text-muted-foreground">Name</div>
|
|
91
|
+
<Input v-model="nameDraft" class="bg-white" placeholder="Workflow name" />
|
|
92
|
+
</div>
|
|
93
|
+
<div class="space-y-1.5">
|
|
94
|
+
<div class="text-sm text-muted-foreground">Description</div>
|
|
95
|
+
<Textarea v-model="descriptionDraft" rows="2" class="bg-white" placeholder="What this workflow does and why it exists." />
|
|
96
|
+
</div>
|
|
97
|
+
<div class="space-y-1.5">
|
|
98
|
+
<div class="text-sm text-muted-foreground">Tags</div>
|
|
99
|
+
<WorkflowTagsInput v-model="tagsDraft" :suggestions="tagSuggestions ?? []" />
|
|
100
|
+
</div>
|
|
101
|
+
<div class="space-y-1.5">
|
|
102
|
+
<div class="text-sm text-muted-foreground">Icon</div>
|
|
103
|
+
<WorkflowIconPicker v-model="iconDraft" />
|
|
104
|
+
</div>
|
|
105
|
+
<div class="flex justify-end">
|
|
106
|
+
<Button
|
|
107
|
+
size="sm"
|
|
108
|
+
class="h-7 text-sm"
|
|
109
|
+
:disabled="savingMeta || !nameDraft.trim()"
|
|
110
|
+
@click="emit('save-meta', { name: nameDraft.trim(), description: descriptionDraft.trim(), tags: tagsDraft, icon: iconDraft })"
|
|
111
|
+
>
|
|
112
|
+
<Loader2 v-if="savingMeta" :size="12" class="animate-spin" />
|
|
113
|
+
Save changes
|
|
114
|
+
</Button>
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div class="rounded-lg border border-black/[0.06] bg-white p-4 space-y-2">
|
|
119
|
+
<div class="text-mono text-muted-foreground">Metadata</div>
|
|
120
|
+
<div class="grid grid-cols-[110px_1fr] gap-x-3 gap-y-2">
|
|
121
|
+
<span class="text-muted-foreground">ID</span>
|
|
122
|
+
<span class="font-mono">{{ workflow.id }}</span>
|
|
123
|
+
<span class="text-muted-foreground">Definition</span>
|
|
124
|
+
<span class="font-mono">{{ workflow.blob_definition_version }}</span>
|
|
125
|
+
<span class="text-muted-foreground">Revision</span>
|
|
126
|
+
<span class="font-mono">r{{ workflow.revision }}</span>
|
|
127
|
+
<span class="text-muted-foreground">Created</span>
|
|
128
|
+
<span>{{ formatDateTime(workflow.created_at) }}</span>
|
|
129
|
+
<span class="text-muted-foreground">Updated</span>
|
|
130
|
+
<span>{{ formatDateTime(workflow.updated_at) }}</span>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</DialogContent>
|
|
135
|
+
</Dialog>
|
|
136
|
+
</template>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Workflow, WorkflowIcon } from '../../types/integrations.js';
|
|
2
|
+
export interface ExecutionModeOption {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
hint: string;
|
|
6
|
+
}
|
|
7
|
+
type __VLS_Props = {
|
|
8
|
+
open: boolean;
|
|
9
|
+
workflow: Workflow;
|
|
10
|
+
modes: ExecutionModeOption[];
|
|
11
|
+
modeDraft: string;
|
|
12
|
+
savingMode?: boolean;
|
|
13
|
+
savingMeta?: boolean;
|
|
14
|
+
/** Tag suggestions (tags already used across the tenant's workflows). */
|
|
15
|
+
tagSuggestions?: string[];
|
|
16
|
+
};
|
|
17
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
18
|
+
"update:open": (args_0: boolean) => any;
|
|
19
|
+
"change-mode": (mode: string) => any;
|
|
20
|
+
"save-meta": (meta: {
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
tags: string[];
|
|
24
|
+
icon: WorkflowIcon | null;
|
|
25
|
+
}) => any;
|
|
26
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
27
|
+
"onUpdate:open"?: ((args_0: boolean) => any) | undefined;
|
|
28
|
+
"onChange-mode"?: ((mode: string) => any) | undefined;
|
|
29
|
+
"onSave-meta"?: ((meta: {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
tags: string[];
|
|
33
|
+
icon: WorkflowIcon | null;
|
|
34
|
+
}) => any) | undefined;
|
|
35
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
36
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
suggestions?: string[];
|
|
3
|
+
};
|
|
4
|
+
type __VLS_PublicProps = __VLS_Props & {
|
|
5
|
+
modelValue?: string[];
|
|
6
|
+
};
|
|
7
|
+
declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
8
|
+
"update:modelValue": (value: string[]) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
10
|
+
"onUpdate:modelValue"?: ((value: string[]) => any) | undefined;
|
|
11
|
+
}>, {
|
|
12
|
+
suggestions: string[];
|
|
13
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { ref, useId } from "vue";
|
|
3
|
+
const model = defineModel({ type: Array, ...{ default: () => [] } });
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
suggestions: { type: Array, required: false, default: () => [] }
|
|
6
|
+
});
|
|
7
|
+
const draft = ref("");
|
|
8
|
+
const inputRef = ref(null);
|
|
9
|
+
const listId = useId();
|
|
10
|
+
function commit() {
|
|
11
|
+
const tag = draft.value.trim().replace(/,+$/, "").trim();
|
|
12
|
+
draft.value = "";
|
|
13
|
+
if (!tag) return;
|
|
14
|
+
if (!model.value.includes(tag)) model.value = [...model.value, tag];
|
|
15
|
+
}
|
|
16
|
+
function remove(tag) {
|
|
17
|
+
model.value = model.value.filter((t) => t !== tag);
|
|
18
|
+
}
|
|
19
|
+
function onKeydown(e) {
|
|
20
|
+
if (e.key === "Enter" || e.key === ",") {
|
|
21
|
+
e.preventDefault();
|
|
22
|
+
commit();
|
|
23
|
+
} else if (e.key === "Backspace" && !draft.value && model.value.length) {
|
|
24
|
+
model.value = model.value.slice(0, -1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
</script>
|
|
28
|
+
|
|
29
|
+
<template>
|
|
30
|
+
<div
|
|
31
|
+
class="flex min-h-9 cursor-text flex-wrap items-center gap-1 rounded-md border border-black/[0.08] bg-white px-2 py-1.5"
|
|
32
|
+
@click="inputRef?.focus()"
|
|
33
|
+
>
|
|
34
|
+
<span
|
|
35
|
+
v-for="t in model"
|
|
36
|
+
:key="t"
|
|
37
|
+
class="inline-flex items-center gap-1 rounded-md border border-black/[0.06] bg-muted/50 px-1.5 py-0.5 text-xs text-foreground"
|
|
38
|
+
>
|
|
39
|
+
{{ t }}
|
|
40
|
+
<button
|
|
41
|
+
type="button"
|
|
42
|
+
class="text-muted-foreground transition hover:text-foreground"
|
|
43
|
+
:title="`Remove ${t}`"
|
|
44
|
+
@click.stop="remove(t)"
|
|
45
|
+
>
|
|
46
|
+
×
|
|
47
|
+
</button>
|
|
48
|
+
</span>
|
|
49
|
+
<input
|
|
50
|
+
ref="inputRef"
|
|
51
|
+
v-model="draft"
|
|
52
|
+
type="text"
|
|
53
|
+
:list="listId"
|
|
54
|
+
class="h-6 min-w-24 flex-1 bg-transparent text-sm focus:outline-none"
|
|
55
|
+
:placeholder="model.length ? 'Add tag\u2026' : 'Add tags \u2014 Enter confirms\u2026'"
|
|
56
|
+
@keydown="onKeydown"
|
|
57
|
+
@blur="commit()"
|
|
58
|
+
>
|
|
59
|
+
<datalist :id="listId">
|
|
60
|
+
<option v-for="s in props.suggestions" :key="s" :value="s" />
|
|
61
|
+
</datalist>
|
|
62
|
+
</div>
|
|
63
|
+
</template>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
suggestions?: string[];
|
|
3
|
+
};
|
|
4
|
+
type __VLS_PublicProps = __VLS_Props & {
|
|
5
|
+
modelValue?: string[];
|
|
6
|
+
};
|
|
7
|
+
declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
8
|
+
"update:modelValue": (value: string[]) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
10
|
+
"onUpdate:modelValue"?: ((value: string[]) => any) | undefined;
|
|
11
|
+
}>, {
|
|
12
|
+
suggestions: string[];
|
|
13
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { computed } from "vue";
|
|
2
|
+
import { computed, ref } from "vue";
|
|
3
3
|
import { Handle, Position, useVueFlow } from "@vue-flow/core";
|
|
4
4
|
import { NodeToolbar } from "@vue-flow/node-toolbar";
|
|
5
5
|
import { ClockCircle as Clock, Play, TrashBinMinimalistic as Trash2, LinkRound as Webhook, Bolt } from "#solar-icons";
|
|
@@ -23,20 +23,32 @@ const subtitle = computed(() => {
|
|
|
23
23
|
const title = computed(() => {
|
|
24
24
|
const n = props.data.name;
|
|
25
25
|
if (!n) return props.data.type.charAt(0).toUpperCase() + props.data.type.slice(1);
|
|
26
|
-
return typeof n === "string" ? n : Object.values(n)[0];
|
|
26
|
+
return typeof n === "string" ? n : n.en ?? Object.values(n)[0];
|
|
27
27
|
});
|
|
28
|
+
const hovered = ref(false);
|
|
29
|
+
let hoverTimer = null;
|
|
30
|
+
function onHoverEnter() {
|
|
31
|
+
if (hoverTimer) clearTimeout(hoverTimer);
|
|
32
|
+
hovered.value = true;
|
|
33
|
+
}
|
|
34
|
+
function onHoverLeave() {
|
|
35
|
+
if (hoverTimer) clearTimeout(hoverTimer);
|
|
36
|
+
hoverTimer = setTimeout(() => {
|
|
37
|
+
hovered.value = false;
|
|
38
|
+
}, 200);
|
|
39
|
+
}
|
|
28
40
|
const flow = useVueFlow();
|
|
29
41
|
function remove() {
|
|
30
42
|
flow.removeNodes([props.id]);
|
|
31
43
|
}
|
|
32
|
-
const
|
|
44
|
+
const OUT_SIDES = ["bottom"];
|
|
33
45
|
function sideToPosition(s) {
|
|
34
46
|
return s === "top" ? Position.Top : s === "right" ? Position.Right : s === "bottom" ? Position.Bottom : Position.Left;
|
|
35
47
|
}
|
|
36
48
|
</script>
|
|
37
49
|
|
|
38
50
|
<template>
|
|
39
|
-
<NodeToolbar :position="Position.Top" :offset="
|
|
51
|
+
<NodeToolbar :is-visible="hovered || selected" :position="Position.Top" :offset="8" class="flex items-center gap-1 rounded-md border border-black/[0.08] bg-white px-1 py-1 shadow-md" @mouseenter="onHoverEnter" @mouseleave="onHoverLeave">
|
|
40
52
|
<button
|
|
41
53
|
type="button"
|
|
42
54
|
class="flex h-6 items-center gap-1 rounded px-1.5 text-sm text-rose-600 hover:bg-rose-50"
|
|
@@ -49,34 +61,42 @@ function sideToPosition(s) {
|
|
|
49
61
|
|
|
50
62
|
<div
|
|
51
63
|
class="w-[200px] rounded-lg border-2 bg-gradient-to-br from-emerald-50 to-white transition-all duration-150"
|
|
52
|
-
|
|
64
|
+
@mouseenter="onHoverEnter"
|
|
65
|
+
@mouseleave="onHoverLeave"
|
|
66
|
+
:class="[
|
|
67
|
+
selected ? 'border-emerald-500 shadow-[0_0_0_2px_rgba(16,185,129,0.18)]' : 'border-emerald-400/40 shadow-sm hover:shadow-md hover:border-emerald-500/60',
|
|
68
|
+
data.active === false ? 'opacity-60 grayscale-[0.4]' : ''
|
|
69
|
+
]"
|
|
53
70
|
>
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
71
|
+
<!-- Same type scale as WorkflowNodeView so trigger and node cards read
|
|
72
|
+
identically (icon chip size-8/15, subtitle plain text-sm, mt-0.5). -->
|
|
73
|
+
<div class="flex items-center gap-2.5 px-3 py-2.5">
|
|
74
|
+
<span class="flex size-8 shrink-0 items-center justify-center rounded-md bg-emerald-500 text-white shadow-sm">
|
|
75
|
+
<component :is="icon" :size="15" :stroke-width="2.5" />
|
|
57
76
|
</span>
|
|
58
|
-
<div class="min-w-0">
|
|
77
|
+
<div class="min-w-0 flex-1">
|
|
59
78
|
<div class="text-sm font-semibold text-foreground leading-tight truncate">
|
|
60
79
|
{{ title }}
|
|
61
80
|
</div>
|
|
62
|
-
<div class="text-sm text-muted-foreground
|
|
81
|
+
<div class="mt-0.5 text-sm text-muted-foreground truncate" :title="subtitle">
|
|
63
82
|
{{ subtitle }}
|
|
64
83
|
</div>
|
|
65
84
|
</div>
|
|
66
85
|
</div>
|
|
67
|
-
<div class="border-t border-emerald-500/15 bg-emerald-500/[0.04] rounded-b-md px-3 py-1 text-mono text-emerald-700/80 font-semibold">
|
|
68
|
-
Trigger · {{ data.type }}
|
|
86
|
+
<div class="flex items-center justify-between border-t border-emerald-500/15 bg-emerald-500/[0.04] rounded-b-md px-3 py-1 text-mono text-emerald-700/80 font-semibold">
|
|
87
|
+
<span>Trigger · {{ data.type }}</span>
|
|
88
|
+
<span v-if="data.active === false" class="text-amber-600">Inactive</span>
|
|
69
89
|
</div>
|
|
70
90
|
</div>
|
|
71
91
|
|
|
72
|
-
<!-- Output handles
|
|
92
|
+
<!-- Output handles: right + bottom. The blob's `from.output` stays
|
|
73
93
|
"default"; the side suffix is stripped on persist. -->
|
|
74
94
|
<Handle
|
|
75
|
-
v-for="side in
|
|
95
|
+
v-for="side in OUT_SIDES"
|
|
76
96
|
:id="`default__${side}`"
|
|
77
97
|
:key="side"
|
|
78
98
|
type="source"
|
|
79
99
|
:position="sideToPosition(side)"
|
|
80
|
-
class="!size-
|
|
100
|
+
class="!size-3 !rounded-full !border-2 !border-white !bg-emerald-500 !shadow-sm transition-all hover:!size-3.5 hover:!bg-emerald-600"
|
|
81
101
|
/>
|
|
82
102
|
</template>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { WorkflowVariable } from '../../types/integrations.js';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
variables: Record<string, WorkflowVariable>;
|
|
5
|
+
};
|
|
6
|
+
declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
"update:open": (args_0: boolean) => any;
|
|
8
|
+
"update:variables": (next: Record<string, WorkflowVariable>) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
"onUpdate:open"?: ((args_0: boolean) => any) | undefined;
|
|
11
|
+
"onUpdate:variables"?: ((next: Record<string, WorkflowVariable>) => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
export default _default;
|