diff --git a/src/modules/Elsa.Workflows.Core/Activities/Complete.cs b/src/modules/Elsa.Workflows.Core/Activities/Complete.cs
new file mode 100644
index 000000000..90ad5dd42
--- /dev/null
+++ b/src/modules/Elsa.Workflows.Core/Activities/Complete.cs
@@ -0,0 +1,46 @@
+using System.ComponentModel;
+using Elsa.Expressions.Models;
+using Elsa.Workflows.Core.Activities.Flowchart.Models;
+using Elsa.Workflows.Core.Attributes;
+using Elsa.Workflows.Core.Models;
+using Elsa.Workflows.Core.Signals;
+
+namespace Elsa.Workflows.Core.Activities;
+
+///
+/// Signals the current composite activity to complete itself as a whole.
+///
+[Activity("Elsa", "Primitives", "Signals the current composite activity to complete itself as a whole.")]
+public class Complete : Activity
+{
+ ///
+ public Complete(params string[] outcomes) : this(new Input>(outcomes))
+ {
+ }
+
+ ///
+ public Complete(Func> outcomes) : this(new Input>(outcomes))
+ {
+ }
+
+ ///
+ public Complete(Func outcome) : this(context => new[] { outcome(context) })
+ {
+ }
+
+ ///
+ public Complete(Input> outcomes) => Outcomes = outcomes;
+
+ ///
+ /// The outcome or set of outcomes to complete this activity with.
+ ///
+ [Description("The outcome or set of outcomes to complete this activity with.")]
+ public Input> Outcomes { get; set; }
+
+ ///
+ protected override async ValueTask ExecuteAsync(ActivityExecutionContext context)
+ {
+ var outcomes = Outcomes.Get(context).ToArray();
+ await context.SendSignalAsync(new CompleteCompositeSignal(new Outcomes(outcomes)));
+ }
+}
\ No newline at end of file
diff --git a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs
index ce42f19b1..9525c93d9 100644
--- a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs
+++ b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs
@@ -90,9 +90,9 @@ public abstract class Composite : ActivityBase
///
/// Represents a composite activity that has a single activity and returns a result.
///
-public class Composite : ActivityBase
+public abstract class Composite : ActivityBase
{
- public Composite()
+ protected Composite()
{
OnSignalReceived(OnCompleteCompositeSignal);
}
diff --git a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs
index 708103123..a04405b87 100644
--- a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs
+++ b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs
@@ -1,5 +1,6 @@
using Elsa.Workflows.Core.Activities;
using Elsa.Workflows.Core.Activities.Flowchart.Attributes;
+using Elsa.Workflows.Core.Models;
namespace Elsa.Samples.TelnyxIntegration;
@@ -8,12 +9,21 @@ public class GetAge : Composite
{
public GetAge()
{
- Root = new Inline(async context =>
+ var ageVariable = new Variable();
+
+ Root = new Sequence
{
- var random = new Random();
- var n = random.Next(2);
- var outcome = n == 0 ? "Under 18" : "Over 18";
- await CompleteAsync(context, outcome);
- });
+ Variables = { ageVariable },
+ Activities =
+ {
+ From(() =>
+ {
+ var random = new Random();
+ return random.Next(36);
+ }, ageVariable),
+
+ new Complete(context => ageVariable.Get(context) < 18 ? "Under 18" : "Over 18")
+ }
+ };
}
}
\ No newline at end of file