diff --git a/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs b/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs
index 6bf1a7f43..e8bfaadf9 100644
--- a/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs
+++ b/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs
@@ -13,11 +13,8 @@ namespace Elsa.Activities.Console.Activities
///
[ActivityDefinition(
Category = "Console",
- Description = "Read text from standard in."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "a => !!a.state.variableName ? `Read text from standard in and store into ${ a.state.variableName }.` : 'Read text from standard in.'",
+ Description = "Read text from standard in.",
+ RuntimeDescription = "a => !!a.state.variableName ? `Read text from standard in and store into ${ a.state.variableName }.` : 'Read text from standard in.'",
Outcomes = new[] { OutcomeNames.Done }
)]
public class ReadLine : Activity
diff --git a/src/activities/Elsa.Activities.Console/Activities/WriteLine.cs b/src/activities/Elsa.Activities.Console/Activities/WriteLine.cs
index 58b292fdf..ef1d050b6 100644
--- a/src/activities/Elsa.Activities.Console/Activities/WriteLine.cs
+++ b/src/activities/Elsa.Activities.Console/Activities/WriteLine.cs
@@ -15,11 +15,8 @@ namespace Elsa.Activities.Console.Activities
///
[ActivityDefinition(
Category = "Console",
- Description = "Write text to standard out."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.textExpression ? `Write ${ x.state.textExpression.expression } to standard out.` : x.definition.description",
+ Description = "Write text to standard out.",
+ RuntimeDescription = "x => !!x.state.textExpression ? `Write ${ x.state.textExpression.expression } to standard out.` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class WriteLine : Activity
diff --git a/src/activities/Elsa.Activities.Console/Elsa.Activities.Console.csproj b/src/activities/Elsa.Activities.Console/Elsa.Activities.Console.csproj
index 125881071..481f8e48b 100644
--- a/src/activities/Elsa.Activities.Console/Elsa.Activities.Console.csproj
+++ b/src/activities/Elsa.Activities.Console/Elsa.Activities.Console.csproj
@@ -17,8 +17,4 @@
-
-
-
-
diff --git a/src/activities/Elsa.Activities.Dropbox/Elsa.Activities.Dropbox.csproj b/src/activities/Elsa.Activities.Dropbox/Elsa.Activities.Dropbox.csproj
index 2369b77a7..008267d2e 100644
--- a/src/activities/Elsa.Activities.Dropbox/Elsa.Activities.Dropbox.csproj
+++ b/src/activities/Elsa.Activities.Dropbox/Elsa.Activities.Dropbox.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/src/activities/Elsa.Activities.Http/Activities/HttpRequestAction.cs b/src/activities/Elsa.Activities.Http/Activities/HttpRequestAction.cs
index 1390358db..965b40736 100644
--- a/src/activities/Elsa.Activities.Http/Activities/HttpRequestAction.cs
+++ b/src/activities/Elsa.Activities.Http/Activities/HttpRequestAction.cs
@@ -23,11 +23,8 @@ namespace Elsa.Activities.Http.Activities
[ActivityDefinition(
Category = "HTTP",
DisplayName = "Send HTTP Request",
- Description = "Send an HTTP request."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.url ? `Send HTTP ${ x.state.method } ${ x.state.url.expression }.` : x.definition.description",
+ Description = "Send an HTTP request.",
+ RuntimeDescription = "x => !!x.state.url ? `Send HTTP ${ x.state.method } ${ x.state.url.expression }.` : x.definition.description",
Outcomes = "x => !!x.state.supportedStatusCodes ? x.state.supportedStatusCodes : []"
)]
public class HttpRequestAction : Activity
diff --git a/src/activities/Elsa.Activities.Http/Activities/HttpRequestEvent.cs b/src/activities/Elsa.Activities.Http/Activities/HttpRequestEvent.cs
index 00a658424..6422f0f5a 100644
--- a/src/activities/Elsa.Activities.Http/Activities/HttpRequestEvent.cs
+++ b/src/activities/Elsa.Activities.Http/Activities/HttpRequestEvent.cs
@@ -20,11 +20,8 @@ namespace Elsa.Activities.Http.Activities
[ActivityDefinition(
Category = "HTTP",
DisplayName = "Receive HTTP Request",
- Description = "Receive an incoming HTTP request."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.path ? `Handle ${ x.state.method } ${ x.state.path }.` : x.definition.description",
+ Description = "Receive an incoming HTTP request.",
+ RuntimeDescription = "x => !!x.state.path ? `Handle ${ x.state.method } ${ x.state.path }.` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class HttpRequestEvent : Activity
diff --git a/src/activities/Elsa.Activities.Http/Activities/HttpResponseAction.cs b/src/activities/Elsa.Activities.Http/Activities/HttpResponseAction.cs
index 271791b9c..27344fedd 100644
--- a/src/activities/Elsa.Activities.Http/Activities/HttpResponseAction.cs
+++ b/src/activities/Elsa.Activities.Http/Activities/HttpResponseAction.cs
@@ -18,11 +18,8 @@ namespace Elsa.Activities.Http.Activities
[ActivityDefinition(
Category = "HTTP",
DisplayName = "Send HTTP Response",
- Description = "Send an HTTP response."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.statusCode ? `Send an HTTP ${ x.state.statusCode } - ${ x.state.contentType } response` : x.definition.description",
+ Description = "Send an HTTP response.",
+ RuntimeDescription = "x => !!x.state.statusCode ? `Send an HTTP ${ x.state.statusCode } - ${ x.state.contentType } response` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class HttpResponseAction : Activity
diff --git a/src/activities/Elsa.Activities.Http/Elsa.Activities.Http.csproj b/src/activities/Elsa.Activities.Http/Elsa.Activities.Http.csproj
index d2a5da3ab..ac69a60a6 100644
--- a/src/activities/Elsa.Activities.Http/Elsa.Activities.Http.csproj
+++ b/src/activities/Elsa.Activities.Http/Elsa.Activities.Http.csproj
@@ -19,11 +19,11 @@
-
+
-
+
diff --git a/src/activities/Elsa.Activities.MassTransit/Elsa.Activities.MassTransit.csproj b/src/activities/Elsa.Activities.MassTransit/Elsa.Activities.MassTransit.csproj
index c405ee8f3..8665b7334 100644
--- a/src/activities/Elsa.Activities.MassTransit/Elsa.Activities.MassTransit.csproj
+++ b/src/activities/Elsa.Activities.MassTransit/Elsa.Activities.MassTransit.csproj
@@ -14,9 +14,9 @@
-
-
-
+
+
+
diff --git a/src/activities/Elsa.Activities.Timers/Activities/CronEvent.cs b/src/activities/Elsa.Activities.Timers/Activities/CronEvent.cs
index 3ac49553f..8d10c8b81 100644
--- a/src/activities/Elsa.Activities.Timers/Activities/CronEvent.cs
+++ b/src/activities/Elsa.Activities.Timers/Activities/CronEvent.cs
@@ -13,11 +13,8 @@ namespace Elsa.Activities.Timers.Activities
{
[ActivityDefinition(
Category = "Timers",
- Description = "Triggers periodically based on a specified CRON expression."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.cronExpression ? `${ x.state.cronExpression.expression }.` : x.definition.description",
+ Description = "Triggers periodically based on a specified CRON expression.",
+ RuntimeDescription = "x => !!x.state.cronExpression ? `${ x.state.cronExpression.expression }.` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class CronEvent : Activity
@@ -43,7 +40,7 @@ namespace Elsa.Activities.Timers.Activities
get => GetState();
set => SetState(value);
}
-
+
protected override async Task OnCanExecuteAsync(WorkflowExecutionContext context, CancellationToken cancellationToken)
{
return StartTime == null || await IsExpiredAsync(context, cancellationToken);
@@ -54,7 +51,8 @@ namespace Elsa.Activities.Timers.Activities
return Halt();
}
- protected override async Task OnResumeAsync(WorkflowExecutionContext context,
+ protected override async Task OnResumeAsync(
+ WorkflowExecutionContext context,
CancellationToken cancellationToken)
{
if (await IsExpiredAsync(context, cancellationToken))
@@ -62,11 +60,12 @@ namespace Elsa.Activities.Timers.Activities
StartTime = null;
return Done();
}
-
+
return Halt();
}
- private async Task IsExpiredAsync(WorkflowExecutionContext workflowContext,
+ private async Task IsExpiredAsync(
+ WorkflowExecutionContext workflowContext,
CancellationToken cancellationToken)
{
var cronExpression = await expressionEvaluator.EvaluateAsync(
@@ -76,10 +75,10 @@ namespace Elsa.Activities.Timers.Activities
);
var schedule = CrontabSchedule.Parse(cronExpression);
var now = clock.GetCurrentInstant();
-
+
if (StartTime == null)
StartTime = now;
-
+
var nextOccurrence = schedule.GetNextOccurrence(StartTime.Value.ToDateTimeUtc());
return now.ToDateTimeUtc() >= nextOccurrence;
diff --git a/src/activities/Elsa.Activities.Timers/Elsa.Activities.Timers.csproj b/src/activities/Elsa.Activities.Timers/Elsa.Activities.Timers.csproj
index 1f8353967..7d86b6658 100644
--- a/src/activities/Elsa.Activities.Timers/Elsa.Activities.Timers.csproj
+++ b/src/activities/Elsa.Activities.Timers/Elsa.Activities.Timers.csproj
@@ -18,7 +18,7 @@
-
+
diff --git a/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionAttribute.cs b/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionAttribute.cs
index 6ef6f1bdc..96ffae093 100644
--- a/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionAttribute.cs
+++ b/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionAttribute.cs
@@ -8,7 +8,9 @@ namespace Elsa.Attributes
public string Type { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
+ public string RuntimeDescription { get; set; }
public string Category { get; set; }
public string Icon { get; set; }
+ public object Outcomes { get; set; }
}
}
\ No newline at end of file
diff --git a/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionDesignerAttribute.cs b/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionDesignerAttribute.cs
deleted file mode 100644
index e2074c0a1..000000000
--- a/src/core/Elsa.Abstractions/Attributes/ActivityDefinitionDesignerAttribute.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace Elsa.Attributes
-{
- [AttributeUsage(AttributeTargets.Class)]
- public class ActivityDefinitionDesignerAttribute : Attribute
- {
- public string Description { get; set; }
- public object Outcomes { get; set; }
- }
-}
\ No newline at end of file
diff --git a/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj b/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj
index 48d647eed..9a157f5ed 100644
--- a/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj
+++ b/src/core/Elsa.Abstractions/Elsa.Abstractions.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/src/core/Elsa.Abstractions/Models/ActivityDefinition.cs b/src/core/Elsa.Abstractions/Models/ActivityDefinition.cs
index dea04e554..60f42a72f 100644
--- a/src/core/Elsa.Abstractions/Models/ActivityDefinition.cs
+++ b/src/core/Elsa.Abstractions/Models/ActivityDefinition.cs
@@ -25,6 +25,8 @@ namespace Elsa.Models
public string Id { get; set; }
public string Type { get; set; }
+ public string DisplayName { get; set; }
+ public string Description { get; set; }
public int Left { get; set; }
public int Top { get; set; }
public JObject State { get; set; }
diff --git a/src/core/Elsa.Abstractions/OutcomeNames.cs b/src/core/Elsa.Abstractions/OutcomeNames.cs
index 2d62709fd..772227618 100644
--- a/src/core/Elsa.Abstractions/OutcomeNames.cs
+++ b/src/core/Elsa.Abstractions/OutcomeNames.cs
@@ -7,5 +7,6 @@ namespace Elsa
public const string True = "True";
public const string False = "False";
public const string Iterate = "Iterate";
+ public const string Loop = "Loop";
}
}
\ No newline at end of file
diff --git a/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs b/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs
index f521ad1b7..4d714c92c 100644
--- a/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs
+++ b/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs
@@ -13,7 +13,10 @@ namespace Elsa.Services
IOutcomeBuilder When(string outcome);
IActivityBuilder Then(Action setup = null, Action branch = null, string id = null) where T : class, IActivity;
IActivityBuilder WithId(string id);
+ IActivityBuilder WithDisplayName(string displayName);
+ IActivityBuilder WithDescription(string description);
IWorkflowBuilder Then(string activityId);
+ IActivityBuilder Then(IActivityBuilder targetActivity);
WorkflowDefinitionVersion Build();
ActivityDefinition BuildActivity();
}
diff --git a/src/core/Elsa.Abstractions/Services/Models/Workflow.cs b/src/core/Elsa.Abstractions/Services/Models/Workflow.cs
index 765221cff..61cadfb18 100644
--- a/src/core/Elsa.Abstractions/Services/Models/Workflow.cs
+++ b/src/core/Elsa.Abstractions/Services/Models/Workflow.cs
@@ -12,8 +12,7 @@ namespace Elsa.Services.Models
{
public Workflow(
string id,
- string definitionId,
- int version,
+ WorkflowDefinitionVersion definition,
Instant createdAt,
IEnumerable activities,
IEnumerable connections,
@@ -21,8 +20,7 @@ namespace Elsa.Services.Models
string correlationId = default) : this()
{
Id = id;
- DefinitionId = definitionId;
- Version = version;
+ Definition = definition;
CreatedAt = createdAt;
CorrelationId = correlationId;
Activities = activities.ToList();
@@ -30,6 +28,8 @@ namespace Elsa.Services.Models
Input = new Variables(input ?? Variables.Empty);
}
+
+
public Workflow()
{
Scopes = new Stack(new[] { new WorkflowExecutionScope() });
@@ -38,8 +38,7 @@ namespace Elsa.Services.Models
}
public string Id { get; set; }
- public string DefinitionId { get; }
- public int Version { get; }
+ public WorkflowDefinitionVersion Definition { get; }
public string CorrelationId { get; set; }
public WorkflowStatus Status { get; set; }
public Instant CreatedAt { get; set; }
@@ -63,8 +62,8 @@ namespace Elsa.Services.Models
return new WorkflowInstance
{
Id = Id,
- DefinitionId = DefinitionId,
- Version = Version,
+ DefinitionId = Definition.Id,
+ Version = Definition.Version,
CorrelationId = CorrelationId,
Status = Status,
CreatedAt = CreatedAt,
diff --git a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs
index 99ea81d7b..27c21ffe3 100644
--- a/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs
+++ b/src/core/Elsa.Abstractions/Services/Models/WorkflowExecutionContext.cs
@@ -53,8 +53,21 @@ namespace Elsa.Services.Models
public IActivity PopScheduledActivity() => CurrentActivity = scheduledActivities.Pop();
public void ScheduleHaltingActivity(IActivity activity) => scheduledHaltingActivities.Push(activity);
public IActivity PopScheduledHaltingActivity() => scheduledHaltingActivities.Pop();
- public void SetVariable(string name, object value) => CurrentScope.SetVariable(name, value);
- public T GetVariable(string name) => CurrentScope.GetVariable(name);
+
+ public void SetVariable(string name, object value)
+ {
+ // Get the first scope (starting from the oldest one) containing the variable (existing variable). Otherwise use the current scope (new variable declaration)
+ var scope = Workflow.Scopes.Reverse().FirstOrDefault(x => x.Variables.ContainsKey(name)) ?? CurrentScope;
+ scope.SetVariable(name, value);
+ }
+
+ public T GetVariable(string name)
+ {
+ // Get the first scope (starting from the newest one) containing the variable.
+ var scope = Workflow.Scopes.FirstOrDefault(x => x.Variables.ContainsKey(name)) ?? CurrentScope;
+ return scope.GetVariable(name);
+ }
+
public void SetLastResult(object value) => CurrentScope.LastResult = value;
public void Start()
diff --git a/src/core/Elsa.AutoMapper.Extensions/Elsa.AutoMapper.Extensions.csproj b/src/core/Elsa.AutoMapper.Extensions/Elsa.AutoMapper.Extensions.csproj
index ca0cf7ef2..6105fc850 100644
--- a/src/core/Elsa.AutoMapper.Extensions/Elsa.AutoMapper.Extensions.csproj
+++ b/src/core/Elsa.AutoMapper.Extensions/Elsa.AutoMapper.Extensions.csproj
@@ -14,9 +14,9 @@
-
-
-
+
+
+
diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Fork.cs b/src/core/Elsa.Core/Activities/ControlFlow/Fork.cs
index 52d999228..0d9e7aaf5 100644
--- a/src/core/Elsa.Core/Activities/ControlFlow/Fork.cs
+++ b/src/core/Elsa.Core/Activities/ControlFlow/Fork.cs
@@ -9,8 +9,8 @@ namespace Elsa.Activities.ControlFlow
[ActivityDefinition(
Category = "Control Flow",
Description = "Fork workflow execution into multiple branches.",
- Icon = "fas fa-code-branch fa-rotate-180")]
- [ActivityDefinitionDesigner(Outcomes = "x => x.state.branches")]
+ Icon = "fas fa-code-branch fa-rotate-180",
+ Outcomes = "x => x.state.branches")]
public class Fork : Activity
{
[ActivityProperty(
diff --git a/src/core/Elsa.Core/Activities/ControlFlow/IfElse.cs b/src/core/Elsa.Core/Activities/ControlFlow/IfElse.cs
index 4bab9e82c..f58316cae 100644
--- a/src/core/Elsa.Core/Activities/ControlFlow/IfElse.cs
+++ b/src/core/Elsa.Core/Activities/ControlFlow/IfElse.cs
@@ -12,11 +12,8 @@ namespace Elsa.Activities.ControlFlow
[ActivityDefinition(
DisplayName = "If/Else",
Category = "Control Flow",
- Description = "Evaluate a Boolean expression and continue execution depending on the result."
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.expression ? `Evaluate ${ x.state.expression.expression } and continue execution depending on the result.` : x.definition.description",
+ Description = "Evaluate a Boolean expression and continue execution depending on the result.",
+ RuntimeDescription = "x => !!x.state.expression ? `Evaluate ${ x.state.expression.expression } and continue execution depending on the result.` : x.definition.description",
Outcomes = new[] { OutcomeNames.True, OutcomeNames.False }
)]
public class IfElse : Activity
diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Join.cs b/src/core/Elsa.Core/Activities/ControlFlow/Join.cs
index 760fbcb99..dc8ed556a 100644
--- a/src/core/Elsa.Core/Activities/ControlFlow/Join.cs
+++ b/src/core/Elsa.Core/Activities/ControlFlow/Join.cs
@@ -14,11 +14,8 @@ namespace Elsa.Activities.ControlFlow
[ActivityDefinition(
Category = "Control Flow",
Description = "Merge workflow execution back into a single branch.",
- Icon = "fas fa-code-branch"
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.joinMode ? `Merge workflow execution back into a single branch using mode ${ x.state.joinMode }` : x.definition.description",
+ Icon = "fas fa-code-branch",
+ RuntimeDescription = "x => !!x.state.joinMode ? `Merge workflow execution back into a single branch using mode ${ x.state.joinMode }` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class Join : Activity, IWorkflowEventHandler
diff --git a/src/core/Elsa.Core/Activities/ControlFlow/Switch.cs b/src/core/Elsa.Core/Activities/ControlFlow/Switch.cs
index b7871d975..4fdf11895 100644
--- a/src/core/Elsa.Core/Activities/ControlFlow/Switch.cs
+++ b/src/core/Elsa.Core/Activities/ControlFlow/Switch.cs
@@ -13,11 +13,8 @@ namespace Elsa.Activities.ControlFlow
[ActivityDefinition(
Category = "Control Flow",
Description = "Switch execution based on a given expression.",
- Icon = "far fa-list-alt"
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.expression ? `Switch execution based on ${ x.state.expression.expression }.` : x.definition.description",
+ Icon = "far fa-list-alt",
+ RuntimeDescription = "x => !!x.state.expression ? `Switch execution based on ${ x.state.expression.expression }.` : x.definition.description",
Outcomes = "x => x.state.cases.map(c => c.toString())"
)]
public class Switch : Activity
@@ -44,7 +41,8 @@ namespace Elsa.Activities.ControlFlow
set => SetState(value);
}
- protected override async Task OnExecuteAsync(WorkflowExecutionContext workflowContext,
+ protected override async Task OnExecuteAsync(
+ WorkflowExecutionContext workflowContext,
CancellationToken cancellationToken)
{
var result = await expressionEvaluator.EvaluateAsync(Expression, workflowContext, cancellationToken);
diff --git a/src/core/Elsa.Core/Activities/ControlFlow/While.cs b/src/core/Elsa.Core/Activities/ControlFlow/While.cs
new file mode 100644
index 000000000..0ae2d5060
--- /dev/null
+++ b/src/core/Elsa.Core/Activities/ControlFlow/While.cs
@@ -0,0 +1,56 @@
+using System.Threading;
+using System.Threading.Tasks;
+using Elsa.Attributes;
+using Elsa.Expressions;
+using Elsa.Extensions;
+using Elsa.Results;
+using Elsa.Services;
+using Elsa.Services.Models;
+
+namespace Elsa.Activities.ControlFlow
+{
+ [ActivityDefinition(Category = "Control Flow", Description = "Execute while a given condition is true.", Icon = "far fa-circle")]
+ public class While : Activity
+ {
+ private readonly IWorkflowExpressionEvaluator expressionEvaluator;
+
+ public While(IWorkflowExpressionEvaluator expressionEvaluator)
+ {
+ this.expressionEvaluator = expressionEvaluator;
+ }
+
+ [ActivityProperty(Hint = "Enter an expression that evaluates to a boolean value.")]
+ public WorkflowExpression ConditionExpression
+ {
+ get => GetState(() => new JavaScriptExpression("true"));
+ set => SetState(value);
+ }
+
+ public bool HasStarted
+ {
+ get => GetState(() => false);
+ set => SetState(value);
+ }
+
+ protected override async Task OnExecuteAsync(
+ WorkflowExecutionContext context,
+ CancellationToken cancellationToken)
+ {
+ var loop = await expressionEvaluator.EvaluateAsync(ConditionExpression, context, cancellationToken);
+
+ if(HasStarted)
+ context.EndScope();
+
+ if (loop)
+ {
+ if (!HasStarted)
+ HasStarted = true;
+
+ context.BeginScope();
+ return Outcome(OutcomeNames.Loop);
+ }
+
+ return Done();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/core/Elsa.Core/Activities/Primitives/SetVariable.cs b/src/core/Elsa.Core/Activities/Primitives/SetVariable.cs
index 39645a194..6706e9830 100644
--- a/src/core/Elsa.Core/Activities/Primitives/SetVariable.cs
+++ b/src/core/Elsa.Core/Activities/Primitives/SetVariable.cs
@@ -11,11 +11,8 @@ namespace Elsa.Activities.Primitives
[ActivityDefinition(
DisplayName = "Set Variable",
Description = "Set variable on the workflow.",
- Category = "Primitives"
- )]
- [ActivityDefinitionDesigner(
- Description =
- "x => !!x.state.variableName ? `${x.state.variableName} = ${x.state.valueExpression.expression}
${x.state.valueExpression.syntax}` : x.definition.description",
+ Category = "Primitives",
+ RuntimeDescription = "x => !!x.state.variableName ? `${x.state.variableName} = ${x.state.valueExpression.expression}
${x.state.valueExpression.syntax}` : x.definition.description",
Outcomes = new[] { OutcomeNames.Done }
)]
public class SetVariable : Activity
@@ -51,7 +48,7 @@ namespace Elsa.Activities.Primitives
workflowContext,
cancellationToken
);
- workflowContext.CurrentScope.SetVariable(VariableName, value);
+ workflowContext.SetVariable(VariableName, value);
return Done();
}
}
diff --git a/src/core/Elsa.Core/Elsa.Core.csproj b/src/core/Elsa.Core/Elsa.Core.csproj
index 1e8b11eb6..b36a56d18 100644
--- a/src/core/Elsa.Core/Elsa.Core.csproj
+++ b/src/core/Elsa.Core/Elsa.Core.csproj
@@ -16,10 +16,11 @@
+
-
+
@@ -29,7 +30,7 @@
-
+
diff --git a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs
index 786595d67..0ff5d3a2b 100644
--- a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs
+++ b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs
@@ -175,6 +175,7 @@ namespace Microsoft.Extensions.DependencyInjection
{
return services
.AddActivity()
+ .AddActivity()
.AddActivity()
.AddActivity()
.AddSingleton(sp => sp.GetRequiredService())
diff --git a/src/dashboard/Elsa.WorkflowDesigner/ActivityDescriber.cs b/src/core/Elsa.Core/Metadata/ActivityDescriber.cs
similarity index 80%
rename from src/dashboard/Elsa.WorkflowDesigner/ActivityDescriber.cs
rename to src/core/Elsa.Core/Metadata/ActivityDescriber.cs
index 73e2a110c..cd385885a 100644
--- a/src/dashboard/Elsa.WorkflowDesigner/ActivityDescriber.cs
+++ b/src/core/Elsa.Core/Metadata/ActivityDescriber.cs
@@ -7,22 +7,20 @@ using Elsa.Attributes;
using Elsa.Design;
using Elsa.Expressions;
using Elsa.Services.Models;
-using Elsa.WorkflowDesigner.Models;
using Humanizer;
-namespace Elsa.WorkflowDesigner
+namespace Elsa.Metadata
{
public static class ActivityDescriber
{
- public static ActivityDefinitionModel Describe() where T : IActivity
+ public static ActivityDescriptor Describe() where T : IActivity
{
return Describe(typeof(T));
}
-
- public static ActivityDefinitionModel Describe(Type activityType)
+
+ public static ActivityDescriptor Describe(Type activityType)
{
var activityDefinitionAttribute = activityType.GetCustomAttribute();
- var activityDesignerAttribute = activityType.GetCustomAttribute();
var typeName = activityDefinitionAttribute?.Type ?? activityType.Name;
var displayName =
@@ -30,25 +28,22 @@ namespace Elsa.WorkflowDesigner
activityType.Name.Humanize(LetterCasing.Title);
var description = activityDefinitionAttribute?.Description;
+ var runtimeDescription = activityDefinitionAttribute?.RuntimeDescription;
var category = activityDefinitionAttribute?.Category ?? "Miscellaneous";
var icon = activityDefinitionAttribute?.Icon;
- var designerDescription = activityDesignerAttribute?.Description;
- var designerOutcomes = activityDesignerAttribute?.Outcomes ?? new[] { OutcomeNames.Done };
+ var outcomes = activityDefinitionAttribute?.Outcomes ?? new[] { OutcomeNames.Done };
var properties = DescribeProperties(activityType);
- return new ActivityDefinitionModel
+ return new ActivityDescriptor
{
Type = typeName.Pascalize(),
DisplayName = displayName,
Description = description,
+ RuntimeDescription = runtimeDescription,
Category = category,
Icon = icon,
Properties = properties.ToArray(),
- Designer = new ActivityDesignerSettings
- {
- Description = designerDescription,
- Outcomes = designerOutcomes
- }
+ Outcomes = outcomes
};
}
diff --git a/src/dashboard/Elsa.WorkflowDesigner/Models/ActivityDefinitionModel.cs b/src/core/Elsa.Core/Metadata/ActivityDescriptor.cs
similarity index 70%
rename from src/dashboard/Elsa.WorkflowDesigner/Models/ActivityDefinitionModel.cs
rename to src/core/Elsa.Core/Metadata/ActivityDescriptor.cs
index e05641b47..0da3dfb49 100644
--- a/src/dashboard/Elsa.WorkflowDesigner/Models/ActivityDefinitionModel.cs
+++ b/src/core/Elsa.Core/Metadata/ActivityDescriptor.cs
@@ -1,23 +1,24 @@
-namespace Elsa.WorkflowDesigner.Models
+namespace Elsa.Metadata
{
- public class ActivityDefinitionModel
+ public class ActivityDescriptor
{
- public ActivityDefinitionModel()
+ public ActivityDescriptor()
{
Type = "Activity";
Properties = new ActivityPropertyDescriptor[0];
Category = "Miscellaneous";
DisplayName = "Activity";
Properties = new ActivityPropertyDescriptor[0];
- Designer = new ActivityDesignerSettings();
+ Outcomes = null;
}
public string Type { get; set; }
public string DisplayName { get; set; }
public string? Description { get; set; }
+ public string? RuntimeDescription { get; set; }
public string Category { get; set; }
public string? Icon { get; set; }
+ public object? Outcomes { get; set; }
public ActivityPropertyDescriptor[] Properties { get; set; }
- public ActivityDesignerSettings Designer { get; set; }
}
}
\ No newline at end of file
diff --git a/src/dashboard/Elsa.WorkflowDesigner/Models/ActivityPropertyDescriptor.cs b/src/core/Elsa.Core/Metadata/ActivityPropertyDescriptor.cs
similarity index 93%
rename from src/dashboard/Elsa.WorkflowDesigner/Models/ActivityPropertyDescriptor.cs
rename to src/core/Elsa.Core/Metadata/ActivityPropertyDescriptor.cs
index 6feaf6f26..58da3a6bc 100644
--- a/src/dashboard/Elsa.WorkflowDesigner/Models/ActivityPropertyDescriptor.cs
+++ b/src/core/Elsa.Core/Metadata/ActivityPropertyDescriptor.cs
@@ -1,4 +1,4 @@
-namespace Elsa.WorkflowDesigner.Models
+namespace Elsa.Metadata
{
public class ActivityPropertyDescriptor
{
diff --git a/src/core/Elsa.Core/Scripting/CommonScriptEngineConfigurator.cs b/src/core/Elsa.Core/Scripting/CommonScriptEngineConfigurator.cs
index df9aa755d..adcd6a908 100644
--- a/src/core/Elsa.Core/Scripting/CommonScriptEngineConfigurator.cs
+++ b/src/core/Elsa.Core/Scripting/CommonScriptEngineConfigurator.cs
@@ -23,7 +23,7 @@ namespace Elsa.Scripting
engine.SetValue("correlationId", (Func