From 04ef675b1d0e8813faeb8759870cec0e25aecccd Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 1 Oct 2024 12:28:46 +0200 Subject: [PATCH] skip step better UI (#4465) --- backend/windmill-common/src/flow_status.rs | 3 +++ backend/windmill-worker/src/worker_flow.rs | 17 +++++++++++++++++ .../lib/components/FlowStatusViewerInner.svelte | 9 +++++++-- frontend/src/lib/components/ModuleStatus.svelte | 3 +++ .../flows/map/FlowModuleSchemaItem.svelte | 13 +++++++++++++ .../src/lib/components/flows/map/MapItem.svelte | 1 + frontend/src/lib/components/graph/model.ts | 1 + .../graph/renderers/nodes/ModuleNode.svelte | 2 +- frontend/src/lib/components/graph/util.ts | 9 +++++++-- openflow.openapi.yaml | 2 ++ 10 files changed, 55 insertions(+), 5 deletions(-) diff --git a/backend/windmill-common/src/flow_status.rs b/backend/windmill-common/src/flow_status.rs index 035cadecd8..a5c509d6ef 100644 --- a/backend/windmill-common/src/flow_status.rs +++ b/backend/windmill-common/src/flow_status.rs @@ -128,6 +128,7 @@ struct UntaggedFlowStatusModule { while_loop: Option, approvers: Option>, failed_retries: Option>, + skipped: Option, } #[derive(Serialize, Debug, Clone)] @@ -179,6 +180,7 @@ pub enum FlowStatusModule { approvers: Vec, #[serde(skip_serializing_if = "Vec::is_empty")] failed_retries: Vec, + skipped: bool, }, Failure { id: String, @@ -255,6 +257,7 @@ impl<'de> Deserialize<'de> for FlowStatusModule { branch_chosen: untagged.branch_chosen, approvers: untagged.approvers.unwrap_or_default(), failed_retries: untagged.failed_retries.unwrap_or_default(), + skipped: untagged.skipped.unwrap_or(false), }), "Failure" => Ok(FlowStatusModule::Failure { id: untagged diff --git a/backend/windmill-worker/src/worker_flow.rs b/backend/windmill-worker/src/worker_flow.rs index c00fd81a44..3f92cfc829 100644 --- a/backend/windmill-worker/src/worker_flow.rs +++ b/backend/windmill-worker/src/worker_flow.rs @@ -561,6 +561,7 @@ pub async fn update_flow_status_after_job_completion_internal< branch_chosen: None, approvers: vec![], failed_retries: vec![], + skipped: false, } } else { success = false; @@ -698,6 +699,20 @@ pub async fn update_flow_status_after_job_completion_internal< } } if success || (flow_jobs.is_some() && (skip_loop_failures || skip_branch_failure)) { + let is_skipped = if current_module.as_ref().is_some_and(|m| m.skip_if.is_some()) { + sqlx::query_scalar!( + "SELECT job_kind = 'identity' FROM completed_job WHERE id = $1", + job_id_for_status + ) + .fetch_one(db) + .await + .map_err(|e| { + Error::InternalErr(format!("error during skip check: {e:#}")) + })? + .unwrap_or(false) + } else { + false + }; success = true; ( true, @@ -709,6 +724,7 @@ pub async fn update_flow_status_after_job_completion_internal< branch_chosen, approvers: vec![], failed_retries: old_status.retry.failed_jobs.clone(), + skipped: is_skipped, }), ) } else { @@ -2344,6 +2360,7 @@ async fn push_next_flow_job branch_chosen: None, approvers: vec![], failed_retries: vec![], + skipped: false, })) .bind(flow_job.id) .execute(db) diff --git a/frontend/src/lib/components/FlowStatusViewerInner.svelte b/frontend/src/lib/components/FlowStatusViewerInner.svelte index 0232548183..2dcc2a030b 100644 --- a/frontend/src/lib/components/FlowStatusViewerInner.svelte +++ b/frontend/src/lib/components/FlowStatusViewerInner.svelte @@ -437,7 +437,8 @@ flow_jobs: mod.flow_jobs, flow_jobs_success: mod.flow_jobs_success, iteration_total: mod.iterator?.itered?.length, - retries: mod?.failed_retries?.length + retries: mod?.failed_retries?.length, + skipped: mod.skipped // retries: $flowStateStore?.raw_flow }, force @@ -1054,7 +1055,11 @@ Selected subflow {/if}
- + {#if node.duration_ms} diff --git a/frontend/src/lib/components/ModuleStatus.svelte b/frontend/src/lib/components/ModuleStatus.svelte index b5f4e8b230..c01e793454 100644 --- a/frontend/src/lib/components/ModuleStatus.svelte +++ b/frontend/src/lib/components/ModuleStatus.svelte @@ -7,6 +7,7 @@ export let type: FlowStatusModule['type'] export let scheduled_for: Date | undefined + export let skipped: boolean = false {#if type == 'WaitingForEvents'} @@ -28,6 +29,8 @@ Job is waiting for an executor {/if} +{:else if skipped} + Skipped {:else if type == 'Success'} Success {:else if type == 'Failure'} diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte index bbab6a6f7e..a0896add9a 100644 --- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte +++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte @@ -13,6 +13,7 @@ PhoneIncoming, Repeat, Square, + SkipForward, Voicemail, X } from 'lucide-svelte' @@ -33,6 +34,7 @@ export let retry: boolean = false export let cache: boolean = false export let earlyStop: boolean = false + export let skip: boolean = false export let suspend: boolean = false export let sleep: boolean = false export let mock: boolean = false @@ -181,6 +183,17 @@ Early stop/break {/if} + {#if skip} + +
+ +
+ Skip +
+ {/if} {#if suspend}