diff --git a/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs b/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs
new file mode 100644
index 000000000..0da7b64ff
--- /dev/null
+++ b/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs
@@ -0,0 +1,24 @@
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using Elsa.Api.Client.Shared.Models;
+
+namespace Elsa.Api.Client.Converters;
+
+///
+/// A JSON converter that serializes .
+///
+public class VersionOptionsJsonConverter : JsonConverter
+{
+ ///
+ public override VersionOptions Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ var textValue = reader.GetString();
+ return string.IsNullOrWhiteSpace(textValue) ? VersionOptions.Published : VersionOptions.FromString(textValue);
+ }
+
+ ///
+ public override void Write(Utf8JsonWriter writer, VersionOptions value, JsonSerializerOptions options)
+ {
+ writer.WriteStringValue(value.ToString());
+ }
+}
\ No newline at end of file
diff --git a/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs b/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs
new file mode 100644
index 000000000..16945d9b4
--- /dev/null
+++ b/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs
@@ -0,0 +1,17 @@
+using System.ComponentModel;
+using System.Globalization;
+using Elsa.Api.Client.Shared.Models;
+
+namespace Elsa.Api.Client.Converters;
+
+///
+/// A type converter that converts to and from strings.
+///
+public class VersionOptionsTypeConverter : TypeConverter
+{
+ ///
+ public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) => sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
+
+ ///
+ public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) => value is string text ? VersionOptions.FromString(text) : base.ConvertFrom(context, culture, value)!;
+}
\ No newline at end of file
diff --git a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
index cbec2b253..d60e674e0 100644
--- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
+++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
@@ -36,7 +36,8 @@ public static class DependencyInjectionExtensions
/// The API type.
public static void AddElsaApiClient(this IServiceCollection services, RefitSettings settings) where T : class
{
- services.AddRefitClient(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
+ services.AddRefitClient(settings)
+ .ConfigureHttpClient(ConfigureElsaApiHttpClient);
}
private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)
diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs
index 93bdc9a44..94d8eae14 100644
--- a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs
+++ b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs
@@ -1,4 +1,5 @@
using Elsa.Api.Client.Resources.WorkflowDefinitions.Models;
+using Elsa.Api.Client.Shared.Models;
using Refit;
namespace Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts;
@@ -12,10 +13,11 @@ public interface IWorkflowDefinitionsApi
/// Lists workflow definitions.
///
/// The request containing options for listing workflow definitions.
+ /// The version options.
/// The cancellation token.
/// The response containing the workflow definitions.
- [Get("/workflow-definitions")]
- Task ListAsync(ListWorkflowDefinitionsRequest request, CancellationToken cancellationToken = default);
+ [Get("/workflow-definitions?versionOptions={VersionOptions}")]
+ Task ListAsync([Query]ListWorkflowDefinitionsRequest request, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default);
///
/// Deletes a workflow definition.
diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs
index 35cea5227..4973b1b83 100644
--- a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs
+++ b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs
@@ -19,17 +19,19 @@ public class ListWorkflowDefinitionsRequest
public int? PageSize { get; set; }
///
- /// The version options.
+ /// The IDs of the workflow definitions to filter by.
///
- public VersionOptions? Version { get; set; }
-
+ public ICollection? DefinitionIds { get; set; }
+
///
/// The name of the workflow materializer to filter by.
///
- [AliasAs("materializer")] public string? MaterializerName { get; set; }
-
+ [AliasAs("materializer")]
+ public string? MaterializerName { get; set; }
+
///
/// The labels to filter by.
///
- [AliasAs("label")] public string[]? Labels { get; set; }
+ [AliasAs("label")]
+ public string[]? Labels { get; set; }
}
\ No newline at end of file
diff --git a/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs b/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs
index 40073d4ae..344f08df6 100644
--- a/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs
+++ b/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs
@@ -1,3 +1,6 @@
+using System.ComponentModel;
+using System.Text.Json.Serialization;
+using Elsa.Api.Client.Converters;
using JetBrains.Annotations;
namespace Elsa.Api.Client.Shared.Models;
@@ -6,6 +9,8 @@ namespace Elsa.Api.Client.Shared.Models;
/// Represents the version to get.
///
[PublicAPI]
+[TypeConverter(typeof(VersionOptionsTypeConverter))]
+[JsonConverter(typeof(VersionOptionsJsonConverter))]
public struct VersionOptions
{
///
@@ -58,6 +63,12 @@ public struct VersionOptions
_ => SpecificVersion(int.Parse(value))
};
+ ///
+ /// Tries to parse a string into a .
+ ///
+ /// The value to parse.
+ /// The parsed value.
+ /// true if the value was parsed successfully, otherwise false.
public static bool TryParse(string value, out VersionOptions versionOptions)
{
versionOptions = FromString(value);
diff --git a/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx b/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx
index e6ba206b6..44f24b63d 100644
--- a/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx
+++ b/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx
@@ -44,7 +44,7 @@ export class WorkflowDefinitionBrowser {
@State() private selectAllChecked: boolean;
async componentWillLoad() {
- var persistedRequest = getRequest()
+ const persistedRequest = getRequest();
if (persistedRequest) {
this.currentPage = persistedRequest.page
@@ -83,7 +83,7 @@ export class WorkflowDefinitionBrowser {
}
private onDeleteManyClick = async () => {
- if(this.selectedWorkflowDefinitionIds.length == 0)
+ if(this.selectedWorkflowDefinitionIds.length == 0)
return;
this.modalDialogService.show(
@@ -99,7 +99,7 @@ export class WorkflowDefinitionBrowser {
};
private onPublishManyClick = async () => {
- if(this.selectedWorkflowDefinitionIds.length == 0)
+ if(this.selectedWorkflowDefinitionIds.length == 0)
return;
this.modalDialogService.show(
@@ -114,9 +114,9 @@ export class WorkflowDefinitionBrowser {
};
private onUnpublishManyClick = async () => {
- if(this.selectedWorkflowDefinitionIds.length == 0)
+ if(this.selectedWorkflowDefinitionIds.length == 0)
return;
-
+
this.modalDialogService.show(
() => DefaultContents.Warning("Are you sure you want to unpublish selected workflow definitions?"),
{
@@ -138,7 +138,7 @@ export class WorkflowDefinitionBrowser {
// TODO: Load only json-based workflow definitions for now.
// Later, also allow CLR-based workflows to be "edited" (publish / unpublish / position activities / set variables, etc.)
const materializerName = 'Json';
-
+
var request: ListWorkflowDefinitionsRequest = {
materializerName,
page: this.currentPage,
diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs
index 0697c532f..853d73d7a 100644
--- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs
+++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs
@@ -45,15 +45,14 @@ internal class List : ElsaEndpoint
private async Task> FindAsync(Request request, WorkflowDefinitionFilter filter, PageArgs pageArgs, CancellationToken cancellationToken)
{
- request.OrderBy = request.OrderBy ?? OrderByWfDefinition.Created;
+ request.OrderBy ??= OrderByWfDefinition.Created;
var direction = request.OrderBy == OrderByWfDefinition.Name ? (request.OrderDirection ?? OrderDirection.Ascending) : (request.OrderDirection ?? OrderDirection.Descending);
switch (request.OrderBy)
{
default:
- case OrderByWfDefinition.Created:
- {
+ {
var order = new WorkflowDefinitionOrder
{
KeySelector = p => p.CreatedAt,
@@ -66,7 +65,7 @@ internal class List : ElsaEndpoint
{
var order = new WorkflowDefinitionOrder
{
- KeySelector = p => p.Name,
+ KeySelector = p => p.Name ?? string.Empty,
Direction = direction
};