Skip to content

Commit

Permalink
Added links to workflow defintions (#93)
Browse files Browse the repository at this point in the history
* Implemented navigation to workflow definition

* Fixed bug
  • Loading branch information
MariusVuscanNx committed Dec 8, 2023
1 parent 4c74e33 commit 4d3d393
Show file tree
Hide file tree
Showing 9 changed files with 132 additions and 83 deletions.
19 changes: 15 additions & 4 deletions src/framework/Elsa.Studio.Shared/Components/DataPanel.razor
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
@using Elsa.Studio.DomInterop.Contracts
@using Elsa.Studio.Models

<MudSimpleTable Outlined="true" Striped="false" Dense="true" Elevation="0" Bordered="false">
<tbody>
@{
var data = HideEmptyValues ? Data.Where(x => !string.IsNullOrWhiteSpace(x.Value)) : Data;
var data = HideEmptyValues ? Data.Where(x => !string.IsNullOrWhiteSpace(x.Value.Text)) : Data;
}
@foreach (var item in data)
{
<tr>
<td style="width: 200px;">@item.Key</td>
<td style="width: 50px;">
<MudIconButton Icon="@Icons.Material.Outlined.ContentCopy" Size="Size.Small" Title="Copy" OnClick="@(() => OnCopyClicked(item.Value!))" Disabled="@(string.IsNullOrWhiteSpace(item.Value))"/>
<MudIconButton Icon="@Icons.Material.Outlined.ContentCopy" Size="Size.Small" Title="Copy" OnClick="@(() => OnCopyClicked(item.Value.Text!))" Disabled="@(string.IsNullOrWhiteSpace(item.Value.Text))"/>
</td>
<td>
@if (!string.IsNullOrWhiteSpace(item.Value.Link))
{
<MudLink Href="@item.Value.Link">@item.Value.Text</MudLink>
}
else
{
<span>@item.Value.Text</span>
}
</td>
<td>@item.Value</td>
</tr>
}
</tbody>
Expand All @@ -23,7 +34,7 @@
/// The data to display.
/// </summary>
[Parameter]
public IDictionary<string, string?> Data { get; set; } = new Dictionary<string, string?>();
public IDictionary<string, DataPanelItem> Data { get; set; } = new Dictionary<string, DataPanelItem>();

/// <summary>
/// If true, empty values will be hidden.
Expand Down
3 changes: 3 additions & 0 deletions src/framework/Elsa.Studio.Shared/Models/DataPanelItem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace Elsa.Studio.Models;

public record DataPanelItem(string? Text = default, string? Link = default);
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Elsa.Api.Client.Resources.ActivityDescriptors.Models;
using Elsa.Studio.Models;
using Microsoft.AspNetCore.Components;

namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.ActivityProperties.Tabs;
Expand All @@ -11,14 +12,18 @@ public partial class InfoTab
/// <summary>
/// The activity descriptor.
/// </summary>
[Parameter] public ActivityDescriptor ActivityDescriptor { get; set; } = default!;
[Parameter]
public ActivityDescriptor ActivityDescriptor { get; set; } = default!;

private IDictionary<string, string?> ActivityInfo { get; } = new Dictionary<string, string?>();
private IDictionary<string, DataPanelItem> ActivityInfo { get; } = new Dictionary<string, DataPanelItem>();

/// <inheritdoc />
protected override void OnParametersSet()
{
ActivityInfo["Type"] = ActivityDescriptor.TypeName;
ActivityInfo["Description"] = ActivityDescriptor.Description;
ActivityDescriptor.ConstructionProperties.TryGetValue("WorkflowDefinitionId", out var link);

ActivityInfo["Type"] = new DataPanelItem(ActivityDescriptor.TypeName,
link == null ? null : $"/workflows/definitions/{link}/edit");
ActivityInfo["Description"] = new DataPanelItem(ActivityDescriptor.Description);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
using Elsa.Api.Client.Resources.WorkflowDefinitions.Models;
using Elsa.Studio.Models;
using Microsoft.AspNetCore.Components;

namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.Sections.Info;
namespace Elsa.Studio.Workflows.Components.WorkflowDefinitionEditor.Components.WorkflowProperties.Tabs.Properties.
Sections.Info;

public partial class Info
{
private IDictionary<string, string> _workflowInfo = new Dictionary<string, string>();
private IDictionary<string, DataPanelItem> _workflowInfo = new Dictionary<string, DataPanelItem>();

[Parameter] public WorkflowDefinition WorkflowDefinition { get; set; } = default!;

protected override void OnParametersSet()
{
_workflowInfo = new Dictionary<string, string>
_workflowInfo = new Dictionary<string, DataPanelItem>
{
["Definition ID"] = WorkflowDefinition.DefinitionId,
["Version ID"] = WorkflowDefinition.Id,
["Version"] = WorkflowDefinition.Version.ToString(),
["Status"] = WorkflowDefinition.IsPublished ? "Published" : "Draft",
["Readonly"] = WorkflowDefinition.IsReadonly ? "Yes" : "No"
["Definition ID"] = new(WorkflowDefinition.DefinitionId),
["Version ID"] = new(WorkflowDefinition.Id),
["Version"] = new(WorkflowDefinition.Version.ToString()),
["Status"] = new(WorkflowDefinition.IsPublished ? "Published" : "Draft"),
["Readonly"] = new(WorkflowDefinition.IsReadonly ? "Yes" : "No")
};
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Text.Json.Nodes;
using Elsa.Api.Client.Extensions;
using Elsa.Api.Client.Resources.ActivityExecutions.Models;
using Elsa.Studio.Models;
using Elsa.Studio.Workflows.Domain.Contracts;
using Microsoft.AspNetCore.Components;
using MudBlazor;
Expand Down Expand Up @@ -40,14 +41,17 @@ public record ActivityExecutionRecordTableRow(int Number, ActivityExecutionRecor
[Inject] private IActivityRegistry ActivityRegistry { get; set; } = default!;

private ActivityExecutionRecord? LastActivityExecution => ActivityExecutions.LastOrDefault();
private IEnumerable<ActivityExecutionRecordTableRow> Items => ActivityExecutions.Select((x, i) => new ActivityExecutionRecordTableRow(i + 1, x));

private IEnumerable<ActivityExecutionRecordTableRow> Items =>
ActivityExecutions.Select((x, i) => new ActivityExecutionRecordTableRow(i + 1, x));

private ActivityExecutionRecord? SelectedItem { get; set; } = default!;

private IDictionary<string, string?> ActivityInfo { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> ActivityData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> OutcomesData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> OutputData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> ExceptionData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, DataPanelItem> ActivityInfo { get; set; } = new Dictionary<string, DataPanelItem>();
private IDictionary<string, DataPanelItem> ActivityData { get; set; } = new Dictionary<string, DataPanelItem>();
private IDictionary<string, DataPanelItem> OutcomesData { get; set; } = new Dictionary<string, DataPanelItem>();
private IDictionary<string, DataPanelItem> OutputData { get; set; } = new Dictionary<string, DataPanelItem>();
private IDictionary<string, DataPanelItem> ExceptionData { get; set; } = new Dictionary<string, DataPanelItem>();
private IDictionary<string, string?> SelectedActivityState { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> SelectedOutcomesData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> SelectedOutputData { get; set; } = new Dictionary<string, string?>();
Expand All @@ -74,55 +78,63 @@ private void CreateDataModels()
var execution = LastActivityExecution;
var activityVersion = execution?.ActivityTypeVersion;
var exception = execution?.Exception;
var workflowDefinitionId = activity.GetWorkflowDefinitionId();

var activityInfo = new Dictionary<string, string?>
var activityInfo = new Dictionary<string, DataPanelItem>
{
["ID"] = activityId,
["Name"] = activityName,
["Type"] = activityType,
["Version"] = activityVersion.ToString()
["ID"] = new(activityId),
["Name"] = new(activityName),
["Type"] = new(activityType,
string.IsNullOrWhiteSpace(workflowDefinitionId)
? null
: $"/workflows/definitions/{workflowDefinitionId}/edit"),
["Version"] = new(activityVersion.ToString())
};

var outcomesData = new Dictionary<string, string?>();
var outputData = new Dictionary<string, string?>();
var outcomesData = new Dictionary<string, DataPanelItem>();
var outputData = new Dictionary<string, DataPanelItem>();

if (execution != null)
{
activityInfo["Status"] = execution.Status.ToString();
activityInfo["Instance ID"] = execution.Id;
activityInfo["Status"] = new(execution.Status.ToString());
activityInfo["Instance ID"] = new(execution.Id);

if (execution.Payload != null)
if (execution.Payload.TryGetValue("Outcomes", out var outcomes))
outcomesData["Outcomes"] = outcomes.ToString();
outcomesData["Outcomes"] = new(outcomes.ToString());

var outputDescriptors = activityDescriptor.Outputs;
var outputs = execution.Outputs;

foreach (var outputDescriptor in outputDescriptors)
{
var outputValue = outputs != null ? outputs.TryGetValue(outputDescriptor.Name, out var value) ? value : default : default;
outputData[outputDescriptor.Name] = outputValue?.ToString();
var outputValue = outputs != null
? outputs.TryGetValue(outputDescriptor.Name, out var value) ? value : default
: default;
outputData[outputDescriptor.Name] = new(outputValue?.ToString());
}
}

var exceptionData = new Dictionary<string, string?>();
var exceptionData = new Dictionary<string, DataPanelItem>();

if (exception != null)
{
exceptionData["Message"] = exception.Message;
exceptionData["InnerException"] = exception.InnerException != null ? exception.InnerException.Type + ": " + exception.InnerException.Message : default;
exceptionData["StackTrace"] = exception.StackTrace;
exceptionData["Message"] = new(exception.Message);
exceptionData["InnerException"] = new(exception.InnerException != null
? exception.InnerException.Type + ": " + exception.InnerException.Message
: default);
exceptionData["StackTrace"] = new(exception.StackTrace);
}

var activityStateData = new Dictionary<string, string?>();
var activityStateData = new Dictionary<string, DataPanelItem>();
var activityState = execution?.ActivityState;

if (activityState != null)
{
foreach (var inputDescriptor in activityDescriptor.Inputs)
{
var inputValue = activityState.TryGetValue(inputDescriptor.Name, out var value) ? value : default;
activityStateData[inputDescriptor.Name] = inputValue?.ToString();
activityStateData[inputDescriptor.Name] = new(inputValue?.ToString());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Threading.Tasks;
using Elsa.Api.Client.Extensions;
using Elsa.Api.Client.Resources.ActivityExecutions.Models;
using Elsa.Studio.Models;
using Elsa.Studio.Workflows.Domain.Contracts;
using Microsoft.AspNetCore.Components;
using MudBlazor;
Expand Down Expand Up @@ -39,11 +40,20 @@ public record ActivityExecutionRecordTableRow(int Number, ActivityExecutionRecor
/// </summary>
[Parameter]
public ICollection<ActivityExecutionRecord> ActivityExecutions { get; set; } = new List<ActivityExecutionRecord>();
private IEnumerable<ActivityExecutionRecordTableRow> Items => ActivityExecutions.Select((x, i) => new ActivityExecutionRecordTableRow(i + 1, x));

private IEnumerable<ActivityExecutionRecordTableRow> Items =>
ActivityExecutions.Select((x, i) => new ActivityExecutionRecordTableRow(i + 1, x));

private ActivityExecutionRecord? SelectedItem { get; set; } = default!;
private IDictionary<string, string?> SelectedActivityState { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> SelectedOutcomesData { get; set; } = new Dictionary<string, string?>();
private IDictionary<string, string?> SelectedOutputData { get; set; } = new Dictionary<string, string?>();

private IDictionary<string, DataPanelItem> SelectedActivityState { get; set; } =
new Dictionary<string, DataPanelItem>();

private IDictionary<string, DataPanelItem> SelectedOutcomesData { get; set; } =
new Dictionary<string, DataPanelItem>();

private IDictionary<string, DataPanelItem> SelectedOutputData { get; set; } =
new Dictionary<string, DataPanelItem>();

/// <inheritdoc />
protected override void OnParametersSet()
Expand All @@ -55,28 +65,28 @@ private void CreateSelectedItemDataModels(ActivityExecutionRecord? record)
{
if (record == null)
{
SelectedActivityState = new Dictionary<string, string?>();
SelectedOutcomesData = new Dictionary<string, string?>();
SelectedOutputData = new Dictionary<string, string?>();
SelectedActivityState = new Dictionary<string, DataPanelItem>();
SelectedOutcomesData = new Dictionary<string, DataPanelItem>();
SelectedOutputData = new Dictionary<string, DataPanelItem>();
return;
}

var activityState = record.ActivityState?
.Where(x => !x.Key.StartsWith("_"))
.ToDictionary(x => x.Key, x => x.Value?.ToString());
.ToDictionary(x => x.Key, x => new DataPanelItem(x.Value?.ToString()));

var outcomesData = record.Payload?.TryGetValue("Outcomes", out var outcomesValue) == true
? new Dictionary<string, string?> { ["Outcomes"] = outcomesValue!.ToString()! }
? new Dictionary<string, DataPanelItem> { ["Outcomes"] = new(outcomesValue!.ToString()!) }
: default;

var outputData = new Dictionary<string, string?>();
var outputData = new Dictionary<string, DataPanelItem>();

if (record.Outputs != null)
foreach (var (key, value) in record.Outputs)
outputData[key] = value?.ToString();
outputData[key] = new(value?.ToString());

SelectedActivityState = activityState ?? new Dictionary<string, string?>();
SelectedOutcomesData = outcomesData ?? new Dictionary<string, string?>();
SelectedActivityState = activityState ?? new Dictionary<string, DataPanelItem>();
SelectedOutcomesData = outcomesData ?? new Dictionary<string, DataPanelItem>();
SelectedOutputData = outputData;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@using Variant = MudBlazor.Variant
@using Elsa.Studio.Models


<ScrollableWell MaxHeight="VisiblePaneHeight">
Expand All @@ -7,11 +8,11 @@
var record = JournalEntry.Record;
var payload = ParsePayload(record.Payload);

var eventInfo = new Dictionary<string, string?>
var eventInfo = new Dictionary<string, DataPanelItem>
{
["Name"] = record.EventName,
["Timestamp"] = record.Timestamp.ToString("s"),
["Message"] = record.Message
["Name"] = new(record.EventName),
["Timestamp"] = new(record.Timestamp.ToString("s")),
["Message"] = new(record.Message)
};

Merge(eventInfo, payload);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Elsa.Api.Client.Extensions;
using Elsa.Api.Client.Resources.ActivityDescriptors.Models;
using Elsa.Api.Client.Resources.WorkflowDefinitions.Models;
using Elsa.Studio.Models;
using Elsa.Studio.Workflows.Pages.WorkflowInstances.View.Models;
using Humanizer;
using Microsoft.AspNetCore.Components;
Expand All @@ -18,12 +19,15 @@ public partial class JournalEntryDetailsTab
/// <summary>
/// The journal entry.
/// </summary>
[Parameter] public JournalEntry JournalEntry { get; set; } = default!;

[Parameter]
public JournalEntry JournalEntry { get; set; } = default!;

/// <summary>
/// The height of the visible pane.
/// </summary>
[Parameter] public int VisiblePaneHeight { get; set; }
[Parameter]
public int VisiblePaneHeight { get; set; }

[CascadingParameter] private IDictionary<string, JsonObject> ActivityLookup { get; set; } = default!;

private JsonObject GetActivity()
Expand All @@ -32,32 +36,32 @@ private JsonObject GetActivity()
return ActivityLookup[activityId];
}

private IDictionary<string, string?> ParsePayload(object? payload)
private IDictionary<string, DataPanelItem> ParsePayload(object? payload)
{
if (payload == null)
return new Dictionary<string, string?>();
return new Dictionary<string, DataPanelItem>();

if (payload is not JsonElement jsonElement)
return new Dictionary<string, string?>
return new Dictionary<string, DataPanelItem>
{
["Payload"] = payload.ToString()
["Payload"] = new(payload.ToString())
};

var properties = jsonElement.EnumerateObject().Where(x => !x.Name.StartsWith("_"));
var result = new Dictionary<string, string?>();
var result = new Dictionary<string, DataPanelItem>();

foreach (var property in properties)
{
var propertyName = property.Name.Pascalize();
var propertyValue = property.Value;
var propertyValueAsString = propertyValue.ToString();
result[propertyName] = propertyValueAsString;
result[propertyName] = new(propertyValueAsString);
}

return result;
}

private static void Merge(IDictionary<string, string?> target, IDictionary<string, string?> input)
private static void Merge(IDictionary<string, DataPanelItem> target, IDictionary<string, DataPanelItem> input)
{
foreach (var (key, value) in input) target[key] = value;
}
Expand Down
Loading

0 comments on commit 4d3d393

Please sign in to comment.