diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs index 439ead886..600fcaf6e 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs @@ -20,6 +20,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers public bool SendDelete { get; set; } - public bool SendChange { get; set; } + public bool SendPublish { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs index e65686d8e..e0b8ef424 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs @@ -43,7 +43,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Triggers (schema.SendCreate && @event is ContentCreated) || (schema.SendUpdate && @event is ContentUpdated) || (schema.SendDelete && @event is ContentDeleted) || - (schema.SendChange && @event is ContentStatusChanged statusChanged && statusChanged.Status == Status.Published); + (schema.SendPublish && @event is ContentStatusChanged statusChanged && statusChanged.Status == Status.Published); } } } diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventEntity.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventEntity.cs index 0b31e6a12..f060b9294 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventEntity.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventEntity.cs @@ -22,10 +22,6 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Rules [BsonElement] public Guid AppId { get; set; } - [BsonRequired] - [BsonElement] - public string EventName { get; set; } - [BsonRequired] [BsonElement] public string LastDump { get; set; } diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventRepository.cs index d7016942c..db39b6675 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Rules/MongoRuleEventRepository.cs @@ -76,7 +76,7 @@ namespace Squidex.Domain.Apps.Read.MongoDb.Rules public Task EnqueueAsync(RuleJob job, Instant nextAttempt) { - var entity = SimpleMapper.Map(job, new MongoRuleEventEntity { Created = nextAttempt, NextAttempt = nextAttempt }); + var entity = SimpleMapper.Map(job, new MongoRuleEventEntity { Job = job, Created = nextAttempt, NextAttempt = nextAttempt }); return Collection.InsertOneIfNotExistsAsync(entity); } diff --git a/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs index c0dabb460..9f7ef7d67 100644 --- a/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/ActionContextDispatcher.cs @@ -10,9 +10,11 @@ using System; using System.Linq; using System.Reflection; +#pragma warning disable IDE0033 // Use explicitly provided tuple name + namespace Squidex.Infrastructure.Dispatching { - public sealed class ActionContextDispatcher + public static class ActionContextDispatcher { public delegate void ActionContextDelegate(TTarget target, T input, TContext context) where T : TIn; diff --git a/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs index 5663a5e52..4902f0f44 100644 --- a/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/ActionDispatcher.cs @@ -10,9 +10,11 @@ using System; using System.Linq; using System.Reflection; +#pragma warning disable IDE0033 // Use explicitly provided tuple name + namespace Squidex.Infrastructure.Dispatching { - public sealed class ActionDispatcher + public static class ActionDispatcher { public delegate void ActionDelegate(TTarget target, T input) where T : TIn; diff --git a/src/Squidex.Infrastructure/Dispatching/FuncContextDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/FuncContextDispatcher.cs index 294488276..00042fe62 100644 --- a/src/Squidex.Infrastructure/Dispatching/FuncContextDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/FuncContextDispatcher.cs @@ -9,9 +9,11 @@ using System.Linq; using System.Reflection; +#pragma warning disable IDE0033 // Use explicitly provided tuple name + namespace Squidex.Infrastructure.Dispatching { - public sealed class FuncContextDispatcher + public static class FuncContextDispatcher { public delegate TOut FuncContextDelegate(TTarget target, T input, TContext context) where T : TIn; diff --git a/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs b/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs index d600e5b33..08e1fd48e 100644 --- a/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs +++ b/src/Squidex.Infrastructure/Dispatching/FuncDispatcher.cs @@ -9,9 +9,11 @@ using System.Linq; using System.Reflection; +#pragma warning disable IDE0033 // Use explicitly provided tuple name + namespace Squidex.Infrastructure.Dispatching { - public sealed class FuncDispatcher + public static class FuncDispatcher { public delegate TOut FuncDelegate(TTarget target, T input) where T : TIn; diff --git a/src/Squidex/Controllers/Api/Rules/Models/Converters/RuleConverter.cs b/src/Squidex/Controllers/Api/Rules/Models/Converters/RuleConverter.cs index 6d4a3b54d..339fabf2c 100644 --- a/src/Squidex/Controllers/Api/Rules/Models/Converters/RuleConverter.cs +++ b/src/Squidex/Controllers/Api/Rules/Models/Converters/RuleConverter.cs @@ -6,6 +6,7 @@ // All rights reserved. // ========================================================================== +using System; using Squidex.Domain.Apps.Read.Rules; using Squidex.Domain.Apps.Write.Rules.Commands; using Squidex.Infrastructure.Reflection; @@ -34,22 +35,36 @@ namespace Squidex.Controllers.Api.Rules.Models.Converters return dto; } - public static UpdateRule ToCommand(this UpdateRuleDto dto) + public static UpdateRule ToCommand(this UpdateRuleDto dto, Guid id) { - var command = new UpdateRule + var command = new UpdateRule { RuleId = id }; + + if (dto.Action != null) { - Trigger = dto.Trigger?.ToTrigger(), Action = dto.Action?.ToAction() - }; + command.Action = dto.Action.ToAction(); + } + + if (dto.Trigger != null) + { + command.Trigger = dto.Trigger.ToTrigger(); + } return command; } public static CreateRule ToCommand(this CreateRuleDto dto) { - var command = new CreateRule + var command = new CreateRule(); + + if (dto.Action != null) { - Trigger = dto.Trigger.ToTrigger(), Action = dto.Action.ToAction() - }; + command.Action = dto.Action.ToAction(); + } + + if (dto.Trigger != null) + { + command.Trigger = dto.Trigger.ToTrigger(); + } return command; } diff --git a/src/Squidex/Controllers/Api/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs b/src/Squidex/Controllers/Api/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs index 05215c376..29e0c71fd 100644 --- a/src/Squidex/Controllers/Api/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs +++ b/src/Squidex/Controllers/Api/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs @@ -35,6 +35,6 @@ namespace Squidex.Controllers.Api.Rules.Models.Triggers /// /// True, when to send a message for published events. /// - public bool SendChange { get; set; } + public bool SendPublish { get; set; } } } diff --git a/src/Squidex/Controllers/Api/Rules/RulesController.cs b/src/Squidex/Controllers/Api/Rules/RulesController.cs index 7c05ac840..100bb3633 100644 --- a/src/Squidex/Controllers/Api/Rules/RulesController.cs +++ b/src/Squidex/Controllers/Api/Rules/RulesController.cs @@ -112,7 +112,7 @@ namespace Squidex.Controllers.Api.Rules [ApiCosts(1)] public async Task PutRule(string app, Guid id, [FromBody] UpdateRuleDto request) { - var command = request.ToCommand(); + var command = request.ToCommand(id); await CommandBus.PublishAsync(command); @@ -239,7 +239,7 @@ namespace Squidex.Controllers.Api.Rules await ruleEventsRepository.EnqueueAsync(id, SystemClock.Instance.GetCurrentInstant()); - return Ok(); + return NoContent(); } } } diff --git a/src/Squidex/app/features/content/pages/content/content-page.component.ts b/src/Squidex/app/features/content/pages/content/content-page.component.ts index aa85c4da8..a2b6fd49b 100644 --- a/src/Squidex/app/features/content/pages/content/content-page.component.ts +++ b/src/Squidex/app/features/content/pages/content/content-page.component.ts @@ -208,8 +208,12 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone private enableContentForm() { this.contentForm.markAsPristine(); - for (const field of this.schema.fields.filter(f => !f.isDisabled)) { - this.contentForm.controls[field.name].enable(); + if (this.schema.fields.length === 0) { + this.contentForm.enable(); + } else { + for (const field of this.schema.fields.filter(f => !f.isDisabled)) { + this.contentForm.controls[field.name].enable(); + } } } diff --git a/src/Squidex/app/features/rules/pages/events/rule-events-page.component.html b/src/Squidex/app/features/rules/pages/events/rule-events-page.component.html index 9bb9ebd9f..bdbf99255 100644 --- a/src/Squidex/app/features/rules/pages/events/rule-events-page.component.html +++ b/src/Squidex/app/features/rules/pages/events/rule-events-page.component.html @@ -39,7 +39,7 @@ Event - Url + Description Created @@ -71,7 +71,7 @@
-

Last Request

+

Last Invocation

diff --git a/src/Squidex/app/features/rules/pages/events/rule-events-page.component.scss b/src/Squidex/app/features/rules/pages/events/rule-events-page.component.scss index e131e5532..bc650f4f1 100644 --- a/src/Squidex/app/features/rules/pages/events/rule-events-page.component.scss +++ b/src/Squidex/app/features/rules/pages/events/rule-events-page.component.scss @@ -5,6 +5,10 @@ h3 { margin-bottom: 1rem; } +.truncate { + @include truncate; +} + .event { &-stats { font-size: .8rem; @@ -31,7 +35,7 @@ h3 { &::before { @include caret-top($color-border); - @include absolute(-1.1rem, 1.9rem, auto, auto); + @include absolute(-1.1rem, 2.3rem, auto, auto); } h3 { diff --git a/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.ts b/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.ts index 08f979cc5..f30dac5d9 100644 --- a/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.ts +++ b/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.ts @@ -58,10 +58,7 @@ export class RuleWizardComponent extends AppComponentBase implements OnInit { public created = new EventEmitter(); @Output() - public ruleTriggerSaved = new EventEmitter(); - - @Output() - public ruleActionSaved = new EventEmitter(); + public updated = new EventEmitter(); @Input() public schemas: SchemaDto[]; @@ -81,12 +78,18 @@ export class RuleWizardComponent extends AppComponentBase implements OnInit { public ngOnInit() { if (this.mode === MODE_EDIT_ACTION) { this.step = 4; - this.action = this.rule.action; + + this.action = Object.assign({}, this.rule.action); this.actionType = this.rule.actionType; + + delete this.action.actionType; } else if (this.mode === MODE_EDIT_TRIGGER) { this.step = 2; - this.trigger = this.rule.trigger; + + this.trigger = Object.assign({}, this.rule.trigger); this.triggerType = this.rule.triggerType; + + delete this.trigger.triggerType; } } @@ -106,15 +109,7 @@ export class RuleWizardComponent extends AppComponentBase implements OnInit { if (this.mode === MODE_WIZARD) { this.step++; } else { - const requestDto = new UpdateRuleDto(this.trigger, null); - - this.appNameOnce() - .switchMap(app => this.rulesService.putRule(app, this.rule.id, requestDto, this.rule.version)) - .subscribe(dto => { - this.ruleTriggerSaved.emit(this.action); - }, error => { - this.notifyError(error); - }); + this.updateTrigger(); } } @@ -122,28 +117,51 @@ export class RuleWizardComponent extends AppComponentBase implements OnInit { this.action = Object.assign({}, value, { actionType: this.actionType }); if (this.mode === MODE_WIZARD) { - const requestDto = new CreateRuleDto(this.trigger, this.action); - - this.appNameOnce() - .switchMap(app => this.rulesService.postRule(app, requestDto, this.authService.user!.id, DateTime.now())) - .subscribe(dto => { - this.created.emit(dto); - }, error => { - this.notifyError(error); - }); + this.createRule(); } else { - const requestDto = new UpdateRuleDto(null, this.action); - - this.appNameOnce() - .switchMap(app => this.rulesService.putRule(app, this.rule.id, requestDto, this.rule.version)) - .subscribe(dto => { - this.ruleActionSaved.emit(this.action); - }, error => { - this.notifyError(error); - }); + this.updateAction(); } } + private createRule() { + const requestDto = new CreateRuleDto(this.trigger, this.action); + + this.appNameOnce() + .switchMap(app => this.rulesService.postRule(app, requestDto, this.authService.user!.id, DateTime.now())) + .subscribe(dto => { + this.created.emit(dto); + }, error => { + this.notifyError(error); + }); + } + + private updateTrigger() { + const requestDto = new UpdateRuleDto(this.trigger, null); + + this.appNameOnce() + .switchMap(app => this.rulesService.putRule(app, this.rule.id, requestDto, this.rule.version)) + .subscribe(dto => { + const rule = this.rule.updateTrigger(this.trigger, this.authService.user.id, dto.version, DateTime.now()); + this.updated.emit(rule); + }, error => { + this.notifyError(error); + }); + } + + private updateAction() { + const requestDto = new UpdateRuleDto(null, this.action); + + this.appNameOnce() + .switchMap(app => this.rulesService.putRule(app, this.rule.id, requestDto, this.rule.version)) + .subscribe(dto => { + const rule = this.rule.updateAction(this.action, this.authService.user.id, dto.version, DateTime.now()); + + this.updated.emit(rule); + }, error => { + this.notifyError(error); + }); + } + public cancel() { this.cancelled.emit(); } diff --git a/src/Squidex/app/features/rules/pages/rules/rules-page.component.html b/src/Squidex/app/features/rules/pages/rules/rules-page.component.html index cd5532676..448ecb97e 100644 --- a/src/Squidex/app/features/rules/pages/rules/rules-page.component.html +++ b/src/Squidex/app/features/rules/pages/rules/rules-page.component.html @@ -99,6 +99,7 @@ diff --git a/src/Squidex/app/features/rules/pages/rules/rules-page.component.ts b/src/Squidex/app/features/rules/pages/rules/rules-page.component.ts index 629db108c..4062e78d9 100644 --- a/src/Squidex/app/features/rules/pages/rules/rules-page.component.ts +++ b/src/Squidex/app/features/rules/pages/rules/rules-page.component.ts @@ -94,6 +94,12 @@ export class RulesPageComponent extends AppComponentBase implements OnInit { this.addRuleDialog.show(); } + public onRuleUpdated(rule: RuleDto) { + this.rules = this.rules.replaceBy('id', rule); + + this.addRuleDialog.hide(); + } + public onRuleCreated(rule: RuleDto) { this.rules = this.rules.push(rule); diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.html b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.html index ff7321f40..dca702cbe 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.html +++ b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.html @@ -25,8 +25,8 @@ D - - C + + P @@ -48,7 +48,7 @@ - +