@revenexx/studio-integrations 0.1.3 → 0.2.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.
Files changed (180) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/Integrations/CredentialCreateDialog.d.vue.ts +13 -0
  3. package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +279 -0
  4. package/dist/runtime/components/Integrations/CredentialCreateDialog.vue.d.ts +13 -0
  5. package/dist/runtime/components/Integrations/CredentialDetailDialog.d.vue.ts +20 -0
  6. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +342 -0
  7. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue.d.ts +20 -0
  8. package/dist/runtime/components/Integrations/CredentialLogo.d.vue.ts +14 -0
  9. package/dist/runtime/components/Integrations/CredentialLogo.vue +37 -0
  10. package/dist/runtime/components/Integrations/CredentialLogo.vue.d.ts +14 -0
  11. package/dist/runtime/components/Integrations/CredentialRevenexxSource.d.vue.ts +12 -0
  12. package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +364 -0
  13. package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue.d.ts +12 -0
  14. package/dist/runtime/components/Integrations/CredentialTypePicker.d.vue.ts +15 -0
  15. package/dist/runtime/components/Integrations/CredentialTypePicker.vue +71 -0
  16. package/dist/runtime/components/Integrations/CredentialTypePicker.vue.d.ts +15 -0
  17. package/dist/runtime/components/Integrations/DeadLettersPanel.d.vue.ts +5 -0
  18. package/dist/runtime/components/Integrations/DeadLettersPanel.vue +151 -0
  19. package/dist/runtime/components/Integrations/DeadLettersPanel.vue.d.ts +5 -0
  20. package/dist/runtime/components/Integrations/EditorTip.d.vue.ts +17 -0
  21. package/dist/runtime/components/Integrations/EditorTip.vue +46 -0
  22. package/dist/runtime/components/Integrations/EditorTip.vue.d.ts +17 -0
  23. package/dist/runtime/components/Integrations/EventTypeCombobox.d.vue.ts +9 -0
  24. package/dist/runtime/components/Integrations/EventTypeCombobox.vue +64 -0
  25. package/dist/runtime/components/Integrations/EventTypeCombobox.vue.d.ts +9 -0
  26. package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +19 -0
  27. package/dist/runtime/components/Integrations/ExpressionInput.vue +236 -0
  28. package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +19 -0
  29. package/dist/runtime/components/Integrations/GroupFrameView.d.vue.ts +28 -0
  30. package/dist/runtime/components/Integrations/GroupFrameView.vue +222 -0
  31. package/dist/runtime/components/Integrations/GroupFrameView.vue.d.ts +28 -0
  32. package/dist/runtime/components/Integrations/NodeConfigDynamicField.d.vue.ts +14 -0
  33. package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue +184 -0
  34. package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue.d.ts +14 -0
  35. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.d.vue.ts +16 -0
  36. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +102 -0
  37. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue.d.ts +16 -0
  38. package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +23 -0
  39. package/dist/runtime/components/Integrations/NodeConfigField.vue +587 -0
  40. package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +23 -0
  41. package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.d.vue.ts +14 -0
  42. package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.vue +80 -0
  43. package/dist/runtime/components/Integrations/NodeDynamicOutputsResolver.vue.d.ts +14 -0
  44. package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +22 -3
  45. package/dist/runtime/components/Integrations/NodeInspector.vue +1074 -294
  46. package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +22 -3
  47. package/dist/runtime/components/Integrations/NodeLogo.d.vue.ts +9 -0
  48. package/dist/runtime/components/Integrations/NodeLogo.vue +38 -0
  49. package/dist/runtime/components/Integrations/NodeLogo.vue.d.ts +9 -0
  50. package/dist/runtime/components/Integrations/NodePalette.d.vue.ts +22 -1
  51. package/dist/runtime/components/Integrations/NodePalette.vue +411 -90
  52. package/dist/runtime/components/Integrations/NodePalette.vue.d.ts +22 -1
  53. package/dist/runtime/components/Integrations/QueryBuilder.d.vue.ts +9 -0
  54. package/dist/runtime/components/Integrations/QueryBuilder.vue +239 -0
  55. package/dist/runtime/components/Integrations/QueryBuilder.vue.d.ts +9 -0
  56. package/dist/runtime/components/Integrations/{RunDetailDialog.d.vue.ts → RunActionsMenu.d.vue.ts} +3 -4
  57. package/dist/runtime/components/Integrations/RunActionsMenu.vue +86 -0
  58. package/dist/runtime/components/Integrations/{RunDetailDialog.vue.d.ts → RunActionsMenu.vue.d.ts} +3 -4
  59. package/dist/runtime/components/Integrations/RunDetailPanel.d.vue.ts +14 -0
  60. package/dist/runtime/components/Integrations/RunDetailPanel.vue +777 -0
  61. package/dist/runtime/components/Integrations/RunDetailPanel.vue.d.ts +14 -0
  62. package/dist/runtime/components/Integrations/RunPayloadInput.d.vue.ts +13 -0
  63. package/dist/runtime/components/Integrations/RunPayloadInput.vue +175 -0
  64. package/dist/runtime/components/Integrations/RunPayloadInput.vue.d.ts +13 -0
  65. package/dist/runtime/components/Integrations/RunResponseModal.d.vue.ts +27 -0
  66. package/dist/runtime/components/Integrations/RunResponseModal.vue +84 -0
  67. package/dist/runtime/components/Integrations/RunResponseModal.vue.d.ts +27 -0
  68. package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +21 -0
  69. package/dist/runtime/components/Integrations/RunsTable.vue +114 -0
  70. package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +21 -0
  71. package/dist/runtime/components/Integrations/SftpAccountImportDialog.d.vue.ts +11 -0
  72. package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +91 -0
  73. package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue.d.ts +11 -0
  74. package/dist/runtime/components/Integrations/Sidebar.vue +1 -0
  75. package/dist/runtime/components/Integrations/StickyNoteView.d.vue.ts +28 -0
  76. package/dist/runtime/components/Integrations/StickyNoteView.vue +208 -0
  77. package/dist/runtime/components/Integrations/StickyNoteView.vue.d.ts +28 -0
  78. package/dist/runtime/components/Integrations/TemplateFlowPreview.d.vue.ts +29 -0
  79. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue +201 -0
  80. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue.d.ts +29 -0
  81. package/dist/runtime/components/Integrations/WorkflowContextMenu.d.vue.ts +32 -0
  82. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue +138 -0
  83. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue.d.ts +32 -0
  84. package/dist/runtime/components/Integrations/WorkflowCreateDialog.d.vue.ts +9 -0
  85. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +322 -0
  86. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue.d.ts +9 -0
  87. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.d.vue.ts +18 -0
  88. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +63 -0
  89. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue.d.ts +18 -0
  90. package/dist/runtime/components/Integrations/WorkflowEdgeView.d.vue.ts +12 -1
  91. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +68 -6
  92. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue.d.ts +12 -1
  93. package/dist/runtime/components/Integrations/WorkflowEditor.d.vue.ts +8 -1
  94. package/dist/runtime/components/Integrations/WorkflowEditor.vue +1424 -144
  95. package/dist/runtime/components/Integrations/WorkflowEditor.vue.d.ts +8 -1
  96. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.d.vue.ts +12 -0
  97. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +417 -0
  98. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue.d.ts +12 -0
  99. package/dist/runtime/components/Integrations/WorkflowIconPicker.d.vue.ts +10 -0
  100. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue +89 -0
  101. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue.d.ts +10 -0
  102. package/dist/runtime/components/Integrations/WorkflowIconView.d.vue.ts +10 -0
  103. package/dist/runtime/components/Integrations/WorkflowIconView.vue +35 -0
  104. package/dist/runtime/components/Integrations/WorkflowIconView.vue.d.ts +10 -0
  105. package/dist/runtime/components/Integrations/WorkflowNodeView.d.vue.ts +5 -1
  106. package/dist/runtime/components/Integrations/WorkflowNodeView.vue +114 -84
  107. package/dist/runtime/components/Integrations/WorkflowNodeView.vue.d.ts +5 -1
  108. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.d.vue.ts +12 -0
  109. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +654 -0
  110. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue.d.ts +12 -0
  111. package/dist/runtime/components/Integrations/WorkflowSettingsDialog.d.vue.ts +36 -0
  112. package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue +136 -0
  113. package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue.d.ts +36 -0
  114. package/dist/runtime/components/Integrations/WorkflowTagsInput.d.vue.ts +14 -0
  115. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue +63 -0
  116. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue.d.ts +14 -0
  117. package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +35 -15
  118. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.d.vue.ts +13 -0
  119. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +265 -0
  120. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue.d.ts +13 -0
  121. package/dist/runtime/components/Integrations/WorkflowsTable.d.vue.ts +4 -1
  122. package/dist/runtime/components/Integrations/WorkflowsTable.vue +122 -39
  123. package/dist/runtime/components/Integrations/WorkflowsTable.vue.d.ts +4 -1
  124. package/dist/runtime/components/Integrations/workflowLayout.d.ts +5 -0
  125. package/dist/runtime/components/Integrations/workflowLayout.js +5 -3
  126. package/dist/runtime/composables/integrationsApi.d.ts +6 -2
  127. package/dist/runtime/composables/integrationsApi.js +5 -4
  128. package/dist/runtime/composables/useCanvasShortcuts.d.ts +37 -0
  129. package/dist/runtime/composables/useCanvasShortcuts.js +62 -0
  130. package/dist/runtime/composables/useIntegrationsDeadLetters.d.ts +22 -0
  131. package/dist/runtime/composables/useIntegrationsDeadLetters.js +50 -0
  132. package/dist/runtime/composables/useIntegrationsNodes.d.ts +4 -0
  133. package/dist/runtime/composables/useIntegrationsNodes.js +6 -3
  134. package/dist/runtime/composables/useIntegrationsRevisions.d.ts +40 -0
  135. package/dist/runtime/composables/useIntegrationsRevisions.js +51 -0
  136. package/dist/runtime/composables/useIntegrationsRuns.d.ts +21 -1
  137. package/dist/runtime/composables/useIntegrationsRuns.js +92 -4
  138. package/dist/runtime/composables/useIntegrationsTemplates.d.ts +1 -0
  139. package/dist/runtime/composables/useIntegrationsTemplates.js +32 -4
  140. package/dist/runtime/composables/useIntegrationsWorkflows.d.ts +1 -0
  141. package/dist/runtime/composables/useIntegrationsWorkflows.js +57 -1
  142. package/dist/runtime/composables/useMiniMapLayout.d.ts +34 -0
  143. package/dist/runtime/composables/useMiniMapLayout.js +119 -0
  144. package/dist/runtime/composables/useNodeConfigResolve.d.ts +43 -0
  145. package/dist/runtime/composables/useNodeConfigResolve.js +123 -0
  146. package/dist/runtime/composables/useNodeDrag.d.ts +22 -0
  147. package/dist/runtime/composables/useNodeDrag.js +10 -0
  148. package/dist/runtime/composables/usePaletteLayout.d.ts +41 -0
  149. package/dist/runtime/composables/usePaletteLayout.js +113 -0
  150. package/dist/runtime/data/expressionEditor.d.ts +22 -0
  151. package/dist/runtime/data/expressionEditor.js +40 -0
  152. package/dist/runtime/data/integrationNodeCatalog.js +8 -8
  153. package/dist/runtime/data/nodeInputData.d.ts +37 -0
  154. package/dist/runtime/data/nodeInputData.js +62 -0
  155. package/dist/runtime/data/nodeRunData.d.ts +56 -0
  156. package/dist/runtime/data/nodeRunData.js +91 -0
  157. package/dist/runtime/data/payloadForm.d.ts +44 -0
  158. package/dist/runtime/data/payloadForm.js +126 -0
  159. package/dist/runtime/data/workflowIconCatalog.d.ts +34 -0
  160. package/dist/runtime/data/workflowIconCatalog.js +116 -0
  161. package/dist/runtime/pages/integrations/audit.vue +25 -35
  162. package/dist/runtime/pages/integrations/credentials.vue +117 -122
  163. package/dist/runtime/pages/integrations/index.vue +133 -36
  164. package/dist/runtime/pages/integrations/runs.vue +125 -75
  165. package/dist/runtime/pages/integrations/schedules.vue +5 -16
  166. package/dist/runtime/pages/integrations/secrets.vue +1 -3
  167. package/dist/runtime/pages/integrations/workflows/[id].vue +599 -194
  168. package/dist/runtime/pages/integrations/workflows/index.vue +10 -8
  169. package/dist/runtime/types/integrations.d.ts +190 -4
  170. package/dist/runtime/utils/credentialState.d.ts +28 -0
  171. package/dist/runtime/utils/credentialState.js +29 -0
  172. package/dist/runtime/utils/localize.d.ts +3 -1
  173. package/dist/runtime/utils/localize.js +1 -2
  174. package/dist/runtime/utils/statusStyle.d.ts +6 -0
  175. package/dist/runtime/utils/statusStyle.js +15 -0
  176. package/package.json +12 -2
  177. package/dist/runtime/components/Integrations/RunDetailDialog.vue +0 -169
  178. package/dist/runtime/pages/integrations/workflows/new.d.vue.ts +0 -2
  179. package/dist/runtime/pages/integrations/workflows/new.vue +0 -153
  180. 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 SIDES = ["top", "right", "bottom", "left"];
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="36" class="flex items-center gap-1 rounded-md border border-black/[0.08] bg-white px-1 py-1 shadow-md">
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
- :class="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'"
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
- <div class="flex items-center gap-2 px-3 py-2">
55
- <span class="flex size-7 items-center justify-center rounded-md bg-emerald-500 text-white shadow-sm">
56
- <component :is="icon" :size="14" :stroke-width="2.5" />
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/80 truncate font-mono">
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 on all 4 sides. The blob's `from.output` stays
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 SIDES"
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-2 !rounded-full !border-2 !border-white !bg-emerald-500 opacity-80 transition-all hover:!size-2.5 hover:!bg-emerald-600 hover:opacity-100"
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;