diff --git a/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj b/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj index b9aba10ec..f571b5656 100644 --- a/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj +++ b/backend/src/Squidex.Data.EntityFramework/Squidex.Data.EntityFramework.csproj @@ -40,13 +40,13 @@ - - - - - - - + + + + + + + diff --git a/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj b/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj index 0271adebd..d735e1ffe 100644 --- a/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj +++ b/backend/src/Squidex.Data.MongoDb/Squidex.Data.MongoDb.csproj @@ -25,12 +25,12 @@ - - - - - - + + + + + + diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj index 71c034556..6041dbabf 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Squidex.Domain.Apps.Core.Model.csproj @@ -20,7 +20,7 @@ - + diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs index e154fb505..fe1b6a385 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs @@ -191,9 +191,13 @@ public sealed class JintScriptEngine(IMemoryCache cache, IOptions - - + + diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/StringLogger.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/StringLogger.cs index 9f9524fbc..4ca1e2452 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/StringLogger.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/StringLogger.cs @@ -8,11 +8,12 @@ using System.Globalization; using Squidex.CLI.Commands.Implementation; using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; using Squidex.Log; namespace Squidex.Domain.Apps.Entities.Apps.Templates; -public sealed class StringLogger : ILogger, ILogLine +public sealed class StringLogger(IJsonSerializer jsonSerializer) : ILogger, ILogLine { private const int MaxActionLength = 40; private readonly List lines = []; @@ -96,6 +97,11 @@ public sealed class StringLogger : ILogger, ILogLine lines.Add(string.Format(CultureInfo.InvariantCulture, message, args)); } + public void WriteJson(object message) + { + lines.Add(jsonSerializer.Serialize(message, true)); + } + private void AddToErrors(string reason) { errors.Add(reason); diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs index d9c368e3c..b59ed6cd0 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs @@ -22,6 +22,7 @@ using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Core.Apps; using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.Json; using Squidex.Log; namespace Squidex.Domain.Apps.Entities.Apps.Templates; @@ -30,6 +31,7 @@ public sealed class TemplateCommandMiddleware( TemplatesClient templatesClient, IOptions templateOptions, IUrlGenerator urlGenerator, + IJsonSerializer jsonSerializer, ISemanticLog log) : ICommandMiddleware { @@ -63,7 +65,7 @@ public sealed class TemplateCommandMiddleware( return; } - using (var cliLog = new StringLogger()) + using (var cliLog = new StringLogger(jsonSerializer)) { try { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index a7e543604..772c974c7 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -40,7 +40,7 @@ - + diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj index 701b2ef0b..997117334 100644 --- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj +++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj @@ -24,13 +24,13 @@ - - - - - - - + + + + + + + diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs index e91a9aab3..ed26e9406 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs @@ -262,7 +262,7 @@ public sealed class RulesController( /// Rule trigger not valid. /// Rule or app not found. [HttpPost] - [Route("apps/{app}/rules/validate/trigger/")] + [Route("apps/{app}/rules/validate/trigger/", Order = -1)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ApiPermission] [ApiCosts(0)] @@ -286,7 +286,7 @@ public sealed class RulesController( /// Rule step not valid. /// Rule or app not found. [HttpPost] - [Route("apps/{app}/rules/validate/step/")] + [Route("apps/{app}/rules/validate/step/", Order = -1)] [ProducesResponseType(StatusCodes.Status204NoContent)] [ApiPermission] [ApiCosts(0)] diff --git a/backend/src/Squidex/Config/Domain/RuleServices.cs b/backend/src/Squidex/Config/Domain/RuleServices.cs index 7ba77facc..d18de4a9f 100644 --- a/backend/src/Squidex/Config/Domain/RuleServices.cs +++ b/backend/src/Squidex/Config/Domain/RuleServices.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using Jint; using Migrations.OldTriggers; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules.Extensions; @@ -118,6 +119,7 @@ public static class RuleServices .As>(); services.AddFlows(config); + services.AddCronJobs(config, m => { m.UpdateInterval = TimeSpan.FromSeconds(1); diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index ab33effd7..e08af34ce 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -59,17 +59,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -83,11 +83,11 @@ - + - + diff --git a/frontend/src/app/features/rules/shared/state-step.component.html b/frontend/src/app/features/rules/shared/state-step.component.html index 0ecf536d6..a0e438533 100644 --- a/frontend/src/app/features/rules/shared/state-step.component.html +++ b/frontend/src/app/features/rules/shared/state-step.component.html @@ -18,16 +18,15 @@ - @if (state) { - + + @if (attemptIndex === -1) { +
+ @for (property of stepInfo.properties; track property.name) { + + } +
+ } @else if (state && state.attempts[attemptIndex]) { +
}
diff --git a/frontend/src/app/features/settings/pages/clients/client.component.html b/frontend/src/app/features/settings/pages/clients/client.component.html index 78e1add96..aeba34e06 100644 --- a/frontend/src/app/features/settings/pages/clients/client.component.html +++ b/frontend/src/app/features/settings/pages/clients/client.component.html @@ -92,7 +92,7 @@ -
+
diff --git a/frontend/src/app/shared/services/rules.service.ts b/frontend/src/app/shared/services/rules.service.ts index f695a1054..b21ac09a2 100644 --- a/frontend/src/app/shared/services/rules.service.ts +++ b/frontend/src/app/shared/services/rules.service.ts @@ -180,7 +180,7 @@ export class RulesService { const url = this.apiUrl.buildUrl(link.href); - return this.http.request(link.method, url, { body: {} }).pipe( + return this.http.request(link.method, url, { body: {} }).pipe( pretifyError('i18n:rules.triggerFailed')); }