Implement delete activity

This commit is contained in:
Sipke Schoorstra 2020-12-27 21:45:24 +01:00
parent c6d68875c1
commit 7cbfa2d4f1
5 changed files with 45 additions and 6 deletions

View file

@ -4,6 +4,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CClientApp_005Cnode_005Fmodules/@EntryIndexedValue"></s:String>
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CClientApp_005Cnode_005Fmodules/@EntryIndexRemoved">True</s:Boolean>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=src_005Cweb_005Cmodules_005CFlowsharp_002EWeb_002EViewComponents_005CAssets_005Cnode_005Fmodules/@EntryIndexedValue">ExplicitlyExcluded</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LINES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>

View file

@ -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<ConnectionModel> Connections { get; init; } = Array.Empty<ConnectionModel>().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()
};
}
}
}

View file

@ -1,4 +1,4 @@
<div class="p-10 bg-gray-100">
<div class="flex flex-1 bg-gray-100 px-4 pt-4">
<div class="space-y-6 sm:px-6 lg:px-0 lg:col-span-9">
<section aria-labelledby="payment_details_heading">
<EditForm EditContext="@EditContext">
@ -20,7 +20,7 @@
<div class="col-span-4 sm:col-span-2">
<label for="workflowDisplayName" class="block text-sm font-medium text-gray-700">Display Name</label>
<InputText @bind-Value="@WorkflowDefinition.DisplayName" type="text" id="workflowDisplayName" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm py-2 px-3 focus:outline-none sm:text-sm"/>
<InputText @bind-Value="WorkflowDefinition.DisplayName" type="text" id="workflowDisplayName" class="mt-1 block w-full border border-gray-300 rounded-md shadow-sm py-2 px-3 focus:outline-none sm:text-sm"/>
<p class="mt-2 text-sm text-gray-500">
Enter a human-friendly name.
</p>

View file

@ -0,0 +1,2 @@
@inherits Microsoft.AspNetCore.Components.Forms.InputText
<input @attributes="@AdditionalAttributes" class="@CssClass" @bind="@CurrentValueAsString" @bind:event="oninput" />

View file

@ -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<ActivityEditor>("Timer Properties");
private async Task OnConnectionCreatedAsync(ConnectionModel connection) => await UpdateModelAsync(Model.AddConnection(connection));
}