From cef0cceef063ff1399f4b4a1c74f0e6a495fecf9 Mon Sep 17 00:00:00 2001 From: zergmk2 Date: Wed, 13 Mar 2024 01:08:38 +0800 Subject: [PATCH] Enhance: Add isStart property to determine if current node is a start node. (#5040) --- .../ActivityDescriptors/Models/ActivityDescriptor.cs | 5 +++++ src/modules/Elsa.Workflows.Core/Activities/Start.cs | 3 ++- src/modules/Elsa.Workflows.Core/Contracts/IStartNode.cs | 8 ++++++++ .../Elsa.Workflows.Core/Models/ActivityDescriptor.cs | 5 +++++ .../Elsa.Workflows.Core/Services/ActivityDescriber.cs | 2 ++ 5 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/modules/Elsa.Workflows.Core/Contracts/IStartNode.cs diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ActivityDescriptor.cs b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ActivityDescriptor.cs index 8ba4079c8..4f6b68a1d 100644 --- a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ActivityDescriptor.cs +++ b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ActivityDescriptor.cs @@ -82,6 +82,11 @@ public record ActivityDescriptor /// public bool IsBrowsable { get; set; } + /// + /// Whether this activity type is a start activity. + /// + public bool IsStart { get; set; } + /// /// Whether this activity type is a terminal activity. /// diff --git a/src/modules/Elsa.Workflows.Core/Activities/Start.cs b/src/modules/Elsa.Workflows.Core/Activities/Start.cs index 5dcfcbefa..f8f001d61 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Start.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Start.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; using Elsa.Workflows.Attributes; +using Elsa.Workflows.Contracts; using JetBrains.Annotations; namespace Elsa.Workflows.Activities; @@ -9,7 +10,7 @@ namespace Elsa.Workflows.Activities; /// [Activity("Elsa", "Flow", "A milestone activity that marks the start of a flowchart.", Kind = ActivityKind.Action)] [PublicAPI] -public class Start : CodeActivity +public class Start : CodeActivity, IStartNode { /// public Start([CallerFilePath] string? source = default, [CallerLineNumber] int? line = default) : base(source, line) diff --git a/src/modules/Elsa.Workflows.Core/Contracts/IStartNode.cs b/src/modules/Elsa.Workflows.Core/Contracts/IStartNode.cs new file mode 100644 index 000000000..1f0311c41 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Contracts/IStartNode.cs @@ -0,0 +1,8 @@ +namespace Elsa.Workflows.Contracts; + +/// +/// Marks an activity as a terminal activity. +/// +public interface IStartNode +{ +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Models/ActivityDescriptor.cs b/src/modules/Elsa.Workflows.Core/Models/ActivityDescriptor.cs index a14e589ff..cd09df6bd 100644 --- a/src/modules/Elsa.Workflows.Core/Models/ActivityDescriptor.cs +++ b/src/modules/Elsa.Workflows.Core/Models/ActivityDescriptor.cs @@ -97,6 +97,11 @@ public class ActivityDescriptor /// public bool IsBrowsable { get; set; } = true; + /// + /// Whether this activity type is a start activity. + /// + public bool IsStart { get; set; } + /// /// Whether this activity type is a terminal activity. /// diff --git a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs index 805fdd4cc..365f4c5c8 100644 --- a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs @@ -74,6 +74,7 @@ public class ActivityDescriber : IActivityDescriber var isTrigger = activityType.IsAssignableTo(typeof(ITrigger)); var browsableAttr = activityType.GetCustomAttribute(); var isTerminal = activityType.FindInterfaces((type, criteria) => type == typeof(ITerminalNode), null).Any(); + var isStart = activityType.FindInterfaces((type, criteria) => type == typeof(IStartNode), null).Any(); var attributes = activityType.GetCustomAttributes(true).Cast().ToList(); var outputAttribute = attributes.OfType().FirstOrDefault(); @@ -92,6 +93,7 @@ public class ActivityDescriber : IActivityDescriber Outputs = (await DescribeOutputPropertiesAsync(outputProperties, cancellationToken)).ToList(), IsContainer = typeof(IContainer).IsAssignableFrom(activityType), IsBrowsable = browsableAttr == null || browsableAttr.Browsable, + IsStart = isStart, IsTerminal = isTerminal, Attributes = attributes, Constructor = context =>