diff --git a/src/modules/Elsa.Workflows.Core/Expressions/InputExpressionHandler.cs b/src/modules/Elsa.Workflows.Core/Expressions/InputExpressionHandler.cs new file mode 100644 index 000000000..9082d7c48 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Expressions/InputExpressionHandler.cs @@ -0,0 +1,28 @@ +using System.Diagnostics; +using Elsa.Expressions.Contracts; +using Elsa.Expressions.Models; +using Elsa.Extensions; +using Elsa.Workflows.Memory; +using Elsa.Workflows.Models; + +namespace Elsa.Workflows.Expressions; + +/// +/// Handles Input expressions. +/// +public class InputExpressionHandler : IExpressionHandler +{ + /// + public ValueTask EvaluateAsync(Expression expression, Type returnType, ExpressionExecutionContext context, ExpressionEvaluatorOptions options) + { + object? result = null; + var inputDefinition = expression.Value as InputDefinition; + + if (inputDefinition != null) + { + result = context.GetInput(inputDefinition.Name); + } + + return ValueTask.FromResult(result); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs index 2c8abe72b..7f25ab0c8 100644 --- a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs @@ -199,6 +199,9 @@ public class ActivityDescriber(IPropertyDefaultValueResolver defaultValueResolve if (wrappedPropertyType == typeof(Variable)) return InputUIHints.VariablePicker; + if (wrappedPropertyType == typeof(WorkflowInput)) + return InputUIHints.InputPicker; + if (wrappedPropertyType == typeof(Type)) return InputUIHints.TypePicker; diff --git a/src/modules/Elsa.Workflows.Core/UIHints/InputUIHints.cs b/src/modules/Elsa.Workflows.Core/UIHints/InputUIHints.cs index c94f48e76..c21c4aee7 100644 --- a/src/modules/Elsa.Workflows.Core/UIHints/InputUIHints.cs +++ b/src/modules/Elsa.Workflows.Core/UIHints/InputUIHints.cs @@ -23,5 +23,6 @@ public static class InputUIHints public const string SingleLine = "singleline"; public const string TypePicker = "type-picker"; public const string VariablePicker = "variable-picker"; + public const string InputPicker = "input-picker"; public const string WorkflowDefinitionPicker = "workflow-definition-picker"; } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs index a07a0e393..572692cc5 100644 --- a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs +++ b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using System.Text.Json; using Elsa.Expressions; using Elsa.Expressions.Contracts; @@ -5,6 +6,7 @@ using Elsa.Expressions.Models; using Elsa.Extensions; using Elsa.Workflows.Expressions; using Elsa.Workflows.Memory; +using Elsa.Workflows.Models; using Microsoft.Extensions.DependencyInjection; namespace Elsa.Workflows.Management.Providers; @@ -20,6 +22,7 @@ public class DefaultExpressionDescriptorProvider : IExpressionDescriptorProvider yield return CreateJsonDescriptor(); yield return CreateDelegateDescriptor(); yield return CreateVariableDescriptor(); + yield return CreateInputDescriptor(); } private ExpressionDescriptor CreateLiteralDescriptor() @@ -72,6 +75,33 @@ public class DefaultExpressionDescriptorProvider : IExpressionDescriptorProvider ); } + private ExpressionDescriptor CreateInputDescriptor() + { + return CreateDescriptor( + "Input", + "Input", // Displayed text in UI (input selection dropdown) + isBrowsable: true, + deserialize: context => + { + var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default; + var valueString = valueElement.GetValue()?.ToString(); + + if (string.IsNullOrWhiteSpace(valueString)) return new Expression("Input", null); + + try + { + var value = JsonSerializer.Deserialize(valueString, typeof(InputDefinition), context.Options); + + return new Expression("Input", value); + } + catch (Exception) + { + return new Expression("Input", null); + } + } + ); + } + private static ExpressionDescriptor CreateDescriptor( string expressionType, string displayName,