From 7cbfa2d4f1342237b70db9b33839dcb6911b86e7 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Sun, 27 Dec 2020 21:45:24 +0100 Subject: [PATCH] Implement delete activity --- Elsa.sln.DotSettings | 1 + .../Models/WorkflowModel.cs | 21 ++++++++++++++--- .../Pages/WorkflowDefinitions/Settings.razor | 4 ++-- .../Shared/DirectInputText.razor | 2 ++ .../Shared/WorkflowDesigner.razor.cs | 23 ++++++++++++++++++- 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 src/dashboards/blazor/ElsaDashboard.Application/Shared/DirectInputText.razor diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings index 0ab16e958..0cad7e260 100644 --- a/Elsa.sln.DotSettings +++ b/Elsa.sln.DotSettings @@ -4,6 +4,7 @@ True ExplicitlyExcluded + True False True True diff --git a/src/dashboards/blazor/ElsaDashboard.Application/Models/WorkflowModel.cs b/src/dashboards/blazor/ElsaDashboard.Application/Models/WorkflowModel.cs index 0fcc91366..1e3028842 100644 --- a/src/dashboards/blazor/ElsaDashboard.Application/Models/WorkflowModel.cs +++ b/src/dashboards/blazor/ElsaDashboard.Application/Models/WorkflowModel.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using ElsaDashboard.Application.Extensions; namespace ElsaDashboard.Application.Models { @@ -18,9 +19,23 @@ namespace ElsaDashboard.Application.Models public IImmutableList Connections { get; init; } = Array.Empty().ToImmutableList(); public static WorkflowModel Blank() => new("New Workflow"); - public WorkflowModel AddActivity(ActivityModel activity) => this with { Activities = Activities.Add(activity)}; - public WorkflowModel RemoveActivity(ActivityModel activity) => this with { Activities = Activities.Where(x => x != activity).ToImmutableList()}; - public WorkflowModel AddConnection(ConnectionModel connection) => this with { Connections = Connections.Add(connection)}; + public WorkflowModel AddActivity(ActivityModel activity) => this with { Activities = Activities.Add(activity) }; + public WorkflowModel AddConnection(ConnectionModel connection) => this with { Connections = Connections.Add(connection) }; public WorkflowModel AddConnection(string sourceId, string targetId, string outcome) => AddConnection(new ConnectionModel(sourceId, targetId, outcome)); + public WorkflowModel RemoveConnection(ConnectionModel connection) => this with { Connections = Connections.Remove(connection) }; + public ActivityModel FindActivity(string activityId) => Activities.First(x => x.ActivityId == activityId); + + public WorkflowModel RemoveActivity(ActivityModel activity) + { + var inboundConnections = this.GetInboundConnections(activity.ActivityId); + var outboundConnections = this.GetOutboundConnections(activity.ActivityId); + var connectionsToRemove = inboundConnections.Concat(outboundConnections).ToList(); + + return this with + { + Activities = Activities.Where(x => x != activity).ToImmutableList(), + Connections = Connections.Where(x => !connectionsToRemove.Contains(x)).ToImmutableList() + }; + } } } \ No newline at end of file diff --git a/src/dashboards/blazor/ElsaDashboard.Application/Pages/WorkflowDefinitions/Settings.razor b/src/dashboards/blazor/ElsaDashboard.Application/Pages/WorkflowDefinitions/Settings.razor index d50bb6f75..1bbc21161 100644 --- a/src/dashboards/blazor/ElsaDashboard.Application/Pages/WorkflowDefinitions/Settings.razor +++ b/src/dashboards/blazor/ElsaDashboard.Application/Pages/WorkflowDefinitions/Settings.razor @@ -1,4 +1,4 @@ -
+
@@ -20,7 +20,7 @@
- +

Enter a human-friendly name.

diff --git a/src/dashboards/blazor/ElsaDashboard.Application/Shared/DirectInputText.razor b/src/dashboards/blazor/ElsaDashboard.Application/Shared/DirectInputText.razor new file mode 100644 index 000000000..17e3ff39d --- /dev/null +++ b/src/dashboards/blazor/ElsaDashboard.Application/Shared/DirectInputText.razor @@ -0,0 +1,2 @@ +@inherits Microsoft.AspNetCore.Components.Forms.InputText + \ No newline at end of file diff --git a/src/dashboards/blazor/ElsaDashboard.Application/Shared/WorkflowDesigner.razor.cs b/src/dashboards/blazor/ElsaDashboard.Application/Shared/WorkflowDesigner.razor.cs index 539e32229..f392372bb 100644 --- a/src/dashboards/blazor/ElsaDashboard.Application/Shared/WorkflowDesigner.razor.cs +++ b/src/dashboards/blazor/ElsaDashboard.Application/Shared/WorkflowDesigner.razor.cs @@ -233,6 +233,27 @@ namespace ElsaDashboard.Application.Shared await FlyoutPanelService.HideAsync(); } + private async Task RemoveActivityAsync(ActivityModel activityModel) + { + var incomingConnections = Model.GetInboundConnections(activityModel.ActivityId).ToList(); + var outgoingConnections = Model.GetOutboundConnections(activityModel.ActivityId).ToList(); + + // Remove activity (will also remove its connections). + var model = Model.RemoveActivity(activityModel); + + // For each incoming activity, try to connect it to a outgoing activity based on outcome. + foreach (var incomingConnection in incomingConnections) + { + var incomingActivity = model.FindActivity(incomingConnection.SourceId); + var outgoingConnection = outgoingConnections.FirstOrDefault(x => x.Outcome == incomingConnection.Outcome); + + if (outgoingConnection != null) + model = model.AddConnection(incomingActivity.ActivityId, outgoingConnection.TargetId, incomingConnection.Outcome); + } + + await UpdateModelAsync(model); + } + private RenderFragment RenderActivity(ActivityModel activityModel) { return builder => @@ -278,7 +299,7 @@ namespace ElsaDashboard.Application.Shared ButtonDescriptor.Create("OK", _ => AddActivityAsync(activityInfo, sourceActivityId, targetActivityId, outcome), true)); } - private async Task OnActivityDelete(ActivityModel activityModel) => await UpdateModelAsync(Model.RemoveActivity(activityModel)); + private async Task OnActivityDelete(ActivityModel activityModel) => await RemoveActivityAsync(activityModel); private async ValueTask OnActivityClick(MouseEventArgs e) => await FlyoutPanelService.ShowAsync("Timer Properties"); private async Task OnConnectionCreatedAsync(ConnectionModel connection) => await UpdateModelAsync(Model.AddConnection(connection)); }