diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs new file mode 100644 index 000000000..5438c9059 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/JsonWorkflowTransition.cs @@ -0,0 +1,55 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Newtonsoft.Json; +using Squidex.Infrastructure.Collections; +using Squidex.Infrastructure.Reflection; + +namespace Squidex.Domain.Apps.Core.Contents.Json +{ + public class JsonWorkflowTransition + { + [JsonProperty] + public string Expression { get; set; } + + [JsonProperty] + public string Role { get; set; } + + [JsonProperty] + public List Roles { get; } + + public JsonWorkflowTransition() + { + } + + public JsonWorkflowTransition(WorkflowTransition client) + { + SimpleMapper.Map(client, this); + } + + public WorkflowTransition ToTransition() + { + var rolesList = Roles; + + if (!string.IsNullOrEmpty(Role)) + { + rolesList = new List { Role }; + } + + ReadOnlyCollection roles = null; + + if (rolesList != null && rolesList.Count > 0) + { + roles = ReadOnlyCollection.Create(rolesList.ToArray()); + } + + return new WorkflowTransition(Expression, roles); + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs new file mode 100644 index 000000000..b32e11d92 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/WorkflowTransitionConverter.cs @@ -0,0 +1,30 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using Newtonsoft.Json; +using Squidex.Infrastructure.Json.Newtonsoft; + +namespace Squidex.Domain.Apps.Core.Contents.Json +{ + public sealed class WorkflowTransitionConverter : JsonClassConverter + { + protected override void WriteValue(JsonWriter writer, WorkflowTransition value, JsonSerializer serializer) + { + var json = new JsonWorkflowTransition(value); + + serializer.Serialize(writer, json); + } + + protected override WorkflowTransition ReadValue(JsonReader reader, Type objectType, JsonSerializer serializer) + { + var json = serializer.Deserialize(reader); + + return json.ToTransition(); + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs index a41c5ba73..6466ece7a 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/WorkflowTransition.cs @@ -5,6 +5,8 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Collections.ObjectModel; + namespace Squidex.Domain.Apps.Core.Contents { public sealed class WorkflowTransition @@ -13,13 +15,13 @@ namespace Squidex.Domain.Apps.Core.Contents public string Expression { get; } - public string Role { get; } + public ReadOnlyCollection Roles { get; } - public WorkflowTransition(string expression = null, string role = null) + public WorkflowTransition(string expression = null, ReadOnlyCollection roles = null) { Expression = expression; - Role = role; + Roles = roles; } } -} +} \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs b/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs index 6788f21e5..6ae3f9e58 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/DynamicContentWorkflow.cs @@ -105,9 +105,9 @@ namespace Squidex.Domain.Apps.Entities.Contents private bool CanUse(WorkflowTransition transition, NamedContentData data, ClaimsPrincipal user) { - if (!string.IsNullOrWhiteSpace(transition.Role)) + if (transition.Roles != null) { - if (!user.Claims.Any(x => x.Type == ClaimTypes.Role && x.Value == transition.Role)) + if (!user.Claims.Any(x => x.Type == ClaimTypes.Role && transition.Roles.Contains(x.Value))) { return false; } diff --git a/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs b/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs index fa96296e4..9b7d221f9 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Collections.ObjectModel; using Squidex.Domain.Apps.Core.Contents; namespace Squidex.Areas.Api.Controllers.Apps.Models @@ -19,7 +20,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models /// /// The optional restricted role. /// - public string Role { get; set; } + public ReadOnlyCollection Roles { get; set; } public static WorkflowTransitionDto FromWorkflowTransition(WorkflowTransition transition) { @@ -28,12 +29,12 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models return null; } - return new WorkflowTransitionDto { Expression = transition.Expression, Role = transition.Role }; + return new WorkflowTransitionDto { Expression = transition.Expression, Roles = transition.Roles }; } public WorkflowTransition ToTransition() { - return new WorkflowTransition(Expression, Role); + return new WorkflowTransition(Expression, Roles); } } -} +} \ No newline at end of file diff --git a/src/Squidex/Config/Domain/SerializationServices.cs b/src/Squidex/Config/Domain/SerializationServices.cs index 380706f47..20c03a60c 100644 --- a/src/Squidex/Config/Domain/SerializationServices.cs +++ b/src/Squidex/Config/Domain/SerializationServices.cs @@ -52,7 +52,8 @@ namespace Squidex.Config.Domain new SchemaConverter(), new StatusConverter(), new StringEnumConverter(), - new WorkflowConverter()); + new WorkflowConverter(), + new WorkflowTransitionConverter()); settings.NullValueHandling = NullValueHandling.Ignore; diff --git a/src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html b/src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html index 26392cf38..91dc8ffbb 100644 --- a/src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html +++ b/src/Squidex/app/features/settings/pages/workflows/workflow-transition.component.html @@ -21,17 +21,21 @@
for
-
- - - Add Role + [dashed]="true" + [allowDuplicates]="false" + [suggestions]="roleSuggestions" + [singleLine]="true" + [ngModelOptions]="onBlur" + [ngModel]="transition.roles" + (ngModelChange)="changeRole($event)" + placeholder="Add Role"> +
+