diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte
index a98ba51f4e..fe0f326768 100644
--- a/frontend/src/lib/components/FlowBuilder.svelte
+++ b/frontend/src/lib/components/FlowBuilder.svelte
@@ -423,7 +423,7 @@
onClick: () => void
}> = []
- if (savedFlow?.draft_only === false) {
+ if (savedFlow?.draft_only === false || savedFlow?.draft_only === undefined) {
dropdownItems.push({
label: 'Exit & see details',
onClick: () => dispatch('details', $pathStore)
diff --git a/frontend/src/lib/components/FlowGraphViewerStep.svelte b/frontend/src/lib/components/FlowGraphViewerStep.svelte
new file mode 100644
index 0000000000..13119e45d3
--- /dev/null
+++ b/frontend/src/lib/components/FlowGraphViewerStep.svelte
@@ -0,0 +1,202 @@
+
+
+
+
+ {#if stepDetail && typeof stepDetail != 'string'}
+ {#if stepDetail.value.type == 'script'}
+
+
+
Step Inputs
+
+
+
+ {#if stepDetail.value.path.startsWith('hub/')}
+
+
Code
+
+
+ {/if}
+ {:else if stepDetail.value.type == 'rawscript'}
+
+
Step Inputs
+
+
+
+ Code
+
+
+
+ {/if}
+ {/if}
+
+
+
+
+ {#if stepDetail == undefined}
+
+
+ Click on a step to see its details
+
+
Flow Inputs
+
+
+ {:else if stepDetail == 'Input'}
+
+ {:else if stepDetail == 'Result'}
+
End of the flow
+ {:else if typeof stepDetail != 'string' && stepDetail.value}
+
+
+ {#if stepDetail.id}
+
+ {stepDetail.id}
+
+ {/if}
+
+ {#if stepDetail.summary}
+ {stepDetail.summary}
+ {:else if stepDetail.value.type == 'identity'}
+ Identity
+ {:else if stepDetail.value.type == 'forloopflow'}
+ For loop {#if stepDetail.value.parallel}(parallel){/if}
+ {#if stepDetail.value.skip_failures}(skip failures){/if}
+ {:else if stepDetail.value.type == 'branchall'}
+ Run all branches {#if stepDetail.value.parallel}(parallel){/if}
+ {:else if stepDetail.value.type == 'branchone'}
+ Run one branch
+ {:else if stepDetail.value.type == 'flow'}
+ Inner flow
+ {:else}
+ Anonymous step
+ {/if}
+
+
+ {#if stepDetail.value.type == 'script'}
+
+ {/if}
+
+ {#if stepDetail.value.type == 'identity'}
+
+ An identity step returns its inputs as outputs
+
+ {:else if stepDetail.value.type == 'rawscript'}
+
+
Step Inputs
+
+
+
+
+
+
Code
+
+
+
+
+
+
+ {:else if stepDetail.value.type == 'script'}
+
+
Step Inputs
+
+
+ {#if stepDetail.value.path.startsWith('hub/')}
+
+
+
Code
+
+
+
+
+ {:else}
+
+ {/if}
+ {:else if stepDetail.value.type == 'forloopflow'}
+
+
Iterator expression:
+ {#if stepDetail.value.iterator.type == 'static'}
+
+ {:else}
+
+
+
+ {/if}
+
+ {:else if stepDetail.value.type == 'branchall'}
+
+ All branches will run, regardless of the inputs
+
+ {:else if stepDetail.value.type == 'branchone'}
+
+ Only one branch will run based on a predicate
+
+ {:else if stepDetail.value.type == 'flow'}
+
+ {/if}
+ {:else}
+
+ Step {stepDetail} selected
+
+ {/if}
+
diff --git a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte
index 4a06e00586..843377984c 100644
--- a/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/flows/get/[...path]/+page.svelte
@@ -40,6 +40,7 @@
import { importStore } from '$lib/components/apps/store'
import TimeAgo from '$lib/components/TimeAgo.svelte'
import ClipboardPanel from '$lib/components/details/ClipboardPanel.svelte'
+ import FlowGraphViewerStep from '$lib/components/FlowGraphViewerStep.svelte'
let flow: Flow | undefined
let can_write = false
@@ -399,7 +400,7 @@