From 7eebda4d71a62716218ae6f18fea0915edf8ab5d Mon Sep 17 00:00:00 2001 From: af Date: Mon, 6 May 2024 14:14:54 +0200 Subject: [PATCH 1/5] Added the code for the attributes --- .../Conditional/BaseInputAttribute.cs | 35 ++++++++++ .../Conditional/ConditionalInputAttribute.cs | 24 +++++++ .../Conditional/ConditionalInputOptions.cs | 17 +++++ .../Conditional/StateDropdownInput.cs | 70 +++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs create mode 100644 src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs create mode 100644 src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs create mode 100644 src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs new file mode 100644 index 0000000000..0ef4f0f51c --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json.Linq; +using Newtonsoft.Json; + +namespace Elsa.Workflows.Attributes.Conditional; +[AttributeUsage(AttributeTargets.Property)] +public class Input : InputAttribute +{ + public Input(List? descriptions = null) + { + if (descriptions is not null) + { + UIDescription = descriptions; + } + } + + protected void Serialize(object? extendWithValues = null) + { + // Important: + // The description field is used to send the payload to the server. + Description = JsonConvert.SerializeObject(new + { + InputType = InputType, + Description = UIDescription + }); + + if (extendWithValues is not null) + { + var json = (JsonConvert.DeserializeAnonymousType(Description, extendWithValues) as JObject)!; + Description = json.ToString(); + } + } + + public string InputType { get; set; } = "Generic"; + public List UIDescription { get; set; } = ["Generic Input"]; +} diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs new file mode 100644 index 0000000000..55dd60514f --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs @@ -0,0 +1,24 @@ +using Elsa.Workflows.Attributes.Conditional; +using Newtonsoft.Json; + + +namespace Workflows.Activities.Shared.Inputs; + +[AttributeUsage(AttributeTargets.Property)] +public class ConditionalInput : Input +{ + public ConditionalInput(string[] showForStates, string description = "") : base([description]) + { + InputType = "ConditionalInput"; + ShowForStates = showForStates; + Description = JsonConvert.SerializeObject( + new + { + InputType = InputType, + Description = UIDescription, + ShowForStates + } + ); + } + public string[] ShowForStates { get; set; } = ["Default"]; +} diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs new file mode 100644 index 0000000000..d885951b4d --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs @@ -0,0 +1,17 @@ +namespace Workflows.Activities.Shared.Inputs.Generics; + +public static class ConditionalInputOptions +{ + // + // Summary: + // State name (in this case the id is the state name) + public const string WithoutDescription = "s"; + // + // Summary: + // State name, description (in this case the id is the state name) + public const string WithDescription = "sd"; + // + // Summary: + // State name, id, description + public const string WithIdAndDescription = "sid"; +} diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs new file mode 100644 index 0000000000..e7b669444c --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs @@ -0,0 +1,70 @@ +using Elsa.Workflows.Attributes.Conditional; +using Elsa.Workflows.UIHints; +using Newtonsoft.Json; +using Workflows.Activities.Shared.Inputs.Generics; + +[AttributeUsage(AttributeTargets.Property)] +public class StateDropdownInput : Input +{ + public List Ids { get; set; } = new(); + public StateDropdownInput(string[] states) : base() + { + Init(); + ParseDynamicStates(states); + Description = JsonConvert.SerializeObject(new + { + Mode = "Dynamic", + InputType = InputType, + Description = UIDescription, + Ids, + Options + }); + } + + private void Init() + { + UIHint = InputUIHints.DropDown; + InputType = "StateDropdown"; + } + + public void ParseDynamicStates(string[] states) + { + int count = states.Length; + List options = new(); + List descriptions = new(); + List ids = new(); + + for (int i = 0; i < count; ++i) + { + string current = states[i]; + if (current == ConditionalInputOptions.WithoutDescription) + { + ++i; + options.Add(states[i]); + descriptions.Add(""); + ids.Add(states[i]); + } + else if (current == ConditionalInputOptions.WithDescription) + { + ++i; + options.Add(states[i]); + ids.Add(states[i]); + ++i; + descriptions.Add(states[i]); + } + else if (current == ConditionalInputOptions.WithIdAndDescription) + { + ++i; + options.Add(states[i]); + ++i; + ids.Add(states[i]); + ++i; + descriptions.Add(states[i]); + } + } + + Options = options; + UIDescription = descriptions; + Ids = ids; + } +} From 3c20489ac9f908c3a321871c6475979bae5a4cd5 Mon Sep 17 00:00:00 2001 From: af Date: Mon, 6 May 2024 14:23:13 +0200 Subject: [PATCH 2/5] Updated the namespaces --- .../Attributes/Conditional/ConditionalInputAttribute.cs | 2 +- .../Attributes/Conditional/ConditionalInputOptions.cs | 3 +-- .../Attributes/Conditional/StateDropdownInput.cs | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs index 55dd60514f..eb6b8892e0 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; -namespace Workflows.Activities.Shared.Inputs; +namespace Elsa.Workflows.Attributes.Conditional; [AttributeUsage(AttributeTargets.Property)] public class ConditionalInput : Input diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs index d885951b4d..ad22ac3a0c 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputOptions.cs @@ -1,5 +1,4 @@ -namespace Workflows.Activities.Shared.Inputs.Generics; - +namespace Elsa.Workflows.Attributes.Conditional; public static class ConditionalInputOptions { // diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs index e7b669444c..b49cd58a3c 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs @@ -1,7 +1,8 @@ using Elsa.Workflows.Attributes.Conditional; using Elsa.Workflows.UIHints; using Newtonsoft.Json; -using Workflows.Activities.Shared.Inputs.Generics; + +namespace Elsa.Workflows.Attributes.Conditional; [AttributeUsage(AttributeTargets.Property)] public class StateDropdownInput : Input From 59f30af4cf9f68d4c54f46e5264fbedc14fd24fa Mon Sep 17 00:00:00 2001 From: Lukas Benner Date: Wed, 12 Feb 2025 12:00:34 +0100 Subject: [PATCH 3/5] refactor to use new properties --- .../Elsa.Server.Web/ConditionalActivity.cs | 22 ++++++++++++ .../Models/ConditionalDescriptor.cs | 16 +++++++++ .../Models/InputDescriptor.cs | 2 ++ .../ActivityDescriptors/Models/InputType.cs | 9 +++++ .../Conditional/BaseInputAttribute.cs | 35 ------------------- .../Conditional/ConditionalInputAttribute.cs | 21 +++-------- .../Conditional/StateDropdownInput.cs | 30 +++++----------- .../Attributes/InputAttribute.cs | 8 +++++ .../Attributes/InputType.cs | 9 +++++ .../Models/ConditionalDescriptor.cs | 18 ++++++++++ .../Models/InputDescriptor.cs | 2 ++ .../Services/ActivityDescriber.cs | 17 ++++++++- 12 files changed, 115 insertions(+), 74 deletions(-) create mode 100644 src/apps/Elsa.Server.Web/ConditionalActivity.cs create mode 100644 src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs create mode 100644 src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputType.cs delete mode 100644 src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs create mode 100644 src/modules/Elsa.Workflows.Core/Attributes/InputType.cs create mode 100644 src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs diff --git a/src/apps/Elsa.Server.Web/ConditionalActivity.cs b/src/apps/Elsa.Server.Web/ConditionalActivity.cs new file mode 100644 index 0000000000..0ba7360802 --- /dev/null +++ b/src/apps/Elsa.Server.Web/ConditionalActivity.cs @@ -0,0 +1,22 @@ +using Elsa.Workflows; +using Elsa.Workflows.Attributes; +using Elsa.Workflows.Attributes.Conditional; +using Elsa.Workflows.Models; +using Elsa.Workflows.UIHints; + +namespace Elsa.Server.Web; + +public class CondActivity : Activity +{ + [StateDropdownInput([ + ConditionalInputOptions.WithDescription, "getTicket", "Get ticket", + ConditionalInputOptions.WithDescription, "addArticle", "Add artice"])] + public Input ApiName{ get; set; } = default; + + + [ConditionalInput(["addArticle"], Description = "Article double", DefaultValue = 0.0, UIHint = InputUIHints.SingleLine)] + public Input ActicleText {get; set;} = default; + + [ConditionalInput(["getTicket"], Description = "Article int", DefaultValue = 0, UIHint = InputUIHints.SingleLine)] + public Input ActicleInt {get; set;} = default; +} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs new file mode 100644 index 0000000000..a21c7aaa49 --- /dev/null +++ b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs @@ -0,0 +1,16 @@ +namespace Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +public record ConditionalDescriptor +{ + public string[] ShowForStates { get; set; } = []; + public InputType InputType{ get; set; } + public DropDownStates? DropDownStates { get; set; } + +} + +public record DropDownStates { + public string Mode {get; set;} = "Dynamic"; + public required List Descriptions {get; set;} + public required List Ids { get; set; } + public required List Options { get; set; } +} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputDescriptor.cs b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputDescriptor.cs index d190895037..1d60c15cce 100644 --- a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputDescriptor.cs +++ b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputDescriptor.cs @@ -53,4 +53,6 @@ public InputDescriptor() /// A dictionary of UI specifications to be used by the UI. /// public IDictionary? UISpecifications { get; set; } + + public ConditionalDescriptor? ConditionalDescriptor { get; set; } } \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputType.cs b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputType.cs new file mode 100644 index 0000000000..8ebf257cdf --- /dev/null +++ b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/InputType.cs @@ -0,0 +1,9 @@ +namespace Elsa.Api.Client.Resources.ActivityDescriptors.Models; + +public enum InputType +{ + Generic, + ConditionalInput, + StateDropdown + +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs deleted file mode 100644 index 0ef4f0f51c..0000000000 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/BaseInputAttribute.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; - -namespace Elsa.Workflows.Attributes.Conditional; -[AttributeUsage(AttributeTargets.Property)] -public class Input : InputAttribute -{ - public Input(List? descriptions = null) - { - if (descriptions is not null) - { - UIDescription = descriptions; - } - } - - protected void Serialize(object? extendWithValues = null) - { - // Important: - // The description field is used to send the payload to the server. - Description = JsonConvert.SerializeObject(new - { - InputType = InputType, - Description = UIDescription - }); - - if (extendWithValues is not null) - { - var json = (JsonConvert.DeserializeAnonymousType(Description, extendWithValues) as JObject)!; - Description = json.ToString(); - } - } - - public string InputType { get; set; } = "Generic"; - public List UIDescription { get; set; } = ["Generic Input"]; -} diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs index eb6b8892e0..aa4e80ee90 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/ConditionalInputAttribute.cs @@ -1,24 +1,11 @@ -using Elsa.Workflows.Attributes.Conditional; -using Newtonsoft.Json; - - -namespace Elsa.Workflows.Attributes.Conditional; +namespace Elsa.Workflows.Attributes.Conditional; [AttributeUsage(AttributeTargets.Property)] -public class ConditionalInput : Input +public class ConditionalInput : InputAttribute { - public ConditionalInput(string[] showForStates, string description = "") : base([description]) + public ConditionalInput(string[] showForStates) : base() { - InputType = "ConditionalInput"; + InputType = InputType.ConditionalInput; ShowForStates = showForStates; - Description = JsonConvert.SerializeObject( - new - { - InputType = InputType, - Description = UIDescription, - ShowForStates - } - ); } - public string[] ShowForStates { get; set; } = ["Default"]; } diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs index b49cd58a3c..13c1e1d5be 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs @@ -1,31 +1,16 @@ -using Elsa.Workflows.Attributes.Conditional; +using Elsa.Workflows.Models; using Elsa.Workflows.UIHints; -using Newtonsoft.Json; namespace Elsa.Workflows.Attributes.Conditional; [AttributeUsage(AttributeTargets.Property)] -public class StateDropdownInput : Input +public class StateDropdownInput : InputAttribute { - public List Ids { get; set; } = new(); public StateDropdownInput(string[] states) : base() - { - Init(); - ParseDynamicStates(states); - Description = JsonConvert.SerializeObject(new - { - Mode = "Dynamic", - InputType = InputType, - Description = UIDescription, - Ids, - Options - }); - } - - private void Init() { UIHint = InputUIHints.DropDown; - InputType = "StateDropdown"; + InputType = InputType.StateDropdown; + ParseDynamicStates(states); } public void ParseDynamicStates(string[] states) @@ -65,7 +50,10 @@ public void ParseDynamicStates(string[] states) } Options = options; - UIDescription = descriptions; - Ids = ids; + DropDownStates = new DropDownStates{ + Descriptions = descriptions, + Ids = ids, + Options = options + }; } } diff --git a/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs index 98335c6b04..61edd5c620 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs @@ -1,3 +1,5 @@ +using Elsa.Workflows.Models; + namespace Elsa.Workflows.Attributes; /// @@ -98,4 +100,10 @@ public class InputAttribute : Attribute /// A set of types that can be used to customize the UI for this property. /// public Type[]? UIHandlers { get; set; } + + public string[]? ShowForStates { get; set; } + + public InputType InputType { get; set; } = InputType.Generic; + + public DropDownStates? DropDownStates { get; set; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs b/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs new file mode 100644 index 0000000000..b614813c9c --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs @@ -0,0 +1,9 @@ +namespace Elsa.Workflows.Attributes; + +public enum InputType +{ + Generic, + ConditionalInput, + StateDropdown + +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs b/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs new file mode 100644 index 0000000000..40a0bb9c42 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs @@ -0,0 +1,18 @@ +using Elsa.Workflows.Attributes; + +namespace Elsa.Workflows.Models; + +public record ConditionalDescriptor +{ + public string[] ShowForStates { get; set; } = []; + public InputType InputType{ get; set; } + public DropDownStates? DropDownStates { get; set; } + +} + +public record DropDownStates { + public string Mode {get; set;} = "Dynamic"; + public required List Descriptions {get; set;} + public required List Ids { get; set; } + public required List Options { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Models/InputDescriptor.cs b/src/modules/Elsa.Workflows.Core/Models/InputDescriptor.cs index 8c7f24fe06..4286a19648 100644 --- a/src/modules/Elsa.Workflows.Core/Models/InputDescriptor.cs +++ b/src/modules/Elsa.Workflows.Core/Models/InputDescriptor.cs @@ -109,4 +109,6 @@ public InputDescriptor( /// A dictionary of UI specifications to be used by the UI. /// public IDictionary? UISpecifications { get; set; } + + public ConditionalDescriptor? ConditionalDescriptor { get; set; } } \ 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 bbed2adeda..a85d6596a9 100644 --- a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs @@ -160,7 +160,7 @@ public async Task DescribeInputPropertyAsync(PropertyInfo prope var uiSpecification = await _propertyUIHandlerResolver.GetUIPropertiesAsync(propertyInfo, null, cancellationToken); - return new InputDescriptor + var inputDescriptor = new InputDescriptor ( inputAttribute?.Name ?? propertyInfo.Name, wrappedPropertyType, @@ -183,6 +183,21 @@ public async Task DescribeInputPropertyAsync(PropertyInfo prope propertyInfo, uiSpecification ); + + if (inputAttribute is null) + return inputDescriptor; + + if (inputAttribute.InputType == InputType.Generic) + return inputDescriptor; + + var conditionalDescriptor = new ConditionalDescriptor{ + ShowForStates = inputAttribute!.ShowForStates ?? [], + InputType = inputAttribute.InputType, + DropDownStates = inputAttribute.DropDownStates, + }; + inputDescriptor.ConditionalDescriptor = conditionalDescriptor; + + return inputDescriptor; } /// From 62ea66a529dc976eda6e84dbaffd1a8527379b29 Mon Sep 17 00:00:00 2001 From: Lukas Benner Date: Fri, 14 Feb 2025 10:35:17 +0100 Subject: [PATCH 4/5] simplify ConditionalDescriptor Remove unused properties Add docstrings --- .../Elsa.Server.Web/ConditionalActivity.cs | 33 +++++++----- .../Models/ConditionalDescriptor.cs | 9 +--- .../Conditional/StateDropdownInput.cs | 51 ++----------------- .../Attributes/InputAttribute.cs | 13 +++-- .../Attributes/InputType.cs | 7 ++- .../Models/ConditionalDescriptor.cs | 9 +--- .../Services/ActivityDescriber.cs | 7 ++- 7 files changed, 42 insertions(+), 87 deletions(-) diff --git a/src/apps/Elsa.Server.Web/ConditionalActivity.cs b/src/apps/Elsa.Server.Web/ConditionalActivity.cs index 0ba7360802..0eb54b36f4 100644 --- a/src/apps/Elsa.Server.Web/ConditionalActivity.cs +++ b/src/apps/Elsa.Server.Web/ConditionalActivity.cs @@ -1,22 +1,31 @@ +using Elsa.Extensions; using Elsa.Workflows; -using Elsa.Workflows.Attributes; using Elsa.Workflows.Attributes.Conditional; using Elsa.Workflows.Models; -using Elsa.Workflows.UIHints; namespace Elsa.Server.Web; -public class CondActivity : Activity +public class CondActivity : CodeActivity { - [StateDropdownInput([ - ConditionalInputOptions.WithDescription, "getTicket", "Get ticket", - ConditionalInputOptions.WithDescription, "addArticle", "Add artice"])] - public Input ApiName{ get; set; } = default; + [StateDropdownInput( + ["double", "string"], + DefaultValue = "double")] + public Input ApiName{ get; set; } = default; + + [ConditionalInput(["double"], Description = "Double")] + public Input DoubleInput {get; set;} = default; - [ConditionalInput(["addArticle"], Description = "Article double", DefaultValue = 0.0, UIHint = InputUIHints.SingleLine)] - public Input ActicleText {get; set;} = default; + [ConditionalInput(["string"], Description = "String")] + public Input StringInput {get; set;} = default; - [ConditionalInput(["getTicket"], Description = "Article int", DefaultValue = 0, UIHint = InputUIHints.SingleLine)] - public Input ActicleInt {get; set;} = default; -} \ No newline at end of file + protected override void Execute(ActivityExecutionContext context) + { + object? value = null; + if (ApiName.Get(context) == "double") + value = DoubleInput.Get(context); + else if (ApiName.Get(context) == "string") + value = StringInput.Get(context); + Console.WriteLine(value); + } +} diff --git a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs index a21c7aaa49..4fbb389469 100644 --- a/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs +++ b/src/clients/Elsa.Api.Client/Resources/ActivityDescriptors/Models/ConditionalDescriptor.cs @@ -4,13 +4,6 @@ public record ConditionalDescriptor { public string[] ShowForStates { get; set; } = []; public InputType InputType{ get; set; } - public DropDownStates? DropDownStates { get; set; } + public List? DropDownStates { get; set; } -} - -public record DropDownStates { - public string Mode {get; set;} = "Dynamic"; - public required List Descriptions {get; set;} - public required List Ids { get; set; } - public required List Options { get; set; } } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs index 13c1e1d5be..bb6b88878a 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/Conditional/StateDropdownInput.cs @@ -1,59 +1,14 @@ -using Elsa.Workflows.Models; -using Elsa.Workflows.UIHints; +using Elsa.Workflows.UIHints; namespace Elsa.Workflows.Attributes.Conditional; [AttributeUsage(AttributeTargets.Property)] public class StateDropdownInput : InputAttribute { - public StateDropdownInput(string[] states) : base() + public StateDropdownInput(string[] stateOptions) : base() { UIHint = InputUIHints.DropDown; InputType = InputType.StateDropdown; - ParseDynamicStates(states); - } - - public void ParseDynamicStates(string[] states) - { - int count = states.Length; - List options = new(); - List descriptions = new(); - List ids = new(); - - for (int i = 0; i < count; ++i) - { - string current = states[i]; - if (current == ConditionalInputOptions.WithoutDescription) - { - ++i; - options.Add(states[i]); - descriptions.Add(""); - ids.Add(states[i]); - } - else if (current == ConditionalInputOptions.WithDescription) - { - ++i; - options.Add(states[i]); - ids.Add(states[i]); - ++i; - descriptions.Add(states[i]); - } - else if (current == ConditionalInputOptions.WithIdAndDescription) - { - ++i; - options.Add(states[i]); - ++i; - ids.Add(states[i]); - ++i; - descriptions.Add(states[i]); - } - } - - Options = options; - DropDownStates = new DropDownStates{ - Descriptions = descriptions, - Ids = ids, - Options = options - }; + Options = stateOptions.ToList(); } } diff --git a/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs b/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs index 61edd5c620..342840b3fa 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/InputAttribute.cs @@ -1,5 +1,3 @@ -using Elsa.Workflows.Models; - namespace Elsa.Workflows.Attributes; /// @@ -101,9 +99,14 @@ public class InputAttribute : Attribute /// public Type[]? UIHandlers { get; set; } + /// + /// A set of states for which this input should be shown + /// public string[]? ShowForStates { get; set; } - public InputType InputType { get; set; } = InputType.Generic; - - public DropDownStates? DropDownStates { get; set; } + /// + /// The type of the input. + /// To differentiate between state dropdown, conditional input and normal input + /// + public InputType InputType { get; set; } = InputType.Default; } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs b/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs index b614813c9c..6fa654f3cc 100644 --- a/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs +++ b/src/modules/Elsa.Workflows.Core/Attributes/InputType.cs @@ -1,9 +1,12 @@ namespace Elsa.Workflows.Attributes; +/// +/// Type of an input. +/// To differentiate between state dropdown, conditional input and normal input. +/// public enum InputType { - Generic, + Default, ConditionalInput, StateDropdown - } \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs b/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs index 40a0bb9c42..a7ec97d2d9 100644 --- a/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs +++ b/src/modules/Elsa.Workflows.Core/Models/ConditionalDescriptor.cs @@ -6,13 +6,6 @@ public record ConditionalDescriptor { public string[] ShowForStates { get; set; } = []; public InputType InputType{ get; set; } - public DropDownStates? DropDownStates { get; set; } + public List? DropDownStates { get; set; } -} - -public record DropDownStates { - public string Mode {get; set;} = "Dynamic"; - public required List Descriptions {get; set;} - public required List Ids { get; set; } - public required List Options { get; set; } } \ 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 a85d6596a9..82d9f16e78 100644 --- a/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs +++ b/src/modules/Elsa.Workflows.Core/Services/ActivityDescriber.cs @@ -187,16 +187,15 @@ public async Task DescribeInputPropertyAsync(PropertyInfo prope if (inputAttribute is null) return inputDescriptor; - if (inputAttribute.InputType == InputType.Generic) + if (inputAttribute.InputType == InputType.Default) return inputDescriptor; var conditionalDescriptor = new ConditionalDescriptor{ - ShowForStates = inputAttribute!.ShowForStates ?? [], + ShowForStates = inputAttribute.ShowForStates ?? [], InputType = inputAttribute.InputType, - DropDownStates = inputAttribute.DropDownStates, + DropDownStates = inputAttribute.Options as List }; inputDescriptor.ConditionalDescriptor = conditionalDescriptor; - return inputDescriptor; } From b3b26ff0ee695cce3d193b59bdf549159481e47a Mon Sep 17 00:00:00 2001 From: Lukas Benner Date: Fri, 14 Feb 2025 11:26:00 +0100 Subject: [PATCH 5/5] remove example implementation --- .../Elsa.Server.Web/ConditionalActivity.cs | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/apps/Elsa.Server.Web/ConditionalActivity.cs diff --git a/src/apps/Elsa.Server.Web/ConditionalActivity.cs b/src/apps/Elsa.Server.Web/ConditionalActivity.cs deleted file mode 100644 index 0eb54b36f4..0000000000 --- a/src/apps/Elsa.Server.Web/ConditionalActivity.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Elsa.Extensions; -using Elsa.Workflows; -using Elsa.Workflows.Attributes.Conditional; -using Elsa.Workflows.Models; - -namespace Elsa.Server.Web; - -public class CondActivity : CodeActivity -{ - - [StateDropdownInput( - ["double", "string"], - DefaultValue = "double")] - public Input ApiName{ get; set; } = default; - - [ConditionalInput(["double"], Description = "Double")] - public Input DoubleInput {get; set;} = default; - - [ConditionalInput(["string"], Description = "String")] - public Input StringInput {get; set;} = default; - - protected override void Execute(ActivityExecutionContext context) - { - object? value = null; - if (ApiName.Get(context) == "double") - value = DoubleInput.Get(context); - else if (ApiName.Get(context) == "string") - value = StringInput.Get(context); - Console.WriteLine(value); - } -}