diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs index bab06a970..ff5cdbd95 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleCreated.cs @@ -6,15 +6,26 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Rules; +using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { [EventType(nameof(RuleCreated))] - public sealed class RuleCreated : RuleEvent + public sealed class RuleCreated : RuleEvent, IMigrated { public RuleTrigger Trigger { get; set; } public RuleAction Action { get; set; } + + public IEvent Migrate() + { + if (Trigger is IMigrated migrated) + { + Trigger = migrated.Migrate(); + } + + return this; + } } } \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs b/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs index 250710106..589486c54 100644 --- a/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs +++ b/src/Squidex.Domain.Apps.Events/Rules/RuleUpdated.cs @@ -6,15 +6,26 @@ // ========================================================================== using Squidex.Domain.Apps.Core.Rules; +using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Events.Rules { [EventType(nameof(RuleUpdated))] - public sealed class RuleUpdated : RuleEvent + public sealed class RuleUpdated : RuleEvent, IMigrated { public RuleTrigger Trigger { get; set; } public RuleAction Action { get; set; } + + public IEvent Migrate() + { + if (Trigger is IMigrated migrated) + { + Trigger = migrated.Migrate(); + } + + return this; + } } } diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.html b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.html index 3f5c593e8..e566d4724 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.html +++ b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.html @@ -1,34 +1,33 @@
-
- - -
+ + + + +
-
-
- - -
-
-
-
- - -
-
-
-
- - -
+ +
+

Conditions

+ +

Conditions are javascript expressions that define when to trigger, for example:

+ +
    +
  • + Specific events: + +
    event.type == 'Created' || event.type == 'Updated'
    +
  • +
  • + Large assets: + +
    event.fileSize > 100000000
    +
  • +
  • + Images only: + +
    event.isImage
    +
  • +
\ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.scss b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.scss index fbb752506..fa39a4f95 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.scss +++ b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.scss @@ -1,2 +1,33 @@ @import '_vars'; -@import '_mixins'; \ No newline at end of file +@import '_mixins'; + +.code { + font-family: monospace; +} + +textarea { + height: 100px; +} + +pre { + background: $color-border; + border: 0; + padding: .25rem .5rem; + margin: 0; +} + +.help { + & { + font-size: .9rem; + } + + &-example { + margin-top: .375rem; + } + + &-examples { + margin-top: 0; + margin-bottom: 0; + padding-left: 1.5rem; + } +} \ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.ts b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.ts index 130dd0dab..2c8138bb3 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.ts +++ b/src/Squidex/app/features/rules/pages/rules/triggers/asset-changed-trigger.component.ts @@ -24,16 +24,7 @@ export class AssetChangedTriggerComponent implements OnInit { public triggerFormSubmitted = false; public ngOnInit() { - this.triggerForm.setControl('sendCreate', - new FormControl(this.trigger.sendCreate || false)); - - this.triggerForm.setControl('sendUpdate', - new FormControl(this.trigger.sendUpdate || false)); - - this.triggerForm.setControl('sendRename', - new FormControl(this.trigger.sendRename || false)); - - this.triggerForm.setControl('sendDelete', - new FormControl(this.trigger.sendDelete || false)); + this.triggerForm.setControl('condition', + new FormControl(this.trigger.condition || '')); } } \ No newline at end of file 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 1b62cf7c3..7dacf15fb 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 @@ -1,15 +1,8 @@ - - - - - - - - - + + @@ -17,29 +10,8 @@ - - - - - - - - @@ -48,29 +20,8 @@ - - - - - - - -
Schema -
All
-
-
Created
-
-
Updated
-
-
Deleted
-
-
Published
-
-
Unpublished
-
-
Archived
-
-
Restored
+
+ Condition
{{schema.schema.displayName}} - - - - - - - - - - - - - - - + + + + +
+

Conditions

+ +

Conditions are javascript expressions that define when to trigger, for example:

+ +
    +
  • + Specific events: + +
    event.type == 'Created' || event.type == 'Published'
    +
  • +
  • + Content has value: + +
    event.data.important.iv === true
    +
  • +
  • + Updated by user: + +
    user.email === 'user@squidex.io'
    +
  • +
+
diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.scss b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.scss index 62d9b45b4..9ccd3ed9e 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.scss +++ b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.scss @@ -4,17 +4,40 @@ .section { border-top: 1px solid $color-border; padding-top: 1rem; - padding-bottom: 0; -} - -.table { - margin-top: 3.5rem; + padding-bottom: 1rem; } .form-check { margin-top: 1rem; } -.rotated-label { - @include rotate(-45deg); +.code { + font-family: monospace; +} + +textarea { + height: 100px; +} + +pre { + background: $color-border; + border: 0; + padding: .25rem .5rem; + margin: 0; +} + +.help { + & { + font-size: .9rem; + } + + &-example { + margin-top: .375rem; + } + + &-examples { + margin-top: 0; + margin-bottom: 0; + padding-left: 1.5rem; + } } \ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.ts b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.ts index ba2eaad1d..60e69a83c 100644 --- a/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.ts +++ b/src/Squidex/app/features/rules/pages/rules/triggers/content-changed-trigger.component.ts @@ -16,14 +16,8 @@ import { export interface TriggerSchemaForm { schema: SchemaDto; - sendAll: boolean; - sendCreate: boolean; - sendUpdate: boolean; - sendDelete: boolean; - sendPublish: boolean; - sendUnpublish: boolean; - sendArchive: boolean; - sendRestore: boolean; + + condition?: string; } @Component({ @@ -60,125 +54,45 @@ export class ContentChangedTriggerComponent implements OnInit { this.triggerForm.setControl('handleAll', new FormControl(Types.isBoolean(this.trigger.handleAll) ? this.trigger.handleAll : false)); - const triggerSchemas: any[] = (this.trigger.schemas = this.trigger.schemas || []); - - this.triggerSchemas = - ImmutableArray.of( - triggerSchemas.map(triggerSchema => { - const schema = this.schemas.find(s => s.id === triggerSchema.schemaId); - - if (schema) { - return this.updateSendAll({ - schema: schema, - sendAll: false, - sendCreate: triggerSchema.sendCreate, - sendUpdate: triggerSchema.sendUpdate, - sendDelete: triggerSchema.sendDelete, - sendPublish: triggerSchema.sendPublish, - sendUnpublish: triggerSchema.sendUnpublish, - sendArchive: triggerSchema.sendArchive, - sendRestore: triggerSchema.sendRestore - }); - } else { - return null; - } - }).filter(s => !!s).map(s => s!)).sortByStringAsc(s => s.schema.name); - - this.schemasToAdd = - this.schemas.filter(schema => - !triggerSchemas.find(s => s.schemaId === schema.id)) - .sortByStringAsc(x => x.name); - - this.schemaToAdd = this.schemasToAdd.at(0); - } + const schemas: TriggerSchemaForm[] = []; - public removeSchema(schemaForm: TriggerSchemaForm) { - this.triggerSchemas = this.triggerSchemas.remove(schemaForm); - - this.updateValue(); - - this.schemasToAdd = this.schemasToAdd.push(schemaForm.schema).sortByStringAsc(x => x.name); - this.schemaToAdd = this.schemasToAdd.at(0); - } + if (this.trigger.schemas) { + for (let triggerSchema of this.trigger.schemas) { + const schema = this.schemas.find(s => s.id === triggerSchema.schemaId); - public addSchema() { - this.triggerSchemas = - this.triggerSchemas.push( - this.updateSendAll({ - schema: this.schemaToAdd, - sendAll: false, - sendCreate: false, - sendUpdate: false, - sendDelete: false, - sendPublish: false, - sendUnpublish: false, - sendArchive: false, - sendRestore: false - })).sortByStringAsc(x => x.schema.name); + if (schema) { + schemas.push({ schema, condition: triggerSchema.condition }); + } + } + } - this.updateValue(); + this.triggerSchemas = ImmutableArray.of(schemas).sortByStringAsc(s => s.schema.name); - this.schemasToAdd = this.schemasToAdd.remove(this.schemaToAdd).sortByStringAsc(x => x.name); - this.schemaToAdd = this.schemasToAdd.at(0); + this.updateSchemaToAdd(); } - public toggle(schemaForm: TriggerSchemaForm, property: string) { - const newSchema = this.updateSendAll(Object.assign({}, schemaForm, { [property]: !schemaForm[property] })); - - this.triggerSchemas = this.triggerSchemas.replace(schemaForm, newSchema); + public removeSchema(schemaForm: TriggerSchemaForm) { + this.triggerSchemas = this.triggerSchemas.remove(schemaForm); this.updateValue(); + this.updateSchemaToAdd(); } - public toggleAll(schemaForm: TriggerSchemaForm) { - const newSchema = this.updateAll({ schema: schemaForm.schema }, !schemaForm.sendAll); - - this.triggerSchemas = this.triggerSchemas.replace(schemaForm, newSchema); + public addSchema() { + this.triggerSchemas = this.triggerSchemas.push({ schema: this.schemaToAdd }).sortByStringAsc(x => x.schema.name); this.updateValue(); + this.updateSchemaToAdd(); } - private updateValue() { - const schemas = - this.triggerSchemas.values.map(s => { - return { - schemaId: s.schema.id, - sendCreate: s.sendCreate, - sendUpdate: s.sendUpdate, - sendDelete: s.sendDelete, - sendPublish: s.sendPublish, - sendUnpublish: s.sendUnpublish, - sendArchive: s.sendArchive, - sendRestore: s.sendRestore - }; - }); + public updateValue() { + const schemas = this.triggerSchemas.values.map(s => ({ schemaId: s.schema.id, condition: s.condition })); this.triggerForm.controls['schemas'].setValue(schemas); } - private updateAll(schemaForm: TriggerSchemaForm, value: boolean): TriggerSchemaForm { - schemaForm.sendAll = value; - schemaForm.sendCreate = value; - schemaForm.sendUpdate = value; - schemaForm.sendDelete = value; - schemaForm.sendPublish = value; - schemaForm.sendUnpublish = value; - schemaForm.sendArchive = value; - schemaForm.sendRestore = value; - - return schemaForm; - } - - private updateSendAll(schemaForm: TriggerSchemaForm): TriggerSchemaForm { - schemaForm.sendAll = - schemaForm.sendCreate && - schemaForm.sendUpdate && - schemaForm.sendDelete && - schemaForm.sendPublish && - schemaForm.sendUnpublish && - schemaForm.sendArchive && - schemaForm.sendRestore; - - return schemaForm; + private updateSchemaToAdd() { + this.schemasToAdd = this.schemas.filter(schema => !this.triggerSchemas.find(s => s.schema.id === schema.id)).sortByStringAsc(x => x.name); + this.schemaToAdd = this.schemasToAdd.at(0); } } \ No newline at end of file diff --git a/tools/Migrate_01/OldTriggers/AssetChangedTrigger.cs b/tools/Migrate_01/OldTriggers/AssetChangedTrigger.cs index 468f0c9f1..3543f011d 100644 --- a/tools/Migrate_01/OldTriggers/AssetChangedTrigger.cs +++ b/tools/Migrate_01/OldTriggers/AssetChangedTrigger.cs @@ -54,9 +54,13 @@ namespace Migrate_01.OldTriggers conditions.Add($"event.type == '{EnrichedAssetEventType.Deleted}'"); } - var condition = "false"; + var condition = string.Empty; - if (conditions.Count > 0) + if (conditions.Count == 0 && condition.Length < 4) + { + condition = "false"; + } + else if (condition.Length < 7) { condition = string.Join(" || ", conditions); } diff --git a/tools/Migrate_01/OldTriggers/ContentChangedTrigger.cs b/tools/Migrate_01/OldTriggers/ContentChangedTrigger.cs index 644b03203..b7890f1cf 100644 --- a/tools/Migrate_01/OldTriggers/ContentChangedTrigger.cs +++ b/tools/Migrate_01/OldTriggers/ContentChangedTrigger.cs @@ -7,7 +7,9 @@ using System; using System.Collections.ObjectModel; +using System.Linq; using Squidex.Domain.Apps.Core.Rules; +using Squidex.Domain.Apps.Core.Rules.Triggers; using Squidex.Infrastructure; namespace Migrate_01.OldTriggers @@ -39,7 +41,9 @@ namespace Migrate_01.OldTriggers public RuleTrigger Migrate() { - throw new NotImplementedException(); + var schemas = new ReadOnlyCollection(Schemas.Select(x => x.Migrate()).ToList()); + + return new ContentChangedTriggerV2 { HandleAll = HandleAll, Schemas = schemas }; } } } diff --git a/tools/Migrate_01/OldTriggers/ContentChangedTriggerSchema.cs b/tools/Migrate_01/OldTriggers/ContentChangedTriggerSchema.cs index 6e46d53f6..651df9456 100644 --- a/tools/Migrate_01/OldTriggers/ContentChangedTriggerSchema.cs +++ b/tools/Migrate_01/OldTriggers/ContentChangedTriggerSchema.cs @@ -70,9 +70,13 @@ namespace Migrate_01.OldTriggers conditions.Add($"event.type == '{EnrichedAssetEventType.Deleted}'"); } - var condition = "false"; + var condition = string.Empty; - if (conditions.Count > 0) + if (conditions.Count == 0 && condition.Length < 7) + { + condition = "false"; + } + else if (condition.Length < 7) { condition = string.Join(" || ", conditions); }