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.
Files changed (199) hide show
  1. package/package/base.d.ts +1 -1
  2. package/package/base.js +1 -1
  3. package/package/components/ArgInput.svelte +33 -3
  4. package/package/components/DisplayResult.svelte +17 -5
  5. package/package/components/EditorBar.svelte +48 -38
  6. package/package/components/EditorBar.svelte.d.ts +2 -0
  7. package/package/components/ErrorOrRecoveryHandler.svelte +3 -2
  8. package/package/components/FlowBuilder.svelte +18 -12
  9. package/package/components/FlowBuilder.svelte.d.ts +3 -2
  10. package/package/components/FlowGraphViewer.svelte +6 -5
  11. package/package/components/FlowJobResult.svelte +4 -2
  12. package/package/components/FlowJobResult.svelte.d.ts +2 -0
  13. package/package/components/FlowStatusViewer.svelte +7 -1
  14. package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
  15. package/package/components/FlowStatusViewerInner.svelte +29 -11
  16. package/package/components/FlowViewer.svelte +3 -1
  17. package/package/components/FlowViewer.svelte.d.ts +1 -0
  18. package/package/components/HighlightCode.svelte +2 -2
  19. package/package/components/ModulePreviewForm.svelte +1 -1
  20. package/package/components/ObjectResourceInput.svelte +7 -2
  21. package/package/components/ObjectResourceInput.svelte.d.ts +2 -0
  22. package/package/components/ResourcePicker.svelte +60 -48
  23. package/package/components/ScriptBuilder.svelte +42 -36
  24. package/package/components/ScriptBuilder.svelte.d.ts +2 -0
  25. package/package/components/ScriptEditor.svelte +3 -1
  26. package/package/components/ScriptEditor.svelte.d.ts +2 -0
  27. package/package/components/ScriptVersionHistory.svelte +63 -7
  28. package/package/components/apps/components/display/AppText.svelte +8 -3
  29. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +3 -2
  30. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +22 -5
  31. package/package/components/apps/components/display/table/AppAggridTable.svelte +14 -5
  32. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +23 -8
  33. package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +5 -3
  34. package/package/components/apps/components/display/table/utils.js +8 -7
  35. package/package/components/apps/components/helpers/RunnableComponent.svelte +13 -1
  36. package/package/components/apps/components/helpers/eval.js +31 -25
  37. package/package/components/apps/components/inputs/AppSelect.svelte +45 -29
  38. package/package/components/apps/editor/AppEditorHeader.svelte +1 -0
  39. package/package/components/apps/editor/AppReportsDrawer.svelte +4 -3
  40. package/package/components/apps/editor/component/components.d.ts +7 -1
  41. package/package/components/apps/editor/component/components.js +6 -0
  42. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +0 -1
  43. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte +55 -45
  44. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphHeader.svelte.d.ts +7 -9
  45. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte +66 -59
  46. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphNode.svelte.d.ts +9 -11
  47. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +213 -254
  48. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte.d.ts +0 -1
  49. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.d.ts +1 -1
  50. package/package/components/apps/editor/settingsPanel/decisionTree/nodeHelpers.js +2 -6
  51. package/package/components/custom_ui.d.ts +35 -1
  52. package/package/components/details/DetailPageDetailPanel.svelte +9 -1
  53. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +2 -1
  54. package/package/components/details/DetailPageLayout.svelte +2 -0
  55. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  56. package/package/components/details/EmailTriggerPanel.svelte +128 -0
  57. package/package/components/details/EmailTriggerPanel.svelte.d.ts +20 -0
  58. package/package/components/details/WebhooksPanel.svelte +10 -71
  59. package/package/components/flows/FlowHistory.svelte +1 -0
  60. package/package/components/flows/content/FlowInputs.svelte +0 -1
  61. package/package/components/flows/content/FlowModuleComponent.svelte +8 -2
  62. package/package/components/flows/content/FlowModuleEarlyStop.svelte +193 -66
  63. package/package/components/flows/content/FlowModuleHeader.svelte +1 -1
  64. package/package/components/flows/content/FlowModuleScript.svelte +33 -3
  65. package/package/components/flows/content/FlowModuleScript.svelte.d.ts +2 -0
  66. package/package/components/flows/content/FlowModuleSuspend.svelte +15 -0
  67. package/package/components/flows/content/FlowSettings.svelte +26 -15
  68. package/package/components/flows/flowExplorer.js +3 -0
  69. package/package/components/flows/flowInfers.js +1 -1
  70. package/package/components/flows/map/FlowJobsMenu.svelte +39 -44
  71. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -2
  72. package/package/components/flows/map/FlowModuleSchemaMap.svelte +4 -3
  73. package/package/components/flows/map/InsertModuleButton.svelte +16 -9
  74. package/package/components/flows/map/MapItem.svelte +4 -98
  75. package/package/components/flows/map/MapItem.svelte.d.ts +0 -5
  76. package/package/components/flows/map/VirtualItem.svelte +6 -159
  77. package/package/components/flows/map/VirtualItem.svelte.d.ts +0 -15
  78. package/package/components/flows/propPicker/PropPickerWrapper.svelte +2 -0
  79. package/package/components/flows/propPicker/PropPickerWrapper.svelte.d.ts +1 -0
  80. package/package/components/flows/types.d.ts +2 -0
  81. package/package/components/graph/FlowGraphV2.svelte +256 -0
  82. package/package/components/graph/{FlowGraph.svelte.d.ts → FlowGraphV2.svelte.d.ts} +8 -8
  83. package/package/components/graph/graphBuilder.d.ts +15 -0
  84. package/package/components/graph/graphBuilder.js +337 -0
  85. package/package/components/graph/index.d.ts +0 -1
  86. package/package/components/graph/index.js +0 -1
  87. package/package/components/graph/model.d.ts +4 -8
  88. package/package/components/graph/renderers/edges/BaseEdge.svelte +109 -0
  89. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +35 -0
  90. package/package/components/graph/renderers/edges/DataflowEdge.svelte +37 -0
  91. package/package/components/graph/renderers/edges/DataflowEdge.svelte.d.ts +29 -0
  92. package/package/components/graph/renderers/edges/EmptyEdge.svelte +22 -0
  93. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +23 -0
  94. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +44 -0
  95. package/package/components/graph/renderers/nodes/BranchAllStart.svelte.d.ts +29 -0
  96. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +41 -0
  97. package/package/components/graph/renderers/nodes/BranchOneStart.svelte.d.ts +29 -0
  98. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +19 -0
  99. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte.d.ts +24 -0
  100. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +20 -0
  101. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte.d.ts +25 -0
  102. package/package/components/graph/renderers/nodes/InputNode.svelte +74 -0
  103. package/package/components/graph/renderers/nodes/InputNode.svelte.d.ts +23 -0
  104. package/package/components/graph/renderers/nodes/ModuleNode.svelte +71 -0
  105. package/package/components/graph/renderers/nodes/ModuleNode.svelte.d.ts +41 -0
  106. package/package/components/graph/renderers/nodes/NoBranchNode.svelte +20 -0
  107. package/package/components/graph/renderers/nodes/NoBranchNode.svelte.d.ts +27 -0
  108. package/package/components/graph/renderers/nodes/NodeWrapper.svelte +21 -0
  109. package/package/components/graph/renderers/nodes/NodeWrapper.svelte.d.ts +22 -0
  110. package/package/components/graph/renderers/nodes/ResultNode.svelte +24 -0
  111. package/package/components/graph/renderers/nodes/ResultNode.svelte.d.ts +22 -0
  112. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte +19 -0
  113. package/package/components/graph/renderers/nodes/branchAllEndNode.svelte.d.ts +26 -0
  114. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +19 -0
  115. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte.d.ts +24 -0
  116. package/package/components/graph/renderers/utils.d.ts +8 -0
  117. package/package/components/graph/renderers/utils.js +26 -0
  118. package/package/components/graph/util.d.ts +1 -2
  119. package/package/components/graph/util.js +2 -8
  120. package/package/components/propertyPicker/PropPickerResult.svelte +6 -1
  121. package/package/components/propertyPicker/PropPickerResult.svelte.d.ts +1 -0
  122. package/package/components/runs/RunsFilter.svelte +15 -17
  123. package/package/components/sidebar/changelogs.js +5 -0
  124. package/package/gen/core/OpenAPI.js +1 -1
  125. package/package/gen/schemas.gen.d.ts +3 -0
  126. package/package/gen/schemas.gen.js +3 -0
  127. package/package/gen/services.gen.d.ts +22 -3
  128. package/package/gen/services.gen.js +38 -2
  129. package/package/gen/types.gen.d.ts +69 -6
  130. package/package/hub.d.ts +11 -0
  131. package/package/hub.js +2 -0
  132. package/package/hubPaths.json +9 -0
  133. package/package/init_scripts/python_failure_module.d.ts +1 -1
  134. package/package/init_scripts/python_failure_module.js +4 -3
  135. package/package/script_helpers.d.ts +2 -2
  136. package/package/script_helpers.js +11 -9
  137. package/package.json +2 -1
  138. package/package/components/graph/FlowGraph.svelte +0 -614
  139. package/package/components/graph/svelvet/LICENSE +0 -21
  140. package/package/components/graph/svelvet/container/README.md +0 -7
  141. package/package/components/graph/svelvet/container/controllers/middleware.d.ts +0 -11
  142. package/package/components/graph/svelvet/container/controllers/middleware.js +0 -87
  143. package/package/components/graph/svelvet/container/models/index.d.ts +0 -0
  144. package/package/components/graph/svelvet/container/models/index.js +0 -1
  145. package/package/components/graph/svelvet/container/views/GraphView.svelte +0 -262
  146. package/package/components/graph/svelvet/container/views/GraphView.svelte.d.ts +0 -26
  147. package/package/components/graph/svelvet/container/views/Svelvet.svelte +0 -121
  148. package/package/components/graph/svelvet/container/views/Svelvet.svelte.d.ts +0 -36
  149. package/package/components/graph/svelvet/customCss/controllers/getCss.d.ts +0 -2
  150. package/package/components/graph/svelvet/customCss/controllers/getCss.js +0 -46
  151. package/package/components/graph/svelvet/d3/controllers/d3.d.ts +0 -5
  152. package/package/components/graph/svelvet/d3/controllers/d3.js +0 -59
  153. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.d.ts +0 -4
  154. package/package/components/graph/svelvet/edges/controllers/anchorCbDev.js +0 -92
  155. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.d.ts +0 -57
  156. package/package/components/graph/svelvet/edges/controllers/anchorCbUser.js +0 -73
  157. package/package/components/graph/svelvet/edges/controllers/util.d.ts +0 -37
  158. package/package/components/graph/svelvet/edges/controllers/util.js +0 -71
  159. package/package/components/graph/svelvet/edges/models/Anchor.d.ts +0 -48
  160. package/package/components/graph/svelvet/edges/models/Anchor.js +0 -122
  161. package/package/components/graph/svelvet/edges/models/Edge.d.ts +0 -48
  162. package/package/components/graph/svelvet/edges/models/Edge.js +0 -109
  163. package/package/components/graph/svelvet/edges/types/types.d.ts +0 -18
  164. package/package/components/graph/svelvet/edges/types/types.js +0 -1
  165. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte +0 -104
  166. package/package/components/graph/svelvet/edges/views/Edges/BaseEdge.svelte.d.ts +0 -18
  167. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte +0 -42
  168. package/package/components/graph/svelvet/edges/views/Edges/EdgeText.svelte.d.ts +0 -17
  169. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte +0 -151
  170. package/package/components/graph/svelvet/edges/views/Edges/SimpleBezierEdge.svelte.d.ts +0 -17
  171. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte +0 -157
  172. package/package/components/graph/svelvet/edges/views/Edges/SmoothStepEdge.svelte.d.ts +0 -60
  173. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte +0 -8
  174. package/package/components/graph/svelvet/edges/views/Edges/StepEdge.svelte.d.ts +0 -25
  175. package/package/components/graph/svelvet/edges/views/Edges/types.d.ts +0 -52
  176. package/package/components/graph/svelvet/edges/views/Edges/types.js +0 -1
  177. package/package/components/graph/svelvet/edges/views/Edges/utils.d.ts +0 -33
  178. package/package/components/graph/svelvet/edges/views/Edges/utils.js +0 -31
  179. package/package/components/graph/svelvet/nodes/controllers/util.d.ts +0 -9
  180. package/package/components/graph/svelvet/nodes/controllers/util.js +0 -13
  181. package/package/components/graph/svelvet/nodes/models/Node.d.ts +0 -74
  182. package/package/components/graph/svelvet/nodes/models/Node.js +0 -156
  183. package/package/components/graph/svelvet/nodes/views/Node.svelte +0 -84
  184. package/package/components/graph/svelvet/nodes/views/Node.svelte.d.ts +0 -21
  185. package/package/components/graph/svelvet/store/controllers/storeApi.d.ts +0 -25
  186. package/package/components/graph/svelvet/store/controllers/storeApi.js +0 -91
  187. package/package/components/graph/svelvet/store/controllers/userApi.d.ts +0 -3
  188. package/package/components/graph/svelvet/store/controllers/userApi.js +0 -18
  189. package/package/components/graph/svelvet/store/controllers/util.d.ts +0 -24
  190. package/package/components/graph/svelvet/store/controllers/util.js +0 -148
  191. package/package/components/graph/svelvet/store/models/store.d.ts +0 -13
  192. package/package/components/graph/svelvet/store/models/store.js +0 -12
  193. package/package/components/graph/svelvet/store/types/types.d.ts +0 -127
  194. package/package/components/graph/svelvet/store/types/types.js +0 -1
  195. package/package/components/graph/svelvet/types/README.md +0 -3
  196. package/package/components/graph/svelvet/types/index.d.ts +0 -2
  197. package/package/components/graph/svelvet/types/index.js +0 -1
  198. package/package/components/graph/svelvet/types/types.d.ts +0 -50
  199. package/package/components/graph/svelvet/types/types.js +0 -18
@@ -1,110 +1,21 @@
1
- <script>import Svelvet from '../../../../graph/svelvet/container/views/Svelvet.svelte';
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 { deepEqual } from 'fast-equals';
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 { addNewBranch, addNode, getFirstNode, getParents, insertNode, removeBranch, removeNode } from './utils';
9
- import { createEdge, createNode } from './nodeHelpers';
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
- let displayedNodes = [];
18
- let edges = [];
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 buildGraphNodes() {
197
- nodes?.forEach((graphNode, index) => {
198
- const parentIds = getParents(nodes, graphNode.id);
199
- const parentNext = nodes.find((node) => node.id == parentIds[0])?.next;
200
- const hasParentBranches = parentNext ? parentNext.length > 1 : false;
201
- if (hasParentBranches) {
202
- const positionRelativeToParent = parentNext?.findIndex((next) => next.id == graphNode.id);
203
- const branchHeaderId = `${parentIds[0]}-${graphNode.id}-branch-header`;
204
- // We create a header node for the branch, which will be the parent of the actual node
205
- displayedNodes.push(createNode({
206
- id: branchHeaderId,
207
- data: {
208
- custom: {
209
- component: DecisionTreeGraphHeader,
210
- props: {
211
- node: graphNode,
212
- canDelete: true,
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
- cb: (e, detail) => {
218
- nodeCallbackHandler(e, detail, graphNode, parentIds, true);
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
- cb: (e, detail) => nodeCallbackHandler(e, detail, graphNode, parentIds, false)
159
+ branchHeader: true
240
160
  }
241
- },
242
- parentIds: [
243
- branchHeaderId,
244
- ...parentIds.filter((pId) => {
245
- const firstLetter = branchHeaderId.split('-')[0];
246
- return pId !== firstLetter;
247
- })
248
- ]
249
- }));
250
- // Edge between branch header and node
251
- edges.push(createEdge({
252
- id: `${graphNode.id}-${branchHeaderId}`,
253
- source: branchHeaderId,
254
- target: graphNode.id
255
- }));
256
- if (graphNode.next.length === 1) {
257
- edges.push(createEdge({
258
- id: `${branchHeaderId}-${graphNode.next[0].id}`,
259
- source: graphNode.id,
260
- target: graphNode.next[0].id
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
- edges.push(createEdge({
266
- id: `${graphNode.id}-${nextNode.id}-branch-header-${nextNode.id}`,
267
- source: graphNode.id,
268
- target: `${graphNode.id}-${nextNode.id}-branch-header`
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
- else {
274
- const cannotAddBranch = graphNode.next.length === 0 ||
275
- (graphNode.next.length === 1 && getParents(nodes, graphNode.next[0].id).length > 1);
276
- displayedNodes.push(createNode({
277
- id: graphNode.id,
278
- data: {
279
- custom: {
280
- component: DecisionTreeGraphNode,
281
- props: {
282
- node: graphNode,
283
- canDelete: !cannotAddBranch &&
284
- (graphNode.next.length == 1 || !parentIds.includes('start')),
285
- canAddBranch: !cannotAddBranch,
286
- index,
287
- darkMode
288
- },
289
- cb: (e, detail) => nodeCallbackHandler(e, detail, graphNode, parentIds, false)
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
- parentIds: parentIds
293
- }));
294
- // if node has multiple next, it means it needs to be connected to a branch header
295
- const hasMultipleNext = graphNode.next.length > 1;
296
- graphNode.next.forEach((nextNode) => {
297
- const target = hasMultipleNext
298
- ? `${graphNode.id}-${nextNode.id}-branch-header`
299
- : nextNode.id;
300
- edges.push(createEdge({
301
- id: `${graphNode.id}-${nextNode.id}`,
302
- source: graphNode.id,
303
- target
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(nodes);
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
- return {
334
- nodes: dag.descendants().map((des) => {
335
- return {
336
- ...des.data,
337
- id: des.data.id,
338
- position: {
339
- x: des.x ? des.x + paneWidth / 2 - boxSize.width / 2 - NODE.width / 2 : 0,
340
- y: des.y || 0
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
- let mounted = false;
369
- onMount(() => {
370
- setTimeout(() => {
371
- createGraph();
372
- }, 10);
373
- mounted = true;
318
+ const viewport = writable({
319
+ x: 0,
320
+ y: 5,
321
+ zoom: 1
374
322
  });
375
- $: if (nodes.length > 0 && !$selectedNodeId) {
376
- $selectedNodeId = getFirstNode(nodes)?.id;
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
- <DarkModeObserver bind:darkMode />
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
- {#if mounted}
383
- <Svelvet
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>
@@ -3,7 +3,6 @@ import type { AppComponent, DecisionTreeNode } from '../../component';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  nodes: DecisionTreeNode[];
6
- rebuildOnChange?: any;
7
6
  paneWidth?: number | undefined;
8
7
  paneHeight?: number | undefined;
9
8
  component: AppComponent;
@@ -1,4 +1,4 @@
1
- import { type Node } from '../../../../graph';
1
+ import { type Node } from '@xyflow/svelte';
2
2
  interface NodeConfig {
3
3
  id: string;
4
4
  type?: string;
@@ -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 WhitelabelCustomUi = {
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" />