windmill-components 1.379.4 → 1.382.3
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/package/base.d.ts +1 -1
- package/package/base.js +1 -1
- package/package/components/ArgInput.svelte +33 -3
- package/package/components/DisplayResult.svelte +17 -5
- package/package/components/EditorBar.svelte +48 -38
- package/package/components/EditorBar.svelte.d.ts +2 -0
- package/package/components/ErrorOrRecoveryHandler.svelte +3 -2
- package/package/components/FlowBuilder.svelte +18 -12
- package/package/components/FlowBuilder.svelte.d.ts +3 -2
- package/package/components/FlowGraphViewer.svelte +6 -5
- package/package/components/FlowJobResult.svelte +4 -2
- package/package/components/FlowJobResult.svelte.d.ts +2 -0
- package/package/components/FlowStatusViewer.svelte +7 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
- package/package/components/FlowStatusViewerInner.svelte +29 -11
- package/package/components/FlowViewer.svelte +3 -1
- package/package/components/FlowViewer.svelte.d.ts +1 -0
- package/package/components/HighlightCode.svelte +2 -2
- package/package/components/ModulePreviewForm.svelte +1 -1
- package/package/components/ObjectResourceInput.svelte +7 -2
- package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
- package/package/components/ResourcePicker.svelte +60 -48
- package/package/components/ScriptBuilder.svelte +42 -36
- package/package/components/ScriptBuilder.svelte.d.ts +2 -0
- package/package/components/ScriptEditor.svelte +3 -1
- package/package/components/ScriptEditor.svelte.d.ts +2 -0
- package/package/components/ScriptVersionHistory.svelte +63 -7
- package/package/components/apps/components/display/AppText.svelte +8 -3
- package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +3 -2
- package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +22 -5
- package/package/components/apps/components/display/table/AppAggridTable.svelte +14 -5
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +23 -8
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +5 -3
- package/package/components/apps/components/display/table/utils.js +8 -7
- package/package/components/apps/components/helpers/RunnableComponent.svelte +13 -1
- package/package/components/apps/components/helpers/eval.js +31 -25
- package/package/components/apps/components/inputs/AppSelect.svelte +45 -29
- package/package/components/apps/editor/AppEditorHeader.svelte +1 -0
- package/package/components/apps/editor/AppReportsDrawer.svelte +4 -3
- package/package/components/apps/editor/component/components.d.ts +7 -1
- package/package/components/apps/editor/component/components.js +6 -0
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte +55 -45
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte.d.ts +7 -9
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +66 -59
- package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +9 -11
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +213 -254
- package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte.d.ts +0 -1
- package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.d.ts +1 -1
- package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.js +2 -6
- package/package/components/custom_ui.d.ts +35 -1
- package/package/components/details/DetailPageDetailPanel.svelte +9 -1
- package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
- package/package/components/details/DetailPageLayout.svelte +2 -0
- package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
- package/package/components/details/EmailTriggerPanel.svelte +128 -0
- package/package/components/details/EmailTriggerPanel.svelte.d.ts +20 -0
- package/package/components/details/WebhooksPanel.svelte +10 -71
- package/package/components/flows/FlowHistory.svelte +1 -0
- package/package/components/flows/content/FlowInputs.svelte +0 -1
- package/package/components/flows/content/FlowModuleComponent.svelte +8 -2
- package/package/components/flows/content/FlowModuleEarlyStop.svelte +193 -66
- package/package/components/flows/content/FlowModuleHeader.svelte +1 -1
- package/package/components/flows/content/FlowModuleScript.svelte +33 -3
- package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
- package/package/components/flows/content/FlowModuleSuspend.svelte +15 -0
- package/package/components/flows/content/FlowSettings.svelte +26 -15
- package/package/components/flows/flowExplorer.js +3 -0
- package/package/components/flows/flowInfers.js +1 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +39 -44
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +4 -3
- package/package/components/flows/map/InsertModuleButton.svelte +16 -9
- package/package/components/flows/map/MapItem.svelte +4 -98
- package/package/components/flows/map/MapItem.svelte.d.ts +0 -5
- package/package/components/flows/map/VirtualItem.svelte +6 -159
- package/package/components/flows/map/VirtualItem.svelte.d.ts +0 -15
- package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
- package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
- package/package/components/flows/types.d.ts +2 -0
- package/package/components/graph/FlowGraphV2.svelte +256 -0
- package/package/components/graph/{FlowGraph.svelte.d.ts → FlowGraphV2.svelte.d.ts} +8 -8
- package/package/components/graph/graphBuilder.d.ts +15 -0
- package/package/components/graph/graphBuilder.js +337 -0
- package/package/components/graph/index.d.ts +0 -1
- package/package/components/graph/index.js +0 -1
- package/package/components/graph/model.d.ts +4 -8
- package/package/components/graph/renderers/edges/BaseEdge.svelte +109 -0
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +35 -0
- package/package/components/graph/renderers/edges/DataflowEdge.svelte +37 -0
- package/package/components/graph/renderers/edges/DataflowEdge.svelte.d.ts +29 -0
- package/package/components/graph/renderers/edges/EmptyEdge.svelte +22 -0
- package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +23 -0
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte +44 -0
- package/package/components/graph/renderers/nodes/BranchAllStart.svelte.d.ts +29 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte +41 -0
- package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +29 -0
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +20 -0
- package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte.d.ts +25 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte +74 -0
- package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +23 -0
- package/package/components/graph/renderers/nodes/ModuleNode.svelte +71 -0
- package/package/components/graph/renderers/nodes/ModuleNode.svelte.d.ts +41 -0
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte +20 -0
- package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +27 -0
- package/package/components/graph/renderers/nodes/NodeWrapper.svelte +21 -0
- package/package/components/graph/renderers/nodes/NodeWrapper.svelte.d.ts +22 -0
- package/package/components/graph/renderers/nodes/ResultNode.svelte +24 -0
- package/package/components/graph/renderers/nodes/ResultNode.svelte.d.ts +22 -0
- package/package/components/graph/renderers/nodes/branchAllEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/branchAllEndNode.svelte.d.ts +26 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +19 -0
- package/package/components/graph/renderers/nodes/branchOneEndNode.svelte.d.ts +24 -0
- package/package/components/graph/renderers/utils.d.ts +8 -0
- package/package/components/graph/renderers/utils.js +26 -0
- package/package/components/graph/util.d.ts +1 -2
- package/package/components/graph/util.js +2 -8
- package/package/components/propertyPicker/PropPickerResult.svelte +6 -1
- package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
- package/package/components/runs/RunsFilter.svelte +15 -17
- package/package/components/sidebar/changelogs.js +5 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +3 -0
- package/package/gen/schemas.gen.js +3 -0
- package/package/gen/services.gen.d.ts +22 -3
- package/package/gen/services.gen.js +38 -2
- package/package/gen/types.gen.d.ts +69 -6
- package/package/hub.d.ts +11 -0
- package/package/hub.js +2 -0
- package/package/hubPaths.json +9 -0
- package/package/init_scripts/python_failure_module.d.ts +1 -1
- package/package/init_scripts/python_failure_module.js +4 -3
- package/package/script_helpers.d.ts +2 -2
- package/package/script_helpers.js +11 -9
- package/package.json +2 -1
- package/package/components/graph/FlowGraph.svelte +0 -614
- package/package/components/graph/svelvet/LICENSE +0 -21
- package/package/components/graph/svelvet/container/README.md +0 -7
- package/package/components/graph/svelvet/container/controllers/middleware.d.ts +0 -11
- package/package/components/graph/svelvet/container/controllers/middleware.js +0 -87
- package/package/components/graph/svelvet/container/models/index.d.ts +0 -0
- package/package/components/graph/svelvet/container/models/index.js +0 -1
- package/package/components/graph/svelvet/container/views/GraphView.svelte +0 -262
- package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +0 -26
- package/package/components/graph/svelvet/container/views/Svelvet.svelte +0 -121
- package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +0 -36
- package/package/components/graph/svelvet/customCss/controllers/getCss.d.ts +0 -2
- package/package/components/graph/svelvet/customCss/controllers/getCss.js +0 -46
- package/package/components/graph/svelvet/d3/controllers/d3.d.ts +0 -5
- package/package/components/graph/svelvet/d3/controllers/d3.js +0 -59
- package/package/components/graph/svelvet/edges/controllers/anchorCbDev.d.ts +0 -4
- package/package/components/graph/svelvet/edges/controllers/anchorCbDev.js +0 -92
- package/package/components/graph/svelvet/edges/controllers/anchorCbUser.d.ts +0 -57
- package/package/components/graph/svelvet/edges/controllers/anchorCbUser.js +0 -73
- package/package/components/graph/svelvet/edges/controllers/util.d.ts +0 -37
- package/package/components/graph/svelvet/edges/controllers/util.js +0 -71
- package/package/components/graph/svelvet/edges/models/Anchor.d.ts +0 -48
- package/package/components/graph/svelvet/edges/models/Anchor.js +0 -122
- package/package/components/graph/svelvet/edges/models/Edge.d.ts +0 -48
- package/package/components/graph/svelvet/edges/models/Edge.js +0 -109
- package/package/components/graph/svelvet/edges/types/types.d.ts +0 -18
- package/package/components/graph/svelvet/edges/types/types.js +0 -1
- package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte +0 -104
- package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte.d.ts +0 -18
- package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +0 -42
- package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte.d.ts +0 -17
- package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +0 -151
- package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte.d.ts +0 -17
- package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte +0 -157
- package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte.d.ts +0 -60
- package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte +0 -8
- package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte.d.ts +0 -25
- package/package/components/graph/svelvet/edges/views/Edges/types.d.ts +0 -52
- package/package/components/graph/svelvet/edges/views/Edges/types.js +0 -1
- package/package/components/graph/svelvet/edges/views/Edges/utils.d.ts +0 -33
- package/package/components/graph/svelvet/edges/views/Edges/utils.js +0 -31
- package/package/components/graph/svelvet/nodes/controllers/util.d.ts +0 -9
- package/package/components/graph/svelvet/nodes/controllers/util.js +0 -13
- package/package/components/graph/svelvet/nodes/models/Node.d.ts +0 -74
- package/package/components/graph/svelvet/nodes/models/Node.js +0 -156
- package/package/components/graph/svelvet/nodes/views/Node.svelte +0 -84
- package/package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -21
- package/package/components/graph/svelvet/store/controllers/storeApi.d.ts +0 -25
- package/package/components/graph/svelvet/store/controllers/storeApi.js +0 -91
- package/package/components/graph/svelvet/store/controllers/userApi.d.ts +0 -3
- package/package/components/graph/svelvet/store/controllers/userApi.js +0 -18
- package/package/components/graph/svelvet/store/controllers/util.d.ts +0 -24
- package/package/components/graph/svelvet/store/controllers/util.js +0 -148
- package/package/components/graph/svelvet/store/models/store.d.ts +0 -13
- package/package/components/graph/svelvet/store/models/store.js +0 -12
- package/package/components/graph/svelvet/store/types/types.d.ts +0 -127
- package/package/components/graph/svelvet/store/types/types.js +0 -1
- package/package/components/graph/svelvet/types/README.md +0 -3
- package/package/components/graph/svelvet/types/index.d.ts +0 -2
- package/package/components/graph/svelvet/types/index.js +0 -1
- package/package/components/graph/svelvet/types/types.d.ts +0 -50
- package/package/components/graph/svelvet/types/types.js +0 -18
package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte
CHANGED
|
@@ -1,110 +1,21 @@
|
|
|
1
|
-
<script>import
|
|
2
|
-
import { NODE } from '../../../../graph';
|
|
3
|
-
import { createEventDispatcher, getContext, onMount } from 'svelte';
|
|
1
|
+
<script>import { NODE } from '../../../../graph';
|
|
4
2
|
import { sugiyama, dagStratify, decrossOpt, coordCenter } from 'd3-dag';
|
|
5
|
-
import {
|
|
3
|
+
import { SvelteFlow, ConnectionLineType, Controls } from '@xyflow/svelte';
|
|
4
|
+
import { addNewBranch, addNode, getFirstNode, getParents, insertNode, removeBranch, removeNode } from './utils';
|
|
6
5
|
import DecisionTreeGraphNode from '../DecisionTreeGraphNode.svelte';
|
|
7
6
|
import DecisionTreeGraphHeader from '../DecisionTreeGraphHeader.svelte';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
7
|
+
import { writable } from 'svelte/store';
|
|
8
|
+
import { createEventDispatcher, getContext } from 'svelte';
|
|
10
9
|
import { deleteGridItem } from '../../appUtils';
|
|
11
|
-
import DarkModeObserver from '../../../../DarkModeObserver.svelte';
|
|
12
10
|
export let nodes;
|
|
13
|
-
export let rebuildOnChange = undefined;
|
|
14
11
|
export let paneWidth = 0;
|
|
15
12
|
export let paneHeight = 0;
|
|
16
13
|
export let component;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
let scroll = false;
|
|
20
|
-
let darkMode = false;
|
|
14
|
+
const nodesStore = writable([]);
|
|
15
|
+
const edgesStore = writable([]);
|
|
21
16
|
const dispatch = createEventDispatcher();
|
|
22
17
|
const { selectedNodeId } = getContext('DecisionTreeEditor');
|
|
23
|
-
$: rebuildOnChange && triggerRebuild();
|
|
24
|
-
let oldRebuildOnChange = rebuildOnChange ? JSON.parse(JSON.stringify(rebuildOnChange)) : undefined;
|
|
25
|
-
function triggerRebuild() {
|
|
26
|
-
if (!deepEqual(oldRebuildOnChange, rebuildOnChange)) {
|
|
27
|
-
oldRebuildOnChange = JSON.parse(JSON.stringify(rebuildOnChange));
|
|
28
|
-
createGraph();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function buildStartNode() {
|
|
32
|
-
const firstNode = getFirstNode(nodes);
|
|
33
|
-
if (!firstNode) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const startNodeConfig = {
|
|
37
|
-
id: 'start',
|
|
38
|
-
data: {
|
|
39
|
-
custom: {
|
|
40
|
-
component: DecisionTreeGraphHeader,
|
|
41
|
-
props: {
|
|
42
|
-
node: {
|
|
43
|
-
id: 'start',
|
|
44
|
-
label: 'Start',
|
|
45
|
-
next: {
|
|
46
|
-
id: firstNode.id,
|
|
47
|
-
condition: {
|
|
48
|
-
type: 'evalv2',
|
|
49
|
-
expr: 'true',
|
|
50
|
-
fieldType: 'boolean'
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
canDelete: false,
|
|
55
|
-
label: 'Start'
|
|
56
|
-
},
|
|
57
|
-
cb: (e, detail) => nodeCallbackHandler(e, detail, undefined, [], false)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
const startNode = createNode(startNodeConfig);
|
|
62
|
-
displayedNodes.push(startNode);
|
|
63
|
-
edges.push(createEdge({
|
|
64
|
-
id: `start-${firstNode?.id}`,
|
|
65
|
-
source: 'start',
|
|
66
|
-
target: firstNode?.id
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
18
|
const { app, runnableComponents, componentControl, debuggingComponents } = getContext('AppViewerContext');
|
|
70
|
-
function buildEndNode() {
|
|
71
|
-
const lastNodesIds = nodes
|
|
72
|
-
.filter((node) => {
|
|
73
|
-
return node.next.length == 0;
|
|
74
|
-
})
|
|
75
|
-
.map((node) => node.id);
|
|
76
|
-
displayedNodes.push(createNode({
|
|
77
|
-
id: 'end',
|
|
78
|
-
data: {
|
|
79
|
-
custom: {
|
|
80
|
-
component: DecisionTreeGraphHeader,
|
|
81
|
-
props: {
|
|
82
|
-
node: {
|
|
83
|
-
id: 'end',
|
|
84
|
-
label: 'End',
|
|
85
|
-
next: []
|
|
86
|
-
},
|
|
87
|
-
canDelete: false,
|
|
88
|
-
isTail: true,
|
|
89
|
-
label: 'End'
|
|
90
|
-
},
|
|
91
|
-
cb: (e, detail) => {
|
|
92
|
-
if (e == 'select') {
|
|
93
|
-
$selectedNodeId = detail;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
parentIds: lastNodesIds
|
|
99
|
-
}));
|
|
100
|
-
lastNodesIds.forEach((lastNodeId) => {
|
|
101
|
-
edges.push(createEdge({
|
|
102
|
-
id: `${lastNodeId}-end`,
|
|
103
|
-
source: lastNodeId,
|
|
104
|
-
target: 'end'
|
|
105
|
-
}));
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
19
|
function addSubGrid() {
|
|
109
20
|
const numberOfPanes = nodes.length;
|
|
110
21
|
if (!$app.subgrids) {
|
|
@@ -193,119 +104,179 @@ function nodeCallbackHandler(event, detail, graphNode, parentIds, branchInsert =
|
|
|
193
104
|
}
|
|
194
105
|
dispatch('render');
|
|
195
106
|
}
|
|
196
|
-
function
|
|
197
|
-
nodes
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
data
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
107
|
+
function graphBuilder(decisionTreeNodes) {
|
|
108
|
+
const nodes = [];
|
|
109
|
+
const edges = [];
|
|
110
|
+
function addNode(node, type = 'step', data, x = nodeCallbackHandler) {
|
|
111
|
+
nodes.push({
|
|
112
|
+
id: node.id,
|
|
113
|
+
type,
|
|
114
|
+
position: { x: -1, y: -1 },
|
|
115
|
+
data: {
|
|
116
|
+
node,
|
|
117
|
+
nodeCallbackHandler: x,
|
|
118
|
+
...data
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const parents = {};
|
|
123
|
+
function addEdge(source, target) {
|
|
124
|
+
parents[target] = [...(parents[target] ?? []), source];
|
|
125
|
+
edges.push({
|
|
126
|
+
id: `${source}-${target}`,
|
|
127
|
+
source,
|
|
128
|
+
target,
|
|
129
|
+
type: 'edge'
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function processNodes(decisionTreeNodes) {
|
|
133
|
+
decisionTreeNodes.forEach((graphNode, index) => {
|
|
134
|
+
const parentIds = getParents(decisionTreeNodes, graphNode.id);
|
|
135
|
+
const parentNext = decisionTreeNodes.find((node) => node.id == parentIds[0])?.next;
|
|
136
|
+
const hasParentBranches = parentNext ? parentNext.length > 1 : false;
|
|
137
|
+
if (hasParentBranches) {
|
|
138
|
+
const positionRelativeToParent = parentNext?.findIndex((next) => next.id == graphNode.id);
|
|
139
|
+
const branchHeaderId = `${parentIds[0]}-${graphNode.id}-branch-header`;
|
|
140
|
+
// We create a header node for the branch, which will be the parent of the actual node
|
|
141
|
+
const header = {
|
|
142
|
+
id: branchHeaderId,
|
|
143
|
+
type: 'start',
|
|
144
|
+
position: { x: -1, y: -1 },
|
|
145
|
+
data: {
|
|
146
|
+
node: {
|
|
213
147
|
label: positionRelativeToParent === 0
|
|
214
148
|
? 'Default branch'
|
|
215
|
-
: `Branch ${positionRelativeToParent}
|
|
149
|
+
: `Branch ${positionRelativeToParent}`,
|
|
150
|
+
id: branchHeaderId,
|
|
151
|
+
allowed: undefined,
|
|
152
|
+
next: [],
|
|
153
|
+
parentIds: [parentIds[0]]
|
|
216
154
|
},
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
parentIds: [parentIds[0]]
|
|
223
|
-
}));
|
|
224
|
-
const cannotAddBranch = graphNode.next.length === 0 ||
|
|
225
|
-
(graphNode.next.length === 1 && getParents(nodes, graphNode.next[0].id).length > 1);
|
|
226
|
-
// We create the actual node
|
|
227
|
-
displayedNodes.push(createNode({
|
|
228
|
-
id: graphNode.id,
|
|
229
|
-
data: {
|
|
230
|
-
custom: {
|
|
231
|
-
component: DecisionTreeGraphNode,
|
|
232
|
-
props: {
|
|
233
|
-
node: graphNode,
|
|
234
|
-
canDelete: !(graphNode.next.length > 1 && parentIds.length > 1),
|
|
235
|
-
canAddBranch: !cannotAddBranch,
|
|
236
|
-
index,
|
|
237
|
-
darkMode
|
|
155
|
+
canDelete: true,
|
|
156
|
+
nodeCallbackHandler: (e, d) => {
|
|
157
|
+
nodeCallbackHandler(e, d, graphNode, parentIds, true);
|
|
238
158
|
},
|
|
239
|
-
|
|
159
|
+
branchHeader: true
|
|
240
160
|
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
})
|
|
161
|
+
};
|
|
162
|
+
nodes.push(header);
|
|
163
|
+
const cannotAddBranch = graphNode.next.length === 0 ||
|
|
164
|
+
(graphNode.next.length === 1 &&
|
|
165
|
+
getParents(decisionTreeNodes, graphNode.next[0].id).length > 1);
|
|
166
|
+
// We create the actual node
|
|
167
|
+
addNode(graphNode, 'step', {
|
|
168
|
+
canDelete: !(graphNode.next.length > 1 && parentIds.length > 1),
|
|
169
|
+
canAddBranch: !cannotAddBranch,
|
|
170
|
+
index,
|
|
171
|
+
parentIds: [
|
|
172
|
+
branchHeaderId,
|
|
173
|
+
...parentIds.filter((pId) => {
|
|
174
|
+
const firstLetter = branchHeaderId.split('-')[0];
|
|
175
|
+
return pId !== firstLetter;
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
}, (e, d) => {
|
|
179
|
+
nodeCallbackHandler(e, d, graphNode, parentIds, false);
|
|
180
|
+
return undefined;
|
|
181
|
+
});
|
|
182
|
+
addEdge(branchHeaderId, graphNode.id);
|
|
183
|
+
if (graphNode.next.length === 1) {
|
|
184
|
+
addEdge(graphNode.id, graphNode.next[0].id);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
graphNode.next.forEach((nextNode) => {
|
|
188
|
+
addEdge(graphNode.id, `${graphNode.id}-${nextNode.id}-branch-header`);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
262
191
|
}
|
|
263
192
|
else {
|
|
193
|
+
const cannotAddBranch = graphNode.next.length === 0 ||
|
|
194
|
+
(graphNode.next.length === 1 &&
|
|
195
|
+
getParents(decisionTreeNodes, graphNode.next[0].id).length > 1);
|
|
196
|
+
addNode(graphNode, 'step', {
|
|
197
|
+
canDelete: !cannotAddBranch && (graphNode.next.length == 1 || !parentIds.includes('start')),
|
|
198
|
+
canAddBranch: !cannotAddBranch,
|
|
199
|
+
index,
|
|
200
|
+
parentIds: parentIds
|
|
201
|
+
}, (e, d) => {
|
|
202
|
+
nodeCallbackHandler(e, d, graphNode, parentIds, false);
|
|
203
|
+
return undefined;
|
|
204
|
+
});
|
|
205
|
+
// if node has multiple next, it means it needs to be connected to a branch header
|
|
206
|
+
const hasMultipleNext = graphNode.next.length > 1;
|
|
264
207
|
graphNode.next.forEach((nextNode) => {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
}));
|
|
208
|
+
const target = hasMultipleNext
|
|
209
|
+
? `${graphNode.id}-${nextNode.id}-branch-header`
|
|
210
|
+
: nextNode.id;
|
|
211
|
+
addEdge(graphNode.id, target);
|
|
270
212
|
});
|
|
271
213
|
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const firstNode = getFirstNode(decisionTreeNodes);
|
|
217
|
+
if (firstNode) {
|
|
218
|
+
const startNode = {
|
|
219
|
+
id: 'start',
|
|
220
|
+
type: 'start',
|
|
221
|
+
position: { x: -1, y: -1 },
|
|
222
|
+
data: {
|
|
223
|
+
node: {
|
|
224
|
+
id: 'start',
|
|
225
|
+
label: 'Start',
|
|
226
|
+
allowed: undefined,
|
|
227
|
+
next: [
|
|
228
|
+
{
|
|
229
|
+
id: firstNode.id,
|
|
230
|
+
condition: {
|
|
231
|
+
type: 'evalv2',
|
|
232
|
+
expr: 'true',
|
|
233
|
+
fieldType: 'boolean'
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
]
|
|
291
237
|
},
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
238
|
+
canDelete: false,
|
|
239
|
+
nodeCallbackHandler
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
nodes.push(startNode);
|
|
243
|
+
addEdge('start', firstNode.id);
|
|
244
|
+
}
|
|
245
|
+
processNodes(decisionTreeNodes);
|
|
246
|
+
const endNode = {
|
|
247
|
+
id: 'end',
|
|
248
|
+
type: 'end',
|
|
249
|
+
position: { x: -1, y: -1 },
|
|
250
|
+
data: {
|
|
251
|
+
node: {
|
|
252
|
+
id: 'end',
|
|
253
|
+
label: 'End',
|
|
254
|
+
allowed: undefined,
|
|
255
|
+
next: []
|
|
256
|
+
},
|
|
257
|
+
canDelete: false,
|
|
258
|
+
nodeCallbackHandler
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const lastNodesIds = decisionTreeNodes
|
|
262
|
+
.filter((node) => {
|
|
263
|
+
return node.next.length == 0;
|
|
264
|
+
})
|
|
265
|
+
.map((node) => node.id);
|
|
266
|
+
lastNodesIds.forEach((id) => {
|
|
267
|
+
addEdge(id, endNode.id);
|
|
268
|
+
});
|
|
269
|
+
nodes.push(endNode);
|
|
270
|
+
Object.keys(parents).forEach((key) => {
|
|
271
|
+
const node = nodes.find((n) => n.id === key);
|
|
272
|
+
if (node) {
|
|
273
|
+
node.data.parentIds = parents[key];
|
|
306
274
|
}
|
|
307
275
|
});
|
|
276
|
+
$nodesStore = layoutNodes(nodes);
|
|
277
|
+
$edgesStore = edges;
|
|
308
278
|
}
|
|
279
|
+
$: graphBuilder(nodes);
|
|
309
280
|
function layoutNodes(nodes) {
|
|
310
281
|
let seenId = [];
|
|
311
282
|
for (const n of nodes) {
|
|
@@ -314,8 +285,12 @@ function layoutNodes(nodes) {
|
|
|
314
285
|
}
|
|
315
286
|
seenId.push(n.id);
|
|
316
287
|
}
|
|
288
|
+
const flattenParentIds = nodes.map((n) => ({
|
|
289
|
+
...n,
|
|
290
|
+
parentIds: n.data?.parentIds ?? []
|
|
291
|
+
}));
|
|
317
292
|
const stratify = dagStratify().id(({ id }) => id);
|
|
318
|
-
const dag = stratify(
|
|
293
|
+
const dag = stratify(flattenParentIds);
|
|
319
294
|
let boxSize;
|
|
320
295
|
try {
|
|
321
296
|
const layout = sugiyama()
|
|
@@ -330,67 +305,51 @@ function layoutNodes(nodes) {
|
|
|
330
305
|
.nodeSize(() => [NODE.width + NODE.gap.horizontal, NODE.height + NODE.gap.vertical]);
|
|
331
306
|
boxSize = layout(dag);
|
|
332
307
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
};
|
|
343
|
-
}),
|
|
344
|
-
height: boxSize.height + NODE.height,
|
|
345
|
-
width: boxSize.width + NODE.width
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
function resetGraphData() {
|
|
349
|
-
displayedNodes = [];
|
|
350
|
-
edges = [];
|
|
351
|
-
}
|
|
352
|
-
function createGraph() {
|
|
353
|
-
try {
|
|
354
|
-
resetGraphData();
|
|
355
|
-
buildStartNode();
|
|
356
|
-
buildGraphNodes();
|
|
357
|
-
buildEndNode();
|
|
358
|
-
applyLayoutToNodes();
|
|
359
|
-
}
|
|
360
|
-
catch (e) {
|
|
361
|
-
console.error(e);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
function applyLayoutToNodes() {
|
|
365
|
-
const layered = layoutNodes(displayedNodes);
|
|
366
|
-
displayedNodes = layered.nodes;
|
|
308
|
+
const newNodes = dag.descendants().map((des) => ({
|
|
309
|
+
...des.data,
|
|
310
|
+
id: des.data.id,
|
|
311
|
+
position: {
|
|
312
|
+
x: des.x ? des.x - boxSize.width / 2 - NODE.width / 2 : 0,
|
|
313
|
+
y: des.y || 0
|
|
314
|
+
}
|
|
315
|
+
}));
|
|
316
|
+
return newNodes;
|
|
367
317
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
}, 10);
|
|
373
|
-
mounted = true;
|
|
318
|
+
const viewport = writable({
|
|
319
|
+
x: 0,
|
|
320
|
+
y: 5,
|
|
321
|
+
zoom: 1
|
|
374
322
|
});
|
|
375
|
-
|
|
376
|
-
|
|
323
|
+
function centerViewport(width) {
|
|
324
|
+
viewport.update((vp) => ({
|
|
325
|
+
...vp,
|
|
326
|
+
x: width / 2,
|
|
327
|
+
y: vp.y
|
|
328
|
+
}));
|
|
377
329
|
}
|
|
330
|
+
$: paneWidth && centerViewport(paneWidth);
|
|
331
|
+
const nodeTypes = {
|
|
332
|
+
step: DecisionTreeGraphNode,
|
|
333
|
+
start: DecisionTreeGraphHeader,
|
|
334
|
+
end: DecisionTreeGraphHeader
|
|
335
|
+
};
|
|
378
336
|
</script>
|
|
379
337
|
|
|
380
|
-
<
|
|
338
|
+
<SvelteFlow
|
|
339
|
+
nodes={nodesStore}
|
|
340
|
+
edges={edgesStore}
|
|
341
|
+
{nodeTypes}
|
|
342
|
+
{viewport}
|
|
343
|
+
height={paneHeight}
|
|
344
|
+
minZoom={0.5}
|
|
345
|
+
connectionLineType={ConnectionLineType.SmoothStep}
|
|
346
|
+
defaultEdgeOptions={{ type: 'smoothstep' }}
|
|
347
|
+
zoomOnDoubleClick={false}
|
|
348
|
+
elementsSelectable={false}
|
|
349
|
+
proOptions={{ hideAttribution: true }}
|
|
350
|
+
nodesDraggable={false}
|
|
351
|
+
>
|
|
352
|
+
<div class="absolute inset-0 !bg-surface-secondary" />
|
|
381
353
|
|
|
382
|
-
{
|
|
383
|
-
|
|
384
|
-
download={false}
|
|
385
|
-
highlightEdges={false}
|
|
386
|
-
locked
|
|
387
|
-
dataflow={false}
|
|
388
|
-
nodes={displayedNodes}
|
|
389
|
-
{edges}
|
|
390
|
-
height={paneHeight}
|
|
391
|
-
{scroll}
|
|
392
|
-
nodeSelected={false}
|
|
393
|
-
background={false}
|
|
394
|
-
width={paneWidth}
|
|
395
|
-
/>
|
|
396
|
-
{/if}
|
|
354
|
+
<Controls position="top-right" orientation="horizontal" showLock={false} />
|
|
355
|
+
</SvelteFlow>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NODE } from '../../../../graph';
|
|
2
|
+
import {} from '@xyflow/svelte';
|
|
2
3
|
export function createNode(nodeConfig) {
|
|
3
4
|
return {
|
|
4
5
|
type: 'node',
|
|
@@ -6,12 +7,7 @@ export function createNode(nodeConfig) {
|
|
|
6
7
|
position: nodeConfig.position || { x: -1, y: -1 },
|
|
7
8
|
data: nodeConfig.data,
|
|
8
9
|
width: nodeConfig.width || NODE.width,
|
|
9
|
-
height: nodeConfig.height || NODE.height
|
|
10
|
-
borderColor: nodeConfig.borderColor || '#999',
|
|
11
|
-
sourcePosition: 'bottom',
|
|
12
|
-
targetPosition: 'top',
|
|
13
|
-
parentIds: nodeConfig.parentIds || [],
|
|
14
|
-
loopDepth: nodeConfig.loopDepth || 0
|
|
10
|
+
height: nodeConfig.height || NODE.height
|
|
15
11
|
};
|
|
16
12
|
}
|
|
17
13
|
export function createEdge(edgeConfig) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SupportedLanguage } from '../common';
|
|
2
|
-
export type
|
|
2
|
+
export type FlowBuilderWhitelabelCustomUi = {
|
|
3
3
|
topBar?: {
|
|
4
4
|
path?: boolean;
|
|
5
5
|
export?: boolean;
|
|
@@ -7,8 +7,18 @@ export type WhitelabelCustomUi = {
|
|
|
7
7
|
aiBuilder?: boolean;
|
|
8
8
|
tutorials?: boolean;
|
|
9
9
|
diff?: boolean;
|
|
10
|
+
extraDeployOptions?: boolean;
|
|
10
11
|
};
|
|
11
12
|
settingsPanel?: boolean;
|
|
13
|
+
settingsTabs?: {
|
|
14
|
+
schedule?: boolean;
|
|
15
|
+
sharedDiretory?: boolean;
|
|
16
|
+
earlyStop?: boolean;
|
|
17
|
+
earlyReturn?: boolean;
|
|
18
|
+
workerGroup?: boolean;
|
|
19
|
+
concurrency?: boolean;
|
|
20
|
+
cache?: boolean;
|
|
21
|
+
};
|
|
12
22
|
triggers?: boolean;
|
|
13
23
|
flowNode?: boolean;
|
|
14
24
|
hub?: boolean;
|
|
@@ -22,4 +32,28 @@ export type WhitelabelCustomUi = {
|
|
|
22
32
|
stepAdvancedSettings?: boolean;
|
|
23
33
|
languages?: (SupportedLanguage | 'docker' | 'bunnative')[];
|
|
24
34
|
scriptFork?: boolean;
|
|
35
|
+
editorBar?: EditorBarUi;
|
|
36
|
+
};
|
|
37
|
+
export type EditorBarUi = {
|
|
38
|
+
contextVar?: boolean;
|
|
39
|
+
variable?: boolean;
|
|
40
|
+
type?: boolean;
|
|
41
|
+
assistants?: boolean;
|
|
42
|
+
multiplayer?: boolean;
|
|
43
|
+
autoformatting?: boolean;
|
|
44
|
+
aiGen?: boolean;
|
|
45
|
+
aiFix?: boolean;
|
|
46
|
+
library?: boolean;
|
|
47
|
+
useVsCode?: boolean;
|
|
48
|
+
};
|
|
49
|
+
export type ScriptEditorWhitelabelCustomUi = {
|
|
50
|
+
editorBar?: EditorBarUi;
|
|
51
|
+
};
|
|
52
|
+
export type ScriptBuilderWhitelabelCustomUi = {
|
|
53
|
+
topBar?: {
|
|
54
|
+
path?: boolean;
|
|
55
|
+
settings?: boolean;
|
|
56
|
+
extraDeployOptions?: boolean;
|
|
57
|
+
};
|
|
58
|
+
editorBar?: EditorBarUi;
|
|
25
59
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script>import { Tabs, Tab, TabContent, Button } from '../common';
|
|
2
2
|
import { copyToClipboard } from '../../utils';
|
|
3
|
-
import { CalendarCheck2, Clipboard, Terminal, Webhook } from 'lucide-svelte';
|
|
3
|
+
import { CalendarCheck2, Clipboard, MailIcon, Terminal, Webhook } from 'lucide-svelte';
|
|
4
4
|
import { Highlight } from 'svelte-highlight';
|
|
5
5
|
import { yaml } from 'svelte-highlight/languages';
|
|
6
6
|
import json from 'svelte-highlight/languages/json';
|
|
@@ -59,6 +59,12 @@ $: !hasStepDetails && selected === 'flow_step' && (selected = 'saved_inputs');
|
|
|
59
59
|
Schedules
|
|
60
60
|
</span>
|
|
61
61
|
</Tab>
|
|
62
|
+
<Tab value="email">
|
|
63
|
+
<span class="flex flex-row gap-2 items-center">
|
|
64
|
+
<MailIcon size={14} />
|
|
65
|
+
Email
|
|
66
|
+
</span>
|
|
67
|
+
</Tab>
|
|
62
68
|
<Tab value="cli">
|
|
63
69
|
<span class="flex flex-row gap-2 items-center">
|
|
64
70
|
<Terminal size={14} />
|
|
@@ -71,6 +77,8 @@ $: !hasStepDetails && selected === 'flow_step' && (selected = 'saved_inputs');
|
|
|
71
77
|
<div class="h-full overflow-auto">
|
|
72
78
|
{#if triggerSelected === 'webhooks'}
|
|
73
79
|
<slot name="webhooks" />
|
|
80
|
+
{:else if triggerSelected === 'email'}
|
|
81
|
+
<slot name="email" />
|
|
74
82
|
{:else if triggerSelected === 'schedule'}
|
|
75
83
|
<slot name="schedule" />
|
|
76
84
|
{:else if triggerSelected === 'cli'}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SvelteComponent } from "svelte";
|
|
2
2
|
declare const __propDef: {
|
|
3
3
|
props: {
|
|
4
|
-
triggerSelected?: "schedule" | "webhooks" | "cli" | undefined;
|
|
4
|
+
triggerSelected?: "email" | "schedule" | "webhooks" | "cli" | undefined;
|
|
5
5
|
flow_json?: any | undefined;
|
|
6
6
|
hasStepDetails?: boolean | undefined;
|
|
7
7
|
isOperator?: boolean | undefined;
|
|
@@ -14,6 +14,7 @@ declare const __propDef: {
|
|
|
14
14
|
save_inputs: {};
|
|
15
15
|
details: {};
|
|
16
16
|
webhooks: {};
|
|
17
|
+
email: {};
|
|
17
18
|
schedule: {};
|
|
18
19
|
cli: {};
|
|
19
20
|
flow_step: {};
|
|
@@ -29,6 +29,7 @@ let clientWidth = window.innerWidth;
|
|
|
29
29
|
{hasStepDetails}
|
|
30
30
|
>
|
|
31
31
|
<slot slot="webhooks" name="webhooks" />
|
|
32
|
+
<slot slot="email" name="email" />
|
|
32
33
|
<slot slot="schedule" name="schedule" />
|
|
33
34
|
<slot slot="cli" name="cli" />
|
|
34
35
|
<slot slot="details" name="details" />
|
|
@@ -53,6 +54,7 @@ let clientWidth = window.innerWidth;
|
|
|
53
54
|
<TabContent value="detail" class="flex flex-col flex-1 h-full">
|
|
54
55
|
<DetailPageDetailPanel bind:triggerSelected bind:selected {isOperator} {hasStepDetails}>
|
|
55
56
|
<slot slot="webhooks" name="webhooks" />
|
|
57
|
+
<slot slot="email" name="email" />
|
|
56
58
|
<slot slot="schedule" name="schedule" />
|
|
57
59
|
<slot slot="cli" name="cli" />
|
|
58
60
|
<slot slot="details" name="details" />
|