@flowdrop/flowdrop 2.0.0-beta.3 → 2.0.0-beta.5
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 +38 -0
- package/README.md +5 -5
- package/dist/adapters/WorkflowAdapter.js +4 -5
- package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -3
- package/dist/adapters/agentspec/defaultNodeTypes.js +9 -9
- package/dist/commands/executor.js +5 -6
- package/dist/commands/types.js +5 -5
- package/dist/components/App.svelte +19 -150
- package/dist/components/Button.stories.svelte +65 -0
- package/dist/components/Button.stories.svelte.d.ts +19 -0
- package/dist/components/Button.svelte +62 -0
- package/dist/components/Button.svelte.d.ts +24 -0
- package/dist/components/ConfigForm.svelte +4 -4
- package/dist/components/EditorStatusBar.stories.svelte +44 -0
- package/dist/components/EditorStatusBar.stories.svelte.d.ts +27 -0
- package/dist/components/EditorStatusBar.svelte +99 -0
- package/dist/components/EditorStatusBar.svelte.d.ts +15 -0
- package/dist/components/IconButton.svelte +80 -0
- package/dist/components/IconButton.svelte.d.ts +30 -0
- package/dist/components/Input.svelte +74 -0
- package/dist/components/Input.svelte.d.ts +17 -0
- package/dist/components/Navbar.svelte +9 -4
- package/dist/components/Navbar.svelte.d.ts +3 -0
- package/dist/components/NodeSidebar.svelte +17 -115
- package/dist/components/NodeSwapPicker.svelte +12 -28
- package/dist/components/Select.svelte +53 -0
- package/dist/components/Select.svelte.d.ts +15 -0
- package/dist/components/Textarea.svelte +39 -0
- package/dist/components/Textarea.svelte.d.ts +12 -0
- package/dist/components/ThemeToggle.svelte +15 -89
- package/dist/components/UniversalNode.svelte +5 -4
- package/dist/components/UniversalNode.svelte.d.ts +1 -1
- package/dist/components/console/ConsoleInput.svelte +3 -3
- package/dist/components/form/FormArray.svelte +37 -157
- package/dist/components/form/FormCheckboxGroup.svelte +1 -1
- package/dist/components/form/FormField.svelte +5 -44
- package/dist/components/form/FormFieldLight.svelte +5 -44
- package/dist/components/form/FormFieldset.svelte +1 -1
- package/dist/components/form/FormNumberField.svelte +4 -32
- package/dist/components/form/FormRangeField.svelte +17 -7
- package/dist/components/form/FormSelect.svelte +13 -79
- package/dist/components/form/FormTextField.svelte +3 -39
- package/dist/components/form/FormTextarea.svelte +4 -43
- package/dist/components/form/resolveFieldType.d.ts +24 -0
- package/dist/components/form/resolveFieldType.js +55 -0
- package/dist/components/icons/CloseIcon.svelte +6 -0
- package/dist/components/icons/CloseIcon.svelte.d.ts +26 -0
- package/dist/components/nodes/AtomNode.svelte +3 -3
- package/dist/components/nodes/AtomNode.svelte.d.ts +1 -1
- package/dist/components/nodes/GatewayNode.svelte +8 -11
- package/dist/components/nodes/GatewayNode.svelte.d.ts +1 -1
- package/dist/components/nodes/IdeaNode.svelte +10 -8
- package/dist/components/nodes/IdeaNode.svelte.d.ts +8 -4
- package/dist/components/nodes/NotesNode.svelte +6 -4
- package/dist/components/nodes/NotesNode.svelte.d.ts +8 -4
- package/dist/components/nodes/SimpleNode.svelte +10 -8
- package/dist/components/nodes/SimpleNode.svelte.d.ts +4 -4
- package/dist/components/nodes/SquareNode.svelte +10 -8
- package/dist/components/nodes/SquareNode.svelte.d.ts +4 -4
- package/dist/components/nodes/TerminalNode.svelte +10 -8
- package/dist/components/nodes/TerminalNode.svelte.d.ts +4 -4
- package/dist/components/nodes/ToolNode.svelte +10 -8
- package/dist/components/nodes/ToolNode.svelte.d.ts +6 -6
- package/dist/components/nodes/WorkflowNode.svelte +7 -10
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +1 -1
- package/dist/components/playground/InputCollector.svelte +11 -46
- package/dist/components/playground/PipelineKanbanView.svelte +2 -2
- package/dist/components/playground/PipelineTableView.svelte +2 -2
- package/dist/helpers/workflowEditorHelper.js +4 -5
- package/dist/messages/index.d.ts +1 -1
- package/dist/messages/index.js +1 -1
- package/dist/openapi/v1/openapi.yaml +2 -2
- package/dist/registry/nodeComponentRegistry.d.ts +2 -1
- package/dist/services/dynamicSchemaService.d.ts +2 -2
- package/dist/services/dynamicSchemaService.js +8 -8
- package/dist/skins/drafter.js +41 -28
- package/dist/stores/playgroundStore.svelte.js +1 -1
- package/dist/stores/workflowStore.svelte.js +0 -18
- package/dist/styles/base.css +247 -5
- package/dist/styles/tokens.css +6 -0
- package/dist/svelte-app.js +68 -107
- package/dist/types/index.d.ts +6 -7
- package/dist/utils/connections.js +20 -56
- package/dist/utils/nodeIds.d.ts +1 -1
- package/dist/utils/nodeIds.js +1 -1
- package/dist/utils/nodeSwap.js +3 -6
- package/package.json +1 -1
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
import NodeConfigButton from './NodeConfigButton.svelte';
|
|
27
27
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
interface Props {
|
|
30
|
+
id: string;
|
|
30
31
|
data: {
|
|
31
32
|
label: string;
|
|
32
33
|
config: ConfigValues;
|
|
33
34
|
metadata: NodeMetadata;
|
|
34
|
-
nodeId?: string;
|
|
35
35
|
extensions?: NodeExtensions;
|
|
36
36
|
onConfigOpen?: (node: {
|
|
37
37
|
id: string;
|
|
@@ -42,7 +42,9 @@
|
|
|
42
42
|
selected?: boolean;
|
|
43
43
|
isProcessing?: boolean;
|
|
44
44
|
isError?: boolean;
|
|
45
|
-
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let props: Props = $props();
|
|
46
48
|
|
|
47
49
|
const fd = getInstance();
|
|
48
50
|
const checker = fd.portCompatibility;
|
|
@@ -93,7 +95,7 @@
|
|
|
93
95
|
if (props.data.onConfigOpen) {
|
|
94
96
|
// Create a WorkflowNodeType-like object for the global ConfigSidebar
|
|
95
97
|
const nodeForConfig = {
|
|
96
|
-
id: props.
|
|
98
|
+
id: props.id,
|
|
97
99
|
type: 'simple',
|
|
98
100
|
data: props.data
|
|
99
101
|
};
|
|
@@ -132,7 +134,7 @@
|
|
|
132
134
|
hiddenPorts,
|
|
133
135
|
hideUnconnectedHandles,
|
|
134
136
|
fd.workflow.connectedHandles,
|
|
135
|
-
props.
|
|
137
|
+
props.id
|
|
136
138
|
)
|
|
137
139
|
)
|
|
138
140
|
);
|
|
@@ -151,7 +153,7 @@
|
|
|
151
153
|
hiddenPorts,
|
|
152
154
|
hideUnconnectedHandles,
|
|
153
155
|
fd.workflow.connectedHandles,
|
|
154
|
-
props.
|
|
156
|
+
props.id
|
|
155
157
|
)
|
|
156
158
|
)
|
|
157
159
|
);
|
|
@@ -179,7 +181,7 @@
|
|
|
179
181
|
index,
|
|
180
182
|
visibleInputPorts.length
|
|
181
183
|
)}px; transform: translateY(-50%); z-index: 30;"
|
|
182
|
-
id={`${props.
|
|
184
|
+
id={`${props.id}-input-${port.id}`}
|
|
183
185
|
/>
|
|
184
186
|
{/each}
|
|
185
187
|
|
|
@@ -251,7 +253,7 @@
|
|
|
251
253
|
index,
|
|
252
254
|
visibleOutputPorts.length
|
|
253
255
|
)}px; transform: translateY(-50%); z-index: 30;"
|
|
254
|
-
id={`${props.
|
|
256
|
+
id={`${props.id}-output-${port.id}`}
|
|
255
257
|
/>
|
|
256
258
|
{/each}
|
|
257
259
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
|
|
2
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
id: string;
|
|
3
4
|
data: {
|
|
4
5
|
label: string;
|
|
5
6
|
config: ConfigValues;
|
|
6
7
|
metadata: NodeMetadata;
|
|
7
|
-
nodeId?: string;
|
|
8
8
|
extensions?: NodeExtensions;
|
|
9
9
|
onConfigOpen?: (node: {
|
|
10
10
|
id: string;
|
|
@@ -19,7 +19,7 @@ type $$ComponentProps = {
|
|
|
19
19
|
selected?: boolean;
|
|
20
20
|
isProcessing?: boolean;
|
|
21
21
|
isError?: boolean;
|
|
22
|
-
}
|
|
23
|
-
declare const SimpleNode: import("svelte").Component
|
|
22
|
+
}
|
|
23
|
+
declare const SimpleNode: import("svelte").Component<Props, {}, "">;
|
|
24
24
|
type SimpleNode = ReturnType<typeof SimpleNode>;
|
|
25
25
|
export default SimpleNode;
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
import NodeConfigButton from './NodeConfigButton.svelte';
|
|
28
28
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
interface Props {
|
|
31
|
+
id: string;
|
|
31
32
|
data: {
|
|
32
33
|
label: string;
|
|
33
34
|
config: ConfigValues;
|
|
34
35
|
metadata: NodeMetadata;
|
|
35
|
-
nodeId?: string;
|
|
36
36
|
extensions?: NodeExtensions;
|
|
37
37
|
onConfigOpen?: (node: {
|
|
38
38
|
id: string;
|
|
@@ -43,7 +43,9 @@
|
|
|
43
43
|
selected?: boolean;
|
|
44
44
|
isProcessing?: boolean;
|
|
45
45
|
isError?: boolean;
|
|
46
|
-
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let props: Props = $props();
|
|
47
49
|
|
|
48
50
|
const fd = getInstance();
|
|
49
51
|
const checker = fd.portCompatibility;
|
|
@@ -84,7 +86,7 @@
|
|
|
84
86
|
if (props.data.onConfigOpen) {
|
|
85
87
|
// Create a WorkflowNodeType-like object for the global ConfigSidebar
|
|
86
88
|
const nodeForConfig = {
|
|
87
|
-
id: props.
|
|
89
|
+
id: props.id,
|
|
88
90
|
type: 'square',
|
|
89
91
|
data: props.data
|
|
90
92
|
};
|
|
@@ -128,7 +130,7 @@
|
|
|
128
130
|
hiddenPorts,
|
|
129
131
|
hideUnconnectedHandles,
|
|
130
132
|
fd.workflow.connectedHandles,
|
|
131
|
-
props.
|
|
133
|
+
props.id
|
|
132
134
|
)
|
|
133
135
|
)
|
|
134
136
|
);
|
|
@@ -147,7 +149,7 @@
|
|
|
147
149
|
hiddenPorts,
|
|
148
150
|
hideUnconnectedHandles,
|
|
149
151
|
fd.workflow.connectedHandles,
|
|
150
|
-
props.
|
|
152
|
+
props.id
|
|
151
153
|
)
|
|
152
154
|
)
|
|
153
155
|
);
|
|
@@ -176,7 +178,7 @@
|
|
|
176
178
|
index,
|
|
177
179
|
visibleInputPorts.length
|
|
178
180
|
)}px; transform: translateY(-50%); z-index: 30;"
|
|
179
|
-
id={`${props.
|
|
181
|
+
id={`${props.id}-input-${port.id}`}
|
|
180
182
|
/>
|
|
181
183
|
{/each}
|
|
182
184
|
|
|
@@ -242,7 +244,7 @@
|
|
|
242
244
|
index,
|
|
243
245
|
visibleOutputPorts.length
|
|
244
246
|
)}px; transform: translateY(-50%); z-index: 30;"
|
|
245
|
-
id={`${props.
|
|
247
|
+
id={`${props.id}-output-${port.id}`}
|
|
246
248
|
/>
|
|
247
249
|
{/each}
|
|
248
250
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
|
|
2
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
id: string;
|
|
3
4
|
data: {
|
|
4
5
|
label: string;
|
|
5
6
|
config: ConfigValues;
|
|
6
7
|
metadata: NodeMetadata;
|
|
7
|
-
nodeId?: string;
|
|
8
8
|
extensions?: NodeExtensions;
|
|
9
9
|
onConfigOpen?: (node: {
|
|
10
10
|
id: string;
|
|
@@ -19,7 +19,7 @@ type $$ComponentProps = {
|
|
|
19
19
|
selected?: boolean;
|
|
20
20
|
isProcessing?: boolean;
|
|
21
21
|
isError?: boolean;
|
|
22
|
-
}
|
|
23
|
-
declare const SquareNode: import("svelte").Component
|
|
22
|
+
}
|
|
23
|
+
declare const SquareNode: import("svelte").Component<Props, {}, "">;
|
|
24
24
|
type SquareNode = ReturnType<typeof SquareNode>;
|
|
25
25
|
export default SquareNode;
|
|
@@ -66,12 +66,12 @@
|
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
interface Props {
|
|
70
|
+
id: string;
|
|
70
71
|
data: {
|
|
71
72
|
label: string;
|
|
72
73
|
config: ConfigValues;
|
|
73
74
|
metadata: NodeMetadata;
|
|
74
|
-
nodeId?: string;
|
|
75
75
|
extensions?: NodeExtensions;
|
|
76
76
|
onConfigOpen?: (node: {
|
|
77
77
|
id: string;
|
|
@@ -82,7 +82,9 @@
|
|
|
82
82
|
selected?: boolean;
|
|
83
83
|
isProcessing?: boolean;
|
|
84
84
|
isError?: boolean;
|
|
85
|
-
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
let props: Props = $props();
|
|
86
88
|
|
|
87
89
|
const fd = getInstance();
|
|
88
90
|
const checker = fd.portCompatibility;
|
|
@@ -111,7 +113,7 @@
|
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
// Check metadata id/name for hints
|
|
114
|
-
const idLower = (props.data.metadata?.
|
|
116
|
+
const idLower = (props.data.metadata?.node_type_id || '').toLowerCase();
|
|
115
117
|
const nameLower = (props.data.metadata?.name || '').toLowerCase();
|
|
116
118
|
if (idLower.includes('start') || nameLower.includes('start')) {
|
|
117
119
|
return 'start';
|
|
@@ -159,7 +161,7 @@
|
|
|
159
161
|
if (port.required) {
|
|
160
162
|
return true;
|
|
161
163
|
}
|
|
162
|
-
const handleId = `${props.
|
|
164
|
+
const handleId = `${props.id}-${type}-${port.id}`;
|
|
163
165
|
return fd.workflow.connectedHandles.has(handleId);
|
|
164
166
|
}
|
|
165
167
|
|
|
@@ -298,7 +300,7 @@
|
|
|
298
300
|
function openConfigSidebar(): void {
|
|
299
301
|
if (props.data.onConfigOpen) {
|
|
300
302
|
const nodeForConfig = {
|
|
301
|
-
id: props.
|
|
303
|
+
id: props.id,
|
|
302
304
|
type: 'terminal',
|
|
303
305
|
data: props.data
|
|
304
306
|
};
|
|
@@ -346,7 +348,7 @@
|
|
|
346
348
|
checker,
|
|
347
349
|
port.dataType
|
|
348
350
|
)}; --fd-handle-border-color: var(--fd-handle-border); left: {pos.left}px; top: {pos.top}px; transform: translate(-50%, -50%); z-index: 30;"
|
|
349
|
-
id={`${props.
|
|
351
|
+
id={`${props.id}-input-${port.id}`}
|
|
350
352
|
/>
|
|
351
353
|
{/each}
|
|
352
354
|
{/if}
|
|
@@ -365,7 +367,7 @@
|
|
|
365
367
|
<Handle
|
|
366
368
|
type="source"
|
|
367
369
|
position={Position.Right}
|
|
368
|
-
id={`${props.
|
|
370
|
+
id={`${props.id}-output-${port.id}`}
|
|
369
371
|
style="--fd-handle-fill: {getDataTypeColor(
|
|
370
372
|
checker,
|
|
371
373
|
port.dataType
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
|
|
2
|
-
|
|
2
|
+
interface Props {
|
|
3
|
+
id: string;
|
|
3
4
|
data: {
|
|
4
5
|
label: string;
|
|
5
6
|
config: ConfigValues;
|
|
6
7
|
metadata: NodeMetadata;
|
|
7
|
-
nodeId?: string;
|
|
8
8
|
extensions?: NodeExtensions;
|
|
9
9
|
onConfigOpen?: (node: {
|
|
10
10
|
id: string;
|
|
@@ -19,7 +19,7 @@ type $$ComponentProps = {
|
|
|
19
19
|
selected?: boolean;
|
|
20
20
|
isProcessing?: boolean;
|
|
21
21
|
isError?: boolean;
|
|
22
|
-
}
|
|
23
|
-
declare const TerminalNode: import("svelte").Component
|
|
22
|
+
}
|
|
23
|
+
declare const TerminalNode: import("svelte").Component<Props, {}, "">;
|
|
24
24
|
type TerminalNode = ReturnType<typeof TerminalNode>;
|
|
25
25
|
export default TerminalNode;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import Icon from '@iconify/svelte';
|
|
10
10
|
import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors';
|
|
11
11
|
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
12
|
-
import type { NodeMetadata, NodePort } from '../../types/index.js';
|
|
12
|
+
import type { ConfigValues, NodeMetadata, NodePort } from '../../types/index.js';
|
|
13
13
|
import NodeConfigButton from './NodeConfigButton.svelte';
|
|
14
14
|
import AlertCircleIcon from '../icons/AlertCircleIcon.svelte';
|
|
15
15
|
|
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
description?: string;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
interface Props {
|
|
23
|
+
id: string;
|
|
23
24
|
data: {
|
|
24
25
|
label: string;
|
|
25
|
-
config: {
|
|
26
|
+
config: ConfigValues & {
|
|
26
27
|
icon?: string;
|
|
27
28
|
color?: string;
|
|
28
29
|
toolName?: string;
|
|
@@ -31,7 +32,6 @@
|
|
|
31
32
|
parameters?: ToolNodeParameter[];
|
|
32
33
|
};
|
|
33
34
|
metadata: NodeMetadata;
|
|
34
|
-
nodeId?: string;
|
|
35
35
|
onConfigOpen?: (node: {
|
|
36
36
|
id: string;
|
|
37
37
|
type: string;
|
|
@@ -45,7 +45,9 @@
|
|
|
45
45
|
selected?: boolean;
|
|
46
46
|
isProcessing?: boolean;
|
|
47
47
|
isError?: boolean;
|
|
48
|
-
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
let props: Props = $props();
|
|
49
51
|
|
|
50
52
|
const fd = getInstance();
|
|
51
53
|
const checker = fd.portCompatibility;
|
|
@@ -142,7 +144,7 @@
|
|
|
142
144
|
if (props.data.onConfigOpen) {
|
|
143
145
|
// Create a WorkflowNodeType-like object for the global ConfigSidebar
|
|
144
146
|
const nodeForConfig = {
|
|
145
|
-
id: props.
|
|
147
|
+
id: props.id,
|
|
146
148
|
type: 'tool',
|
|
147
149
|
data: props.data
|
|
148
150
|
};
|
|
@@ -163,7 +165,7 @@
|
|
|
163
165
|
<Handle
|
|
164
166
|
type="target"
|
|
165
167
|
position={Position.Left}
|
|
166
|
-
id={`${props.
|
|
168
|
+
id={`${props.id}-input-${toolInputPort.id}`}
|
|
167
169
|
style="top: {firstPortTop}px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
168
170
|
checker,
|
|
169
171
|
portDataType
|
|
@@ -239,7 +241,7 @@
|
|
|
239
241
|
<Handle
|
|
240
242
|
type="source"
|
|
241
243
|
position={Position.Right}
|
|
242
|
-
id={`${props.
|
|
244
|
+
id={`${props.id}-output-${toolOutputPort.id}`}
|
|
243
245
|
style="top: {firstPortTop}px; transform: translateY(-50%); z-index: 30; --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
|
|
244
246
|
checker,
|
|
245
247
|
portDataType
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type { NodeMetadata } from '../../types/index.js';
|
|
1
|
+
import type { ConfigValues, NodeMetadata } from '../../types/index.js';
|
|
2
2
|
interface ToolNodeParameter {
|
|
3
3
|
name: string;
|
|
4
4
|
type?: string;
|
|
5
5
|
description?: string;
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
interface Props {
|
|
8
|
+
id: string;
|
|
8
9
|
data: {
|
|
9
10
|
label: string;
|
|
10
|
-
config: {
|
|
11
|
+
config: ConfigValues & {
|
|
11
12
|
icon?: string;
|
|
12
13
|
color?: string;
|
|
13
14
|
toolName?: string;
|
|
@@ -16,7 +17,6 @@ type $$ComponentProps = {
|
|
|
16
17
|
parameters?: ToolNodeParameter[];
|
|
17
18
|
};
|
|
18
19
|
metadata: NodeMetadata;
|
|
19
|
-
nodeId?: string;
|
|
20
20
|
onConfigOpen?: (node: {
|
|
21
21
|
id: string;
|
|
22
22
|
type: string;
|
|
@@ -30,7 +30,7 @@ type $$ComponentProps = {
|
|
|
30
30
|
selected?: boolean;
|
|
31
31
|
isProcessing?: boolean;
|
|
32
32
|
isError?: boolean;
|
|
33
|
-
}
|
|
34
|
-
declare const ToolNode: import("svelte").Component
|
|
33
|
+
}
|
|
34
|
+
declare const ToolNode: import("svelte").Component<Props, {}, "">;
|
|
35
35
|
type ToolNode = ReturnType<typeof ToolNode>;
|
|
36
36
|
export default ToolNode;
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
import { m } from '../../messages/index.js';
|
|
28
28
|
|
|
29
29
|
interface Props {
|
|
30
|
+
id: string;
|
|
30
31
|
data: WorkflowNode['data'] & {
|
|
31
|
-
nodeId?: string;
|
|
32
32
|
onConfigOpen?: (node: { id: string; type: string; data: WorkflowNode['data'] }) => void;
|
|
33
33
|
};
|
|
34
34
|
selected?: boolean;
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
// Check if port is connected
|
|
150
|
-
const handleId = `${props.
|
|
150
|
+
const handleId = `${props.id}-${type}-${port.id}`;
|
|
151
151
|
return fd.workflow.connectedHandles.has(handleId);
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -179,7 +179,7 @@
|
|
|
179
179
|
if (props.data.onConfigOpen) {
|
|
180
180
|
// Create a WorkflowNodeType-like object for the global ConfigSidebar
|
|
181
181
|
const nodeForConfig = {
|
|
182
|
-
id: props.
|
|
182
|
+
id: props.id,
|
|
183
183
|
type: 'workflowNode',
|
|
184
184
|
data: props.data
|
|
185
185
|
};
|
|
@@ -201,7 +201,7 @@
|
|
|
201
201
|
}}
|
|
202
202
|
data-handle-interaction={isHandleInteraction}
|
|
203
203
|
aria-label={graph.workflowNode({ name: props.data.metadata.name })}
|
|
204
|
-
aria-describedby="node-description-{props.
|
|
204
|
+
aria-describedby="node-description-{props.id}"
|
|
205
205
|
>
|
|
206
206
|
<!-- Default Node Header: expands in multiples of 10 (title row 40px + gap 10px + description 20px per line) -->
|
|
207
207
|
<div class="flowdrop-workflow-node__header">
|
|
@@ -231,10 +231,7 @@
|
|
|
231
231
|
<div class="flowdrop-flex flowdrop-gap--2 flowdrop-items--center"></div>
|
|
232
232
|
</div>
|
|
233
233
|
<!-- Node Description - line-height 20px so header grows in steps of 10 -->
|
|
234
|
-
<p
|
|
235
|
-
class="flowdrop-workflow-node__header-desc"
|
|
236
|
-
id="node-description-{props.data.nodeId || 'unknown'}"
|
|
237
|
-
>
|
|
234
|
+
<p class="flowdrop-workflow-node__header-desc" id="node-description-{props.id}">
|
|
238
235
|
{displayDescription}
|
|
239
236
|
</p>
|
|
240
237
|
</div>
|
|
@@ -249,7 +246,7 @@
|
|
|
249
246
|
<Handle
|
|
250
247
|
type="target"
|
|
251
248
|
position={Position.Left}
|
|
252
|
-
id={`${props.
|
|
249
|
+
id={`${props.id}-input-${port.id}`}
|
|
253
250
|
class="flowdrop-workflow-node__handle"
|
|
254
251
|
style="top: var(--fd-node-port-row-height); transform: translateY(-50%); --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColorToken(
|
|
255
252
|
checker,
|
|
@@ -330,7 +327,7 @@
|
|
|
330
327
|
<Handle
|
|
331
328
|
type="source"
|
|
332
329
|
position={Position.Right}
|
|
333
|
-
id={`${props.
|
|
330
|
+
id={`${props.id}-output-${port.id}`}
|
|
334
331
|
class="flowdrop-workflow-node__handle"
|
|
335
332
|
style="top: var(--fd-node-port-row-height); transform: translateY(-50%); --fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColorToken(
|
|
336
333
|
checker,
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import Icon from '@iconify/svelte';
|
|
11
|
+
import Input from '../Input.svelte';
|
|
12
|
+
import Select from '../Select.svelte';
|
|
13
|
+
import Textarea from '../Textarea.svelte';
|
|
11
14
|
import { slide } from 'svelte/transition';
|
|
12
15
|
import type { PlaygroundInputField } from '../../types/playground.js';
|
|
13
16
|
import { getInstance } from '../../stores/getInstance.svelte.js';
|
|
@@ -171,9 +174,8 @@
|
|
|
171
174
|
|
|
172
175
|
{#if hasEnumOptions(field)}
|
|
173
176
|
<!-- Select for enum fields -->
|
|
174
|
-
<
|
|
177
|
+
<Select
|
|
175
178
|
id="input-{field.nodeId}-{field.fieldId}"
|
|
176
|
-
class="input-collector__select"
|
|
177
179
|
value={getValue(field)}
|
|
178
180
|
onchange={(e) => updateValue(field, e.currentTarget.value)}
|
|
179
181
|
>
|
|
@@ -181,17 +183,16 @@
|
|
|
181
183
|
{#each field.schema?.enum ?? [] as option (option)}
|
|
182
184
|
<option value={String(option)}>{option}</option>
|
|
183
185
|
{/each}
|
|
184
|
-
</
|
|
186
|
+
</Select>
|
|
185
187
|
{:else if getInputType(field) === 'textarea'}
|
|
186
188
|
<!-- Textarea for multiline -->
|
|
187
|
-
<
|
|
189
|
+
<Textarea
|
|
188
190
|
id="input-{field.nodeId}-{field.fieldId}"
|
|
189
|
-
class="input-collector__textarea"
|
|
190
191
|
placeholder={field.schema?.description ?? `Enter ${field.label}`}
|
|
191
192
|
value={String(getValue(field) ?? '')}
|
|
192
193
|
oninput={(e) => updateValue(field, e.currentTarget.value)}
|
|
193
|
-
rows=
|
|
194
|
-
|
|
194
|
+
rows={3}
|
|
195
|
+
/>
|
|
195
196
|
{:else if getInputType(field) === 'checkbox'}
|
|
196
197
|
<!-- Checkbox for boolean -->
|
|
197
198
|
<label class="input-collector__checkbox-wrapper">
|
|
@@ -208,10 +209,10 @@
|
|
|
208
209
|
</label>
|
|
209
210
|
{:else if getInputType(field) === 'number'}
|
|
210
211
|
<!-- Number input -->
|
|
211
|
-
<
|
|
212
|
+
<Input
|
|
212
213
|
id="input-{field.nodeId}-{field.fieldId}"
|
|
213
214
|
type="number"
|
|
214
|
-
class="input
|
|
215
|
+
class="flowdrop-input--numeric"
|
|
215
216
|
placeholder={field.schema?.description ?? `Enter ${field.label}`}
|
|
216
217
|
value={Number(getValue(field) ?? 0)}
|
|
217
218
|
min={field.schema?.minimum}
|
|
@@ -220,10 +221,9 @@
|
|
|
220
221
|
/>
|
|
221
222
|
{:else}
|
|
222
223
|
<!-- Text input (default) -->
|
|
223
|
-
<
|
|
224
|
+
<Input
|
|
224
225
|
id="input-{field.nodeId}-{field.fieldId}"
|
|
225
226
|
type="text"
|
|
226
|
-
class="input-collector__input"
|
|
227
227
|
placeholder={field.schema?.description ?? `Enter ${field.label}`}
|
|
228
228
|
value={String(getValue(field) ?? '')}
|
|
229
229
|
oninput={(e) => updateValue(field, e.currentTarget.value)}
|
|
@@ -351,41 +351,6 @@
|
|
|
351
351
|
color: var(--fd-error);
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
-
.input-collector__input,
|
|
355
|
-
.input-collector__select,
|
|
356
|
-
.input-collector__textarea {
|
|
357
|
-
padding: var(--fd-space-xs) var(--fd-space-md);
|
|
358
|
-
border: 1px solid var(--fd-border);
|
|
359
|
-
border-radius: var(--fd-radius-lg);
|
|
360
|
-
font-size: var(--fd-text-sm);
|
|
361
|
-
font-family: inherit;
|
|
362
|
-
color: var(--fd-foreground);
|
|
363
|
-
background-color: var(--fd-background);
|
|
364
|
-
transition:
|
|
365
|
-
border-color var(--fd-transition-normal),
|
|
366
|
-
box-shadow var(--fd-transition-normal);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
.input-collector__input:focus,
|
|
370
|
-
.input-collector__select:focus,
|
|
371
|
-
.input-collector__textarea:focus {
|
|
372
|
-
border-color: var(--fd-primary);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
.input-collector__input::placeholder,
|
|
376
|
-
.input-collector__textarea::placeholder {
|
|
377
|
-
color: var(--fd-muted-foreground);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
.input-collector__textarea {
|
|
381
|
-
resize: vertical;
|
|
382
|
-
min-height: 80px;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
.input-collector__select {
|
|
386
|
-
cursor: pointer;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
354
|
.input-collector__checkbox-wrapper {
|
|
390
355
|
display: flex;
|
|
391
356
|
align-items: center;
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
nodesByColumn.get(colKey)?.push({
|
|
109
109
|
key: job.id,
|
|
110
110
|
label: job.label || node.data.label,
|
|
111
|
-
typeId: node.data.metadata.
|
|
111
|
+
typeId: node.data.metadata.node_type_id,
|
|
112
112
|
status,
|
|
113
113
|
durationUs: job.executionTimeUs
|
|
114
114
|
});
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
nodesByColumn.get(colKey)?.push({
|
|
123
123
|
key: node.id,
|
|
124
124
|
label: node.data.label,
|
|
125
|
-
typeId: node.data.metadata.
|
|
125
|
+
typeId: node.data.metadata.node_type_id,
|
|
126
126
|
status
|
|
127
127
|
});
|
|
128
128
|
}
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
jobRows.push({
|
|
112
112
|
key: job.id,
|
|
113
113
|
label: job.label || node.data.label,
|
|
114
|
-
typeId: node.data.metadata.
|
|
114
|
+
typeId: node.data.metadata.node_type_id,
|
|
115
115
|
nodeId: job.nodeId,
|
|
116
116
|
status: resolveStatus({ status: job.status }),
|
|
117
117
|
started: job.started,
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
return {
|
|
138
138
|
key: node.id,
|
|
139
139
|
label: node.data.label,
|
|
140
|
-
typeId: node.data.metadata.
|
|
140
|
+
typeId: node.data.metadata.node_type_id,
|
|
141
141
|
nodeId: node.id,
|
|
142
142
|
status: resolveStatus(statusData),
|
|
143
143
|
started: statusData?.last_executed,
|
|
@@ -63,7 +63,7 @@ export class NodeOperationsHelper {
|
|
|
63
63
|
// Use fallback sample nodes
|
|
64
64
|
return [
|
|
65
65
|
{
|
|
66
|
-
|
|
66
|
+
node_type_id: 'text-input',
|
|
67
67
|
name: 'Text Input',
|
|
68
68
|
category: 'inputs',
|
|
69
69
|
description: 'Simple text input field',
|
|
@@ -73,7 +73,7 @@ export class NodeOperationsHelper {
|
|
|
73
73
|
outputs: [{ id: 'text', name: 'text', type: 'output', dataType: 'string' }]
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
|
|
76
|
+
node_type_id: 'text-output',
|
|
77
77
|
name: 'Text Output',
|
|
78
78
|
category: 'outputs',
|
|
79
79
|
description: 'Display text output',
|
|
@@ -128,7 +128,7 @@ export class NodeOperationsHelper {
|
|
|
128
128
|
};
|
|
129
129
|
}
|
|
130
130
|
// Generate node ID based on node type and existing nodes
|
|
131
|
-
const newNodeId = generateNodeId(nodeType.
|
|
131
|
+
const newNodeId = generateNodeId(nodeType.node_type_id, existingNodes);
|
|
132
132
|
// All nodes use "universalNode" type
|
|
133
133
|
// UniversalNode component handles internal switching based on metadata and config
|
|
134
134
|
const newNode = {
|
|
@@ -137,8 +137,7 @@ export class NodeOperationsHelper {
|
|
|
137
137
|
position, // Use the position calculated from the drop event
|
|
138
138
|
deletable: true,
|
|
139
139
|
data: {
|
|
140
|
-
...nodeData
|
|
141
|
-
nodeId: newNodeId // Use the same ID
|
|
140
|
+
...nodeData
|
|
142
141
|
}
|
|
143
142
|
};
|
|
144
143
|
return newNode;
|
package/dist/messages/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Messages module — typed, overridable, translation-ready user-facing strings.
|
|
3
3
|
*
|
|
4
4
|
* See `./defaults.ts` for the canonical shape, `./context.ts` for the runtime
|
|
5
|
-
* plumbing, and the i18n guide in
|
|
5
|
+
* plumbing, and the i18n guide in the docs site (`.docs/`) for consumer recipes.
|
|
6
6
|
*/
|
|
7
7
|
export { defaultMessages } from './defaults.js';
|
|
8
8
|
export { mergeMessages } from './merge.js';
|
package/dist/messages/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Messages module — typed, overridable, translation-ready user-facing strings.
|
|
3
3
|
*
|
|
4
4
|
* See `./defaults.ts` for the canonical shape, `./context.ts` for the runtime
|
|
5
|
-
* plumbing, and the i18n guide in
|
|
5
|
+
* plumbing, and the i18n guide in the docs site (`.docs/`) for consumer recipes.
|
|
6
6
|
*/
|
|
7
7
|
export { defaultMessages } from './defaults.js';
|
|
8
8
|
export { mergeMessages } from './merge.js';
|
|
@@ -37,8 +37,8 @@ info:
|
|
|
37
37
|
email: shibinkidd@gmail.com
|
|
38
38
|
url: https://www.drupal.org/project/issues/flowdrop?categories=All
|
|
39
39
|
servers:
|
|
40
|
-
- url: http://localhost:
|
|
41
|
-
description: Local development server
|
|
40
|
+
- url: http://localhost:7104/api/flowdrop
|
|
41
|
+
description: Local development server
|
|
42
42
|
- url: https://flowdrop.ddev.site/api/flowdrop
|
|
43
43
|
description: Local Drupal server
|
|
44
44
|
security:
|