From 161a70e42926bc40540f14014c6b4b4d993f91dc Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 4 Mar 2022 21:42:27 +0100 Subject: [PATCH] Remove Trigger separation --- .../Endpoints/TriggerDescriptors/List.cs | 32 ---- .../Endpoints/TriggerDescriptors/Resource.cs | 32 ---- src/api/Elsa.Api/Endpoints/Workflows/Post.cs | 3 - .../EndpointRouteBuilderExtensions.cs | 2 - .../Builders/WorkflowDefinitionBuilder.cs | 9 +- src/core/Elsa.Core/Contracts/ITrigger.cs | 17 +- .../Contracts/IWorkflowDefinitionBuilder.cs | 2 - src/core/Elsa.Core/Models/Trigger.cs | 38 ++-- src/core/Elsa.Core/Models/TriggerActivity.cs | 41 ----- src/core/Elsa.Core/Models/TriggerMode.cs | 17 ++ src/core/Elsa.Core/Models/Workflow.cs | 3 +- .../Services/IdentityGraphService.cs | 16 +- .../Extensions/ServiceCollectionExtensions.cs | 1 - .../Elsa.Management/Options/ApiOptions.cs | 5 - .../Services/WorkflowPublisher.cs | 1 - .../Extensions/ServiceCollectionExtensions.cs | 1 - .../src/components.d.ts | 71 +------- .../src/components/designer/state.tsx | 6 +- .../designer/toolbox/toolbox-activities.tsx | 17 +- .../designer/toolbox/toolbox-triggers.tsx | 139 --------------- .../components/designer/toolbox/toolbox.tsx | 9 - .../trigger-container/trigger-container.tsx | 158 ----------------- .../trigger-properties-editor.tsx | 165 ------------------ .../workflow-editor/workflow-editor.scss | 33 +--- .../workflow-editor/workflow-editor.tsx | 76 ++------ .../src/components/shell/studio/studio.tsx | 6 +- .../drivers/trigger/default-trigger-driver.ts | 36 ---- .../elsa-workflows-designer/src/index.html | 2 +- .../elsa-workflows-designer/src/models/api.ts | 7 - .../src/models/core.ts | 5 +- .../src/services/elsa-api-client-provider.ts | 17 +- .../src/services/index.ts | 2 - .../src/services/trigger-driver-registry.ts | 22 --- .../src/services/trigger-driver.ts | 16 -- src/dsl/Elsa.Dsl/Dsl/ElsaLexer.g4 | 1 - .../VisitTrigger.cs | 18 -- .../Activities/MessageReceived.cs | 4 +- .../Activities/HttpTrigger.cs | 4 +- .../Elsa.Modules.Scheduling/Triggers/Timer.cs | 2 +- .../Entities/WorkflowDefinition.cs | 1 - .../Mappers/WorkflowDefinitionMapper.cs | 2 - .../WorkflowDefinitionConfiguration.cs | 1 - .../WorkflowDefinitionSerializer.cs | 8 +- .../WorkflowExecutionBuilderExtensions.cs | 2 +- .../Elsa.Runtime/Services/TriggerIndexer.cs | 12 +- .../aspnet/Elsa.Samples.Web1/Program.cs | 17 +- .../Workflows/ForkedHttpWorkflow.cs | 12 +- .../Workflows/HttpWorkflow.cs | 12 +- .../Workflows/ReceiveMessageWorkflow.cs | 17 +- .../console/Elsa.Samples.Console1/Program.cs | 2 +- 50 files changed, 128 insertions(+), 994 deletions(-) delete mode 100644 src/api/Elsa.Api/Endpoints/TriggerDescriptors/List.cs delete mode 100644 src/api/Elsa.Api/Endpoints/TriggerDescriptors/Resource.cs delete mode 100644 src/core/Elsa.Core/Models/TriggerActivity.cs create mode 100644 src/core/Elsa.Core/Models/TriggerMode.cs delete mode 100644 src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-triggers.tsx delete mode 100644 src/designer/elsa-workflows-designer/src/components/designer/trigger-container/trigger-container.tsx delete mode 100644 src/designer/elsa-workflows-designer/src/components/designer/trigger-properties-editor/trigger-properties-editor.tsx delete mode 100644 src/designer/elsa-workflows-designer/src/drivers/trigger/default-trigger-driver.ts delete mode 100644 src/designer/elsa-workflows-designer/src/services/trigger-driver-registry.ts delete mode 100644 src/designer/elsa-workflows-designer/src/services/trigger-driver.ts delete mode 100644 src/dsl/Elsa.Dsl/Interpreters/WorkflowDefinitionBuilderInterpreter/VisitTrigger.cs diff --git a/src/api/Elsa.Api/Endpoints/TriggerDescriptors/List.cs b/src/api/Elsa.Api/Endpoints/TriggerDescriptors/List.cs deleted file mode 100644 index fb52ad38a..000000000 --- a/src/api/Elsa.Api/Endpoints/TriggerDescriptors/List.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Linq; -using System.Text.Json; -using System.Text.Json.Serialization; -using Elsa.Management.Contracts; -using Elsa.Management.Serialization.Converters; -using Microsoft.AspNetCore.Http; - -namespace Elsa.Api.Endpoints.TriggerDescriptors; - -public static partial class TriggerDescriptors -{ - public static IResult ListAsync(ITriggerRegistry registry, IWellKnownTypeRegistry wellKnownTypeRegistry) - { - var descriptors = registry.ListAll().ToList(); - - var model = new - { - TriggerDescriptors = descriptors - }; - - return Results.Json(model, new JsonSerializerOptions - { - Converters = - { - new JsonStringEnumConverter(), - new TypeJsonConverter(wellKnownTypeRegistry) - }, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault - }); - } -} \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/TriggerDescriptors/Resource.cs b/src/api/Elsa.Api/Endpoints/TriggerDescriptors/Resource.cs deleted file mode 100644 index 38b65aeb2..000000000 --- a/src/api/Elsa.Api/Endpoints/TriggerDescriptors/Resource.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Routing; - -namespace Elsa.Api.Endpoints.TriggerDescriptors; - -public class TriggerDescriptorsResource -{ - private readonly IEndpointRouteBuilder _endpoints; - - public TriggerDescriptorsResource(IEndpointRouteBuilder endpoints) - { - _endpoints = endpoints; - } - - public TriggerDescriptorsResource List() - { - _endpoints.MapGet("api/descriptors/triggers", TriggerDescriptors.ListAsync); - return this; - } -} - -public static class TriggerDescriptorsResourceExtensions -{ - public static IEndpointRouteBuilder MapTriggerDescriptors(this IEndpointRouteBuilder endpoints, Action configureResource) - { - configureResource(new(endpoints)); - return endpoints; - } - - public static IEndpointRouteBuilder MapTriggerDescriptors(this IEndpointRouteBuilder endpoints) => endpoints.MapTriggerDescriptors(x => x.List()); -} \ No newline at end of file diff --git a/src/api/Elsa.Api/Endpoints/Workflows/Post.cs b/src/api/Elsa.Api/Endpoints/Workflows/Post.cs index 7057c0dc2..4852e27a3 100644 --- a/src/api/Elsa.Api/Endpoints/Workflows/Post.cs +++ b/src/api/Elsa.Api/Endpoints/Workflows/Post.cs @@ -17,7 +17,6 @@ public static partial class Workflows string? Name, string? Description, IActivity? Root, - ICollection? Triggers, bool Publish); public static async Task PostAsync( @@ -49,12 +48,10 @@ public static partial class Workflows // Update the draft with the received model. var root = model.Root ?? new Sequence(); - var triggers = model.Triggers ?? new List(); draft = draft with { Root = root, - Triggers = triggers, Metadata = draft.Metadata with { Name = model.Name, diff --git a/src/api/Elsa.Api/Extensions/EndpointRouteBuilderExtensions.cs b/src/api/Elsa.Api/Extensions/EndpointRouteBuilderExtensions.cs index 0a4385896..481e25c65 100644 --- a/src/api/Elsa.Api/Extensions/EndpointRouteBuilderExtensions.cs +++ b/src/api/Elsa.Api/Extensions/EndpointRouteBuilderExtensions.cs @@ -1,6 +1,5 @@ using Elsa.Api.Endpoints.ActivityDescriptors; using Elsa.Api.Endpoints.Events; -using Elsa.Api.Endpoints.TriggerDescriptors; using Elsa.Api.Endpoints.WorkflowInstances; using Elsa.Api.Endpoints.Workflows; using Microsoft.AspNetCore.Routing; @@ -13,6 +12,5 @@ public static class EndpointRouteBuilderExtensions .MapWorkflows() .MapWorkflowInstances() .MapActivityDescriptors() - .MapTriggerDescriptors() .MapEvents(); } \ No newline at end of file diff --git a/src/core/Elsa.Core/Builders/WorkflowDefinitionBuilder.cs b/src/core/Elsa.Core/Builders/WorkflowDefinitionBuilder.cs index df28c691c..032c7eb63 100644 --- a/src/core/Elsa.Core/Builders/WorkflowDefinitionBuilder.cs +++ b/src/core/Elsa.Core/Builders/WorkflowDefinitionBuilder.cs @@ -10,7 +10,6 @@ public class WorkflowDefinitionBuilder : IWorkflowDefinitionBuilder public string? DefinitionId { get; private set; } public int Version { get; private set; } = 1; public IActivity? Root { get; private set; } - public ICollection Triggers { get; } = new List(); public ICollection Variables { get; set; } = new List(); public IWorkflowDefinitionBuilder WithId(string id) @@ -37,12 +36,6 @@ public class WorkflowDefinitionBuilder : IWorkflowDefinitionBuilder return this; } - public IWorkflowDefinitionBuilder AddTrigger(ITrigger trigger) - { - Triggers.Add(trigger); - return this; - } - public Workflow BuildWorkflow() { var definitionId = DefinitionId ?? Guid.NewGuid().ToString("N"); @@ -51,6 +44,6 @@ public class WorkflowDefinitionBuilder : IWorkflowDefinitionBuilder var identity = new WorkflowIdentity(definitionId, Version, id); var publication = WorkflowPublication.LatestAndPublished; var metadata = new WorkflowMetadata(); - return new Workflow(identity, publication, metadata, root, Triggers, Variables); + return new Workflow(identity, publication, metadata, root, Variables); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Contracts/ITrigger.cs b/src/core/Elsa.Core/Contracts/ITrigger.cs index c522d0a26..493b0d5ac 100644 --- a/src/core/Elsa.Core/Contracts/ITrigger.cs +++ b/src/core/Elsa.Core/Contracts/ITrigger.cs @@ -2,7 +2,22 @@ using Elsa.Models; namespace Elsa.Contracts; +/// +/// Activities that act as a trigger should implement this interface. +/// public interface ITrigger : INode { - ValueTask> GetPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken = default); + /// + /// A value indicating whether this trigger can create a new workflow instances when triggered, or execute the workflow instance this trigger belongs to. + /// + TriggerMode TriggerMode { get; set; } + + /// + /// Implementing triggers should return zero or more objects that represent a lookup value. + /// + /// + /// For example, if your trigger can be configured with a signal name to listen for, you would return an object with said signal name as a field. + /// Your auxiliary services would then use this signal name to create a hash and use it to lookup a trigger stored in the database by this hash. + /// + ValueTask> GetTriggerPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/core/Elsa.Core/Contracts/IWorkflowDefinitionBuilder.cs b/src/core/Elsa.Core/Contracts/IWorkflowDefinitionBuilder.cs index 191fa93fa..5b5e0bec1 100644 --- a/src/core/Elsa.Core/Contracts/IWorkflowDefinitionBuilder.cs +++ b/src/core/Elsa.Core/Contracts/IWorkflowDefinitionBuilder.cs @@ -7,11 +7,9 @@ public interface IWorkflowDefinitionBuilder string? DefinitionId { get; } int Version { get; } IActivity? Root { get; } - ICollection Triggers { get; } ICollection Variables { get; set; } IWorkflowDefinitionBuilder WithDefinitionId(string definitionId); IWorkflowDefinitionBuilder WithVersion(int version); IWorkflowDefinitionBuilder WithRoot(IActivity root); - IWorkflowDefinitionBuilder AddTrigger(ITrigger trigger); Workflow BuildWorkflow(); } \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/Trigger.cs b/src/core/Elsa.Core/Models/Trigger.cs index 23d1f9551..73f347faa 100644 --- a/src/core/Elsa.Core/Models/Trigger.cs +++ b/src/core/Elsa.Core/Models/Trigger.cs @@ -1,22 +1,36 @@ using Elsa.Contracts; -using Elsa.Helpers; namespace Elsa.Models; -public class Trigger : ITrigger +public abstract class Trigger : Activity, ITrigger { - protected Trigger() => NodeType = TypeNameHelper.GenerateTypeName(GetType()); - protected Trigger(string triggerType) => NodeType = triggerType; - - public string Id { get; set; } = default!; - public string NodeType { get; set; } - public IDictionary Metadata { get; set; } = new Dictionary(); - - public virtual ValueTask> GetPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken = default) + protected Trigger() { - var hashes = GetPayloads(context); + } + + protected Trigger(string triggerType) : base(triggerType) + { + } + + public TriggerMode TriggerMode { get; set; } = TriggerMode.WorkflowDefinition; + ValueTask> ITrigger.GetTriggerPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken) => GetTriggerPayloadsAsync(context, cancellationToken); + + /// + /// Override this method to return a list of trigger payloads. + /// + protected virtual ValueTask> GetTriggerPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken = default) + { + var hashes = GetTriggerPayloads(context); return ValueTask.FromResult(hashes); } - protected virtual IEnumerable GetPayloads(TriggerIndexingContext context) => Enumerable.Empty(); + /// + /// Override this method to return a list of trigger payloads. + /// + protected virtual IEnumerable GetTriggerPayloads(TriggerIndexingContext context) => new[]{ GetTriggerPayload(context) }; + + /// + /// Override this method to return a trigger payload. + /// + protected virtual object GetTriggerPayload(TriggerIndexingContext context) => new(); } \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/TriggerActivity.cs b/src/core/Elsa.Core/Models/TriggerActivity.cs deleted file mode 100644 index a1cd59272..000000000 --- a/src/core/Elsa.Core/Models/TriggerActivity.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Elsa.Contracts; - -namespace Elsa.Models; - -public class TriggerActivity : Activity, ITrigger -{ - protected TriggerActivity() - { - } - - protected TriggerActivity(string triggerType) : base(triggerType) - { - } - - public string TriggerType - { - get => NodeType; - set => NodeType = value; - } - - ValueTask> ITrigger.GetPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken) => GetPayloadsAsync(context, cancellationToken); - - /// - /// Override this method to return a list of trigger payloads. - /// - protected virtual ValueTask> GetPayloadsAsync(TriggerIndexingContext context, CancellationToken cancellationToken = default) - { - var hashes = GetPayloads(context); - return ValueTask.FromResult(hashes); - } - - /// - /// Override this method to return a list of trigger payloads. - /// - protected virtual IEnumerable GetPayloads(TriggerIndexingContext context) => new[]{ GetPayload(context) }; - - /// - /// Override this method to return a trigger payloads. - /// - protected virtual object GetPayload(TriggerIndexingContext context) => new(); -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/TriggerMode.cs b/src/core/Elsa.Core/Models/TriggerMode.cs new file mode 100644 index 000000000..c38bfb81e --- /dev/null +++ b/src/core/Elsa.Core/Models/TriggerMode.cs @@ -0,0 +1,17 @@ +namespace Elsa.Models; + +/// +/// A set of trigger modes. +/// +public enum TriggerMode +{ + /// + /// The trigger will create a new workflow instance and execute said instance. + /// + WorkflowDefinition, + + /// + /// The trigger will schedule the trigger for execution within the context of the workflow instance. + /// + WorkflowInstance +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/Workflow.cs b/src/core/Elsa.Core/Models/Workflow.cs index cec543b3f..8fad3a066 100644 --- a/src/core/Elsa.Core/Models/Workflow.cs +++ b/src/core/Elsa.Core/Models/Workflow.cs @@ -7,10 +7,9 @@ public record Workflow( WorkflowPublication Publication, WorkflowMetadata Metadata, IActivity Root, - ICollection Triggers, ICollection Variables) { - public static Workflow FromActivity(IActivity root) => new(WorkflowIdentity.VersionOne, WorkflowPublication.LatestDraft, new WorkflowMetadata(), root, new List(), new List()); + public static Workflow FromActivity(IActivity root) => new(WorkflowIdentity.VersionOne, WorkflowPublication.LatestDraft, new WorkflowMetadata(), root, new List()); public Workflow WithVersion(int version) => this with { Identity = Identity with { Version = version } }; public Workflow IncrementVersion() => WithVersion(Identity.Version + 1); diff --git a/src/core/Elsa.Core/Services/IdentityGraphService.cs b/src/core/Elsa.Core/Services/IdentityGraphService.cs index a1ecd5b84..bf17735da 100644 --- a/src/core/Elsa.Core/Services/IdentityGraphService.cs +++ b/src/core/Elsa.Core/Services/IdentityGraphService.cs @@ -13,22 +13,8 @@ public class IdentityGraphService : IIdentityGraphService _activityWalker = activityWalker; } - public void AssignIdentities(Workflow workflow) - { - AssignIdentities(workflow.Root); + public void AssignIdentities(Workflow workflow) => AssignIdentities(workflow.Root); - var triggers = workflow.Triggers; - - if (triggers == null) - return; - - foreach (var trigger in triggers) - { - if(trigger is IActivity activity) - AssignIdentities(activity); - } - } - public void AssignIdentities(IActivity root) { var graph = _activityWalker.Walk(root); diff --git a/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs b/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs index 98928b654..4efc65383 100644 --- a/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs +++ b/src/core/Elsa.Management/Extensions/ServiceCollectionExtensions.cs @@ -35,5 +35,4 @@ public static class ServiceCollectionExtensions public static IServiceCollection ConfigureApiOptions(this IServiceCollection services, Action configure) => services.Configure(configure); public static IServiceCollection AddActivity(this IServiceCollection services) where T:IActivity => services.ConfigureApiOptions(options => options.ActivityTypes.Add(typeof(T))); - public static IServiceCollection AddTrigger(this IServiceCollection services) where T:ITrigger => services.ConfigureApiOptions(options => options.TriggerTypes.Add(typeof(T))); } \ No newline at end of file diff --git a/src/core/Elsa.Management/Options/ApiOptions.cs b/src/core/Elsa.Management/Options/ApiOptions.cs index fbaef310b..ff09e1ed2 100644 --- a/src/core/Elsa.Management/Options/ApiOptions.cs +++ b/src/core/Elsa.Management/Options/ApiOptions.cs @@ -6,9 +6,4 @@ public class ApiOptions /// A collection of activity types made available from the API. /// public HashSet ActivityTypes { get; set; } = new(); - - /// - /// A collection of trigger types made available from the API. - /// - public HashSet TriggerTypes { get; set; } = new(); } \ No newline at end of file diff --git a/src/core/Elsa.Management/Services/WorkflowPublisher.cs b/src/core/Elsa.Management/Services/WorkflowPublisher.cs index 539589e0a..50e6b62cf 100644 --- a/src/core/Elsa.Management/Services/WorkflowPublisher.cs +++ b/src/core/Elsa.Management/Services/WorkflowPublisher.cs @@ -34,7 +34,6 @@ namespace Elsa.Management.Services WorkflowPublication.LatestDraft, new WorkflowMetadata(CreatedAt: _systemClock.UtcNow), new Sequence(), - new List(), new List()); } diff --git a/src/core/Elsa/Extensions/ServiceCollectionExtensions.cs b/src/core/Elsa/Extensions/ServiceCollectionExtensions.cs index ea9f6c971..28d7105b9 100644 --- a/src/core/Elsa/Extensions/ServiceCollectionExtensions.cs +++ b/src/core/Elsa/Extensions/ServiceCollectionExtensions.cs @@ -76,5 +76,4 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddStimulusHandler(this IServiceCollection services) where T : class, IStimulusHandler => services.AddSingleton(); public static IServiceCollection AddInstructionInterpreter(this IServiceCollection services) where T : class, IWorkflowInstructionInterpreter => services.AddSingleton(); public static IServiceCollection ConfigureWorkflowRuntime(this IServiceCollection services, Action configure) => services.Configure(configure); - public static IServiceCollection IndexWorkflowTriggers(this IServiceCollection services) => services.AddHostedService(); } \ No newline at end of file diff --git a/src/designer/elsa-workflows-designer/src/components.d.ts b/src/designer/elsa-workflows-designer/src/components.d.ts index 6d9fa8b9e..b207e6b0b 100644 --- a/src/designer/elsa-workflows-designer/src/components.d.ts +++ b/src/designer/elsa-workflows-designer/src/components.d.ts @@ -5,7 +5,7 @@ * It contains typing information for all components that exist in this project. */ import { HTMLStencilElement, JSXBase } from "@stencil/core/internal"; -import { ActionDefinition, ActionInvokedArgs, Activity, ActivityDescriptor, ActivitySelectedArgs, ContainerSelectedArgs, GraphUpdatedArgs, IntellisenseContext, SelectListItem, TabChangedArgs, TabDefinition, Trigger, TriggerDescriptor, Workflow, WorkflowInstance, WorkflowInstanceSummary, WorkflowSummary } from "./models"; +import { ActionDefinition, ActionInvokedArgs, Activity, ActivityDescriptor, ActivitySelectedArgs, ContainerSelectedArgs, GraphUpdatedArgs, IntellisenseContext, SelectListItem, TabChangedArgs, TabDefinition, Workflow, WorkflowInstance, WorkflowInstanceSummary, WorkflowSummary } from "./models"; import { ActivityUpdatedArgs, DeleteActivityRequestedArgs } from "./components/designer/activity-properties-editor/activity-properties-editor"; import { ContainerActivityComponent } from "./components/activities/container-activity-component"; import { AddActivityArgs } from "./components/designer/canvas/canvas"; @@ -18,8 +18,6 @@ import { ExpressionChangedArs } from "./components/designer/input-control-switch import { MonacoLib, MonacoValueChangedArgs } from "./components/shared/monaco-editor/monaco-editor"; import { PagerData } from "./components/shared/pager/pager"; import { PanelPosition, PanelStateChangedArgs } from "./components/designer/panel/models"; -import { TriggerDeselectedArgs, TriggerSelectedArgs, TriggersUpdatedArgs } from "./components/designer/trigger-container/trigger-container"; -import { DeleteTriggerRequestedArgs, TriggerUpdatedArgs } from "./components/designer/trigger-properties-editor/trigger-properties-editor"; import { WorkflowUpdatedArgs } from "./components/designer/workflow-editor/workflow-editor"; import { ActivityDriverRegistry } from "./services"; import { WorkflowPropsUpdatedArgs } from "./components/designer/workflow-properties-editor/workflow-properties-editor"; @@ -155,24 +153,6 @@ export namespace Components { interface ElsaToolboxActivities { "activityDescriptors": Array; "graph": Graph; - "triggerDescriptors": Array; - } - interface ElsaToolboxTriggers { - "activityDescriptors": Array; - "graph": Graph; - "triggerDescriptors": Array; - } - interface ElsaTriggerContainer { - "deselectAll": () => Promise; - "interactiveMode": boolean; - "triggerDescriptors": Array; - "triggers": Array; - } - interface ElsaTriggerPropertiesEditor { - "hide": () => Promise; - "show": () => Promise; - "trigger"?: Trigger; - "triggerDescriptors": Array; } interface ElsaWorkflowBrowser { "hide": () => Promise; @@ -186,7 +166,6 @@ export namespace Components { "importWorkflowMetadata": (workflow: Workflow) => Promise; "monacoLibPath": string; "registerActivityDrivers": (register: (registry: ActivityDriverRegistry) => void) => Promise; - "triggerDescriptors": Array; } interface ElsaWorkflowInstanceBrowser { "hide": () => Promise; @@ -356,24 +335,6 @@ declare global { prototype: HTMLElsaToolboxActivitiesElement; new (): HTMLElsaToolboxActivitiesElement; }; - interface HTMLElsaToolboxTriggersElement extends Components.ElsaToolboxTriggers, HTMLStencilElement { - } - var HTMLElsaToolboxTriggersElement: { - prototype: HTMLElsaToolboxTriggersElement; - new (): HTMLElsaToolboxTriggersElement; - }; - interface HTMLElsaTriggerContainerElement extends Components.ElsaTriggerContainer, HTMLStencilElement { - } - var HTMLElsaTriggerContainerElement: { - prototype: HTMLElsaTriggerContainerElement; - new (): HTMLElsaTriggerContainerElement; - }; - interface HTMLElsaTriggerPropertiesEditorElement extends Components.ElsaTriggerPropertiesEditor, HTMLStencilElement { - } - var HTMLElsaTriggerPropertiesEditorElement: { - prototype: HTMLElsaTriggerPropertiesEditorElement; - new (): HTMLElsaTriggerPropertiesEditorElement; - }; interface HTMLElsaWorkflowBrowserElement extends Components.ElsaWorkflowBrowser, HTMLStencilElement { } var HTMLElsaWorkflowBrowserElement: { @@ -442,9 +403,6 @@ declare global { "elsa-switch-editor": HTMLElsaSwitchEditorElement; "elsa-toolbox": HTMLElsaToolboxElement; "elsa-toolbox-activities": HTMLElsaToolboxActivitiesElement; - "elsa-toolbox-triggers": HTMLElsaToolboxTriggersElement; - "elsa-trigger-container": HTMLElsaTriggerContainerElement; - "elsa-trigger-properties-editor": HTMLElsaTriggerPropertiesEditorElement; "elsa-workflow-browser": HTMLElsaWorkflowBrowserElement; "elsa-workflow-editor": HTMLElsaWorkflowEditorElement; "elsa-workflow-instance-browser": HTMLElsaWorkflowInstanceBrowserElement; @@ -589,26 +547,6 @@ declare namespace LocalJSX { interface ElsaToolboxActivities { "activityDescriptors"?: Array; "graph"?: Graph; - "triggerDescriptors"?: Array; - } - interface ElsaToolboxTriggers { - "activityDescriptors"?: Array; - "graph"?: Graph; - "triggerDescriptors"?: Array; - } - interface ElsaTriggerContainer { - "interactiveMode"?: boolean; - "onTriggerDeselected"?: (event: CustomEvent) => void; - "onTriggerSelected"?: (event: CustomEvent) => void; - "onTriggersUpdated"?: (event: CustomEvent) => void; - "triggerDescriptors"?: Array; - "triggers"?: Array; - } - interface ElsaTriggerPropertiesEditor { - "onDeleteTriggerRequested"?: (event: CustomEvent) => void; - "onTriggerUpdated"?: (event: CustomEvent) => void; - "trigger"?: Trigger; - "triggerDescriptors"?: Array; } interface ElsaWorkflowBrowser { "onWorkflowDefinitionSelected"?: (event: CustomEvent) => void; @@ -617,7 +555,6 @@ declare namespace LocalJSX { "activityDescriptors"?: Array; "monacoLibPath"?: string; "onWorkflowUpdated"?: (event: CustomEvent) => void; - "triggerDescriptors"?: Array; } interface ElsaWorkflowInstanceBrowser { "onWorkflowInstanceSelected"?: (event: CustomEvent) => void; @@ -664,9 +601,6 @@ declare namespace LocalJSX { "elsa-switch-editor": ElsaSwitchEditor; "elsa-toolbox": ElsaToolbox; "elsa-toolbox-activities": ElsaToolboxActivities; - "elsa-toolbox-triggers": ElsaToolboxTriggers; - "elsa-trigger-container": ElsaTriggerContainer; - "elsa-trigger-properties-editor": ElsaTriggerPropertiesEditor; "elsa-workflow-browser": ElsaWorkflowBrowser; "elsa-workflow-editor": ElsaWorkflowEditor; "elsa-workflow-instance-browser": ElsaWorkflowInstanceBrowser; @@ -705,9 +639,6 @@ declare module "@stencil/core" { "elsa-switch-editor": LocalJSX.ElsaSwitchEditor & JSXBase.HTMLAttributes; "elsa-toolbox": LocalJSX.ElsaToolbox & JSXBase.HTMLAttributes; "elsa-toolbox-activities": LocalJSX.ElsaToolboxActivities & JSXBase.HTMLAttributes; - "elsa-toolbox-triggers": LocalJSX.ElsaToolboxTriggers & JSXBase.HTMLAttributes; - "elsa-trigger-container": LocalJSX.ElsaTriggerContainer & JSXBase.HTMLAttributes; - "elsa-trigger-properties-editor": LocalJSX.ElsaTriggerPropertiesEditor & JSXBase.HTMLAttributes; "elsa-workflow-browser": LocalJSX.ElsaWorkflowBrowser & JSXBase.HTMLAttributes; "elsa-workflow-editor": LocalJSX.ElsaWorkflowEditor & JSXBase.HTMLAttributes; "elsa-workflow-instance-browser": LocalJSX.ElsaWorkflowInstanceBrowser & JSXBase.HTMLAttributes; diff --git a/src/designer/elsa-workflows-designer/src/components/designer/state.tsx b/src/designer/elsa-workflows-designer/src/components/designer/state.tsx index b3e6ef14c..8f38673ec 100644 --- a/src/designer/elsa-workflows-designer/src/components/designer/state.tsx +++ b/src/designer/elsa-workflows-designer/src/components/designer/state.tsx @@ -1,18 +1,16 @@ import {createProviderConsumer} from "@stencil/state-tunnel"; import {h} from "@stencil/core"; -import {ActivityDescriptor, TriggerDescriptor, Workflow} from "../../models"; +import {ActivityDescriptor, Workflow} from "../../models"; export interface WorkflowDesignerState { workflow: Workflow; activityDescriptors: Array; - triggerDescriptors: Array; } export default createProviderConsumer( { workflow: null, - activityDescriptors: [], - triggerDescriptors: [] + activityDescriptors: [] }, (subscribe, child) => () ); diff --git a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-activities.tsx b/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-activities.tsx index c7d7c8828..0eca17d92 100644 --- a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-activities.tsx +++ b/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-activities.tsx @@ -2,7 +2,7 @@ import {Component, h, Prop, State, Watch} from "@stencil/core"; import {Addon, Graph} from '@antv/x6'; import groupBy from 'lodash/groupBy'; import {Container} from 'typedi'; -import {ActivityDescriptor, TriggerDescriptor} from '../../../models'; +import {ActivityDescriptor} from '../../../models'; import {ActivityDriverRegistry} from '../../../services'; import WorkflowEditorTunnel from '../state'; @@ -18,7 +18,6 @@ interface ActivityCategoryModel { export class ToolboxActivities { @Prop() graph: Graph; @Prop({mutable: true}) activityDescriptors: Array = []; - @Prop({mutable: true}) triggerDescriptors: Array = []; @State() activityCategoryModels: Array = []; private dnd: Addon.Dnd; private renderedActivities: Map; @@ -71,17 +70,9 @@ export class ToolboxActivities { this.handleActivityDescriptorsChanged(this.activityDescriptors); } - private onActivityStartDrag(e: DragEvent, activityDescriptor: ActivityDescriptor) { + private static onActivityStartDrag(e: DragEvent, activityDescriptor: ActivityDescriptor) { const json = JSON.stringify(activityDescriptor); - const triggerDescriptor = this.triggerDescriptors.find(x => x.nodeType == activityDescriptor.nodeType); - const isTrigger = !!triggerDescriptor; - e.dataTransfer.setData('activity-descriptor', json); - - if (isTrigger) { - const triggerDescriptorJson = JSON.stringify(triggerDescriptor); - e.dataTransfer.setData('trigger-descriptor', triggerDescriptorJson); - } } private onToggleActivityCategory(categoryModel: ActivityCategoryModel) { @@ -121,7 +112,7 @@ export class ToolboxActivities { return (
this.onActivityStartDrag(e, activityDescriptor)}> + onDragStart={e => ToolboxActivities.onActivityStartDrag(e, activityDescriptor)}>
@@ -136,4 +127,4 @@ export class ToolboxActivities { } } -WorkflowEditorTunnel.injectProps(ToolboxActivities, ['activityDescriptors', 'triggerDescriptors']); +WorkflowEditorTunnel.injectProps(ToolboxActivities, ['activityDescriptors']); diff --git a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-triggers.tsx b/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-triggers.tsx deleted file mode 100644 index 65e77133f..000000000 --- a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox-triggers.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import {Component, h, Prop, State, Watch} from '@stencil/core'; -import {Addon, Graph} from '@antv/x6'; -import groupBy from 'lodash/groupBy'; -import {ActivityDescriptor, TriggerDescriptor} from '../../../models'; -import WorkflowEditorTunnel from '../state'; -import {Container} from "typedi"; -import {TriggerDriverRegistry} from '../../../services/trigger-driver-registry'; - -interface TriggerCategoryModel { - category: string; - triggers: Array; - expanded: boolean; -} - -@Component({ - tag: 'elsa-toolbox-triggers', -}) -export class ToolboxTriggers { - @Prop() graph: Graph; - @Prop({mutable: true}) triggerDescriptors: Array = []; - @Prop({mutable: true}) activityDescriptors: Array = []; - @State() triggerCategoryModels: Array = []; - private dnd: Addon.Dnd; - private renderedTriggers: Map; - - @Watch('graph') - handleGraphChanged(value: Graph) { - - if (this.dnd) - this.dnd.dispose(); - - this.dnd = new Addon.Dnd({ - target: value, - scaled: false, - animation: true, - }); - } - - @Watch('triggerDescriptors') - handleTriggerDescriptorsChanged(value: Array) { - const categorizedTriggersLookup = groupBy(value, x => x.category); - const categories = Object.keys(categorizedTriggersLookup); - const renderedTriggers: Map = new Map(); - - // Group triggers by category - this.triggerCategoryModels = categories.map(x => { - const model: TriggerCategoryModel = { - category: x, - expanded: false, - triggers: categorizedTriggersLookup[x] - }; - - return model; - }); - - // Render activities. - const driverRegistry = Container.get(TriggerDriverRegistry); - - for (const triggerDescriptor of value) { - const triggerType = triggerDescriptor.nodeType; - const driver = driverRegistry.createDriver(triggerType); - const html = driver.display({displayType: 'picker', triggerDescriptor: triggerDescriptor}); - - renderedTriggers.set(triggerType, html); - } - - this.renderedTriggers = renderedTriggers; - } - - componentDidLoad() { - this.handleTriggerDescriptorsChanged(this.triggerDescriptors); - } - - private onTriggerStartDrag(e: DragEvent, triggerDescriptor: TriggerDescriptor) { - const json = JSON.stringify(triggerDescriptor); - const activityDescriptor = this.activityDescriptors.find(x => x.nodeType == triggerDescriptor.nodeType); - const isActivity = !!activityDescriptor; - - e.dataTransfer.setData('trigger-descriptor', json); - - if (isActivity) { - const activityJson = JSON.stringify(activityDescriptor); - e.dataTransfer.setData('activity-descriptor', activityJson); - } - } - - private onToggleTriggerCategory(categoryModel: TriggerCategoryModel) { - categoryModel.expanded = !categoryModel.expanded; - this.triggerCategoryModels = [...this.triggerCategoryModels]; - } - - render() { - const categoryModels = this.triggerCategoryModels; - const renderedTriggers = this.renderedTriggers; - - return - } -} - -WorkflowEditorTunnel.injectProps(ToolboxTriggers, ['activityDescriptors', 'triggerDescriptors']); diff --git a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox.tsx b/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox.tsx index 822fcc066..e5ebf28e5 100644 --- a/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox.tsx +++ b/src/designer/elsa-workflows-designer/src/components/designer/toolbox/toolbox.tsx @@ -19,7 +19,6 @@ export class Toolbox { const selectedCss = 'border-blue-500 text-blue-600'; const defaultCss = 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'; const activitiesTabCssClass = selectedTabIndex == 0 ? selectedCss : defaultCss; - const triggersTabCssClass = selectedTabIndex == 1 ? selectedCss : defaultCss; return ( @@ -33,11 +32,6 @@ export class Toolbox { Activities - this.onTabSelected(e, 1)} - class={`${triggersTabCssClass} w-1/2 py-4 px-1 text-center border-b-2 font-medium text-sm`}> - Triggers -
@@ -45,9 +39,6 @@ export class Toolbox { graph={this.graph} class={selectedTabIndex == 0 ? '' : 'hidden'}/> - ); } diff --git a/src/designer/elsa-workflows-designer/src/components/designer/trigger-container/trigger-container.tsx b/src/designer/elsa-workflows-designer/src/components/designer/trigger-container/trigger-container.tsx deleted file mode 100644 index e7928db4e..000000000 --- a/src/designer/elsa-workflows-designer/src/components/designer/trigger-container/trigger-container.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import {Component, EventEmitter, h, Prop, State, Event, Method} from '@stencil/core'; -import {v4 as uuid} from 'uuid'; -import {Container} from 'typedi'; -import {Activity, ActivitySelectedArgs, Trigger, TriggerDescriptor, Workflow} from '../../../models'; -import {TriggerDriverRegistry} from '../../../services/trigger-driver-registry'; -import WorkflowEditorTunnel from "../state"; - -export interface TriggersUpdatedArgs { - triggers: Array; -} - -export interface TriggerSelectedArgs { - trigger: Trigger; - applyChanges: (trigger: Trigger) => void; - deleteTrigger: (trigger: Trigger) => void; -} - -export interface TriggerDeselectedArgs { - trigger: Trigger; -} - -@Component({ - tag: 'elsa-trigger-container', -}) -export class TriggerContainer { - private renderedTriggers: Map = new Map(); - - @Prop({mutable: true}) public triggerDescriptors: Array = []; - @Prop({mutable: true}) public triggers: Array = []; - @Prop() public interactiveMode: boolean = true; - @Event() public triggersUpdated: EventEmitter; - @Event() triggerSelected: EventEmitter; - @Event() triggerDeselected: EventEmitter; - @State() private selectedTriggers: Array = []; - - @Method() - public async deselectAll(): Promise { - this.selectedTriggers = []; - } - - public componentWillRender() { - const triggerDescriptors = this.triggerDescriptors; - const triggers = this.triggers; - const triggerDriverRegistry = Container.get(TriggerDriverRegistry); - const renderedTriggers = new Map(); - - for (const trigger of triggers) { - const triggerType = trigger.nodeType; - const triggerDescriptor = triggerDescriptors.find(x => x.nodeType == triggerType); - const driver = triggerDriverRegistry.createDriver(triggerType); - const html = driver.display({triggerDescriptor: triggerDescriptor, trigger: trigger, displayType: 'designer'}); - - renderedTriggers.set(trigger.id, html); - } - - this.renderedTriggers = renderedTriggers; - } - - public render() { - return ( -
this.onDrop(e)}> - {this.renderTriggers()} -
- ); - } - - private renderTriggers = () => { - const triggers = this.triggers; - - if (triggers.length == 0) { - return
-
-

Place your workflow triggers here to automatically invoke your workflow when a trigger executes.

-
-
- } - - return
- {triggers.map(this.renderTrigger)} -
- }; - - private renderTrigger = (trigger: Trigger) => { - const renderedTriggers = this.renderedTriggers; - const html = renderedTriggers.get(trigger.id); - const isSelected = this.getIsTriggerSelected(trigger); - const cssClass = isSelected ? 'border-green-400' : 'border-transparent'; - return ( -
this.onKeyPress(e)}> -
this.onTriggerClick(e, trigger)}> -
-
-
- ); - }; - - private updateTriggers = (triggers: Array) => { - this.triggers = triggers; - this.triggersUpdated.emit({triggers: triggers}); - }; - - private deleteTrigger = (trigger: Trigger) => { - const triggers = this.triggers.filter(x => x != trigger); - this.updateTriggers(triggers); - }; - - private updateTrigger = (trigger: Trigger) => this.updateTriggers([...this.triggers]); - private getIsTriggerSelected = (trigger: Trigger) => this.selectedTriggers.findIndex(x => x == trigger.id) >= 0; - - private onDrop = (e: DragEvent) => { - const json = e.dataTransfer.getData('trigger-descriptor'); - const triggerDescriptor: TriggerDescriptor = JSON.parse(json); - - const trigger: Trigger = { - id: uuid(), - nodeType: triggerDescriptor.nodeType, - metadata: {} - }; - - const triggers = [...this.triggers, trigger]; - this.updateTriggers(triggers); - }; - - private onDragOver = (e: DragEvent) => { - const isTrigger = e.dataTransfer.types.indexOf('trigger-descriptor') >= 0; - if (this.interactiveMode && isTrigger) - e.preventDefault(); - } - - private onTriggerClick = (e: MouseEvent, trigger: Trigger) => { - const isSelected = this.getIsTriggerSelected(trigger); - - if (e.ctrlKey) - this.selectedTriggers = isSelected ? this.selectedTriggers.filter(x => x != trigger.id) : [...this.selectedTriggers, trigger.id]; - else - this.selectedTriggers = [trigger.id]; - - this.triggerSelected.emit({ - trigger: trigger, - applyChanges: this.updateTrigger, - deleteTrigger: this.deleteTrigger - }); - }; - - private onKeyPress = (e: KeyboardEvent) => { - if (e.key != 'Delete' || !this.interactiveMode) - return; - - const selectedTriggers = this.selectedTriggers; - const triggers = this.triggers.filter(trigger => selectedTriggers.findIndex(x => x == trigger.id) < 0); - this.updateTriggers(triggers); - }; -} - -WorkflowEditorTunnel.injectProps(TriggerContainer, ['triggerDescriptors', 'workflow']); diff --git a/src/designer/elsa-workflows-designer/src/components/designer/trigger-properties-editor/trigger-properties-editor.tsx b/src/designer/elsa-workflows-designer/src/components/designer/trigger-properties-editor/trigger-properties-editor.tsx deleted file mode 100644 index a6b7a4f87..000000000 --- a/src/designer/elsa-workflows-designer/src/components/designer/trigger-properties-editor/trigger-properties-editor.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import {Component, Event, EventEmitter, h, Method, Prop, State} from '@stencil/core'; -import {camelCase} from 'lodash'; -import WorkflowEditorTunnel from '../state'; -import { - DefaultActions, InputDescriptor, - RenderNodePropContext, - RenderNodePropsContext, - TabChangedArgs, - TabDefinition, - Trigger, - TriggerDescriptor -} from '../../../models'; -import {FormEntry} from "../../shared/forms/form-entry"; -import {InputDriverRegistry} from "../../../services/input-driver-registry"; -import {Container} from "typedi"; -import {NodeInputContext} from "../../../services/node-input-driver"; - -export interface TriggerUpdatedArgs { - trigger: Trigger; -} - -export interface DeleteTriggerRequestedArgs { - trigger: Trigger; -} - -@Component({ - tag: 'elsa-trigger-properties-editor', -}) -export class TriggerPropertiesEditor { - private slideOverPanel: HTMLElsaSlideOverPanelElement; - private renderContext: RenderNodePropsContext; - private readonly inputDriverRegistry: InputDriverRegistry; - - constructor() { - this.inputDriverRegistry = Container.get(InputDriverRegistry); - } - - @Prop({mutable: true}) triggerDescriptors: Array = []; - @Prop({mutable: true}) trigger?: Trigger; - - @Event() triggerUpdated: EventEmitter; - @Event() deleteTriggerRequested: EventEmitter; - - @State() private selectedTabIndex: number = 0; - - @Method() - public async show(): Promise { - await this.slideOverPanel.show(); - } - - @Method() - public async hide(): Promise { - await this.slideOverPanel.hide(); - } - - public componentWillRender() { - const trigger = this.trigger; - const triggerDescriptor = this.findDescriptor(); - const title = triggerDescriptor?.displayName ?? triggerDescriptor?.nodeType ?? 'Unknown Trigger'; - const driverRegistry = this.inputDriverRegistry; - - const renderPropertyContexts: Array = triggerDescriptor.inputProperties.map(inputDescriptor => { - const renderInputContext: NodeInputContext = { - node: trigger, - nodeDescriptor: triggerDescriptor, - inputDescriptor, - notifyInputChanged: () => this.triggerUpdated.emit({trigger}), - inputChanged: (v, s) => this.onPropertyEditorChanged(inputDescriptor, v, s) - }; - - const driver = driverRegistry.get(renderInputContext); - const control = driver?.renderInput(renderInputContext); - - return { - inputContext: renderInputContext, - inputControl: control, - } - }); - - this.renderContext = { - node: trigger, - nodeDescriptor: triggerDescriptor, - title, - properties: renderPropertyContexts - } - } - - public render() { - const {nodeDescriptor, title} = this.renderContext; - - const propertiesTab: TabDefinition = { - displayText: 'Properties', - content: () => this.renderPropertiesTab() - }; - - const commonTab: TabDefinition = { - displayText: 'Common', - content: () => this.renderCommonTab() - }; - - const tabs = !!nodeDescriptor ? [propertiesTab, commonTab] : []; - const actions = [DefaultActions.Delete(this.onDeleteTrigger)]; - - return ( - this.onSelectedTabIndexChanged(e)} - actions={actions}/> - ); - } - - private findDescriptor = (): TriggerDescriptor => !!this.trigger ? this.triggerDescriptors.find(x => x.nodeType == this.trigger.nodeType) : null; - - private onSelectedTabIndexChanged(e: CustomEvent) { - this.selectedTabIndex = e.detail.selectedTabIndex; - } - - private onTriggerIdChanged = (e: any) => { - const trigger = this.trigger; - const inputElement = e.target as HTMLInputElement; - - trigger.id = inputElement.value; - this.triggerUpdated.emit({trigger}); - }; - - private onPropertyEditorChanged = (inputDescriptor: InputDescriptor, propertyValue: any, syntax: string) => { - const trigger = this.trigger; - const propertyName = inputDescriptor.name; - const camelCasePropertyName = camelCase(propertyName); - - trigger[camelCasePropertyName] = { - type: inputDescriptor.type, - expression: { - type: syntax, - value: propertyValue - } - }; - - this.triggerUpdated.emit({trigger}); - } - - private onDeleteTrigger = () => this.deleteTriggerRequested.emit({trigger: this.trigger}); - - private renderPropertiesTab = () => { - const {node, properties} = this.renderContext; - const activityId = node.id; - - return
- - this.onTriggerIdChanged(e)}/> - - - {properties.filter(x => !!x.inputControl).map(propertyContext => { - return propertyContext.inputControl; - })} -
- }; - - private renderCommonTab = () => { - return
-
- }; -} - -WorkflowEditorTunnel.injectProps(TriggerPropertiesEditor, ['triggerDescriptors']); diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.scss b/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.scss index 4d6d4a5cb..08b2ec3d3 100644 --- a/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.scss +++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.scss @@ -1,25 +1,13 @@ $activity-picker-width: 300px; -$trigger-panel-height: 76px; $activity-editor-width: 580px; elsa-canvas { left: $activity-picker-width; - top: $trigger-panel-height; + top: 0; right: $activity-editor-width; bottom: 0; } -elsa-panel.elsa-trigger-container { - left: $activity-picker-width; - right: $activity-editor-width; -} - -elsa-panel.panel-state-expanded.elsa-trigger-container { - left: $activity-picker-width; - right: $activity-editor-width; - height: $trigger-panel-height; -} - elsa-panel.panel-state-expanded.elsa-activity-picker-container { width: $activity-picker-width; } @@ -39,21 +27,6 @@ elsa-panel.panel-state-expanded.elsa-activity-editor-container { elsa-canvas { left: 0; } - - elsa-panel.elsa-trigger-container { - left: 0; - } -} - -.trigger-container-closed { - - elsa-canvas { - top: 0; - } - - elsa-trigger-container { - display: none; - } } .object-editor-closed { @@ -65,8 +38,4 @@ elsa-panel.panel-state-expanded.elsa-activity-editor-container { elsa-canvas { right: 0; } - - elsa-panel.elsa-trigger-container { - right: 0; - } } diff --git a/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.tsx b/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.tsx index af009c3b9..2fe551678 100644 --- a/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.tsx +++ b/src/designer/elsa-workflows-designer/src/components/designer/workflow-editor/workflow-editor.tsx @@ -5,11 +5,15 @@ import {Container} from "typedi"; import {PanelPosition, PanelStateChangedArgs} from '../panel/models'; import { Activity, - ActivityDescriptor, ActivityPropertyChangedEventArgs, - ActivitySelectedArgs, ContainerSelectedArgs, EventTypes, - GraphUpdatedArgs, Trigger, - TriggerDescriptor, - Workflow, WorkflowInstance + ActivityDescriptor, + ActivityPropertyChangedEventArgs, + ActivitySelectedArgs, + ContainerSelectedArgs, + EventTypes, + GraphUpdatedArgs, + Trigger, + Workflow, + WorkflowInstance } from '../../../models'; import WorkflowEditorTunnel, {WorkflowDesignerState} from '../state'; import { @@ -17,8 +21,6 @@ import { DeleteActivityRequestedArgs } from '../activity-properties-editor/activity-properties-editor'; import {ActivityDriverRegistry, EventBus} from '../../../services'; -import {TriggerSelectedArgs, TriggersUpdatedArgs} from '../trigger-container/trigger-container'; -import {DeleteTriggerRequestedArgs, TriggerUpdatedArgs} from "../trigger-properties-editor/trigger-properties-editor"; import {WorkflowPropsUpdatedArgs} from "../workflow-properties-editor/workflow-properties-editor"; import {MonacoEditorSettings} from "../../../services/monaco-editor-settings"; import {PluginRegistry} from "../../../services/plugin-registry"; @@ -37,7 +39,6 @@ export class WorkflowEditor { private canvas: HTMLElsaCanvasElement; private container: HTMLDivElement; private toolbox: HTMLElsaToolboxElement; - private triggerContainer: HTMLElsaTriggerContainerElement; private applyActivityChanges: (activity: Activity) => void; private deleteActivity: (activity: Activity) => void; private applyTriggerChanges: (trigger: Trigger) => void; @@ -49,8 +50,7 @@ export class WorkflowEditor { root: null, identity: {id: uuid(), definitionId: uuid(), version: 1}, publication: {isLatest: true, isPublished: false}, - metadata: {}, - triggers: [] + metadata: {} }; private workflowInstance?: WorkflowInstance; @@ -65,11 +65,8 @@ export class WorkflowEditor { @Element() el: HTMLElsaWorkflowEditorElement; @Prop({attribute: 'monaco-lib-path'}) public monacoLibPath: string; @Prop() public activityDescriptors: Array = []; - @Prop() public triggerDescriptors: Array = []; @Event() public workflowUpdated: EventEmitter @State() private selectedActivity?: Activity; - @State() private selectedTrigger?: Trigger; - @State() private triggers: Array = []; private get interactiveMode(): boolean { return !this.workflowInstance; @@ -94,32 +91,15 @@ export class WorkflowEditor { @Listen('containerSelected') private async handleContainerSelected(e: CustomEvent) { this.selectedActivity = null; - this.selectedTrigger = null; - await this.triggerContainer.deselectAll(); } @Listen('activitySelected') private async handleActivitySelected(e: CustomEvent) { this.selectedActivity = e.detail.activity; - this.selectedTrigger = null; - await this.triggerContainer.deselectAll(); this.applyActivityChanges = e.detail.applyChanges; this.deleteActivity = e.detail.deleteActivity; } - @Listen('triggerSelected') - private async handleTriggerSelected(e: CustomEvent) { - this.selectedTrigger = e.detail.trigger; - this.selectedActivity = null; - this.applyTriggerChanges = e.detail.applyChanges; - this.deleteTrigger = e.detail.deleteTrigger; - } - - @Listen('triggerDeselected') - private async handleTriggerDeselected(e: CustomEvent) { - this.selectedTrigger = null; - } - @Listen('graphUpdated') private handleGraphUpdated(e: CustomEvent) { if (this.interactiveMode) @@ -152,14 +132,12 @@ export class WorkflowEditor { @Method() public async importWorkflowMetadata(workflow: Workflow): Promise { this.workflow = workflow; - this.triggers = workflow.triggers; } public render() { const tunnelState: WorkflowDesignerState = { workflow: this.workflow, activityDescriptors: this.activityDescriptors, - triggerDescriptors: this.triggerDescriptors }; const interactiveMode = this.interactiveMode; @@ -173,17 +151,6 @@ export class WorkflowEditor { onExpandedStateChanged={e => this.onActivityPickerPanelStateChanged(e.detail)}> this.toolbox = el}/> - this.onTriggerContainerPanelStateChanged(e.detail)} - position={PanelPosition.Top}> - this.onTriggersUpdated(e.detail)} - ref={el => this.triggerContainer = el}/> - this.canvas = el} interactiveMode={interactiveMode} @@ -204,12 +171,6 @@ export class WorkflowEditor { } private renderSelectedObject = () => { - if (!!this.selectedTrigger) - return this.onTriggerUpdated(e)} - onDeleteTriggerRequested={e => this.onDeleteTriggerRequested(e)}/> - if (!!this.selectedActivity) return await this.updateContainerLayout('activity-picker-closed', e.expanded) - private onTriggerContainerPanelStateChanged = async (e: PanelStateChangedArgs) => await this.updateContainerLayout('trigger-container-closed', e.expanded) private onActivityEditorPanelStateChanged = async (e: PanelStateChangedArgs) => await this.updateContainerLayout('object-editor-closed', e.expanded) - private onTriggersUpdated = async (e: TriggersUpdatedArgs) => { - this.workflow.triggers = e.triggers; - await this.saveChangesDebounced(); - }; - private onDragOver = (e: DragEvent) => { if (this.interactiveMode) e.preventDefault(); @@ -280,21 +235,10 @@ export class WorkflowEditor { this.saveChangesDebounced(); } - private onTriggerUpdated = (e: CustomEvent) => { - const updatedTrigger = e.detail.trigger; - this.applyTriggerChanges(updatedTrigger); - this.saveChangesDebounced(); - } - private onWorkflowPropsUpdated = (e: CustomEvent) => this.saveChangesDebounced() private onDeleteActivityRequested = (e: CustomEvent) => { this.deleteActivity(e.detail.activity); this.selectedActivity = null; }; - - private onDeleteTriggerRequested = (e: CustomEvent) => { - this.deleteTrigger(e.detail.trigger); - this.selectedTrigger = null; - }; } diff --git a/src/designer/elsa-workflows-designer/src/components/shell/studio/studio.tsx b/src/designer/elsa-workflows-designer/src/components/shell/studio/studio.tsx index 0d2730066..c7429724f 100644 --- a/src/designer/elsa-workflows-designer/src/components/shell/studio/studio.tsx +++ b/src/designer/elsa-workflows-designer/src/components/shell/studio/studio.tsx @@ -2,7 +2,7 @@ import {Component, Element, h, Listen, Prop, Watch} from '@stencil/core'; import 'reflect-metadata'; import {Container} from 'typedi'; import {ElsaApiClientProvider, ElsaClient, SaveWorkflowRequest, ServerSettings} from '../../../services'; -import {ActivityDescriptor, TriggerDescriptor, VersionOptions, Workflow, WorkflowInstanceSummary, WorkflowSummary} from '../../../models'; +import {ActivityDescriptor, VersionOptions, Workflow, WorkflowInstanceSummary, WorkflowSummary} from '../../../models'; import {WorkflowUpdatedArgs} from '../../designer/workflow-editor/workflow-editor'; import {PublishClickedArgs} from "../../toolbar/workflow-publish-button/workflow-publish-button"; import {MonacoEditorSettings} from "../../../services/monaco-editor-settings"; @@ -12,7 +12,6 @@ import {MonacoEditorSettings} from "../../../services/monaco-editor-settings"; }) export class Studio { private activityDescriptors: Array; - private triggerDescriptors: Array; private elsaClient: ElsaClient; private workflowEditorElement?: HTMLElsaWorkflowEditorElement; @@ -88,12 +87,10 @@ export class Studio { const elsaClientProvider = Container.get(ElsaApiClientProvider); this.elsaClient = await elsaClientProvider.getClient(); this.activityDescriptors = await this.elsaClient.descriptors.activities.list(); - this.triggerDescriptors = await this.elsaClient.descriptors.triggers.list(); this.workflowEditorElement = this.el.getElementsByTagName('elsa-workflow-editor')[0] as HTMLElsaWorkflowEditorElement; if (!!this.workflowEditorElement) { this.workflowEditorElement.activityDescriptors = this.activityDescriptors; - this.workflowEditorElement.triggerDescriptors = this.triggerDescriptors; this.workflowEditorElement.monacoLibPath = this.monacoLibPath; } } @@ -108,7 +105,6 @@ export class Studio { name: workflow.metadata.name, description: workflow.metadata.description, publish: publish, - triggers: workflow.triggers, root: workflow.root }; diff --git a/src/designer/elsa-workflows-designer/src/drivers/trigger/default-trigger-driver.ts b/src/designer/elsa-workflows-designer/src/drivers/trigger/default-trigger-driver.ts deleted file mode 100644 index 1b015a658..000000000 --- a/src/designer/elsa-workflows-designer/src/drivers/trigger/default-trigger-driver.ts +++ /dev/null @@ -1,36 +0,0 @@ -import {TriggerDisplayContext, TriggerDriver} from "../../services/trigger-driver"; - -export class DefaultTriggerDriver implements TriggerDriver { - display(context: TriggerDisplayContext): any { - const triggerDescriptor = context.triggerDescriptor; - const text = triggerDescriptor?.displayName; - const borderColor = 'border-green-600'; - const backgroundColor = 'bg-green-400'; - const iconBackgroundColor = 'bg-green-500'; - - return (` -
-
-
-
-
- - - - -
-
-
-
- ${text} -
-
-
-
-
- `); - } - -} diff --git a/src/designer/elsa-workflows-designer/src/index.html b/src/designer/elsa-workflows-designer/src/index.html index d19fa4d97..cd1a5a0d9 100644 --- a/src/designer/elsa-workflows-designer/src/index.html +++ b/src/designer/elsa-workflows-designer/src/index.html @@ -14,7 +14,7 @@ -
+
diff --git a/src/designer/elsa-workflows-designer/src/models/api.ts b/src/designer/elsa-workflows-designer/src/models/api.ts index b7ff20068..34915bc28 100644 --- a/src/designer/elsa-workflows-designer/src/models/api.ts +++ b/src/designer/elsa-workflows-designer/src/models/api.ts @@ -18,13 +18,6 @@ export interface ActivityDescriptor extends NodeDescriptor { outPorts: Array; } -export interface TriggerDescriptor extends NodeDescriptor { -} - -export interface TriggerDescriptorResponse { - triggerDescriptors: Array; -} - export enum ActivityTraits { Action = 1, Trigger = 2 diff --git a/src/designer/elsa-workflows-designer/src/models/core.ts b/src/designer/elsa-workflows-designer/src/models/core.ts index e9bd1b24d..329814d75 100644 --- a/src/designer/elsa-workflows-designer/src/models/core.ts +++ b/src/designer/elsa-workflows-designer/src/models/core.ts @@ -10,10 +10,10 @@ export interface Node { [name: string]: any; } -export interface Trigger extends Node { +export interface Activity extends Node { } -export interface Activity extends Node { +export interface Trigger extends Activity { } export interface Container extends Activity { @@ -36,7 +36,6 @@ export interface Workflow { publication: WorkflowPublication; metadata: WorkflowMetadata; root: Activity; - triggers: Array; } export interface WorkflowMetadata { diff --git a/src/designer/elsa-workflows-designer/src/services/elsa-api-client-provider.ts b/src/designer/elsa-workflows-designer/src/services/elsa-api-client-provider.ts index a83048fb8..62fa569b6 100644 --- a/src/designer/elsa-workflows-designer/src/services/elsa-api-client-provider.ts +++ b/src/designer/elsa-workflows-designer/src/services/elsa-api-client-provider.ts @@ -13,13 +13,12 @@ import { PagedList, SelectList, Trigger, - TriggerDescriptor, - TriggerDescriptorResponse, VersionOptions, + VersionOptions, Workflow, WorkflowInstance, WorkflowInstanceSummary, WorkflowStatus, WorkflowSummary } from '../models'; import 'reflect-metadata'; import {ServerSettings} from './server-settings'; -import {getVersionOptionsString} from "../utils/utils"; +import {getVersionOptionsString} from "../utils"; function serializeQueryString(queryString: object): string { const filteredItems = _(queryString).omitBy(_.isUndefined).omitBy(_.isNull).value(); @@ -54,12 +53,6 @@ export async function createElsaClient(serverUrl: string): Promise { const response = await httpClient.get('api/descriptors/activities'); return response.data.activityDescriptors; } - }, - triggers: { - async list(): Promise> { - const response = await httpClient.get('api/descriptors/triggers'); - return response.data.triggerDescriptors; - } } }, workflows: { @@ -140,17 +133,12 @@ export interface ElsaClient { export interface DescriptorsApi { activities: ActivityDescriptorsApi; - triggers: TriggerDescriptorsApi; } export interface ActivityDescriptorsApi { list(): Promise>; } -export interface TriggerDescriptorsApi { - list(): Promise>; -} - export interface WorkflowsApi { post(request: SaveWorkflowRequest): Promise; @@ -180,7 +168,6 @@ export interface SaveWorkflowRequest { definitionId: string; name?: string; description?: string; - triggers?: Array; publish: boolean; root?: Activity } diff --git a/src/designer/elsa-workflows-designer/src/services/index.ts b/src/designer/elsa-workflows-designer/src/services/index.ts index e6fe1735a..4e8d4c619 100644 --- a/src/designer/elsa-workflows-designer/src/services/index.ts +++ b/src/designer/elsa-workflows-designer/src/services/index.ts @@ -7,5 +7,3 @@ export * from './event-bus'; export * from './input-control-registry'; export * from './input-driver-registry'; export * from './server-settings'; -export * from './trigger-driver'; -export * from './trigger-driver-registry'; diff --git a/src/designer/elsa-workflows-designer/src/services/trigger-driver-registry.ts b/src/designer/elsa-workflows-designer/src/services/trigger-driver-registry.ts deleted file mode 100644 index 6ac894093..000000000 --- a/src/designer/elsa-workflows-designer/src/services/trigger-driver-registry.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {TriggerDriver, TriggerDriverFactory} from "./trigger-driver"; -import {Service} from "typedi"; -import {DefaultTriggerDriver} from "../drivers/trigger/default-trigger-driver"; - -@Service() -export class TriggerDriverRegistry { - private _driverMap: Map = new Map(); - private _defaultDriverFactory: TriggerDriverFactory = () => new DefaultTriggerDriver(); - - public add(triggerType: string, driverFactory: TriggerDriverFactory) { - this._driverMap.set(triggerType, driverFactory); - } - - public get(triggerType: string): TriggerDriverFactory { - return this._driverMap.get(triggerType); - } - - public createDriver(triggerType: string): TriggerDriver { - const driverFactory = this.get(triggerType) ?? this._defaultDriverFactory; - return driverFactory(); - } -} diff --git a/src/designer/elsa-workflows-designer/src/services/trigger-driver.ts b/src/designer/elsa-workflows-designer/src/services/trigger-driver.ts deleted file mode 100644 index cf4e7cf5f..000000000 --- a/src/designer/elsa-workflows-designer/src/services/trigger-driver.ts +++ /dev/null @@ -1,16 +0,0 @@ -import {Trigger, TriggerDescriptor} from "../models"; - -export interface TriggerDisplayContext { - triggerDescriptor: TriggerDescriptor; - displayType: TriggerDisplayType; - trigger?: Trigger; -} - -export interface TriggerDriver { - display: (context: TriggerDisplayContext) => any; -} - -export type TriggerDriverFactory = () => TriggerDriver; - -export type TriggerDisplayType = string | 'designer' | 'picker'; - diff --git a/src/dsl/Elsa.Dsl/Dsl/ElsaLexer.g4 b/src/dsl/Elsa.Dsl/Dsl/ElsaLexer.g4 index 3b183b547..797829459 100644 --- a/src/dsl/Elsa.Dsl/Dsl/ElsaLexer.g4 +++ b/src/dsl/Elsa.Dsl/Dsl/ElsaLexer.g4 @@ -5,7 +5,6 @@ GREATER : '>'; INCREMENT : '++'; DECREMENT : '--'; NEW : 'new'; -TRIGGER : 'trigger'; VARIABLE : 'variable'; LET : 'let'; IF : 'if'; diff --git a/src/dsl/Elsa.Dsl/Interpreters/WorkflowDefinitionBuilderInterpreter/VisitTrigger.cs b/src/dsl/Elsa.Dsl/Interpreters/WorkflowDefinitionBuilderInterpreter/VisitTrigger.cs deleted file mode 100644 index 0eaf7ee23..000000000 --- a/src/dsl/Elsa.Dsl/Interpreters/WorkflowDefinitionBuilderInterpreter/VisitTrigger.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Elsa.Contracts; - -namespace Elsa.Dsl.Interpreters; - -public partial class WorkflowDefinitionBuilderInterpreter -{ - - public override IWorkflowDefinitionBuilder VisitTrigger(ElsaParser.TriggerContext context) - { - VisitChildren(context); - var trigger = (ITrigger)_object.Get(context.@object()); - - _workflowDefinitionBuilder.AddTrigger(trigger); - - return DefaultResult; - } - -} \ No newline at end of file diff --git a/src/modules/Elsa.Modules.AzureServiceBus/Activities/MessageReceived.cs b/src/modules/Elsa.Modules.AzureServiceBus/Activities/MessageReceived.cs index d16c3677a..bbd2da279 100644 --- a/src/modules/Elsa.Modules.AzureServiceBus/Activities/MessageReceived.cs +++ b/src/modules/Elsa.Modules.AzureServiceBus/Activities/MessageReceived.cs @@ -7,7 +7,7 @@ using Elsa.Modules.AzureServiceBus.Models; namespace Elsa.Modules.AzureServiceBus.Activities; [Activity("Azure.ServiceBus.MessageReceived", "Executes when a message is received from the configured queue or topic and subscription", "Azure Service Bus")] -public class MessageReceived : TriggerActivity +public class MessageReceived : Trigger { internal const string MessageReceivedInputKey = "ReceivedMessage"; public Input QueueOrTopic { get; set; } = default!; @@ -33,7 +33,7 @@ public class MessageReceived : TriggerActivity /// public IFormatter? Formatter { get; set; } - protected override object GetPayload(TriggerIndexingContext context) => GetPayload(context.ExpressionExecutionContext); + protected override object GetTriggerPayload(TriggerIndexingContext context) => GetPayload(context.ExpressionExecutionContext); protected override void Execute(ActivityExecutionContext context) { diff --git a/src/modules/Elsa.Modules.Http/Activities/HttpTrigger.cs b/src/modules/Elsa.Modules.Http/Activities/HttpTrigger.cs index 400cef624..211ed7bec 100644 --- a/src/modules/Elsa.Modules.Http/Activities/HttpTrigger.cs +++ b/src/modules/Elsa.Modules.Http/Activities/HttpTrigger.cs @@ -8,7 +8,7 @@ using Elsa.Modules.Http.Models; namespace Elsa.Modules.Http; -public class HttpTrigger : TriggerActivity +public class HttpTrigger : Trigger { [Input] public Input Path { get; set; } = default!; @@ -20,7 +20,7 @@ public class HttpTrigger : TriggerActivity [Output] public Output? Result { get; set; } - protected override IEnumerable GetPayloads(TriggerIndexingContext context) => GetHashInputs(context.ExpressionExecutionContext); + protected override IEnumerable GetTriggerPayloads(TriggerIndexingContext context) => GetHashInputs(context.ExpressionExecutionContext); protected override void Execute(ActivityExecutionContext context) => context.SetBookmarks(GetHashInputs(context.ExpressionExecutionContext)); private IEnumerable GetHashInputs(ExpressionExecutionContext context) diff --git a/src/modules/Elsa.Modules.Scheduling/Triggers/Timer.cs b/src/modules/Elsa.Modules.Scheduling/Triggers/Timer.cs index ad5f77c36..440be5eae 100644 --- a/src/modules/Elsa.Modules.Scheduling/Triggers/Timer.cs +++ b/src/modules/Elsa.Modules.Scheduling/Triggers/Timer.cs @@ -13,7 +13,7 @@ public class Timer : Trigger { [Input] public Input Interval { get; set; } = default!; - protected override IEnumerable GetPayloads(TriggerIndexingContext context) + protected override IEnumerable GetTriggerPayloads(TriggerIndexingContext context) { var interval = context.ExpressionExecutionContext.Get(Interval); var clock = context.ExpressionExecutionContext.GetRequiredService(); diff --git a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs b/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs index 1519bd1eb..16d30babe 100644 --- a/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs +++ b/src/persistence/Elsa.Persistence.Abstractions/Entities/WorkflowDefinition.cs @@ -14,7 +14,6 @@ public class WorkflowDefinition : Entity public DateTime CreatedAt { get; set; } public int Version { get; set; } = 1; public IActivity Root { get; set; } = default!; - public ICollection Triggers { get; set; } = new List(); public ICollection Variables { get; set; } = new List(); public bool IsLatest { get; set; } public bool IsPublished { get; set; } diff --git a/src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs b/src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs index 81f0a81bb..c41a8f610 100644 --- a/src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs +++ b/src/persistence/Elsa.Persistence.Abstractions/Mappers/WorkflowDefinitionMapper.cs @@ -15,7 +15,6 @@ public class WorkflowDefinitionMapper new WorkflowPublication(definition.IsLatest, definition.IsPublished), new WorkflowMetadata(definition.Name, definition.Description, definition.CreatedAt), definition.Root, - definition.Triggers, definition.Variables); } @@ -33,7 +32,6 @@ public class WorkflowDefinitionMapper definition.Name = metadata.Name; definition.Description = metadata.Description; definition.Root = workflow.Root; - definition.Triggers = workflow.Triggers; definition.CreatedAt = metadata.CreatedAt; definition.IsLatest = publication.IsLatest; definition.IsPublished = publication.IsPublished; diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs index febfa0f4b..2c0f12af3 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs +++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Configuration/WorkflowDefinitionConfiguration.cs @@ -9,7 +9,6 @@ namespace Elsa.Persistence.EntityFrameworkCore.Configuration public void Configure(EntityTypeBuilder builder) { builder.Ignore(x => x.Root); - builder.Ignore(x => x.Triggers); builder.Property("Data"); builder.HasIndex(x => new {x.DefinitionId, x.Version}).HasDatabaseName($"IX_{nameof(WorkflowDefinition)}_{nameof(WorkflowDefinition.DefinitionId)}_{nameof(WorkflowDefinition.Version)}").IsUnique(); diff --git a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs index ac41dc39c..286d1419d 100644 --- a/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs +++ b/src/persistence/Elsa.Persistence.EntityFrameworkCore/Handlers/Serialization/WorkflowDefinitionSerializer.cs @@ -20,7 +20,6 @@ public class WorkflowDefinitionSerializer : IEntitySerializer triggers) + public WorkflowDefinitionState(IActivity root) { Root = root; - Triggers = triggers; } public IActivity Root { get; init; } = default!; - public ICollection Triggers { get; init; } = default!; } } \ No newline at end of file diff --git a/src/runtime/Elsa.Runtime/Extensions/WorkflowExecutionBuilderExtensions.cs b/src/runtime/Elsa.Runtime/Extensions/WorkflowExecutionBuilderExtensions.cs index f02ff1a17..d6522871e 100644 --- a/src/runtime/Elsa.Runtime/Extensions/WorkflowExecutionBuilderExtensions.cs +++ b/src/runtime/Elsa.Runtime/Extensions/WorkflowExecutionBuilderExtensions.cs @@ -4,7 +4,7 @@ using Elsa.Runtime.Middleware; namespace Elsa.Runtime.Extensions; -public static class WorkflowExecutionBuilderExtensions +public static class WorkflowExecutionPipelineBuilderExtensions { public static IWorkflowExecutionBuilder UsePersistence(this IWorkflowExecutionBuilder builder) => builder.UseMiddleware(); public static IWorkflowExecutionBuilder UseWorkflowExecutionEvents(this IWorkflowExecutionBuilder builder) => builder.UseMiddleware(); diff --git a/src/runtime/Elsa.Runtime/Services/TriggerIndexer.cs b/src/runtime/Elsa.Runtime/Services/TriggerIndexer.cs index 2c69825d5..d0022d989 100644 --- a/src/runtime/Elsa.Runtime/Services/TriggerIndexer.cs +++ b/src/runtime/Elsa.Runtime/Services/TriggerIndexer.cs @@ -12,7 +12,6 @@ using Elsa.Persistence.Entities; using Elsa.Persistence.Requests; using Elsa.Runtime.Contracts; using Elsa.Runtime.Models; -using Elsa.Runtime.Notifications; using Microsoft.Extensions.Logging; namespace Elsa.Runtime.Services; @@ -26,6 +25,7 @@ namespace Elsa.Runtime.Services; public class TriggerIndexer : ITriggerIndexer { private readonly IWorkflowRegistry _workflowRegistry; + private readonly IActivityWalker _activityWalker; private readonly IExpressionEvaluator _expressionEvaluator; private readonly IIdentityGenerator _identityGenerator; private readonly IRequestSender _requestSender; @@ -37,6 +37,7 @@ public class TriggerIndexer : ITriggerIndexer public TriggerIndexer( IWorkflowRegistry workflowRegistry, + IActivityWalker activityWalker, IExpressionEvaluator expressionEvaluator, IIdentityGenerator identityGenerator, IRequestSender requestSender, @@ -47,6 +48,7 @@ public class TriggerIndexer : ITriggerIndexer ILogger logger) { _workflowRegistry = workflowRegistry; + _activityWalker = activityWalker; _expressionEvaluator = expressionEvaluator; _identityGenerator = identityGenerator; _requestSender = requestSender; @@ -112,11 +114,11 @@ public class TriggerIndexer : ITriggerIndexer private async IAsyncEnumerable GetTriggersAsync(Workflow workflow, [EnumeratorCancellation] CancellationToken cancellationToken = default) { var context = new WorkflowIndexingContext(workflow); - var triggerSources = workflow.Triggers; + var triggerNodes = _activityWalker.Walk(workflow.Root).Flatten().Where(x => x.Activity is ITrigger { TriggerMode: TriggerMode.WorkflowDefinition }).ToList(); - foreach (var triggerSource in triggerSources) + foreach (var triggerNode in triggerNodes) { - var triggers = await GetTriggersAsync(workflow, context, triggerSource, cancellationToken); + var triggers = await GetTriggersAsync(workflow, context, (ITrigger)triggerNode.Activity, cancellationToken); foreach (var trigger in triggers) yield return trigger; @@ -167,7 +169,7 @@ public class TriggerIndexer : ITriggerIndexer { try { - return (await trigger.GetPayloadsAsync(context, cancellationToken)).ToList(); + return (await trigger.GetTriggerPayloadsAsync(context, cancellationToken)).ToList(); } catch (Exception e) { diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Program.cs b/src/samples/aspnet/Elsa.Samples.Web1/Program.cs index 166e6652a..d9acb278c 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Program.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Program.cs @@ -17,7 +17,7 @@ using Elsa.Modules.Scheduling.Triggers; using Elsa.Persistence.EntityFrameworkCore.Extensions; using Elsa.Persistence.EntityFrameworkCore.Sqlite; using Elsa.Pipelines.WorkflowExecution.Components; -using Elsa.Runtime.Middleware; +using Elsa.Runtime.Extensions; using Elsa.Runtime.ProtoActor.Extensions; using Elsa.Samples.Web1.Activities; using Elsa.Samples.Web1.Workflows; @@ -28,7 +28,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using WorkflowExecutionBuilderExtensions = Elsa.Runtime.Extensions.WorkflowExecutionBuilderExtensions; var builder = WebApplication.CreateBuilder(args); @@ -70,16 +69,12 @@ services .AddActivity() .AddActivity() .AddActivity() + .AddActivity() .AddActivity() .AddActivity() .AddActivity() ; -// Register available triggers. -services - .AddTrigger() - .AddTrigger(); - // Register scripting languages. services .AddJavaScriptExpressions() @@ -97,8 +92,12 @@ wellKnownTypeRegistry.RegisterType("boolean"); wellKnownTypeRegistry.RegisterType("string"); // Configure workflow engine execution pipeline. -serviceProvider.ConfigureDefaultWorkflowExecutionPipeline(pipeline => WorkflowExecutionBuilderExtensions.UseWorkflowExecutionEvents(WorkflowExecutionBuilderExtensions.UseWorkflowExecutionLogPersistence(WorkflowExecutionBuilderExtensions.UsePersistence(pipeline))) - .UseActivityScheduler() +serviceProvider.ConfigureDefaultWorkflowExecutionPipeline(pipeline => + pipeline + .UseWorkflowExecutionEvents() + .UseWorkflowExecutionLogPersistence() + .UsePersistence() + .UseActivityScheduler() ); if (app.Environment.IsDevelopment()) diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ForkedHttpWorkflow.cs b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ForkedHttpWorkflow.cs index 9b4145816..5cdea29cd 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ForkedHttpWorkflow.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ForkedHttpWorkflow.cs @@ -15,18 +15,16 @@ public class ForkedHttpWorkflow : IWorkflow { public void Build(IWorkflowDefinitionBuilder workflow) { - // Add triggers. - workflow.AddTrigger(new HttpTrigger - { - Path = new Input("/fork"), - SupportedMethods = new Input>(new[] { HttpMethods.Get }) - }); - // Setup workflow graph. workflow.WithRoot(new Sequence { Activities = { + new HttpTrigger + { + Path = new Input("/fork"), + SupportedMethods = new Input>(new[] { HttpMethods.Get }) + }, new Fork { JoinMode = new Input(JoinMode.WaitAll), diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/HttpWorkflow.cs b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/HttpWorkflow.cs index 9f47777c9..c4df9e4c1 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/HttpWorkflow.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/HttpWorkflow.cs @@ -19,18 +19,16 @@ public class HttpWorkflow : IWorkflow public void Build(IWorkflowDefinitionBuilder workflow) { - // Add triggers. - workflow.AddTrigger(new HttpTrigger - { - Path = new Input("/hello-world"), - SupportedMethods = new Input>(new[] { HttpMethods.Get }) - }); - // Setup workflow graph. workflow.WithRoot(new Sequence { Activities = { + new HttpTrigger + { + Path = new Input("/hello-world"), + SupportedMethods = new Input>(new[] { HttpMethods.Get }) + }, new If { Condition = new Input(true), diff --git a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ReceiveMessageWorkflow.cs b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ReceiveMessageWorkflow.cs index 746ece3f1..fa066de0d 100644 --- a/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ReceiveMessageWorkflow.cs +++ b/src/samples/aspnet/Elsa.Samples.Web1/Workflows/ReceiveMessageWorkflow.cs @@ -14,20 +14,19 @@ public class ReceiveMessageWorkflow : IWorkflow { public void Build(IWorkflowDefinitionBuilder workflow) { - // var receivedMessage = new Variable(); - // workflow.Variables.Add(receivedMessage); - - workflow.AddTrigger(new MessageReceived - { - QueueOrTopic = new Input("inbox"), - //ReceivedMessageBody = new Output(receivedMessage) - }); + var receivedMessage = new Variable(); workflow.WithRoot(new Sequence { + Variables = { receivedMessage }, Activities = { - new WriteLine(context => $"Message received: {context.Input}") + new MessageReceived + { + QueueOrTopic = new Input("inbox"), + ReceivedMessageBody = new Output(receivedMessage) + }, + new WriteLine(context => $"Message received: {receivedMessage.Get(context)}") } }); } diff --git a/src/samples/console/Elsa.Samples.Console1/Program.cs b/src/samples/console/Elsa.Samples.Console1/Program.cs index a07d65b39..e9be7a579 100644 --- a/src/samples/console/Elsa.Samples.Console1/Program.cs +++ b/src/samples/console/Elsa.Samples.Console1/Program.cs @@ -51,7 +51,7 @@ class Program var workflow13 = new Func(BlockingParallelForEachWorkflow.Create); var workflow14 = new Func(FlowchartWorkflow.Create); - var workflowFactory = workflow1; + var workflowFactory = workflow10; var workflowGraph = workflowFactory(); var workflow = Workflow.FromActivity(workflowGraph);