From a9e84efa2245e80d6906d60aa8a04e34921a423f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 3 Jun 2022 13:46:13 +0200 Subject: [PATCH] Improve Flowchart activity Only complete itself if there are no more direct children to schedule. --- .../Activities/Flowchart.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Activities/Flowchart.cs b/src/modules/Elsa.Workflows.Core/Activities/Flowchart.cs index 335363810..ee1c5f781 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Flowchart.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Flowchart.cs @@ -12,7 +12,7 @@ public class Flowchart : Container { public Flowchart() { - OnSignalReceived(OnDescendantCompleted); + OnSignalReceived(OnDescendantCompletedAsync); } [Node] public IActivity? Start { get; set; } @@ -26,19 +26,28 @@ public class Flowchart : Container context.ScheduleActivity(Start); } - private void OnDescendantCompleted(ActivityCompleted signal, SignalContext context) + private async ValueTask OnDescendantCompletedAsync(ActivityCompleted signal, SignalContext context) { - ScheduleChildren(context.ActivityExecutionContext, context.SourceActivityExecutionContext.Activity); + await ScheduleChildrenAsync(context.ActivityExecutionContext, context.SourceActivityExecutionContext.Activity); } - private void ScheduleChildren(ActivityExecutionContext context, IActivity parent) + private async Task ScheduleChildrenAsync(ActivityExecutionContext context, IActivity parent) { if (parent == null!) return; + + // Is the activity a direct child? + var isDirectChild = Activities.Contains(parent); + + if (!isDirectChild) + return; var outboundConnections = Connections.Where(x => x.Source == parent).ToList(); var children = outboundConnections.Select(x => x.Target).ToList(); - context.ScheduleActivities(children); + if(children.Any()) + context.ScheduleActivities(children); + else + await context.CompleteActivityAsync(); } } \ No newline at end of file