From 7f420f4f42e8152e7763cc49df9f6c1bb9fbfae6 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sat, 29 May 2021 14:16:23 +0200 Subject: [PATCH] Add JS functions to access activity properties --- .../Handlers/ConfigureJavaScriptEngine.cs | 17 +++++++++++++++++ .../Handlers/ConfigureLiquidEngine.cs | 10 ---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngine.cs b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngine.cs index 3b93cf316..c91e268ce 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngine.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Handlers/ConfigureJavaScriptEngine.cs @@ -10,6 +10,7 @@ using Jint; using Jint.Runtime.Interop; using MediatR; using Microsoft.Extensions.Configuration; +using Newtonsoft.Json.Linq; using NodaTime; namespace Elsa.Scripting.JavaScript.Handlers @@ -41,6 +42,8 @@ namespace Elsa.Scripting.JavaScript.Handlers engine.SetValue("isNullOrEmpty", (Func) (string.IsNullOrEmpty)); engine.SetValue("getWorkflowDefinitionIdByName", (Func) (name => GetWorkflowDefinitionIdByName(activityExecutionContext, name))); engine.SetValue("getWorkflowDefinitionIdByTag", (Func) (tag => GetWorkflowDefinitionIdByTag(activityExecutionContext, tag))); + engine.SetValue("getActivity", (Func) (idOrName => GetActivityModel(activityExecutionContext, idOrName))); + engine.SetValue("getInboundActivity", (Func) (() => GetInboundActivityModel(activityExecutionContext))); // Global variables. engine.SetValue("activityExecutionContext", activityExecutionContext); @@ -68,6 +71,7 @@ namespace Elsa.Scripting.JavaScript.Handlers foreach (var variable in variables.Data) engine.SetValue(variable.Key, variable.Value); + // TODO: Deprecated. Remove with next breaking version. // Add activity outputs. foreach (var activity in workflowBlueprint.Activities.Where(x => x.Name is not null and not "" && workflowInstance.ActivityOutput.ContainsKey(x.Id))) { @@ -87,6 +91,19 @@ namespace Elsa.Scripting.JavaScript.Handlers var workflowBlueprint = workflowRegistry.FindAsync(filter).Result; return workflowBlueprint?.Id; } + + private object? GetActivityModel(ActivityExecutionContext context, string idOrName) + { + var workflowExecutionContext = context.WorkflowExecutionContext; + var activity = workflowExecutionContext.GetActivityBlueprintByName(idOrName) ?? workflowExecutionContext.GetActivityBlueprintById(idOrName); + return activity == null ? null : workflowExecutionContext.WorkflowInstance.ActivityData[activity.Id]; + } + + private object? GetInboundActivityModel(ActivityExecutionContext context) + { + var inboundActivityId = context.WorkflowExecutionContext.GetInboundActivityPath(context.ActivityId).FirstOrDefault(); + return inboundActivityId == null ? null : GetActivityModel(context, inboundActivityId); + } private void RegisterType(Engine engine) => engine.SetValue(typeof(T).Name, TypeReference.CreateTypeReference(engine, typeof(T))); } diff --git a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs index db19d4f46..8288c5364 100644 --- a/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs +++ b/src/scripting/Elsa.Scripting.Liquid/Handlers/ConfigureLiquidEngine.cs @@ -62,16 +62,6 @@ namespace Elsa.Scripting.Liquid.Handlers private Task ToFluidValue(Variables dictionary, string key, TemplateOptions options) => Task.FromResult(!dictionary.Has(key) ? NilValue.Instance : FluidValue.Create(dictionary.Get(key), options)); private LiquidActivityModel GetActivityModelAsync(ActivityExecutionContext context, string name) => new(context, name, null); - private object? GetInboundActivityModelPropertyAsync(ActivityExecutionContext context, string propertyName) - { - var activityModel = GetInboundActivityModelAsync(context); - - if (activityModel == null) - return null; - - return GetActivityProperty(activityModel, propertyName); - } - private LiquidActivityModel? GetInboundActivityModelAsync(ActivityExecutionContext context) { var inboundActivityId = context.WorkflowExecutionContext.GetInboundActivityPath(context.ActivityId).FirstOrDefault();