From 59d16b18a8415c743b1874508a9deff2a0bddc44 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 1 Jul 2018 15:04:38 +0200 Subject: [PATCH 01/13] Started with medium action handler. --- .../Contents/NamedContentData.cs | 1 - .../Rules/Actions/MediumAction.cs | 36 + .../Rules/IRuleActionVisitor.cs | 2 + .../Schemas/FieldCollection.cs | 1 - .../Actions/MediumActionHandler.cs | 137 + .../HandleRules/IContentResolver.cs | 18 + .../HandleRules/RuleEventFormatter.cs | 94 +- .../Rules/Guards/RuleActionValidator.cs | 27 + .../Rules/RuleEnqueuer.cs | 2 +- .../Commands/CreateSchemaNestedField.cs | 2 - .../Schemas/SchemaCreatedNestedField.cs | 2 - src/Squidex.Infrastructure/Validate.cs | 1 - .../Rules/Models/Actions/MediumactionDto.cs | 67 + .../Models/Converters/RuleActionDtoFactory.cs | 5 + src/Squidex/Config/Domain/RuleServices.cs | 3 + src/Squidex/Program.cs | 1 - src/Squidex/WebStartup.cs | 2 - .../app/features/rules/declarations.ts | 1 + src/Squidex/app/features/rules/module.ts | 2 + .../actions/medium-action.component.html | 112 + .../actions/medium-action.component.scss | 6 + .../rules/actions/medium-action.component.ts | 57 + .../pages/rules/rule-wizard.component.html | 7 + .../app/shared/services/rules.service.ts | 3 + src/Squidex/app/theme/_rules.scss | 5 + .../app/theme/icomoon/demo-files/demo.css | 4 +- src/Squidex/app/theme/icomoon/demo.html | 1116 +++++---- .../app/theme/icomoon/fonts/icomoon.eot | Bin 24880 -> 25028 bytes .../app/theme/icomoon/fonts/icomoon.svg | 1 + .../app/theme/icomoon/fonts/icomoon.ttf | Bin 24716 -> 24864 bytes .../app/theme/icomoon/fonts/icomoon.woff | Bin 24792 -> 24940 bytes src/Squidex/app/theme/icomoon/selection.json | 2215 +++++++++-------- src/Squidex/app/theme/icomoon/style.css | 289 ++- 33 files changed, 2518 insertions(+), 1701 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Model/Rules/Actions/MediumAction.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/IContentResolver.cs create mode 100644 src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/MediumactionDto.cs create mode 100644 src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.html create mode 100644 src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.scss create mode 100644 src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.ts diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs index 3f776c24b..fd298d5ef 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/NamedContentData.cs @@ -6,7 +6,6 @@ // ========================================================================== using System; -using System.Collections.Generic; using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Contents diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Actions/MediumAction.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Actions/MediumAction.cs new file mode 100644 index 000000000..003bcfd51 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Actions/MediumAction.cs @@ -0,0 +1,36 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.Rules.Actions +{ + [TypeName(nameof(MediumAction))] + public sealed class MediumAction : RuleAction + { + public string AccessToken { get; set; } + + public string Author { get; set; } + + public string Publication { get; set; } + + public string Tags { get; set; } + + public string Title { get; set; } + + public string CanonicalUrl { get; set; } + + public string Content { get; set; } + + public bool IsHtml { get; set; } + + public override T Accept(IRuleActionVisitor visitor) + { + return visitor.Visit(this); + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/IRuleActionVisitor.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/IRuleActionVisitor.cs index 2ef2e3516..dc1929cb7 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/IRuleActionVisitor.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/IRuleActionVisitor.cs @@ -19,6 +19,8 @@ namespace Squidex.Domain.Apps.Core.Rules T Visit(FastlyAction action); + T Visit(MediumAction action); + T Visit(SlackAction action); T Visit(WebhookAction action); diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldCollection.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldCollection.cs index 006488a2b..e1546841d 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldCollection.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldCollection.cs @@ -9,7 +9,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.Contracts; -using System.Globalization; using System.Linq; using Squidex.Infrastructure; diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs new file mode 100644 index 000000000..75307c81c --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs @@ -0,0 +1,137 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +#pragma warning disable SA1649 // File name must match first type name + +using System; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.Rules.Actions; +using Squidex.Domain.Apps.Events; +using Squidex.Infrastructure; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Http; + +namespace Squidex.Domain.Apps.Core.HandleRules.Actions +{ + public sealed class MediumJob + { + public string RequestUrl { get; set; } + public string RequestBody { get; set; } + + public string AccessToken { get; set; } + } + + public sealed class MediumActionHandler : RuleActionHandler + { + private const string Description = "Post to medium"; + + private readonly RuleEventFormatter formatter; + + public MediumActionHandler(RuleEventFormatter formatter) + { + Guard.NotNull(formatter, nameof(formatter)); + + this.formatter = formatter; + } + + protected override async Task<(string Description, MediumJob Data)> CreateJobAsync(Envelope @event, string eventName, MediumAction action) + { + var requestUrl = + !string.IsNullOrWhiteSpace(action.Author) ? + $"https://api.medium.com/v1/users/{action.Author}/posts" : + $"https://api.medium.com/v1/publication/{action.Publication}/posts"; + + var requestBody = + new JObject( + new JProperty("title", await formatter.FormatStringAsync(action.Title, @event)), + new JProperty("contentFormat", action.IsHtml ? "html" : "markdown"), + new JProperty("content", await formatter.FormatStringAsync(action.Content, @event)), + new JProperty("canonicalUrl", await formatter.FormatStringAsync(action.CanonicalUrl, @event)), + new JProperty("tags", await ParseTagsAsync(@event, action))); + + var ruleJob = new MediumJob + { + AccessToken = action.AccessToken, + RequestUrl = requestUrl, + RequestBody = requestBody.ToString(Formatting.Indented) + }; + + return (Description, ruleJob); + } + + private async Task ParseTagsAsync(Envelope @event, MediumAction action) + { + if (string.IsNullOrWhiteSpace(action.Tags)) + { + return null; + } + + string[] tags; + try + { + var jsonTags = await formatter.FormatStringAsync(action.Tags, @event); + + tags = JsonConvert.DeserializeObject(jsonTags); + } + catch + { + tags = action.Tags.Split(','); + } + + return new JArray(tags); + } + + protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(MediumJob job) + { + var requestBody = job.RequestBody; + var requestMessage = BuildRequest(job, requestBody); + + HttpResponseMessage response = null; + + try + { + response = await HttpClientPool.GetHttpClient().SendAsync(requestMessage); + + var responseString = await response.Content.ReadAsStringAsync(); + var requestDump = DumpFormatter.BuildDump(requestMessage, response, requestBody, responseString, TimeSpan.Zero, false); + + Exception ex = null; + + if (!response.IsSuccessStatusCode) + { + ex = new HttpRequestException($"Response code does not indicate success: {(int)response.StatusCode} ({response.StatusCode})."); + } + + return (requestDump, ex); + } + catch (Exception ex) + { + var requestDump = DumpFormatter.BuildDump(requestMessage, response, requestBody, ex.ToString(), TimeSpan.Zero, false); + + return (requestDump, ex); + } + } + + private static HttpRequestMessage BuildRequest(MediumJob job, string requestBody) + { + var request = new HttpRequestMessage(HttpMethod.Post, job.RequestUrl) + { + Content = new StringContent(requestBody, Encoding.UTF8, "application/json") + }; + + request.Headers.Add("Accept", "application/json"); + request.Headers.Add("Accept-Charset", "utf-8"); + request.Headers.Add("Authorization", $"Bearer {job.AccessToken}"); + + return request; + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IContentResolver.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IContentResolver.cs new file mode 100644 index 000000000..d25b17ea4 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IContentResolver.cs @@ -0,0 +1,18 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using Squidex.Domain.Apps.Core.Contents; + +namespace Squidex.Domain.Apps.Core.HandleRules +{ + public interface IContentResolver + { + Task GetContentDataAsync(Guid id); + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs index 6401a786b..8adaafa90 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs @@ -17,6 +17,7 @@ using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; +using Squidex.Infrastructure.Caching; using Squidex.Infrastructure.EventSourcing; using Squidex.Shared.Users; @@ -36,13 +37,18 @@ namespace Squidex.Domain.Apps.Core.HandleRules private const string UserNamePlaceholder = "$USER_NAME"; private const string UserEmailPlaceholder = "$USER_EMAIL"; private static readonly Regex ContentDataPlaceholder = new Regex(@"\$CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}", RegexOptions.Compiled); + private static readonly Regex ContentDataPlaceholderV2 = new Regex(@"\$\{CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}\}", RegexOptions.Compiled); private static readonly TimeSpan UserCacheDuration = TimeSpan.FromMinutes(10); private readonly JsonSerializer serializer; private readonly IRuleUrlGenerator urlGenerator; private readonly IMemoryCache memoryCache; private readonly IUserResolver userResolver; - public RuleEventFormatter(JsonSerializer serializer, IRuleUrlGenerator urlGenerator, IMemoryCache memoryCache, IUserResolver userResolver) + public RuleEventFormatter( + JsonSerializer serializer, + IRuleUrlGenerator urlGenerator, + IMemoryCache memoryCache, + IUserResolver userResolver) { Guard.NotNull(memoryCache, nameof(memoryCache)); Guard.NotNull(serializer, nameof(serializer)); @@ -70,6 +76,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules public async virtual Task FormatStringAsync(string text, Envelope @event) { + if (string.IsNullOrWhiteSpace(text)) + { + return text; + } + var sb = new StringBuilder(text); if (@event.Headers.Contains(CommonHeaders.Timestamp)) @@ -173,55 +184,68 @@ namespace Squidex.Domain.Apps.Core.HandleRules private static string ReplaceData(NamedContentData data, string text) { - return ContentDataPlaceholder.Replace(text, match => + text = ContentDataPlaceholder.Replace(text, match => { - var captures = match.Groups[2].Captures; + return Replace(data, match); + }); - var path = new string[captures.Count]; + text = ContentDataPlaceholderV2.Replace(text, match => + { + return Replace(data, match); + }); - for (var i = 0; i < path.Length; i++) - { - path[i] = captures[i].Value; - } + return text; + } - if (!data.TryGetValue(path[0], out var field)) - { - return Undefined; - } + private static string Replace(NamedContentData data, Match match) + { + var captures = match.Groups[2].Captures; + + var path = new string[captures.Count]; + + for (var i = 0; i < path.Length; i++) + { + path[i] = captures[i].Value; + } - if (!field.TryGetValue(path[1], out var value)) + if (!data.TryGetValue(path[0], out var field)) + { + return Undefined; + } + + if (!field.TryGetValue(path[1], out var value)) + { + return Undefined; + } + + for (var j = 2; j < path.Length; j++) + { + if (value is JObject obj && obj.TryGetValue(path[j], out value)) { - return Undefined; + continue; } - for (var j = 2; j < path.Length; j++) + if (value is JArray arr && int.TryParse(path[j], out var idx) && idx >= 0 && idx < arr.Count) { - if (value is JObject obj && obj.TryGetValue(path[j], out value)) - { - continue; - } - if (value is JArray arr && int.TryParse(path[j], out var idx) && idx >= 0 && idx < arr.Count) - { - value = arr[idx]; - } - else - { - return Undefined; - } + value = arr[idx]; } - - if (value == null || value.Type == JTokenType.Null || value.Type == JTokenType.Undefined) + else { return Undefined; } + } - if (value is JValue jValue && jValue != null) - { - return jValue.Value.ToString(); - } + if (value == null || value.Type == JTokenType.Null || value.Type == JTokenType.Undefined) + { + return Undefined; + } - return value?.ToString(Formatting.Indented) ?? Undefined; - }); + if (value is JValue jValue && jValue != null) + { + return jValue.Value.ToString(); + } + + return value?.ToString(Formatting.Indented) ?? Undefined; } private Task FindUserAsync(RefToken actor) diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs b/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs index 6e2178bb3..68a8fc9c5 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs @@ -107,6 +107,33 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards return Task.FromResult>(errors); } + public Task> Visit(MediumAction action) + { + var errors = new List(); + + if (string.IsNullOrWhiteSpace(action.AccessToken)) + { + errors.Add(new ValidationError("Access token is required.", nameof(action.AccessToken))); + } + + if (string.IsNullOrWhiteSpace(action.Author) && !string.IsNullOrWhiteSpace(action.Publication)) + { + errors.Add(new ValidationError("Author or publication id is required.", nameof(action.Author), nameof(action.Publication))); + } + + if (string.IsNullOrWhiteSpace(action.Content)) + { + errors.Add(new ValidationError("Content is required.", nameof(action.Content))); + } + + if (string.IsNullOrWhiteSpace(action.Title)) + { + errors.Add(new ValidationError("Title is required.", nameof(action.Content))); + } + + return Task.FromResult>(errors); + } + public Task> Visit(SlackAction action) { var errors = new List(); diff --git a/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs b/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs index 5b0d07d12..e1710013e 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/RuleEnqueuer.cs @@ -20,7 +20,7 @@ namespace Squidex.Domain.Apps.Entities.Rules { public sealed class RuleEnqueuer : IEventConsumer { - private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(2); + private static readonly TimeSpan CacheDuration = TimeSpan.FromSeconds(10); private readonly IRuleEventRepository ruleEventRepository; private readonly IAppProvider appProvider; private readonly IMemoryCache cache; diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Commands/CreateSchemaNestedField.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Commands/CreateSchemaNestedField.cs index a20292880..55cd4e6eb 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Commands/CreateSchemaNestedField.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Commands/CreateSchemaNestedField.cs @@ -5,8 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Domain.Apps.Core.Schemas; - namespace Squidex.Domain.Apps.Entities.Schemas.Commands { public sealed class CreateSchemaNestedField : CreateSchemaFieldBase diff --git a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreatedNestedField.cs b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreatedNestedField.cs index 331f89513..bb2c22c50 100644 --- a/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreatedNestedField.cs +++ b/src/Squidex.Domain.Apps.Events/Schemas/SchemaCreatedNestedField.cs @@ -5,8 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Domain.Apps.Core.Schemas; - namespace Squidex.Domain.Apps.Events.Schemas { public sealed class SchemaCreatedNestedField : SchemaCreatedFieldBase diff --git a/src/Squidex.Infrastructure/Validate.cs b/src/Squidex.Infrastructure/Validate.cs index 8f69aeeca..ae85f0a21 100644 --- a/src/Squidex.Infrastructure/Validate.cs +++ b/src/Squidex.Infrastructure/Validate.cs @@ -7,7 +7,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; namespace Squidex.Infrastructure diff --git a/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/MediumactionDto.cs b/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/MediumactionDto.cs new file mode 100644 index 000000000..6335a67f6 --- /dev/null +++ b/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/MediumactionDto.cs @@ -0,0 +1,67 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.ComponentModel.DataAnnotations; +using NJsonSchema.Annotations; +using Squidex.Domain.Apps.Core.Rules; +using Squidex.Domain.Apps.Core.Rules.Actions; +using Squidex.Infrastructure.Reflection; + +namespace Squidex.Areas.Api.Controllers.Rules.Models.Actions +{ + [JsonSchema("Medium")] + public class MediumActionDto : RuleActionDto + { + /// + /// The self issued access token. + /// + [Required] + public string AccessToken { get; set; } + + /// + /// The author name. + /// + public string Author { get; set; } + + /// + /// The author name. + /// + public string Publication { get; set; } + + /// + /// The optional comma separated list of tags. + /// + public string Tags { get; set; } + + /// + /// The title, used for the url. + /// + [Required] + public string Title { get; set; } + + /// + /// The content, either html or markdown. + /// + [Required] + public string Content { get; set; } + + /// + /// The original home of this content, if it was originally published elsewhere. + /// + public string CanonicalUrl { get; set; } + + /// + /// Indicates whether the content is markdown or html. + /// + public bool IsHtml { get; set; } + + public override RuleAction ToAction() + { + return SimpleMapper.Map(this, new MediumAction()); + } + } +} diff --git a/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleActionDtoFactory.cs b/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleActionDtoFactory.cs index c2b50b831..664d3f352 100644 --- a/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleActionDtoFactory.cs +++ b/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleActionDtoFactory.cs @@ -45,6 +45,11 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Converters return SimpleMapper.Map(action, new FastlyActionDto()); } + public RuleActionDto Visit(MediumAction action) + { + return SimpleMapper.Map(action, new MediumActionDto()); + } + public RuleActionDto Visit(SlackAction action) { return SimpleMapper.Map(action, new SlackActionDto()); diff --git a/src/Squidex/Config/Domain/RuleServices.cs b/src/Squidex/Config/Domain/RuleServices.cs index 888d1eee4..d80b0e5c7 100644 --- a/src/Squidex/Config/Domain/RuleServices.cs +++ b/src/Squidex/Config/Domain/RuleServices.cs @@ -36,6 +36,9 @@ namespace Squidex.Config.Domain services.AddSingletonAs() .As(); + services.AddSingletonAs() + .As(); + services.AddSingletonAs() .As(); diff --git a/src/Squidex/Program.cs b/src/Squidex/Program.cs index e3e20d220..2719edd25 100644 --- a/src/Squidex/Program.cs +++ b/src/Squidex/Program.cs @@ -6,7 +6,6 @@ // ========================================================================== using System.IO; -using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; diff --git a/src/Squidex/WebStartup.cs b/src/Squidex/WebStartup.cs index fbaec12fb..815d183fd 100644 --- a/src/Squidex/WebStartup.cs +++ b/src/Squidex/WebStartup.cs @@ -5,9 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System; using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Squidex.Areas.Api; diff --git a/src/Squidex/app/features/rules/declarations.ts b/src/Squidex/app/features/rules/declarations.ts index 8c9a3da63..d3e0a1722 100644 --- a/src/Squidex/app/features/rules/declarations.ts +++ b/src/Squidex/app/features/rules/declarations.ts @@ -9,6 +9,7 @@ export * from './pages/rules/actions/algolia-action.component'; export * from './pages/rules/actions/azure-queue-action.component'; export * from './pages/rules/actions/elastic-search-action.component'; export * from './pages/rules/actions/fastly-action.component'; +export * from './pages/rules/actions/medium-action.component'; export * from './pages/rules/actions/slack-action.component'; export * from './pages/rules/actions/webhook-action.component'; export * from './pages/rules/triggers/asset-changed-trigger.component'; diff --git a/src/Squidex/app/features/rules/module.ts b/src/Squidex/app/features/rules/module.ts index d7ab32982..3111c2490 100644 --- a/src/Squidex/app/features/rules/module.ts +++ b/src/Squidex/app/features/rules/module.ts @@ -21,6 +21,7 @@ import { ContentChangedTriggerComponent, ElasticSearchActionComponent, FastlyActionComponent, + MediumActionComponent, RuleEventBadgeClassPipe, RuleEventsPageComponent, RulesPageComponent, @@ -62,6 +63,7 @@ const routes: Routes = [ ContentChangedTriggerComponent, ElasticSearchActionComponent, FastlyActionComponent, + MediumActionComponent, RuleEventBadgeClassPipe, RuleEventsPageComponent, RulesPageComponent, diff --git a/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.html b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.html new file mode 100644 index 000000000..259dc2785 --- /dev/null +++ b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.html @@ -0,0 +1,112 @@ +

Post to Medium

+ +
+
+ + +
+ + + + + + The self issued access token. Can be created under https://medium.com/me/settings. + +
+
+ +
+ + +
+ + + + + + The name of the author. You can also define the publication. + +
+
+ +
+ + +
+ + + + + + The name of the publication. You can also define the author. + +
+
+ +
+ + +
+ + + + + + The title of the post. Note that this title is used for SEO and when rendering the post as a listing. + +
+
+ +
+ + +
+ + + + + + The body of the post, in a valid, semantic, HTML fragment, or Markdown. + +
+
+ +
+
+
+ + +
+
+
+ +
+ + +
+ + + + + + The original home of this content, if it was originally published elsewhere. + +
+
+ +
+ + +
+ + + + + + Comma-separated list of tags. + +
+
+
\ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.scss b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.scss new file mode 100644 index 000000000..756609665 --- /dev/null +++ b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.scss @@ -0,0 +1,6 @@ +@import '_vars'; +@import '_mixins'; + +textarea { + height: 150px; +} \ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.ts b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.ts new file mode 100644 index 000000000..afb7c26e4 --- /dev/null +++ b/src/Squidex/app/features/rules/pages/rules/actions/medium-action.component.ts @@ -0,0 +1,57 @@ +/* + * Squidex Headless CMS + * + * @license + * Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. + */ + +import { Component, Input, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; + +@Component({ + selector: 'sqx-medium-action', + styleUrls: ['./medium-action.component.scss'], + templateUrl: './medium-action.component.html' +}) +export class MediumActionComponent implements OnInit { + @Input() + public action: any; + + @Input() + public actionForm: FormGroup; + + @Input() + public actionFormSubmitted = false; + + public ngOnInit() { + this.actionForm.setControl('accessToken', + new FormControl(this.action.accessToken || '', [ + Validators.required + ])); + + this.actionForm.setControl('title', + new FormControl(this.action.title || '', [ + Validators.required + ])); + + this.actionForm.setControl('content', + new FormControl(this.action.content || '', [ + Validators.required + ])); + + this.actionForm.setControl('author', + new FormControl(this.action.author || '')); + + this.actionForm.setControl('publication', + new FormControl(this.action.publication || '')); + + this.actionForm.setControl('canonicalUrl', + new FormControl(this.action.canonicalUrl || '')); + + this.actionForm.setControl('tags', + new FormControl(this.action.tags || '')); + + this.actionForm.setControl('isHtml', + new FormControl(this.action.isHtml || false)); + } +} \ No newline at end of file diff --git a/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.html b/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.html index f15755dc0..52d82aa3e 100644 --- a/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.html +++ b/src/Squidex/app/features/rules/pages/rules/rule-wizard.component.html @@ -96,6 +96,13 @@ [actionFormSubmitted]="actionForm.submitted | async"> + + + +
-

Font Name: icomoon (Glyphs: 92)

+

Font Name: icomoon (Glyphs: 93)

-

Grid Size: 14

+

Grid Size: Unknown

- + - icon-single-content + icon-action-Medium
- - + +
liga: @@ -31,14 +31,14 @@
- + - icon-multiple-content + icon-circle
- - + +
liga: @@ -47,14 +47,14 @@
- + - icon-type-Array + icon-action-Fastly
- - + +
liga: @@ -63,14 +63,14 @@
- + - icon-exclamation + icon-control-Slug
- - + +
liga: @@ -79,14 +79,14 @@
- + - icon-action-ElasticSearch + icon-action-Algolia
- - + +
liga: @@ -95,14 +95,14 @@
- + - icon-action-Slack + icon-type-Tags
- - + +
liga: @@ -111,14 +111,14 @@
- + - icon-orleans + icon-activity
- - + +
liga: @@ -127,14 +127,14 @@
- + - icon-document-lock + icon-history
- - + +
liga: @@ -143,14 +143,14 @@
- + - icon-document-unpublish + icon-time
- - + +
liga: @@ -159,14 +159,14 @@
- + - icon-angle-down + icon-add
- - + +
liga: @@ -175,14 +175,14 @@
- + - icon-angle-left + icon-plus
- - + +
liga: @@ -191,14 +191,14 @@
- + - icon-angle-right + icon-check-circle
- - + +
liga: @@ -207,14 +207,14 @@
- + - icon-angle-up + icon-check-circle-filled
- - + +
liga: @@ -223,14 +223,14 @@
- + - icon-api + icon-close
- - + +
liga: @@ -239,14 +239,14 @@
- + - icon-assets + icon-type-References
- - + +
liga: @@ -255,14 +255,14 @@
- + - icon-bug + icon-control-Checkbox
- - + +
liga: @@ -271,14 +271,14 @@
- + - icon-caret-down + icon-control-Dropdown
- - + +
liga: @@ -287,14 +287,14 @@
- + - icon-caret-left + icon-control-Input
- - + +
liga: @@ -303,14 +303,14 @@
- + - icon-caret-right + icon-control-Radio
- - + +
liga: @@ -319,14 +319,14 @@
- + - icon-caret-up + icon-control-TextArea
- - + +
liga: @@ -335,14 +335,14 @@
- + - icon-contents + icon-control-Toggle
- - + +
liga: @@ -351,14 +351,14 @@
- + - icon-trigger-ContentChanged + icon-copy
- - + +
liga: @@ -367,14 +367,14 @@
- + - icon-control-Date + icon-dashboard
- - + +
liga: @@ -383,14 +383,14 @@
- + - icon-control-DateTime + icon-delete
- - + +
liga: @@ -399,14 +399,14 @@
- + - icon-control-Markdown + icon-bin
- - + +
liga: @@ -415,14 +415,14 @@
- + - icon-grid + icon-delete-filled
- - + +
liga: @@ -431,14 +431,14 @@
- + - icon-list + icon-document-delete
- - + +
liga: @@ -447,14 +447,14 @@
- + - icon-user-o + icon-document-disable
- - + +
liga: @@ -463,14 +463,14 @@
- + - icon-rules + icon-document-publish
- - + +
liga: @@ -479,177 +479,417 @@
- + - icon-action-Webhook + icon-drag
- - + +
liga:
-
-
-

Grid Size: 16

-
+
- + - icon-hour-glass + icon-filter
- - + +
liga:
-
+
- + - icon-spinner + icon-github
- - + +
liga:
-
+
- + - icon-clock + icon-help
- - + +
liga:
-
+
- + - icon-bin2 + icon-location
- - + +
liga:
-
+
- + - icon-earth + icon-control-Map
- - + +
liga: - +
-
+
- + - icon-elapsed + icon-type-Geolocation
- - + +
liga:
-
+
- + - icon-google + icon-logo
- - + +
liga:
-
+
- + - icon-lock + icon-media
- - + +
liga:
-
+
- + - icon-microsoft + icon-type-Assets
- - + + +
+
+ liga: + +
+
+
+
+ + + + icon-trigger-AssetChanged +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-more +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-dots +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-pencil +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-reference +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-schemas +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-search +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-settings +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-type-Boolean +
+
+ +
liga:
+
+
+ + + + icon-type-DateTime +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-type-Json +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-json +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-type-Number +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-type-String +
+
+ + +
+
+ liga: + +
+
+
+
+ + + + icon-user +
+
+ + +
+
+ liga: + +
+
+
+
+

Grid Size: 14

- + - icon-action-AzureQueue + icon-single-content
- - + +
liga: @@ -658,14 +898,14 @@
- + - icon-pause + icon-multiple-content
- - + +
liga: @@ -674,14 +914,14 @@
- + - icon-play + icon-type-Array
- - + +
liga: @@ -690,14 +930,14 @@
- + - icon-reset + icon-exclamation
- - + +
liga: @@ -706,14 +946,14 @@
- + - icon-settings2 + icon-action-ElasticSearch
- - + +
liga: @@ -722,14 +962,14 @@
- + - icon-timeout + icon-action-Slack
- - + +
liga: @@ -738,401 +978,401 @@
- + - icon-unlocked + icon-orleans
- - + +
liga:
-
-
-

Grid Size: Unknown

-
+
- + - icon-circle + icon-document-lock
- - + +
liga:
-
+
- + - icon-action-Fastly + icon-document-unpublish
- - + +
liga:
-
+
- + - icon-control-Slug + icon-angle-down
- - + +
liga:
-
+
- + - icon-action-Algolia + icon-angle-left
- - + +
liga:
-
+
- + - icon-type-Tags + icon-angle-right
- - + +
liga:
-
+
- + - icon-activity + icon-angle-up
- - + +
liga:
-
+
- + - icon-history + icon-api
- - + +
liga:
-
+
- + - icon-time + icon-assets
- - + +
liga:
-
+
- + - icon-add + icon-bug
- - + +
liga:
-
+
- + - icon-plus + icon-caret-down
- - + +
liga:
-
+
- + - icon-check-circle + icon-caret-left
- - + +
liga:
-
+
- + - icon-check-circle-filled + icon-caret-right
- - + +
liga:
-
+
- + - icon-close + icon-caret-up
- - + +
liga:
-
+
- + - icon-type-References + icon-contents
- - + +
liga:
-
+
- + - icon-control-Checkbox + icon-trigger-ContentChanged
- - + +
liga:
-
+
- + - icon-control-Dropdown + icon-control-Date
- - + +
liga:
-
+
- + - icon-control-Input + icon-control-DateTime
- - + +
liga:
-
+
- + - icon-control-Radio + icon-control-Markdown
- - + +
liga:
-
+
- + - icon-control-TextArea + icon-grid
- - + +
liga:
-
+
- + - icon-control-Toggle + icon-list
- - + +
liga:
-
+
- + - icon-copy + icon-user-o
- - + +
liga:
-
+
- + - icon-dashboard + icon-rules
- - + +
liga:
-
+
- + - icon-delete + icon-action-Webhook
- - + +
liga:
+
+
+

Grid Size: 16

- + - icon-bin + icon-hour-glass
- - + +
liga: @@ -1141,14 +1381,14 @@
- + - icon-delete-filled + icon-spinner
- - + +
liga: @@ -1157,14 +1397,14 @@
- + - icon-document-delete + icon-clock
- - + +
liga: @@ -1173,14 +1413,14 @@
- + - icon-document-disable + icon-bin2
- - + +
liga: @@ -1189,30 +1429,30 @@
- + - icon-document-publish + icon-earth
- - + +
liga: - +
- + - icon-drag + icon-elapsed
- - + +
liga: @@ -1221,14 +1461,14 @@
- + - icon-filter + icon-google
- - + +
liga: @@ -1237,14 +1477,14 @@
- + - icon-github + icon-lock
- - + +
liga: @@ -1253,14 +1493,14 @@
- + - icon-help + icon-microsoft
- - + +
liga: @@ -1269,14 +1509,14 @@
- + - icon-location + icon-action-AzureQueue
- - + +
liga: @@ -1285,14 +1525,14 @@
- + - icon-control-Map + icon-pause
- - + +
liga: @@ -1301,14 +1541,14 @@
- + - icon-type-Geolocation + icon-play
- - + +
liga: @@ -1317,14 +1557,14 @@
-
- - + +
liga: @@ -1333,14 +1573,14 @@
- + - icon-media + icon-settings2
- - + +
liga: @@ -1349,14 +1589,14 @@
- + - icon-type-Assets + icon-timeout
- - + +
liga: @@ -1365,14 +1605,14 @@
- + - icon-trigger-AssetChanged + icon-unlocked
- - + +
liga: @@ -1381,14 +1621,14 @@
- + - icon-more + icon-control-TextArea
- - + +
liga: @@ -1397,14 +1637,14 @@
- + - icon-dots + icon-control-Toggle
- - + +
liga: @@ -1413,14 +1653,14 @@
- + - icon-pencil + icon-copy
- - + +
liga: @@ -1429,14 +1669,14 @@
- + - icon-reference + icon-dashboard
- - + +
liga: @@ -1445,14 +1685,14 @@
- + - icon-schemas + icon-delete
- - + +
liga: @@ -1461,14 +1701,14 @@
- + - icon-search + icon-bin
- - + +
liga: @@ -1477,14 +1717,14 @@
- + - icon-settings + icon-delete-filled
- - + +
liga: @@ -1493,14 +1733,14 @@
- + - icon-type-Boolean + icon-document-delete
- - + +
liga: @@ -1509,14 +1749,14 @@
- + - icon-type-DateTime + icon-document-disable
- - + +
liga: @@ -1525,14 +1765,14 @@
- + - icon-type-Json + icon-document-publish
- - + +
liga: @@ -1541,14 +1781,14 @@
- + - icon-json + icon-drag
- - + +
liga: @@ -1557,14 +1797,14 @@
- + - icon-type-Number + icon-filter
- - + +
liga: @@ -1573,14 +1813,14 @@
- + - icon-type-String + icon-github
- - + +
liga: @@ -1589,14 +1829,14 @@
- + - icon-user + icon-help
- - + +
liga: diff --git a/src/Squidex/app/theme/icomoon/fonts/icomoon.eot b/src/Squidex/app/theme/icomoon/fonts/icomoon.eot index 9e1dac2c57499fbe72b8b1632ff2cfe9062bfb1b..736a4d35ba68852ae352c2924ab2b8b1a69a84f8 100644 GIT binary patch delta 410 zcmdmRi1El_Mz$k~3=9g16WPpIJfGi-p6F06xRZf_VGj@|BTPGDe&R>??BOc9nAQDtC=*#cB&mH`ytWMWMM^4|dYDjB&Y6=_RF^cWao1%P^5 za`KZCm5x}%FfhbT0m>iAO{^$js9=m@V2FjXVB_Fqy!dyA0F%eR zN*)Q$CLy6FP6-~yqnm3YLzrcv?>+a7=ePOFz|8{k0K@gT^h+>$@|zfQ#>CAku{Dg7 b=foZ1(|)5fN!L$z5(CI9iJSA{4>1A&gwboR delta 279 zcmX?dm~q1)MmB>)28N!5iEL&p2RENin&?n2xPyU#VGj@|Bib;`nH1n;t~dCkkW)4 zkURr3Gvm?8DU98W5tBbKDzi=&2;rZ$S%N7wd^2xUFtbe3>CFe@`E9;3aI=6kFsSej+ZW*t`|_25r`8QBN)U$DjAq2Z%h>4ET6EH5dd$X BOk4l} diff --git a/src/Squidex/app/theme/icomoon/fonts/icomoon.svg b/src/Squidex/app/theme/icomoon/fonts/icomoon.svg index e5f1e9156..39bfadaac 100644 --- a/src/Squidex/app/theme/icomoon/fonts/icomoon.svg +++ b/src/Squidex/app/theme/icomoon/fonts/icomoon.svg @@ -96,6 +96,7 @@ + diff --git a/src/Squidex/app/theme/icomoon/fonts/icomoon.ttf b/src/Squidex/app/theme/icomoon/fonts/icomoon.ttf index 0f69edbfc429a92253c31c63d373b37cea1dfff7..5a9fd93a9d831d4a8b379b101e180cd2f47df90d 100644 GIT binary patch delta 434 zcmeA<$hhDTV?6^S0|Ns$LjwadgMojrz7f9=?@pk|9w1Ig&P^=1ZF1`|0|TQBke`#D zSX=<41%UhxAkC4UQ<>&I{o-37e*yzTv`R*5Vv4Y|h$;g^%od=$Sq4ymlZiD6$bSRm zt7PPsRHQ8x(PLnU1)0&3lb`IEsC2|4hJhh&3Q)n3+{B6kh6=_g28Q?uAYUObF*kLl z7w2yvzXGVCtsuX+1n5v8NCXiI49v{OCLZW!jGXMlsLVP=Ae4Xl<`Tx#@OqG^G+7v! z!x*#~7=+E#^chVRr5P1P+4&g71=+;p8ATOM&FvUX1(}r@k@)I@m5glc35=RgPccdd zv9dBUva$yJ%MW5>dM5wxD-#Dt&cE|H9PCU?8##s8iUt31GJY5IW8q={dw`vX#ZO2m zfQ^Hb@#5bd0!$wNDtRP0n}md#I3;)(k8ZvZ5yC7JeebzvJipCX25uIR^BJzkrC);4 mlRaY0851`*#MCfO{tk%qTVD#i0G3Ja3n+0NP7$;ANJHV&orOT%41(XE^N5bZ~_(O~U D*quqM diff --git a/src/Squidex/app/theme/icomoon/fonts/icomoon.woff b/src/Squidex/app/theme/icomoon/fonts/icomoon.woff index 29c443eeb91db9691b96965c9b834b50aaa4af6b..b48a3d432c86765abc68ebdcdf213eba19d4597f 100644 GIT binary patch delta 490 zcmca{knznSMv-!VH#Y`G1|UexVc-VS3X=~eh)>iOso$BLn^?fWz?cCP&H>@uCbu4^ zCl-Umt^oNQP%Mz1Q<(-7yTiZ`tpdXC(=WcwNKH&(V2A}OVK4(>VQCT744@!T%mT;< zs$)>$WMWOq$StV=ip2o+w}5ckQW3qJ{A8dyzqkiLMMpqb>4-&4Zej({;`k*%z5*Cm zFh=Di=B5J0fNB`qKzODX=kJ32;u4^5eBkPsfh=a`W0QFpyBQ-V&tOz$ogxs*KYjB7 z#?U?7?{Htv>6zL&D8W6O%VlPw zZ0re)nomzLN(ZsBGBUEV2K>tpVq9{(zNBsiOdgqk=dco>gvR*4K@mWjUi+%ulv<|_j? z3($QG4AdT|eDP;8;v#j9?H0YheP$qVQ(p H_@#^hHve-n delta 331 zcmaEJi1EfjMv-!VH#Y`G1|Ued!N3isdnN}aN=(!duHTWIn^?fWz?cCP&H>@u#doO~zl0H2PRE}O0w PP!<$u37c2NA7TUmMI2Hq diff --git a/src/Squidex/app/theme/icomoon/selection.json b/src/Squidex/app/theme/icomoon/selection.json index 0ea70b229..c8e61e4fc 100644 --- a/src/Squidex/app/theme/icomoon/selection.json +++ b/src/Squidex/app/theme/icomoon/selection.json @@ -4,1405 +4,1283 @@ { "icon": { "paths": [ - "M251.429 100.58c-87.896 0-160 72.104-160 160v525.714c0 87.896 72.104 160 160 160h525.714c87.896 0 160-72.104 160-160v-525.714c0-87.896-72.104-160-160-160zM251.429 146.295h525.714c62.961 0 114.286 51.325 114.286 114.286v525.714c0 62.961-51.325 114.286-114.286 114.286h-525.714c-62.961 0-114.286-51.325-114.286-114.286v-525.714c0-62.961 51.325-114.286 114.286-114.286z", - "M251.429 306.295c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h525.714c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z", - "M251.429 443.438c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z", - "M251.429 580.58c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z" + "M121.429 271.36c1.28-12.587-3.541-25.003-12.928-33.451l-95.573-115.2v-17.195h296.832l229.461 503.253 201.728-503.253h283.051v17.195l-81.792 78.379c-7.040 5.376-10.539 14.208-9.088 22.955v576c-1.451 8.704 2.048 17.493 9.088 22.912l79.787 78.379v17.195h-401.493v-17.195l82.645-80.299c8.107-8.107 8.107-10.496 8.107-22.955v-465.536l-229.973 584.021h-31.019l-267.733-584.021v391.424c-2.219 16.469 3.243 33.024 14.805 44.928l107.52 130.56v17.152h-304.853v-17.195l107.52-130.56c11.52-11.861 16.64-28.587 13.909-44.885v-452.608z" ], "attrs": [ - {}, - {}, - {}, {} ], - "width": 1029, "isMulticolor": false, "isMulticolor2": false, - "grid": 14, "tags": [ - "single-content" - ] + "medium" + ], + "grid": 0 }, "attrs": [ - {}, - {}, - {}, {} ], "properties": { - "order": 112, - "id": 214, - "name": "single-content", - "prevSize": 28, - "code": 59736 + "order": 1, + "id": 0, + "prevSize": 32, + "code": 59737, + "name": "action-Medium" }, "setIdx": 0, - "setId": 1, + "setId": 2, "iconIdx": 0 }, { "icon": { "paths": [ - "M777.143 946.286h-525.714c-89.143 0-160-70.857-160-160v-297.143c0-89.143 70.857-160 160-160h525.714c89.143 0 160 70.857 160 160v297.143c0 89.143-70.857 160-160 160zM251.429 374.857c-64 0-114.286 50.286-114.286 114.286v297.143c0 64 50.286 114.286 114.286 114.286h525.714c64 0 114.286-50.286 114.286-114.286v-297.143c0-64-50.286-114.286-114.286-114.286h-525.714z", - "M731.429 580.571h-457.143c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h457.143c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", - "M502.857 740.571h-228.571c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h228.571c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", - "M777.143 260.571h-525.714c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h525.714c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", - "M685.714 146.286h-342.857c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h342.857c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z" + "M1024 512c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512z" ], "attrs": [ - {}, - {}, - {}, - {}, {} ], - "width": 1029, "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "multiple-content" + "circle" ] }, "attrs": [ - {}, - {}, - {}, - {}, {} ], "properties": { - "order": 113, - "id": 213, - "name": "multiple-content", - "prevSize": 28, - "code": 59735 + "order": 106, + "id": 0, + "name": "circle", + "prevSize": 32, + "code": 59729 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 1 + "iconIdx": 44 }, { "icon": { "paths": [ - "M832 268.8h-657.92c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h657.92c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", - "M832 453.12h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", - "M832 642.56h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", - "M832 832h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z" + "M341.758 30.332v55.545h25.806v83.195c-193.056 37.236-336.992 205.942-337.132 408.544l-0 0.016c-0 229.687 184.814 415.885 412.793 415.885l-0-0c227.979 0 412.793-186.198 412.793-415.885l-0 0c-0.125-202.629-144.065-371.351-334.545-408.173l-2.587-0.416v-83.165h25.809v-55.545h-202.936zM454.729 369.689c102.973 5.539 185.923 86.823 194.885 189.491v6.763h-23.479v23.589h23.485v6.447c-8.918 102.72-91.882 184.055-194.891 189.594v-23.144h-23.444v23.078c-104.989-6.154-188.976-91.042-194.458-196.868h23.297v-23.589h-23.172c6.225-105.086 89.86-189.163 194.333-195.295v23.195h23.444v-23.261zM535.132 467.312l-78.775 73.035c-3.893-1.564-8.405-2.478-13.126-2.494l-0.006-0c-20.265 0-36.693 16.551-36.693 36.967l-0 0c0 20.417 16.428 36.967 36.693 36.967h-0c20.265 0 36.693-16.551 36.693-36.967l0-0c-0.010-3.753-0.574-7.37-1.613-10.776l0.069 0.262 71.128-80.156-14.369-16.838z" ], "attrs": [ - {}, - {}, - {}, {} ], + "width": 886, "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "type-Array" + "action-Fastly" ] }, "attrs": [ - {}, - {}, - {}, {} ], "properties": { - "order": 108, - "id": 211, - "name": "type-Array", - "prevSize": 28, - "code": 59734 + "order": 102, + "id": 1, + "name": "action-Fastly", + "prevSize": 32, + "code": 59726 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 3 + "iconIdx": 45 }, { "icon": { "paths": [ - "M292.571 713.143v128c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-128c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571zM309.714 109.714l-16 438.857c-0.571 20-17.714 36.571-37.714 36.571h-146.286c-20 0-37.143-16.571-37.714-36.571l-16-438.857c-0.571-20 15.429-36.571 35.429-36.571h182.857c20 0 36 16.571 35.429 36.571z" + "M512 0c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h128v870.4h-128c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h307.2c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-128v-870.4h128c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.16 0-51.2 23.040-51.2 51.2v460.8c0 28.16 23.040 51.2 51.2 51.2h537.6v-51.2h-512c-15.36 0-25.6-10.24-25.6-25.6v-409.6c0-15.36 10.24-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c15.36 0 25.6 10.24 25.6 25.6v409.6c0 15.36-10.24 25.6-25.6 25.6h-204.8v51.2h230.4c28.16 0 51.2-23.040 51.2-51.2v-460.8c0-28.16-23.040-51.2-51.2-51.2h-230.4z", + "M386.56 606.72c0 12.8-7.68 23.040-20.48 25.6-28.16 10.24-58.88 15.36-92.16 15.36-35.84 0-66.56-10.24-84.48-25.6s-25.6-38.4-25.6-66.56 10.24-51.2 25.6-66.56c17.92-17.92 46.080-23.040 84.48-23.040h69.12v-38.4c0-35.84-25.6-53.76-64-53.76-23.040 0-46.080 7.68-69.12 20.48-2.56 2.56-5.12 2.56-10.24 2.56-10.24 0-20.48-7.68-20.48-20.48 0-7.68 2.56-12.8 10.24-17.92 30.72-20.48 61.44-25.6 92.16-25.6 56.32 0 104.96 30.72 104.96 92.16v181.76zM345.6 501.76h-69.12c-61.44 0-69.12 28.16-69.12 53.76s7.68 56.32 69.12 56.32c23.040 0 46.080-2.56 69.12-10.24v-99.84z" ], "attrs": [ + {}, {} ], - "width": 366, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "exclamation" - ], - "grid": 14 + "control-Slug" + ] }, "attrs": [ + {}, {} ], "properties": { - "order": 1, + "order": 103, "id": 0, - "prevSize": 28, - "code": 59733, - "name": "exclamation" + "name": "control-Slug", + "prevSize": 32, + "code": 59727 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 4 + "iconIdx": 46 }, { "icon": { "paths": [ - "M491.055 637.673h-338.784c-12.301-39.564-19.283-81.787-19.283-125.673s6.649-86.109 19.283-125.673h557.548c69.153 0 125.008 56.519 125.008 126.005 0 69.153-55.855 125.34-125.008 125.34h-218.764zM475.096 679.564h-306.868c32.582 74.473 86.442 137.974 153.6 182.192v0c66.161 43.553 145.288 69.153 230.4 69.153 145.288 0 273.288-74.14 348.426-186.514-38.566-39.896-92.758-64.831-152.603-64.831h-272.956zM748.052 344.436c59.844 0 114.036-24.935 152.603-64.831-75.138-112.374-203.138-186.514-348.758-186.514-85.112 0-164.239 25.6-230.4 69.153v0c-67.158 44.551-121.018 107.719-153.6 182.192h580.156z" + "M512 26.947c-267.728 0-485.053 217.059-485.053 485.053s217.069 485.053 485.053 485.053c267.983 0 485.053-217.314 485.053-485.308s-217.069-484.797-485.053-484.797zM512 853.496c-188.747 0-341.745-152.988-341.745-341.752 0-188.745 152.998-341.733 341.745-341.733 188.765 0 341.745 152.988 341.745 341.733 0 188.763-152.98 341.752-341.745 341.752zM512 240.522v254.585c0 7.443 7.957 12.405 14.654 8.939l225.774-117.231c5.042-2.659 6.844-8.986 3.96-13.901-46.936-82.204-133.855-138.576-234.205-142.298z" ], "attrs": [ {} ], - "width": 1071, "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "logo-elastic-elasticsearch-dk" + "algolia-mark-white" ] }, "attrs": [ {} ], "properties": { - "order": 107, - "id": 210, - "name": "action-ElasticSearch", - "prevSize": 28, - "code": 59730 + "order": 101, + "id": 1, + "name": "action-Algolia", + "prevSize": 32, + "code": 59724 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 5 + "iconIdx": 47 }, { "icon": { "paths": [ - "M868 443.429c46.857 0 82.857 34.286 82.857 81.143 0 36.571-18.857 62.286-53.143 74.286l-98.286 33.714 32 95.429c2.857 8.571 4 17.714 4 26.857 0 45.143-36.571 82.857-81.714 82.857-36 0-68-22.286-79.429-56.571l-31.429-94.286-177.143 60.571 31.429 93.714c2.857 8.571 4.571 17.714 4.571 26.857 0 44.571-36.571 82.857-82.286 82.857-36 0-67.429-22.286-78.857-56.571l-31.429-93.143-87.429 30.286c-9.143 2.857-18.857 5.143-28.571 5.143-46.286 0-81.143-34.286-81.143-80.571 0-35.429 22.857-67.429 56.571-78.857l89.143-30.286-60-178.857-89.143 30.857c-9.143 2.857-18.286 4.571-27.429 4.571-45.714 0-81.143-34.857-81.143-80.571 0-35.429 22.857-67.429 56.571-78.857l89.714-30.286-30.286-90.857c-2.857-8.571-4.571-17.714-4.571-26.857 0-45.143 36.571-82.857 82.286-82.857 36 0 67.429 22.286 78.857 56.571l30.857 91.429 177.143-60-30.857-91.429c-2.857-8.571-4.571-17.714-4.571-26.857 0-45.143 37.143-82.857 82.286-82.857 36 0 68 22.857 79.429 56.571l30.286 92 92.571-31.429c8-2.286 16-3.429 24.571-3.429 44.571 0 82.857 33.143 82.857 78.857 0 35.429-27.429 65.143-59.429 76l-89.714 30.857 60 180.571 93.714-32c8.571-2.857 17.714-4.571 26.286-4.571zM414.286 593.143l177.143-60-60-180-177.143 61.143z" + "M295.954 822.751h-94.705c-47.353 0-88.786-41.434-88.786-88.786v-491.283c0-47.353 41.434-88.786 88.786-88.786h94.705v-59.191h-94.705c-82.867 0-147.977 65.11-147.977 147.977v491.283c0 82.867 65.11 147.977 147.977 147.977h94.705v-59.191z", + "M970.728 473.526c-82.867-171.653-201.249-378.821-272.277-378.821h-112.462v59.191h112.462c35.514 11.838 136.139 177.572 213.087 337.387-76.948 153.896-177.572 325.549-213.087 337.387h-112.462v59.191h112.462c71.029 0 183.491-207.168 272.277-384.74l5.919-11.838-5.919-17.757z", + "M266.358 337.341v260.462h59.191v-260.462z", + "M479.422 337.341v260.462h59.191v-260.462z" ], "attrs": [ + {}, + {}, + {}, {} ], - "width": 951, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "slack" - ], - "grid": 14 + "Tags" + ] }, "attrs": [ + {}, + {}, + {}, {} ], "properties": { - "order": 1, + "order": 98, "id": 0, - "prevSize": 28, - "code": 59725, - "name": "action-Slack" + "name": "type-Tags", + "prevSize": 32, + "code": 59722 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 6 + "iconIdx": 48 }, { "icon": { "paths": [ - "M512 26.38l-424.96 242.8v485.64l424.96 242.8 424.96-242.8v-485.64l-424.96-242.8zM512 235.52l245.76 138.24v276.48l-245.76 138.24-245.76-138.24v-276.48l245.76-138.24z" + "M512 102.4c-200.4 0-366.954 144.072-402.4 334.2-0.031 0.165-0.069 0.335-0.1 0.5-2.974 16.061-4.76 32.441-5.8 49.1-0.017 0.271-0.084 0.529-0.1 0.8 0.019 0.004 0.080-0.004 0.1 0-0.503 8.31-1.3 16.564-1.3 25 0 226.202 183.398 409.6 409.6 409.6 208.165 0 379.707-155.44 405.8-356.5 0.004-0.033-0.004-0.067 0-0.1 1.94-14.978 3.124-30.16 3.4-45.6 0.044-2.487 0.4-4.903 0.4-7.4 0-226.202-183.398-409.6-409.6-409.6zM512 153.6c185.461 0 337.902 140.924 356.4 321.5-35.181-21.812-84.232-39.9-151.6-39.9-85.35 0-140.891 41.606-194.6 81.9-49.152 36.864-95.55 71.7-163.8 71.7-86.067 0-135.862-54.67-175.9-98.6-9.001-9.901-17.11-17.483-25.4-25.3 23.131-175.603 172.981-311.3 354.9-311.3zM716.8 486.4c77.828 0 125.173 28.221 152.2 52.8-13.96 185.173-168.254 331.2-357 331.2-190.097 0-345.175-148.14-357.2-335.2 41.826 45.372 102.577 104.8 203.6 104.8 85.35 0 140.891-41.606 194.6-81.9 49.152-36.915 95.55-71.7 163.8-71.7z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "orleans" + "activity" ] }, "attrs": [ {} ], "properties": { - "order": 99, - "id": 209, - "name": "orleans", - "prevSize": 28, - "code": 59723 + "order": 12, + "id": 36, + "name": "activity, history, time", + "prevSize": 32, + "code": 59652 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 7 + "iconIdx": 49 }, { "icon": { "paths": [ - "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v204.8h51.2v-204.8h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-307.2v51.2h307.2c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4z", - "M153.6 640v281.6h358.4v-281.6zM179.2 640v-76.8c0-84.48 69.12-153.6 153.6-153.6s153.6 69.12 153.6 153.6v76.8h-51.2v-76.8c0-56.32-46.080-102.4-102.4-102.4s-102.4 46.080-102.4 102.4v76.8z" + "M512 0c-35.392 0-64 28.608-64 64v384h-384c-35.392 0-64 28.608-64 64s28.608 64 64 64h384v384c0 35.392 28.608 64 64 64s64-28.608 64-64v-384h384c35.392 0 64-28.608 64-64s-28.608-64-64-64h-384v-384c0-35.392-28.608-64-64-64z" ], "attrs": [ - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "document-lock" + "add" ] }, "attrs": [ - {}, {} ], "properties": { - "order": 97, - "id": 208, - "name": "document-lock", - "prevSize": 28, - "code": 59721 + "order": 13, + "id": 35, + "name": "add, plus", + "prevSize": 32, + "code": 59653 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 8 + "iconIdx": 50 }, { "icon": { "paths": [ - "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v153.6h51.2v-153.6h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7z", - "M102.4 357.532h460.8v52.068h-460.8v-52.068z" + "M512 102.4c-226.202 0-409.6 183.398-409.6 409.6s183.398 409.6 409.6 409.6c226.202 0 409.6-183.398 409.6-409.6s-183.398-409.6-409.6-409.6zM512 153.6c197.632 0 358.4 160.819 358.4 358.4s-160.768 358.4-358.4 358.4c-197.632 0-358.4-160.819-358.4-358.4s160.768-358.4 358.4-358.4zM691.9 333c-12.893 0.002-25.782 4.882-35.5 14.6l-222.2 221.9-67.7-67.5c-19.19-19.294-51.085-19.215-70.3 0-19.15 19.15-19.15 51.050 0 70.2 0.198 0.2 26.198 26.681 52 53 12.95 13.209 25.761 26.372 35.2 36 4.719 4.814 8.607 8.755 11.2 11.4 1.296 1.322 2.293 2.281 2.9 2.9 0.279 0.282 0.488 0.486 0.6 0.6 0.001 0.001 7.591-7.429 14.6-14.3l-14.5 14.4 0.2 0.2v0.1c19.43 19.327 51.57 19.327 71 0v-0.1l258.1-257.6c19.546-19.447 19.521-51.885-0.1-71.3-9.731-9.679-22.607-14.502-35.5-14.5z" ], "attrs": [ - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "document-unpublish" + "check-circle" ] }, "attrs": [ - {}, {} ], "properties": { - "order": 96, - "id": 207, - "name": "document-unpublish", - "prevSize": 28, - "code": 59711 + "order": 14, + "id": 34, + "name": "check-circle", + "prevSize": 32, + "code": 59654 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 9 + "iconIdx": 51 }, { "icon": { "paths": [ - "M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z" + "M512 1024c-282.778 0-512-229.222-512-512s229.222-512 512-512 512 229.222 512 512-229.222 512-512 512zM855.808 270.592c-19.2-19.2-50.278-19.2-69.478 0l-376.73 376.73-171.878-171.93c-19.2-19.2-50.278-19.2-69.478 0s-19.2 50.278 0 69.478c0 0 201.523 205.261 204.8 208.486 9.984 10.138 23.347 14.643 36.557 14.080 13.21 0.563 26.573-3.942 36.608-14.029 3.277-3.226 409.6-413.286 409.6-413.286 19.2-19.2 19.2-50.33 0-69.53z" ], "attrs": [ {} ], - "width": 658, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "angle-down" - ], - "grid": 14 + "check-circle-filled" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 1, - "prevSize": 28, - "code": 59648, - "name": "angle-down" + "order": 27, + "id": 33, + "name": "check-circle-filled", + "prevSize": 32, + "code": 59655 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 10 + "iconIdx": 52 }, { "icon": { "paths": [ - "M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z" + "M601.024 512l276.736 276.736c24.512 24.576 24.512 64.384 0 89.024-24.64 24.576-64.384 24.576-89.024 0l-276.736-276.736-276.736 276.736c-24.512 24.576-64.384 24.576-89.024 0-24.512-24.64-24.512-64.448 0-89.024l276.736-276.736-276.736-276.736c-24.512-24.576-24.512-64.384 0-89.024 24.64-24.576 64.512-24.576 89.024 0l276.736 276.736 276.736-276.736c24.64-24.576 64.384-24.576 89.024 0 24.512 24.64 24.512 64.448 0 89.024l-276.736 276.736z" ], "attrs": [ {} ], - "width": 384, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "angle-left" - ], - "grid": 14 + "close" + ] }, "attrs": [ {} ], "properties": { - "order": 2, - "id": 0, - "prevSize": 28, - "code": 59649, - "name": "angle-left" + "order": 28, + "id": 32, + "name": "close", + "prevSize": 32, + "code": 59656 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 11 + "iconIdx": 53 }, { "icon": { "paths": [ - "M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z" + "M409.6 435.2h-153.6v51.2h153.6v-51.2zM409.6 332.8h-153.6v51.2h153.6v-51.2zM256 691.2h409.6v-51.2h-409.6v51.2zM409.6 230.4h-153.6v51.2h153.6v-51.2zM870.4 179.2h-51.2v-51.2c0-28.262-22.938-51.2-51.2-51.2h-614.4c-28.262 0-51.2 22.938-51.2 51.2v665.6c0 28.262 22.938 51.2 51.2 51.2h51.2v51.2c0 28.262 22.938 51.2 51.2 51.2h614.4c28.262 0 51.2-22.938 51.2-51.2v-665.6c0-28.262-22.938-51.2-51.2-51.2zM179.2 793.6c-14.157 0-25.6-11.443-25.6-25.6v-614.4c0-14.131 11.443-25.6 25.6-25.6h563.2c14.157 0 25.6 11.469 25.6 25.6v614.4c0 14.157-11.443 25.6-25.6 25.6h-563.2zM870.4 870.4c0 14.157-11.443 25.6-25.6 25.6h-563.2c-14.157 0-25.6-11.443-25.6-25.6v-25.6h512c28.262 0 51.2-22.938 51.2-51.2v-563.2h25.6c14.157 0 25.6 11.469 25.6 25.6v614.4zM614.4 230.4h-102.4c-28.262 0-51.2 22.938-51.2 51.2v153.6c0 28.262 22.938 51.2 51.2 51.2h102.4c28.262 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.938-51.2-51.2-51.2zM614.4 435.2h-102.4v-153.6h102.4v153.6zM256 588.8h409.6v-51.2h-409.6v51.2z" ], "attrs": [ {} ], - "width": 347, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "angle-right" - ], - "grid": 14 + "content" + ] }, "attrs": [ {} ], "properties": { - "order": 67, - "id": 0, - "prevSize": 28, - "code": 59697, - "name": "angle-right" + "order": 37, + "id": 31, + "name": "type-References", + "prevSize": 32, + "code": 59657 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 12 + "iconIdx": 54 }, { "icon": { "paths": [ - "M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z" + "M793.6 844.8c0 14.157-11.443 25.6-25.6 25.6h-665.6c-14.131 0-25.6-11.443-25.6-25.6v-665.6c0-14.157 11.469-25.6 25.6-25.6h665.6c14.157 0 25.6 11.443 25.6 25.6v102.4h51.2v-128c0-28.262-22.938-51.2-51.2-51.2h-716.8c-28.262 0-51.2 22.938-51.2 51.2v716.8c0 28.262 22.938 51.2 51.2 51.2h716.8c28.262 0 51.2-22.938 51.2-51.2v-281.6h-51.2v256zM991.078 237.747c-9.958-9.958-26.035-9.958-35.968 0l-391.91 391.91-238.31-238.31c-9.958-9.958-26.061-9.958-35.942 0-9.958 9.907-9.958 26.010 0 35.942l254.874 254.874c0.461 0.538 0.614 1.203 1.126 1.69 5.043 5.018 11.674 7.475 18.278 7.373 6.605 0.102 13.235-2.355 18.278-7.373 0.512-0.512 0.666-1.178 1.126-1.69l408.448-408.474c9.933-9.933 9.933-26.035 0-35.942z" ], "attrs": [ {} ], - "width": 658, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "angle-up" - ], - "grid": 14 + "control-checkbox" + ] }, "attrs": [ {} ], "properties": { - "order": 2, - "id": 2, - "prevSize": 28, - "code": 59651, - "name": "angle-up" + "order": 38, + "id": 30, + "name": "control-Checkbox", + "prevSize": 32, + "code": 59658 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 13 + "iconIdx": 55 }, { "icon": { "paths": [ - "M592 393.6h-156.8c-57.6 0-105.6-48-105.6-105.6v-182.4c0-57.6 48-105.6 105.6-105.6h156.8c57.6 0 105.6 48 105.6 105.6v182.4c-3.2 57.6-48 105.6-105.6 105.6zM432 64c-22.4 0-41.6 19.2-41.6 41.6v182.4c0 22.4 19.2 41.6 41.6 41.6h156.8c22.4 0 41.6-19.2 41.6-41.6v-182.4c0-22.4-19.2-41.6-41.6-41.6h-156.8z", - "M195.2 1024c-105.6 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c3.2 105.6-86.4 195.2-195.2 195.2zM195.2 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 134.4 131.2 134.4 73.6 0 131.2-60.8 131.2-131.2 3.2-73.6-57.6-134.4-131.2-134.4z", - "M828.8 1024c-108.8 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c0 105.6-89.6 195.2-195.2 195.2zM828.8 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 131.2 131.2 131.2 73.6 0 131.2-60.8 131.2-131.2s-60.8-131.2-131.2-131.2z", - "M332.8 640c-6.4 0-12.8 0-16-3.2-16-9.6-19.2-28.8-9.6-44.8l83.2-137.6c9.6-16 28.8-19.2 44.8-9.6s19.2 28.8 9.6 44.8l-83.2 137.6c-6.4 6.4-16 12.8-28.8 12.8z", - "M691.2 640c-9.6 0-22.4-6.4-28.8-16l-83.2-137.6c-9.6-16-3.2-35.2 9.6-44.8s35.2-3.2 44.8 9.6l83.2 137.6c9.6 16 3.2 35.2-9.6 44.8-6.4 6.4-12.8 6.4-16 6.4z" + "M51.2 0c-28.262 0-51.2 22.938-51.2 51.2v281.6c0 28.262 22.938 51.2 51.2 51.2h921.6c28.262 0 51.2-22.938 51.2-51.2v-281.6c0-28.262-22.938-51.2-51.2-51.2h-921.6zM76.8 51.2h512v281.6h-512c-14.157 0-25.6-11.443-25.6-25.6v-230.4c0-14.157 11.443-25.6 25.6-25.6zM640 51.2h307.2c14.157 0 25.6 11.443 25.6 25.6v230.4c0 14.157-11.443 25.6-25.6 25.6h-307.2v-281.6zM716.8 153.6c-0.41 0.358 89.139 102.938 89.6 102.4 0.512 0 89.6-95.36 89.6-102.4 0 0.384-172.16 0-179.2 0zM128 435.2c-42.394 0-76.8 34.406-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.406 76.8-76.8s-34.406-76.8-76.8-76.8zM128 486.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 486.4c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 640c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 691.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 691.2c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 844.8c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 896c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 896c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640z" ], "attrs": [ - {}, - {}, - {}, - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "api" + "control-dropdown" ] }, "attrs": [ - {}, - {}, - {}, - {}, {} ], "properties": { - "order": 94, - "id": 206, - "name": "api", - "prevSize": 28, - "code": 59717 + "order": 39, + "id": 29, + "name": "control-Dropdown", + "prevSize": 32, + "code": 59659 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 14 + "iconIdx": 56 }, { "icon": { "paths": [ - "M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z", - "M771.2 860.8h-438.4c-12.8 0-22.4-6.4-28.8-19.2s-3.2-25.6 3.2-35.2l300.8-355.2c6.4-6.4 16-12.8 25.6-12.8s19.2 6.4 25.6 12.8l192 275.2c3.2 3.2 3.2 6.4 3.2 9.6 16 44.8 3.2 73.6-6.4 89.6-22.4 32-70.4 35.2-76.8 35.2zM403.2 796.8h371.2c6.4 0 22.4-3.2 25.6-9.6 3.2-3.2 3.2-12.8 0-25.6l-166.4-236.8-230.4 272z", - "M332.8 502.4c-76.8 0-140.8-64-140.8-140.8s64-140.8 140.8-140.8 140.8 64 140.8 140.8-60.8 140.8-140.8 140.8zM332.8 284.8c-41.6 0-76.8 32-76.8 76.8s35.2 76.8 76.8 76.8 76.8-35.2 76.8-76.8-32-76.8-76.8-76.8z" + "M512 0c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h128v870.4h-128c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h307.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-128v-870.4h128c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.262 0-51.2 22.938-51.2 51.2v460.8c0 28.262 22.938 51.2 51.2 51.2h537.6v-51.2h-512c-14.131 0-25.6-11.443-25.6-25.6v-409.6c0-14.157 11.469-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c14.157 0 25.6 11.443 25.6 25.6v409.6c0 14.157-11.443 25.6-25.6 25.6h-204.8v51.2h230.4c28.262 0 51.2-22.938 51.2-51.2v-460.8c0-28.262-22.938-51.2-51.2-51.2h-230.4zM285.9 307c-0.589 0.051-1.161 0.048-1.75 0.15-8.243 0.051-16.396 4.474-20.85 13.050l-132.55 306.25c-6.656 12.749-2.866 28.981 8.5 36.2 11.341 7.219 25.97 2.749 32.6-10l27.65-63.85h170.5c0.512 0 0.914-0.224 1.4-0.25l27.45 64.050c6.63 12.749 21.136 17.269 32.4 10.050s15.005-23.451 8.4-36.2l-131.3-306.25c-4.454-8.576-12.432-12.973-20.65-13.050-0.614-0.102-1.211-0.099-1.8-0.15zM285.9 389.15l63.65 148.45h-127.9l64.25-148.45z" ], "attrs": [ - {}, - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "assets" + "control-input" ] }, "attrs": [ - {}, - {}, {} ], "properties": { - "order": 95, - "id": 205, - "name": "assets", - "prevSize": 28, - "code": 59720 + "order": 41, + "id": 28, + "name": "control-Input", + "prevSize": 32, + "code": 59660 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 15 + "iconIdx": 57 }, { "icon": { "paths": [ - "M932.571 548.571c0 20-16.571 36.571-36.571 36.571h-128c0 71.429-15.429 125.143-38.286 165.714l118.857 119.429c14.286 14.286 14.286 37.143 0 51.429-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-113.143-112.571s-74.857 68.571-172 68.571v-512h-73.143v512c-103.429 0-178.857-75.429-178.857-75.429l-104.571 118.286c-7.429 8-17.143 12-27.429 12-8.571 0-17.143-2.857-24.571-9.143-14.857-13.714-16-36.571-2.857-52l115.429-129.714c-20-39.429-33.143-90.286-33.143-156.571h-128c-20 0-36.571-16.571-36.571-36.571s16.571-36.571 36.571-36.571h128v-168l-98.857-98.857c-14.286-14.286-14.286-37.143 0-51.429s37.143-14.286 51.429 0l98.857 98.857h482.286l98.857-98.857c14.286-14.286 37.143-14.286 51.429 0s14.286 37.143 0 51.429l-98.857 98.857v168h128c20 0 36.571 16.571 36.571 36.571zM658.286 219.429h-365.714c0-101.143 81.714-182.857 182.857-182.857s182.857 81.714 182.857 182.857z" + "M153.6 716.8c-84.787 0-153.6 68.813-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.813 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 972.8c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM153.6 0c-84.787 0-153.6 68.787-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.787 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 256c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 358.4c-84.787 0-153.6 68.787-153.6 153.6 0 84.787 68.813 153.6 153.6 153.6s153.6-68.813 153.6-153.6c0-84.813-68.813-153.6-153.6-153.6zM153.6 614.4c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 102.4c-28.262 0-51.2 22.938-51.2 51.2s22.938 51.2 51.2 51.2c28.262 0 51.2-22.938 51.2-51.2s-22.938-51.2-51.2-51.2zM998.4 844.8h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z" ], "attrs": [ {} ], - "width": 951, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "bug" - ], - "grid": 14 + "control-radio" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 0, - "prevSize": 28, - "code": 59709, - "name": "bug" + "order": 42, + "id": 27, + "name": "control-Radio", + "prevSize": 32, + "code": 59661 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 16 + "iconIdx": 58 }, { "icon": { "paths": [ - "M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z" + "M0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8h-204.8zM819.2 0v204.8h204.8v-204.8h-204.8zM51.2 51.2h102.4v102.4h-102.4v-102.4zM870.4 51.2h102.4v102.4h-102.4v-102.4zM281.6 76.8v51.2h102.4v-51.2h-102.4zM486.4 76.8v51.2h102.4v-51.2h-102.4zM691.2 76.8v51.2h102.4v-51.2h-102.4zM333.25 204.8c-7.091-0.307-14.348 2.097-19.75 7.55l-74.75 74.75c-10.317 10.291-10.317 27.083 0 37.4s27.059 10.317 37.35 0l68.45-68.5h141.85v486.4h-50.7c-7.117-0.307-14.348 2.097-19.75 7.55l-23.6 23.55c-10.317 10.317-10.317 27.083 0 37.4 10.291 10.317 27.109 10.317 37.4 0l17.25-17.3h129.75l18.050 18c10.394 10.368 27.181 10.368 37.6 0 10.368-10.394 10.368-27.181 0-37.6l-24-24c-5.478-5.478-12.682-7.907-19.85-7.6h-50.95v-486.4h141.55l69.25 69.2c10.394 10.368 27.155 10.368 37.6 0 10.368-10.368 10.368-27.181 0-37.6l-75.2-75.2c-5.478-5.478-12.706-7.907-19.9-7.6h-357.65zM896 281.6v102.4h51.2v-102.4h-51.2zM76.8 384v102.4h51.2v-102.4h-51.2zM896 486.4v102.4h51.2v-102.4h-51.2zM76.8 588.8v102.4h51.2v-102.4h-51.2zM896 691.2v102.4h51.2v-102.4h-51.2zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6h-51.2zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8h-204.8zM51.2 870.4h102.4v102.4h-102.4v-102.4zM870.4 870.4h102.4v102.4h-102.4v-102.4zM384 896v51.2h102.4v-51.2h-102.4zM588.8 896v51.2h102.4v-51.2h-102.4z" ], "attrs": [ {} ], - "width": 585, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "caret-down" - ], - "grid": 14 + "control-textarea" + ] }, "attrs": [ {} ], "properties": { - "order": 4, - "id": 4, - "prevSize": 28, - "code": 59692, - "name": "caret-down" + "order": 17, + "id": 26, + "name": "control-TextArea", + "prevSize": 32, + "code": 59662 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 17 + "iconIdx": 59 }, { "icon": { "paths": [ - "M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z" + "M332.8 25.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 76.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM332.8 128c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM332.8 179.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8zM332.8 537.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 588.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM691.2 640c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM691.2 691.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8z" ], "attrs": [ {} ], - "width": 402, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "caret-left" - ], - "grid": 14 + "control-toggle" + ] }, "attrs": [ {} ], "properties": { - "order": 2, - "id": 6, - "prevSize": 28, - "code": 59690, - "name": "caret-left" + "order": 16, + "id": 25, + "name": "control-Toggle", + "prevSize": 32, + "code": 59663 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 18 + "iconIdx": 60 }, { "icon": { "paths": [ - "M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z" + "M204.8 51.2c-56.525 0-102.4 45.875-102.4 102.4v512c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4h-409.6zM204.8 102.4h409.6c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2v-512c0-28.314 22.938-51.2 51.2-51.2zM768 204.8v51.2c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2h-51.2c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4z" ], "attrs": [ {} ], - "width": 329, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "caret-right" - ], - "grid": 14 + "copy" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 7, - "prevSize": 28, - "code": 59689, - "name": "caret-right" + "order": 90, + "id": 24, + "name": "copy", + "prevSize": 32, + "code": 59664 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 19 + "iconIdx": 61 }, { "icon": { "paths": [ - "M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z" + "M828.8 1024h-633.6c-105.6 0-195.2-89.6-195.2-195.2v-320c0-281.6 227.2-508.8 505.6-508.8 288 0 518.4 230.4 518.4 518.4v310.4c0 105.6-89.6 195.2-195.2 195.2zM505.6 64c-243.2 0-441.6 198.4-441.6 441.6v320c0 73.6 60.8 134.4 131.2 134.4h630.4c73.6 0 131.2-60.8 131.2-131.2v-310.4c3.2-249.6-201.6-454.4-451.2-454.4z", + "M512 668.8c-3.2 0-6.4 0-6.4 0-32-3.2-64-19.2-80-48l-192-278.4c-9.6-9.6-9.6-25.6-0-38.4 9.6-9.6 25.6-12.8 38.4-6.4l294.4 172.8c28.8 16 48 44.8 51.2 76.8s-6.4 64-28.8 89.6c-19.2 22.4-48 32-76.8 32zM364.8 428.8l108.8 160c6.4 9.6 19.2 19.2 32 19.2s25.6-3.2 35.2-12.8c9.6-9.6 12.8-22.4 9.6-35.2s-9.6-22.4-19.2-32l-166.4-99.2z", + "M678.4 364.8c-6.4 0-12.8-3.2-19.2-6.4-16-9.6-19.2-28.8-9.6-44.8l54.4-83.2c9.6-16 28.8-19.2 44.8-9.6 19.2 12.8 22.4 35.2 12.8 48l-54.4 83.2c-6.4 9.6-16 12.8-28.8 12.8z" ], "attrs": [ + {}, + {}, {} ], - "width": 585, "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "caret-up" - ], - "grid": 14 + "dashboard" + ] }, "attrs": [ + {}, + {}, {} ], "properties": { - "order": 3, - "id": 5, - "prevSize": 28, - "code": 59691, - "name": "caret-up" + "order": 26, + "id": 23, + "name": "dashboard", + "prevSize": 32, + "code": 59665 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 20 + "iconIdx": 62 }, { "icon": { "paths": [ - "M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z", - "M480 448h-211.2c-57.6 0-105.6-48-105.6-105.6v-73.6c0-57.6 48-105.6 105.6-105.6h211.2c57.6 0 105.6 48 105.6 105.6v73.6c0 57.6-48 105.6-105.6 105.6zM268.8 227.2c-22.4 0-41.6 19.2-41.6 41.6v73.6c0 22.4 19.2 41.6 41.6 41.6h211.2c22.4 0 41.6-19.2 41.6-41.6v-73.6c0-22.4-19.2-41.6-41.6-41.6h-211.2z", - "M828.8 611.2h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z", - "M553.6 777.6h-358.4c-19.2 0-32-12.8-32-32s12.8-32 32-32h355.2c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z" + "M597.35 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.418 25.6 25.6 25.6zM776.55 204.8h-153.6v-51.2c0-28.314-22.886-51.2-51.2-51.2h-102.4c-28.262 0-51.2 22.886-51.2 51.2v51.2h-153.6c-28.262 0-51.2 22.886-51.2 51.2v102.4c0 28.314 22.938 51.2 51.2 51.2v460.8c0 28.314 22.938 51.2 51.2 51.2h409.6c28.314 0 51.2-22.886 51.2-51.2v-460.8c28.314 0 51.2-22.886 51.2-51.2v-102.4c0-28.314-22.938-51.2-51.2-51.2zM469.35 153.6h102.4v51.2h-102.4v-51.2zM725.35 870.4h-409.6v-460.8h409.6v460.8zM776.55 358.4h-512v-102.4h512v102.4zM443.75 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.469 25.6 25.6 25.6z" ], "attrs": [ - {}, - {}, - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "content" + "delete" ] }, "attrs": [ - {}, - {}, - {}, {} ], "properties": { - "order": 93, - "id": 204, - "name": "contents, trigger-ContentChanged", - "prevSize": 28, - "code": 59718 + "order": 29, + "id": 22, + "name": "delete, bin", + "prevSize": 32, + "code": 59666 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 21 + "iconIdx": 63 }, { "icon": { "paths": [ - "M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z" + "M832 128h-192v-64c0-35.392-28.608-64-64-64h-128c-35.328 0-64 28.608-64 64v64h-192c-35.328 0-64 28.608-64 64v128c0 35.392 28.672 64 64 64v512c0 35.392 28.672 64 64 64h512c35.392 0 64-28.608 64-64v-512c35.392 0 64-28.608 64-64v-128c0-35.392-28.608-64-64-64zM448 64h128v64h-128v-64zM448 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM640 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM832 320h-640v-128h640v128z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "control-date" + "delete-filled" ] }, "attrs": [ {} ], "properties": { - "order": 71, - "id": 42, - "name": "control-Date", - "prevSize": 28, - "code": 59702 + "order": 36, + "id": 21, + "name": "delete-filled", + "prevSize": 32, + "code": 59667 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 22 + "iconIdx": 64 }, { "icon": { "paths": [ - "M486.4 409.6h51.2c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6zM230.4 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM230.4 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM51.2 742.4v-435.2h665.6v102.4h51.2v-281.6c0-42.342-34.458-76.8-76.8-76.8h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-256v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v614.4c0 42.342 34.458 76.8 76.8 76.8h332.8v-51.2h-332.8c-14.080 0-25.6-11.469-25.6-25.6zM51.2 128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h256v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128h-665.6v-128zM384 409.6c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM742.4 460.8c-155.546 0-281.6 126.054-281.6 281.6s126.054 281.6 281.6 281.6 281.6-126.054 281.6-281.6-126.054-281.6-281.6-281.6zM742.4 972.8c-127.232 0-230.4-103.168-230.4-230.4s103.168-230.4 230.4-230.4 230.4 103.168 230.4 230.4-103.168 230.4-230.4 230.4zM384 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM384 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM844.8 716.8c14.131 0 25.6 11.469 25.6 25.6s-11.469 25.6-25.6 25.6h-102.4c-14.131 0-25.6-11.469-25.6-25.6v-102.4c0-14.131 11.469-25.6 25.6-25.6s25.6 11.469 25.6 25.6v76.8h76.8z" + "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c98.816 0 179.2 80.384 179.2 179.2s-80.384 179.2-179.2 179.2c-98.816 0-179.2-80.384-179.2-179.2s80.384-179.2 179.2-179.2zM227.2 665.6c-12.39 0-22.4 10.061-22.4 22.4v6.4c0 12.39 10.010 22.4 22.4 22.4h211.2c12.39 0 22.4-10.010 22.4-22.4v-6.4c0-12.39-10.061-22.4-22.4-22.4h-211.2z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "control-date-time" + "document-delete" ] }, "attrs": [ {} ], "properties": { - "order": 70, - "id": 41, - "name": "control-DateTime", - "prevSize": 28, - "code": 59703 + "order": 35, + "id": 20, + "name": "document-delete", + "prevSize": 32, + "code": 59668 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 23 + "iconIdx": 65 }, { "icon": { "paths": [ - "M793.6 609.416h-61.838v-28.108h-0.783q-21.135 33.092-62.034 33.092-37.573 0-60.469-26.912-22.896-27.112-22.896-75.554 0-50.635 25.244-81.136t66.144-30.501q38.747 0 54.011 28.308h0.783v-121.405h61.838v302.216zM732.936 510.139v-15.35q0-19.935-11.35-33.092t-29.549-13.157q-20.548 0-32.093 16.546-11.546 16.347-11.546 45.053 0 26.912 11.154 41.465t30.919 14.553q18.786 0 30.528-15.35 11.937-15.35 11.937-40.668zM548.594 609.416h-61.643v-116.421q0-44.455-32.093-44.455-15.264 0-24.853 13.357t-9.589 33.292v114.228h-61.839v-117.617q0-43.259-31.506-43.259-15.851 0-25.44 12.758-9.393 12.758-9.393 34.687v113.431h-61.838v-204.135h61.838v31.896h0.783q9.589-16.347 26.81-26.514 17.417-10.366 37.964-10.366 42.465 0 58.12 38.076 22.896-38.076 67.318-38.076 65.361 0 65.361 82.133v126.987zM0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8zM819.2 0v204.8h204.8v-204.8zM51.2 51.2h102.4v102.4h-102.4zM870.4 51.2h102.4v102.4h-102.4zM281.6 76.8v51.2h102.4v-51.2zM486.4 76.8v51.2h102.4v-51.2zM691.2 76.8v51.2h102.4v-51.2zM896 281.6v102.4h51.2v-102.4zM76.8 384v102.4h51.2v-102.4zM896 486.4v102.4h51.2v-102.4zM76.8 588.8v102.4h51.2v-102.4zM896 691.2v102.4h51.2v-102.4zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8zM51.2 870.4h102.4v102.4h-102.4zM870.4 870.4h102.4v102.4h-102.4zM384 896v51.2h102.4v-51.2zM588.8 896v51.2h102.4v-51.2z" + "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c39.934 0 76.475 13.533 106.3 35.7l-250.4 249c-21.807-29.683-35.1-65.924-35.1-105.5 0-98.816 80.384-179.2 179.2-179.2zM477 585.7c21.785 29.674 35 65.947 35 105.5 0 98.816-80.384 179.2-179.2 179.2-39.906 0-76.386-13.561-106.2-35.7l250.4-249z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "control-Markdown" + "document-disable" ] }, "attrs": [ {} ], "properties": { - "order": 72, - "id": 43, - "name": "control-Markdown", - "prevSize": 28, - "code": 59704 + "order": 40, + "id": 19, + "name": "document-disable", + "prevSize": 32, + "code": 59669 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 24 + "iconIdx": 66 }, { "icon": { "paths": [ - "M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z" + "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2l-230.4-256zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7l161.5-179.5z" + ], + "attrs": [ + {} ], - "width": 1024, - "attrs": [], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "th" - ], - "defaultCode": 61450, - "grid": 14 + "document-publish" + ] }, - "attrs": [], + "attrs": [ + {} + ], "properties": { - "name": "grid", - "id": 14, - "order": 83, - "prevSize": 28, - "code": 61450 + "order": 44, + "id": 18, + "name": "document-publish", + "prevSize": 32, + "code": 59670 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 25 + "iconIdx": 67 }, { "icon": { "paths": [ - "M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z" + "M665.6 51.2v102.4h102.4v-102.4h-102.4zM460.8 153.6h102.4v-102.4h-102.4v102.4zM460.8 358.4h102.4v-102.4h-102.4v102.4zM665.6 358.4h102.4v-102.4h-102.4v102.4zM665.6 563.2h102.4v-102.4h-102.4v102.4zM460.8 563.2h102.4v-102.4h-102.4v102.4zM460.8 768h102.4v-102.4h-102.4v102.4zM665.6 768h102.4v-102.4h-102.4v102.4zM665.6 972.8h102.4v-102.4h-102.4v102.4zM460.8 972.8h102.4v-102.4h-102.4v102.4zM256 153.6h102.4v-102.4h-102.4v102.4zM256 358.4h102.4v-102.4h-102.4v102.4zM256 563.2h102.4v-102.4h-102.4v102.4zM256 768h102.4v-102.4h-102.4v102.4zM256 972.8h102.4v-102.4h-102.4v102.4z" + ], + "attrs": [ + {} ], - "width": 877.7142857142857, - "attrs": [], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "bars", - "navicon", - "reorder" - ], - "defaultCode": 61641, - "grid": 14 + "drag" + ] }, - "attrs": [], + "attrs": [ + {} + ], "properties": { - "name": "list", - "id": 178, - "order": 89, - "prevSize": 28, - "code": 61641 + "order": 43, + "id": 17, + "name": "drag", + "prevSize": 32, + "code": 59671 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 26 + "iconIdx": 68 }, { "icon": { "paths": [ - "M512 64c-131.696 0-239.125 107.4-239.125 239 0 65.8 24.831 146.717 65.375 215.25 19.653 33.221 43.902 63.853 71.75 87.125-59.423 7.524-122.009 9.415-172.125 32-79.809 35.967-144.343 94.74-172.375 178.625-1.5 9.499 0 0-1.5 9v0.499c0 73.995 60.563 134.501 134.375 134.501h627.125c73.888 0 134.5-60.506 134.5-134.5l-1.5-9.375c-27.845-84.263-92.273-143.119-172.125-179-50.17-22.544-112.844-24.421-172.375-31.875 27.792-23.26 52.002-53.831 71.625-87 40.544-68.533 65.375-149.45 65.375-215.25 0-131.6-107.304-239-239-239zM512 124c99.241 0 179 79.875 179 179 0 49.562-21.877 125.381-57 184.75s-81.435 98.75-122 98.75c-40.565 0-86.877-39.381-122-98.75s-57.125-135.188-57.125-184.75c0-99.125 79.884-179 179.125-179zM512 646.5c92.551 0 180.829 14.406 249.75 45.375 66.784 30.009 113.649 74.724 136.5 137.75-2.447 39.259-32.9 70.375-72.75 70.375h-627.125c-39.678 0-70.116-31.051-72.625-70.25 22.978-62.705 69.953-107.523 136.75-137.625 68.937-31.067 157.205-45.625 249.5-45.625z" + "M921.6 281.958c0-70.707-171.878-128.154-384-128.154s-384 57.19-384 127.898c0 10.035 3.789 19.712 10.342 29.030 0-0.051 296.858 406.067 296.858 406.067v256l153.6-51.2v-204.8c0 0 298.752-408.166 299.725-409.702 0 0 7.475-16.64 7.475-25.139zM537.6 204.8c206.899 0 318.208 53.248 332.083 76.8-13.875 23.552-125.184 76.8-332.083 76.8s-318.208-53.248-332.083-76.8c13.875-23.552 125.184-76.8 332.083-76.8zM869.376 345.856v0 0zM573.030 686.592c-6.4 8.755-9.83 19.354-9.83 30.208v167.885l-51.2 17.050v-184.934c0-10.854-3.43-21.453-9.83-30.208l-228.147-312.115c68.762 21.709 161.382 35.123 263.578 35.123 102.298 0 195.021-13.414 263.834-35.174-0.102 0.051-0.205 0.051-0.307 0.102l-228.096 312.064z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, + "grid": 0, "tags": [ - "user-o" + "filter" ] }, "attrs": [ {} ], "properties": { - "order": 64, - "id": 38, - "name": "user-o", - "prevSize": 28, - "code": 59698 + "order": 18, + "id": 16, + "name": "filter", + "prevSize": 32, + "code": 59672 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 27 + "iconIdx": 69 }, { "icon": { "paths": [ - "M217.6 992c-3.2 0-3.2 0-6.4 0h-3.2c-144-25.6-208-144-208-249.6 0-99.2 57.6-208 185.6-240v-147.2c0-19.2 12.8-32 32-32s32 12.8 32 32v172.8c0 16-12.8 28.8-25.6 32-108.8 16-160 102.4-160 182.4s48 166.4 153.6 185.6h6.4c16 3.2 28.8 19.2 25.6 38.4-3.2 16-16 25.6-32 25.6z", - "M774.4 1001.6c0 0 0 0 0 0-102.4 0-211.2-60.8-243.2-185.6h-176c-19.2 0-32-12.8-32-32s12.8-32 32-32h201.6c16 0 28.8 12.8 32 25.6 16 108.8 102.4 156.8 182.4 160 80 0 166.4-48 185.6-153.6v-3.2c3.2-16 19.2-28.8 38.4-25.6 16 3.2 28.8 19.2 25.6 38.4v3.2c-22.4 140.8-140.8 204.8-246.4 204.8z", - "M787.2 678.4c-19.2 0-32-12.8-32-32v-176c0-16 12.8-28.8 25.6-32 108.8-16 156.8-102.4 160-182.4 0-80-48-166.4-153.6-185.6h-3.2c-19.2-6.4-32-22.4-28.8-38.4s19.2-28.8 38.4-25.6h3.2c144 25.6 208 144 208 249.6 0 99.2-60.8 208-185.6 240v150.4c0 16-16 32-32 32z", - "M41.6 246.4c-3.2 0-3.2 0-6.4 0-16-3.2-28.8-19.2-25.6-35.2v-3.2c25.6-144 140.8-208 246.4-208 0 0 3.2 0 3.2 0 99.2 0 208 60.8 240 185.6h147.2c19.2 0 32 12.8 32 32s-12.8 32-32 32h-172.8c-16 0-28.8-12.8-32-25.6-16-108.8-102.4-156.8-182.4-160-80 0-166.4 48-185.6 153.6v3.2c-3.2 16-16 25.6-32 25.6z", - "M256 387.2c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-25.6 22.4-57.6 35.2-92.8 35.2zM256 192c-16 0-32 6.4-44.8 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-32-19.2-44.8-28.8-19.2-48-19.2z", - "M771.2 873.6c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-25.6 57.6-38.4 92.8-38.4s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-28.8 25.6-60.8 38.4-92.8 38.4zM771.2 678.4c-19.2 0-35.2 6.4-48 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-35.2-19.2-48-28.8-16-44.8-16z", - "M745.6 387.2c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 60.8-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM745.6 192c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z", - "M259.2 873.6c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM259.2 678.4c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z" + "M512 0c-282.88 0-512 229.248-512 512 0 226.24 146.688 418.112 350.080 485.76 25.6 4.8 35.008-11.008 35.008-24.64 0-12.16-0.448-44.352-0.64-87.040-142.464 30.912-172.48-68.672-172.48-68.672-23.296-59.136-56.96-74.88-56.96-74.88-46.4-31.744 3.584-31.104 3.584-31.104 51.392 3.584 78.4 52.736 78.4 52.736 45.696 78.272 119.872 55.68 149.12 42.56 4.608-33.088 17.792-55.68 32.448-68.48-113.728-12.8-233.216-56.832-233.216-252.992 0-55.872 19.84-101.568 52.672-137.408-5.76-12.928-23.040-64.96 4.48-135.488 0 0 42.88-13.76 140.8 52.48 40.96-11.392 84.48-17.024 128-17.28 43.52 0.256 87.040 5.888 128 17.28 97.28-66.24 140.16-52.48 140.16-52.48 27.52 70.528 10.24 122.56 5.12 135.488 32.64 35.84 52.48 81.536 52.48 137.408 0 196.672-119.68 240-233.6 252.608 17.92 15.36 34.56 46.72 34.56 94.72 0 68.48-0.64 123.52-0.64 140.16 0 13.44 8.96 29.44 35.2 24.32 204.864-67.136 351.424-259.136 351.424-485.056 0-282.752-229.248-512-512-512z" ], "attrs": [ - {}, - {}, - {}, - {}, - {}, - {}, - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 14, "tags": [ - "webhooks" - ] + "brand", + "github" + ], + "grid": 0 }, "attrs": [ - {}, - {}, - {}, - {}, - {}, - {}, - {}, {} ], "properties": { - "order": 92, - "id": 203, - "name": "rules, action-Webhook", - "prevSize": 28, - "code": 59719 + "order": 77, + "id": 0, + "name": "github", + "prevSize": 32, + "code": 59713 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 28 + "iconIdx": 70 }, { "icon": { "paths": [ - "M728.992 512c137.754-87.334 231.008-255.208 231.008-448 0-21.676-1.192-43.034-3.478-64h-889.042c-2.29 20.968-3.48 42.326-3.48 64 0 192.792 93.254 360.666 231.006 448-137.752 87.334-231.006 255.208-231.006 448 0 21.676 1.19 43.034 3.478 64h889.042c2.288-20.966 3.478-42.324 3.478-64 0.002-192.792-93.252-360.666-231.006-448zM160 960c0-186.912 80.162-345.414 224-397.708v-100.586c-143.838-52.29-224-210.792-224-397.706v0h704c0 186.914-80.162 345.416-224 397.706v100.586c143.838 52.294 224 210.796 224 397.708h-704zM619.626 669.594c-71.654-40.644-75.608-93.368-75.626-125.366v-64.228c0-31.994 3.804-84.914 75.744-125.664 38.504-22.364 71.808-56.348 97.048-98.336h-409.582c25.266 42.032 58.612 76.042 97.166 98.406 71.654 40.644 75.606 93.366 75.626 125.366v64.228c0 31.992-3.804 84.914-75.744 125.664-72.622 42.18-126.738 125.684-143.090 226.336h501.67c-16.364-100.708-70.53-184.248-143.212-226.406z" + "M512 512h-204.8v51.2h204.8v-51.2zM768 153.6h-51.2c0-28.314-22.886-51.2-51.2-51.2h-307.2c-28.314 0-51.2 22.886-51.2 51.2h-51.2c-28.314 0-51.2 22.886-51.2 51.2v665.6c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-665.6c0-28.314-22.886-51.2-51.2-51.2zM358.4 153.6h307.2v51.2h-307.2v-51.2zM768 819.2c0 28.314-22.886 51.2-51.2 51.2h-409.6c-28.314 0-51.2-22.886-51.2-51.2v-563.2c0-28.314 22.886-51.2 51.2-51.2 0 28.314 22.886 51.2 51.2 51.2h307.2c28.314 0 51.2-22.886 51.2-51.2 28.314 0 51.2 22.886 51.2 51.2v563.2zM307.2 460.8h409.6v-51.2h-409.6v51.2zM307.2 665.6h409.6v-51.2h-409.6v51.2z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "hour-glass", - "loading", - "busy", - "wait" - ], - "grid": 16 + "help" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 1, + "order": 19, + "id": 15, + "name": "help", "prevSize": 32, - "code": 59732, - "name": "hour-glass" + "code": 59673 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 29 + "iconIdx": 71 }, { "icon": { "paths": [ - "M192 512c0-12.18 0.704-24.196 2.030-36.022l-184.98-60.104c-5.916 31.14-9.050 63.264-9.050 96.126 0 147.23 62.166 279.922 161.654 373.324l114.284-157.296c-52.124-56.926-83.938-132.758-83.938-216.028zM832 512c0 83.268-31.812 159.102-83.938 216.028l114.284 157.296c99.488-93.402 161.654-226.094 161.654-373.324 0-32.862-3.132-64.986-9.048-96.126l-184.98 60.104c1.324 11.828 2.028 23.842 2.028 36.022zM576 198.408c91.934 18.662 169.544 76.742 214.45 155.826l184.978-60.102c-73.196-155.42-222.24-268.060-399.428-290.156v194.432zM233.55 354.232c44.906-79.084 122.516-137.164 214.45-155.826v-194.43c-177.188 22.096-326.23 134.736-399.426 290.154l184.976 60.102zM644.556 803.328c-40.39 18.408-85.272 28.672-132.556 28.672s-92.166-10.264-132.554-28.67l-114.292 157.31c73.206 40.366 157.336 63.36 246.846 63.36s173.64-22.994 246.848-63.36l-114.292-157.312z" + "M512 0c-169.421 0-307.2 137.779-307.2 307.2 0 78.643 15.258 164.915 45.261 256.41 23.859 72.55 56.986 148.582 98.56 226.099 70.707 131.635 140.339 220.774 143.309 224.512 4.813 6.195 12.288 9.779 20.070 9.779 7.834 0 15.258-3.584 20.122-9.779 2.97-3.686 72.602-92.826 143.309-224.512 41.574-77.517 74.701-153.549 98.56-226.099 29.952-91.494 45.21-177.766 45.21-256.41 0-169.421-137.83-307.2-307.2-307.2zM630.682 764.672c-46.234 86.374-92.979 154.982-118.682 190.822-25.6-35.635-72.038-103.885-118.221-189.952-62.874-117.146-137.779-291.738-137.779-458.342 0-141.158 114.842-256 256-256s256 114.842 256 256c0 166.298-74.65 340.582-137.318 457.472zM512 153.6c-84.685 0-153.6 68.915-153.6 153.6s68.915 153.6 153.6 153.6 153.6-68.915 153.6-153.6-68.915-153.6-153.6-153.6zM512 409.6c-56.525 0-102.4-45.875-102.4-102.4 0-56.474 45.875-102.4 102.4-102.4 56.474 0 102.4 45.926 102.4 102.4 0 56.525-45.926 102.4-102.4 102.4z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "spinner", - "loading", - "loading-wheel", - "busy", - "wait" - ], - "grid": 16 + "location" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 0, + "order": 25, + "id": 13, + "name": "location, control-Map, type-Geolocation", "prevSize": 32, - "code": 59731, - "name": "spinner" + "code": 59675 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 30 + "iconIdx": 72 }, { "icon": { "paths": [ - "M658.744 749.256l-210.744-210.746v-282.51h128v229.49l173.256 173.254zM512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 896c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384z" + "M512.273 83.782c-0.141 0.056-182.959 84.073-229.418 256.782-4.481 16.584 32.696 9.296 31.036 27.527-2.034 22.136-44.668 31.201-39.109 94.764 5.659 64.734 60.321 130.141 68.527 169.673v27.655c-0.497 8.54-4.566 31.715-18.018 43.036-7.378 6.19-17.322 8.421-30.436 6.782-18.205-2.275-25.449-14.468-28.345-24.309-4.753-16.218-0.322-35.123 10.345-44 10.724-8.924 12.17-24.842 3.236-35.564-8.934-10.712-24.858-12.161-35.582-3.218-25.995 21.64-36.887 61.52-26.491 97 9.815 33.392 36.197 55.884 70.6 60.182 4.903 0.609 9.566 0.909 14 0.909 26.623 0 44.661-10.175 55.582-19.455 32.866-27.97 35.449-74.593 35.636-79.818 0.009-0.309 0.018-0.618 0.018-0.927v-21.218h0.109v-1.418c0-12.351 10.008-22.364 22.382-22.364 11.944 0 21.609 9.346 22.273 21.109v202.491c-0.206 2.912-2.536 29.892-17.891 42.945-7.368 6.274-17.384 8.53-30.545 6.873-18.214-2.275-25.476-14.468-28.364-24.291-4.762-16.228-0.322-35.151 10.345-44.018 10.724-8.933 12.188-24.833 3.255-35.564-8.924-10.694-24.876-12.161-35.6-3.218-26.013 21.631-36.887 61.52-26.491 97 9.796 33.392 36.197 55.893 70.6 60.2 4.903 0.609 9.566 0.891 14 0.891 26.623 0 44.671-10.156 55.564-19.436 32.875-27.97 35.458-74.611 35.636-79.836 0.019-0.328 0.018-0.609 0.018-0.909v-225.636l0.127-0.055v-1c0-12.595 10.219-22.8 22.836-22.8 12.349 0 22.333 9.824 22.727 22.073v227.418c0 0.309-0 0.591 0.018 0.909 0.187 5.216 2.779 51.866 35.655 79.836 10.912 9.28 28.959 19.436 55.582 19.436 4.443 0 9.088-0.282 13.982-0.891 34.394-4.307 60.804-26.818 70.6-60.2 10.405-35.48-0.487-75.36-26.491-97-10.743-8.943-26.676-7.466-35.6 3.218-8.934 10.74-7.488 26.63 3.236 35.564 10.668 8.868 15.135 27.79 10.364 44.018-2.878 9.823-10.159 22.015-28.364 24.291-13.105 1.648-23.050-0.592-30.418-6.782-13.508-11.358-17.558-34.657-18.036-43v-201.818c0.297-12.093 10.14-21.818 22.327-21.818 12.374 0 22.4 10.003 22.4 22.364v1.418h0.073v21.218c0 0.318-0 0.628 0.018 0.927 0.178 5.216 2.779 51.848 35.655 79.818 10.912 9.28 28.941 19.455 55.564 19.455 4.434 0 9.107-0.292 14-0.891 34.394-4.298 60.786-26.818 70.582-60.2 10.405-35.48-0.487-75.351-26.491-97-10.743-8.933-26.667-7.476-35.582 3.236-8.943 10.722-7.488 26.622 3.236 35.545 10.668 8.877 15.117 27.8 10.345 44.018-2.878 9.842-10.159 22.025-28.364 24.291-13.086 1.648-23.050-0.583-30.418-6.764-13.508-11.368-17.549-34.675-18.018-43v-21.018c5.305-54.103 63.095-107.777 69.091-176.364 5.531-63.563-37.121-72.627-39.145-94.764-1.669-18.232 35.498-10.944 31.036-27.527-46.468-172.709-229.269-256.726-229.4-256.782z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "clock", - "time", - "schedule" - ], - "grid": 16 + "logo" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 0, + "order": 31, + "id": 12, + "name": "logo", "prevSize": 32, - "code": 59728, - "name": "clock" + "code": 59676 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 31 + "iconIdx": 73 }, { "icon": { "paths": [ - "M128 320v640c0 35.2 28.8 64 64 64h576c35.2 0 64-28.8 64-64v-640h-704zM320 896h-64v-448h64v448zM448 896h-64v-448h64v448zM576 896h-64v-448h64v448zM704 896h-64v-448h64v448z", - "M848 128h-208v-80c0-26.4-21.6-48-48-48h-224c-26.4 0-48 21.6-48 48v80h-208c-26.4 0-48 21.6-48 48v80h832v-80c0-26.4-21.6-48-48-48zM576 128h-192v-63.198h192v63.198z" + "M947.2 0h-870.4c-42.342 0-76.8 34.458-76.8 76.8v870.4c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-870.4c0-42.342-34.458-76.8-76.8-76.8zM972.8 947.2c0 14.157-11.443 25.6-25.6 25.6h-870.4c-14.131 0-25.6-11.443-25.6-25.6v-870.4c0-14.131 11.469-25.6 25.6-25.6h870.4c14.157 0 25.6 11.469 25.6 25.6v870.4zM665.6 460.8c56.448 0 102.4-45.926 102.4-102.4s-45.952-102.4-102.4-102.4c-56.448 0-102.4 45.926-102.4 102.4s45.952 102.4 102.4 102.4zM665.6 307.2c28.211 0 51.2 22.989 51.2 51.2s-22.989 51.2-51.2 51.2c-28.211 0-51.2-22.989-51.2-51.2s22.989-51.2 51.2-51.2zM896 102.4h-768c-14.131 0-25.6 11.469-25.6 25.6v614.4c0 14.157 11.469 25.6 25.6 25.6h768c14.157 0 25.6-11.443 25.6-25.6v-614.4c0-14.131-11.443-25.6-25.6-25.6zM153.6 716.8v-118.246l164.301-184.858c4.198-4.787 9.728-7.373 15.462-7.475 5.734-0.051 11.29 2.458 15.642 7.040l283.238 303.539h-478.643zM870.4 716.8h-168.090l-315.853-338.432c-14.285-15.334-33.331-23.603-53.709-23.347-20.326 0.256-39.219 9.011-53.094 24.627l-126.054 141.798v-367.846h716.8v563.2z" ], "attrs": [ - {}, {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "bin", - "trashcan", - "remove", - "delete", - "recycle", - "dispose" - ], - "grid": 16 + "media" + ] }, "attrs": [ - {}, {} ], "properties": { - "order": 1, - "id": 0, - "name": "bin2", + "order": 30, + "id": 11, + "name": "media, type-Assets, trigger-AssetChanged", "prevSize": 32, - "code": 59650 + "code": 59677 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 32 + "iconIdx": 74 }, { "icon": { "paths": [ - "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 960.002c-62.958 0-122.872-13.012-177.23-36.452l233.148-262.29c5.206-5.858 8.082-13.422 8.082-21.26v-96c0-17.674-14.326-32-32-32-112.99 0-232.204-117.462-233.374-118.626-6-6.002-14.14-9.374-22.626-9.374h-128c-17.672 0-32 14.328-32 32v192c0 12.122 6.848 23.202 17.69 28.622l110.31 55.156v187.886c-116.052-80.956-192-215.432-192-367.664 0-68.714 15.49-133.806 43.138-192h116.862c8.488 0 16.626-3.372 22.628-9.372l128-128c6-6.002 9.372-14.14 9.372-22.628v-77.412c40.562-12.074 83.518-18.588 128-18.588 70.406 0 137.004 16.26 196.282 45.2-4.144 3.502-8.176 7.164-12.046 11.036-36.266 36.264-56.236 84.478-56.236 135.764s19.97 99.5 56.236 135.764c36.434 36.432 85.218 56.264 135.634 56.26 3.166 0 6.342-0.080 9.518-0.236 13.814 51.802 38.752 186.656-8.404 372.334-0.444 1.744-0.696 3.488-0.842 5.224-81.324 83.080-194.7 134.656-320.142 134.656z" + "M128 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM512 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM896 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128z" + ], + "attrs": [ + {} ], - "attrs": [], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "earth", - "globe", - "language", - "web", - "internet", - "sphere", - "planet" - ], - "defaultCode": 59850, - "grid": 16 + "more" + ] }, - "attrs": [], + "attrs": [ + {} + ], "properties": { - "ligatures": "earth, globe2", - "name": "earth", - "id": 202, - "order": 91, + "order": 34, + "id": 10, + "name": "more, dots", "prevSize": 32, - "code": 59850 + "code": 59678 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 33 + "iconIdx": 75 }, { "icon": { "paths": [ - "M512.002 193.212v-65.212h128v-64c0-35.346-28.654-64-64.002-64h-191.998c-35.346 0-64 28.654-64 64v64h128v65.212c-214.798 16.338-384 195.802-384 414.788 0 229.75 186.25 416 416 416s416-186.25 416-416c0-218.984-169.202-398.448-384-414.788zM706.276 834.274c-60.442 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c58.040-58.038 134.448-91.018 216.114-93.548l-21.678 314.020c-1.86 26.29 12.464 37.802 31.836 37.802s33.698-11.512 31.836-37.802l-21.676-314.022c81.666 2.532 158.076 35.512 216.116 93.55 60.44 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274z" + "M877.12 311.104l-66.304 66.368-228.224-228.224 66.368-66.368c25.216-25.152 66.048-25.152 91.264 0l136.896 137.024c25.216 25.216 25.216 65.984 0 91.2zM760.896 427.392l-386.176 386.112c-25.216 25.28-66.048 25.28-91.264 0l-136.96-136.896c-25.216-25.28-25.216-66.112 0-91.264l386.24-386.24 228.16 228.288zM64 896v-191.872l191.936 191.872h-191.936z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "stopwatch", - "time", - "speed", - "meter", - "chronometer" - ], - "grid": 16 + "pencil" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 2, + "order": 47, + "id": 9, + "name": "pencil", "prevSize": 32, - "code": 59715, - "name": "elapsed" + "code": 59679 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 34 + "iconIdx": 76 }, { "icon": { "paths": [ - "M522.2 438.8v175.6h290.4c-11.8 75.4-87.8 220.8-290.4 220.8-174.8 0-317.4-144.8-317.4-323.2s142.6-323.2 317.4-323.2c99.4 0 166 42.4 204 79l139-133.8c-89.2-83.6-204.8-134-343-134-283 0-512 229-512 512s229 512 512 512c295.4 0 491.6-207.8 491.6-500.2 0-33.6-3.6-59.2-8-84.8l-483.6-0.2z" + "M892.083 131.917c-73.523-73.498-193.152-73.498-266.65 0l-157.184 157.107c-9.958 10.035-9.958 26.214 0 36.275 10.061 9.984 26.24 9.984 36.25 0l157.133-157.107c53.504-53.555 140.672-53.555 194.176 0 53.581 53.504 53.581 140.672 0 194.176l-186.138 186.163c-53.53 53.581-140.672 53.581-194.176 0-10.086-10.010-26.24-10.010-36.275 0-10.035 10.086-10.035 26.189 0 36.25 36.787 36.736 84.992 55.117 133.325 55.117s96.589-18.432 133.376-55.117l186.163-186.214c73.498-73.472 73.498-193.152 0-266.65zM519.45 698.726l-157.082 157.082c-53.504 53.555-140.672 53.555-194.176 0-53.581-53.504-53.581-140.672 0-194.176l186.138-186.163c53.53-53.581 140.672-53.581 194.176 0 10.086 9.984 26.189 9.984 36.275 0 10.035-10.086 10.035-26.214 0-36.25-73.549-73.498-193.203-73.498-266.701 0l-186.163 186.163c-73.498 73.574-73.498 193.203 0 266.701 36.787 36.71 85.043 55.117 133.325 55.117 48.333 0 96.538-18.406 133.325-55.117l157.133-157.133c10.010-10.010 10.010-26.189 0-36.224-10.010-9.984-26.189-9.984-36.25 0z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "google", - "brand" - ], - "grid": 16 + "reference" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 0, + "order": 45, + "id": 8, + "name": "reference", "prevSize": 32, - "code": 59707, - "name": "google" + "code": 59680 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 35 + "iconIdx": 77 }, { "icon": { "paths": [ - "M592 448h-16v-192c0-105.87-86.13-192-192-192h-128c-105.87 0-192 86.13-192 192v192h-16c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h544c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48zM192 256c0-35.29 28.71-64 64-64h128c35.29 0 64 28.71 64 64v192h-256v-192z" + "M800 1024h-576c-124.8 0-224-99.2-224-224v-300.8c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v300.8c0 124.8-99.2 224-224 224zM224 339.2c-89.6 0-160 70.4-160 160v300.8c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-300.8c0-89.6-70.4-160-160-160h-576z", + "M828.8 201.6h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z", + "M716.8 64h-409.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h412.8c19.2 0 32 12.8 32 32s-16 32-35.2 32z", + "M800 416v64c0 48-38.4 83.2-83.2 83.2h-409.6c-44.8 3.2-83.2-35.2-83.2-83.2v-64h-54.4v64c0 76.8 64 140.8 140.8 140.8h406.4c76.8 0 140.8-64 140.8-140.8v-64h-57.6z" ], "attrs": [ + {}, + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "lock", - "secure", - "private", - "encrypted" - ], - "grid": 16 + "schemas" + ] }, "attrs": [ + {}, + {}, + {}, {} ], "properties": { - "order": 2, - "id": 0, + "order": 46, + "id": 7, + "name": "schemas", "prevSize": 32, - "code": 59700, - "name": "lock" + "code": 59681 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 36 + "iconIdx": 78 }, { "icon": { "paths": [ - "M0.35 512l-0.35-312.074 384-52.144v364.218zM448 138.482l511.872-74.482v448h-511.872zM959.998 576l-0.126 448-511.872-72.016v-375.984zM384 943.836l-383.688-52.594-0.020-315.242h383.708z" + "M939.776 1003.776c-27.2 27.008-71.232 27.008-98.368 0l-168.96-168.96c-66.176 38.464-142.016 62.080-224 62.080-247.744 0-448.448-200.832-448.448-448.448 0-247.744 200.704-448.448 448.448-448.448 247.68 0 448.512 200.704 448.512 448.448 0 115.136-44.672 218.944-115.904 298.304l158.656 158.656c27.008 27.136 27.008 71.168 0.064 98.368zM448.448 128.128c-176.896 0-320.32 143.36-320.32 320.32s143.424 320.32 320.32 320.32c176.96 0 320.384-143.36 320.384-320.32s-143.488-320.32-320.384-320.32z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "windows8", - "brand", - "os" - ], - "grid": 16 + "search" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 1, + "order": 23, + "id": 6, + "name": "search", "prevSize": 32, - "code": 59712, - "name": "microsoft, action-AzureQueue" + "code": 59682 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 37 + "iconIdx": 79 }, { "icon": { "paths": [ - "M128 128h320v768h-320zM576 128h320v768h-320z" + "M1019.11 440.755c-1.946-13.747-14.438-23.398-28.16-21.888-16.947 1.843-34.253-0.589-50.048-7.091-52.25-21.504-77.261-81.459-55.757-133.709 6.605-15.846 16.947-29.85 30.208-40.602 10.803-8.653 12.698-24.294 4.352-35.354-28.902-37.99-62.797-71.706-100.838-100.045-10.701-8.090-25.805-6.451-34.662 3.661-28.8 33.254-75.546 44.262-116.198 27.546-40.704-16.742-66.099-57.498-63.206-101.453 0.845-13.338-8.755-25.19-21.99-27.008-47.002-6.605-94.797-6.605-142.054 0.077-13.722 1.946-23.398 14.387-21.862 28.211 1.843 16.896-0.614 34.202-7.168 49.997-21.504 52.25-81.408 77.21-133.632 55.706-15.821-6.502-29.85-16.947-40.602-30.157-8.653-10.752-24.32-12.698-35.379-4.301-37.99 28.851-71.68 62.694-100.045 100.762-8.090 10.701-6.451 25.83 3.635 34.637 33.28 28.902 44.288 75.597 27.546 116.301-16.742 40.653-57.498 66.048-101.427 63.155-13.363-0.845-25.19 8.755-26.982 21.99-6.63 47.002-6.63 94.822 0.102 142.080 1.946 13.696 14.387 23.322 28.16 21.811 16.896-1.818 34.202 0.691 50.022 7.168 52.224 21.53 77.21 81.459 55.706 133.734-6.502 15.795-16.947 29.773-30.157 40.525-10.803 8.73-12.698 24.346-4.352 35.354 28.877 38.042 62.822 71.731 100.813 100.122 1.741 1.357 3.661 2.355 5.606 3.2 9.933 4.045 21.709 1.536 29.082-6.938 28.826-33.178 75.571-44.262 116.275-27.52 40.653 16.742 66.048 57.498 63.13 101.453-0.819 13.338 8.755 25.165 22.067 27.059 47.002 6.579 94.72 6.554 142.029-0.102 13.645-1.971 23.347-14.464 21.811-28.237-1.843-16.947 0.691-34.253 7.194-50.048 21.504-52.25 81.459-77.21 133.658-55.68 15.795 6.528 29.85 16.947 40.55 30.157 8.704 10.803 24.346 12.698 35.405 4.326 37.99-28.902 71.654-62.746 100.096-100.813 7.987-10.675 6.4-25.805-3.712-34.662-33.254-28.826-44.288-75.571-27.546-116.224 16.742-40.73 57.498-66.099 101.453-63.232 13.338 0.922 25.139-8.678 27.008-21.965 6.554-47.002 6.502-94.771-0.128-142.003zM971.059 554.010c-56.141 5.274-105.702 41.114-127.642 94.464s-12.058 113.613 24.090 156.902c-17.69 21.478-37.453 41.318-58.854 59.315-12.749-11.213-27.392-20.352-43.238-26.854-78.259-32.282-168.243 5.197-200.499 83.584-6.502 15.718-10.291 32.563-11.29 49.536-27.853 2.56-55.859 2.637-83.61 0.077-5.274-56.090-41.114-105.677-94.464-127.616-53.35-21.99-113.613-11.981-156.928 24.064-21.504-17.69-41.318-37.453-59.29-58.88 11.213-12.723 20.352-27.392 26.906-43.136 32.205-78.387-5.274-168.294-83.584-200.55-15.821-6.502-32.589-10.342-49.613-11.366-2.534-27.853-2.586-55.859 0-83.558 56.090-5.299 105.626-41.088 127.565-94.438 21.965-53.402 12.058-113.638-24.090-156.902 17.69-21.555 37.478-41.395 58.88-59.341 12.749 11.213 27.392 20.352 43.213 26.854 78.285 32.256 168.218-5.248 200.474-83.558 6.528-15.795 10.342-32.589 11.366-49.613 27.853-2.509 55.808-2.56 83.558 0 5.299 56.090 41.139 105.6 94.49 127.59 53.35 21.939 113.638 12.006 156.902-24.090 21.504 17.741 41.293 37.453 59.29 58.854-11.213 12.8-20.352 27.392-26.854 43.213-32.256 78.31 5.248 168.294 83.507 200.499 15.846 6.502 32.691 10.342 49.638 11.392 2.56 27.853 2.611 55.808 0.077 83.558zM512 307.2c-113.101 0-204.8 91.699-204.8 204.8 0 113.126 91.699 204.826 204.8 204.826s204.8-91.699 204.8-204.826c0-113.101-91.699-204.8-204.8-204.8zM512 665.626c-84.813 0-153.6-68.813-153.6-153.626 0-84.838 68.787-153.6 153.6-153.6 84.838 0 153.6 68.762 153.6 153.6 0 84.813-68.762 153.626-153.6 153.626z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "pause", - "player" - ], - "grid": 16 + "settings" + ] }, "attrs": [ {} ], "properties": { - "order": 2, - "id": 1, + "order": 22, + "id": 5, + "name": "settings", "prevSize": 32, - "code": 59695, - "name": "pause" + "code": 59683 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 38 + "iconIdx": 80 }, { "icon": { "paths": [ - "M192 128l640 384-640 384z" + "M77.005 102.605h128v332.8c0 14.131 11.418 25.6 25.6 25.6 14.106 0 25.6-11.469 25.6-25.6v-332.8h128c14.106 0 25.6-11.469 25.6-25.6 0-14.157-11.494-25.6-25.6-25.6h-307.2c-14.182 0-25.6 11.443-25.6 25.6 0 14.106 11.418 25.6 25.6 25.6zM947.405 716.979h-179.2v-102.4h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-204.8c-14.182 0-25.6 11.443-25.6 25.6v358.4c0 14.157 11.418 25.6 25.6 25.6 14.157 0 25.6-11.443 25.6-25.6v-179.2h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.494-25.6-25.6-25.6zM965.094 58.47c-9.958-9.933-26.112-9.933-36.045 0l-870.605 870.579c-9.958 9.984-9.958 26.086 0 36.045 10.010 9.984 26.112 9.984 36.045 0l870.605-870.579c9.958-9.933 9.958-26.086 0-36.045z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "play", - "player" - ], - "grid": 16 + "type-boolean" + ] }, "attrs": [ {} ], "properties": { - "order": 3, - "id": 0, + "order": 21, + "id": 4, + "name": "type-Boolean", "prevSize": 32, - "code": 59696, - "name": "play" + "code": 59684 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 39 + "iconIdx": 81 }, { "icon": { "paths": [ - "M889.68 166.32c-93.608-102.216-228.154-166.32-377.68-166.32-282.77 0-512 229.23-512 512h96c0-229.75 186.25-416 416-416 123.020 0 233.542 53.418 309.696 138.306l-149.696 149.694h352v-352l-134.32 134.32z", - "M928 512c0 229.75-186.25 416-416 416-123.020 0-233.542-53.418-309.694-138.306l149.694-149.694h-352v352l134.32-134.32c93.608 102.216 228.154 166.32 377.68 166.32 282.77 0 512-229.23 512-512h-96z" + "M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z" ], "attrs": [ - {}, {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "loop", - "repeat", - "player", - "reload", - "refresh", - "update", - "synchronize", - "arrows" - ], - "grid": 16 + "type-datetime" + ] }, "attrs": [ - {}, {} ], "properties": { - "order": 49, - "id": 2, + "order": 24, + "id": 3, + "name": "type-DateTime", "prevSize": 32, - "code": 59694, - "name": "reset" + "code": 59685 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 40 + "iconIdx": 82 }, { "icon": { "paths": [ - "M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99h-201.258c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z" + "M179.2 256c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6h-25.6c-56.55 0-102.4 45.85-102.4 102.4v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 56.55 45.85 102.4 102.4 102.4h25.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-30.746-13.85-58.061-35.328-76.8 21.478-18.765 35.328-46.029 35.328-76.8v-179.2zM972.8 486.4h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-56.55-45.85-102.4-102.4-102.4h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 30.771 13.85 58.035 35.328 76.8-21.478 18.739-35.328 46.054-35.328 76.8v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h25.6c56.55 0 102.4-45.85 102.4-102.4v-179.2c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6zM512 332.8c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6c0-14.131-11.443-25.6-25.6-25.6zM512 435.2c-14.157 0-25.6 11.469-25.6 25.6v204.8c0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6v-204.8c0-14.131-11.443-25.6-25.6-25.6z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "cog", - "gear", - "preferences", - "settings", - "generate", - "control", - "options" - ], - "grid": 16 + "json" + ] }, "attrs": [ {} ], "properties": { - "order": 1, - "id": 1, + "order": 20, + "id": 14, + "name": "type-Json, json", "prevSize": 32, - "code": 59693, - "name": "settings2" + "code": 59674 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 41 + "iconIdx": 83 }, { "icon": { "paths": [ - "M512 128c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448zM512 936c-198.824 0-360-161.178-360-360 0-198.824 161.176-360 360-360 198.822 0 360 161.176 360 360 0 198.822-161.178 360-360 360zM934.784 287.174c16.042-28.052 25.216-60.542 25.216-95.174 0-106.040-85.96-192-192-192-61.818 0-116.802 29.222-151.92 74.596 131.884 27.236 245.206 105.198 318.704 212.578v0zM407.92 74.596c-35.116-45.374-90.102-74.596-151.92-74.596-106.040 0-192 85.96-192 192 0 34.632 9.174 67.122 25.216 95.174 73.5-107.38 186.822-185.342 318.704-212.578z", - "M512 576v-256h-64v320h256v-64z" + "M256 665.6h-76.8v-332.8c0-14.131-11.469-25.6-25.6-25.6h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h51.2v307.2h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6zM614.4 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6v179.2c0 14.131 11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-179.2v-128h179.2c14.131 0 25.6-11.469 25.6-25.6v-179.2c0-14.131-11.469-25.6-25.6-25.6zM972.8 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6v-358.4c0-14.131-11.469-25.6-25.6-25.6z" ], "attrs": [ - {}, {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "alarm", - "time", - "clock" - ], - "grid": 16 + "type-number" + ] }, "attrs": [ - {}, {} ], "properties": { - "order": 2, - "id": 1, + "order": 32, + "id": 2, + "name": "type-Number", "prevSize": 32, - "code": 59716, - "name": "timeout" + "code": 59686 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 42 + "iconIdx": 84 }, { "icon": { "paths": [ - "M768 64c105.87 0 192 86.13 192 192v192h-128v-192c0-35.29-28.71-64-64-64h-128c-35.29 0-64 28.71-64 64v192h16c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48h-544c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h400v-192c0-105.87 86.13-192 192-192h128z" + "M870.4 921.6h-716.8c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h716.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM194.688 817.152c13.030 5.555 28.083-0.461 33.613-13.44l125.030-291.712h317.338l125.005 291.712c4.173 9.677 13.568 15.488 23.526 15.488 3.405 0 6.81-0.64 10.112-2.048 13.005-5.606 18.995-20.659 13.44-33.638l-131.61-306.944c-0.051-0.051-0.051-0.154-0.102-0.205l-175.488-409.6c-4.045-9.472-13.312-15.565-23.552-15.565s-19.507 6.093-23.552 15.514l-175.488 409.6c-0.051 0.051-0.051 0.154-0.102 0.205l-131.61 306.97c-5.53 13.005 0.461 28.058 13.44 33.664zM512 141.773l136.704 319.027h-273.408l136.704-319.027z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 0, "tags": [ - "unlocked", - "lock-open" - ], - "grid": 16 + "type-string" + ] }, "attrs": [ {} ], "properties": { - "order": 1, + "order": 48, "id": 1, + "name": "type-String", "prevSize": 32, - "code": 59699, - "name": "unlocked" + "code": 59687 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 43 + "iconIdx": 85 }, { "icon": { "paths": [ - "M1024 512c0 282.77-229.23 512-512 512s-512-229.23-512-512c0-282.77 229.23-512 512-512s512 229.23 512 512z" + "M955.221 848c0-0.109 10.752 0 0 0-52.751-161.392-240.461-224-443.178-224-202.269 0-389.979 63.392-443.066 224-11.2-0.109 0-1.232 0 0 0 61.936 49.615 112 110.654 112h664.823c61.151 0 110.766-50.064 110.766-112zM290.399 288c0 123.648 99.231 336 221.645 336s221.645-212.352 221.645-336c0-123.648-99.231-224-221.645-224s-221.645 100.352-221.645 224z" ], "attrs": [ {} @@ -1411,1269 +1289,1420 @@ "isMulticolor2": false, "grid": 0, "tags": [ - "circle" + "user" ] }, "attrs": [ {} ], "properties": { - "order": 106, + "order": 33, "id": 0, - "name": "circle", + "name": "user", "prevSize": 32, - "code": 59729 + "code": 59688 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 44 + "iconIdx": 86 }, { "icon": { "paths": [ - "M341.758 30.332v55.545h25.806v83.195c-193.056 37.236-336.992 205.942-337.132 408.544l-0 0.016c-0 229.687 184.814 415.885 412.793 415.885l-0-0c227.979 0 412.793-186.198 412.793-415.885l-0 0c-0.125-202.629-144.065-371.351-334.545-408.173l-2.587-0.416v-83.165h25.809v-55.545h-202.936zM454.729 369.689c102.973 5.539 185.923 86.823 194.885 189.491v6.763h-23.479v23.589h23.485v6.447c-8.918 102.72-91.882 184.055-194.891 189.594v-23.144h-23.444v23.078c-104.989-6.154-188.976-91.042-194.458-196.868h23.297v-23.589h-23.172c6.225-105.086 89.86-189.163 194.333-195.295v23.195h23.444v-23.261zM535.132 467.312l-78.775 73.035c-3.893-1.564-8.405-2.478-13.126-2.494l-0.006-0c-20.265 0-36.693 16.551-36.693 36.967l-0 0c0 20.417 16.428 36.967 36.693 36.967h-0c20.265 0 36.693-16.551 36.693-36.967l0-0c-0.010-3.753-0.574-7.37-1.613-10.776l0.069 0.262 71.128-80.156-14.369-16.838z" + "M251.429 100.58c-87.896 0-160 72.104-160 160v525.714c0 87.896 72.104 160 160 160h525.714c87.896 0 160-72.104 160-160v-525.714c0-87.896-72.104-160-160-160zM251.429 146.295h525.714c62.961 0 114.286 51.325 114.286 114.286v525.714c0 62.961-51.325 114.286-114.286 114.286h-525.714c-62.961 0-114.286-51.325-114.286-114.286v-525.714c0-62.961 51.325-114.286 114.286-114.286z", + "M251.429 306.295c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h525.714c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z", + "M251.429 443.438c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z", + "M251.429 580.58c-0.096-0.001-0.21-0.002-0.323-0.002-12.625 0-22.859 10.235-22.859 22.859s10.235 22.859 22.859 22.859c0.114 0 0.227-0.001 0.34-0.002l-0.017 0h297.143c0.096 0.001 0.21 0.002 0.323 0.002 12.625 0 22.859-10.235 22.859-22.859s-10.235-22.859-22.859-22.859c-0.114 0-0.227 0.001-0.34 0.002l0.017-0z" ], "attrs": [ + {}, + {}, + {}, {} ], - "width": 886, + "width": 1029, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "action-Fastly" + "single-content" ] }, "attrs": [ + {}, + {}, + {}, {} ], "properties": { - "order": 102, - "id": 1, - "name": "action-Fastly", - "prevSize": 32, - "code": 59726 + "order": 112, + "id": 214, + "name": "single-content", + "prevSize": 28, + "code": 59736 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 45 + "iconIdx": 0 }, { "icon": { "paths": [ - "M512 0c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h128v870.4h-128c-15.36 0-25.6 10.24-25.6 25.6s10.24 25.6 25.6 25.6h307.2c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-128v-870.4h128c15.36 0 25.6-10.24 25.6-25.6s-10.24-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.16 0-51.2 23.040-51.2 51.2v460.8c0 28.16 23.040 51.2 51.2 51.2h537.6v-51.2h-512c-15.36 0-25.6-10.24-25.6-25.6v-409.6c0-15.36 10.24-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c15.36 0 25.6 10.24 25.6 25.6v409.6c0 15.36-10.24 25.6-25.6 25.6h-204.8v51.2h230.4c28.16 0 51.2-23.040 51.2-51.2v-460.8c0-28.16-23.040-51.2-51.2-51.2h-230.4z", - "M386.56 606.72c0 12.8-7.68 23.040-20.48 25.6-28.16 10.24-58.88 15.36-92.16 15.36-35.84 0-66.56-10.24-84.48-25.6s-25.6-38.4-25.6-66.56 10.24-51.2 25.6-66.56c17.92-17.92 46.080-23.040 84.48-23.040h69.12v-38.4c0-35.84-25.6-53.76-64-53.76-23.040 0-46.080 7.68-69.12 20.48-2.56 2.56-5.12 2.56-10.24 2.56-10.24 0-20.48-7.68-20.48-20.48 0-7.68 2.56-12.8 10.24-17.92 30.72-20.48 61.44-25.6 92.16-25.6 56.32 0 104.96 30.72 104.96 92.16v181.76zM345.6 501.76h-69.12c-61.44 0-69.12 28.16-69.12 53.76s7.68 56.32 69.12 56.32c23.040 0 46.080-2.56 69.12-10.24v-99.84z" + "M777.143 946.286h-525.714c-89.143 0-160-70.857-160-160v-297.143c0-89.143 70.857-160 160-160h525.714c89.143 0 160 70.857 160 160v297.143c0 89.143-70.857 160-160 160zM251.429 374.857c-64 0-114.286 50.286-114.286 114.286v297.143c0 64 50.286 114.286 114.286 114.286h525.714c64 0 114.286-50.286 114.286-114.286v-297.143c0-64-50.286-114.286-114.286-114.286h-525.714z", + "M731.429 580.571h-457.143c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h457.143c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", + "M502.857 740.571h-228.571c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h228.571c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", + "M777.143 260.571h-525.714c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h525.714c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z", + "M685.714 146.286h-342.857c-13.714 0-22.857-9.143-22.857-22.857s9.143-22.857 22.857-22.857h342.857c13.714 0 22.857 9.143 22.857 22.857s-9.143 22.857-22.857 22.857z" ], "attrs": [ + {}, + {}, + {}, {}, {} ], + "width": 1029, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "control-Slug" + "multiple-content" ] }, "attrs": [ + {}, + {}, + {}, {}, {} ], "properties": { - "order": 103, - "id": 0, - "name": "control-Slug", - "prevSize": 32, - "code": 59727 + "order": 113, + "id": 213, + "name": "multiple-content", + "prevSize": 28, + "code": 59735 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 46 + "iconIdx": 1 }, { "icon": { "paths": [ - "M512 26.947c-267.728 0-485.053 217.059-485.053 485.053s217.069 485.053 485.053 485.053c267.983 0 485.053-217.314 485.053-485.308s-217.069-484.797-485.053-484.797zM512 853.496c-188.747 0-341.745-152.988-341.745-341.752 0-188.745 152.998-341.733 341.745-341.733 188.765 0 341.745 152.988 341.745 341.733 0 188.763-152.98 341.752-341.745 341.752zM512 240.522v254.585c0 7.443 7.957 12.405 14.654 8.939l225.774-117.231c5.042-2.659 6.844-8.986 3.96-13.901-46.936-82.204-133.855-138.576-234.205-142.298z" + "M832 268.8h-657.92c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h657.92c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", + "M832 453.12h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", + "M832 642.56h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z", + "M832 832h-409.6c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h409.6c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6z" ], "attrs": [ + {}, + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "algolia-mark-white" + "type-Array" ] }, "attrs": [ + {}, + {}, + {}, {} ], "properties": { - "order": 101, - "id": 1, - "name": "action-Algolia", - "prevSize": 32, - "code": 59724 + "order": 108, + "id": 211, + "name": "type-Array", + "prevSize": 28, + "code": 59734 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 47 + "iconIdx": 3 }, { "icon": { "paths": [ - "M295.954 822.751h-94.705c-47.353 0-88.786-41.434-88.786-88.786v-491.283c0-47.353 41.434-88.786 88.786-88.786h94.705v-59.191h-94.705c-82.867 0-147.977 65.11-147.977 147.977v491.283c0 82.867 65.11 147.977 147.977 147.977h94.705v-59.191z", - "M970.728 473.526c-82.867-171.653-201.249-378.821-272.277-378.821h-112.462v59.191h112.462c35.514 11.838 136.139 177.572 213.087 337.387-76.948 153.896-177.572 325.549-213.087 337.387h-112.462v59.191h112.462c71.029 0 183.491-207.168 272.277-384.74l5.919-11.838-5.919-17.757z", - "M266.358 337.341v260.462h59.191v-260.462z", - "M479.422 337.341v260.462h59.191v-260.462z" + "M292.571 713.143v128c0 20-16.571 36.571-36.571 36.571h-146.286c-20 0-36.571-16.571-36.571-36.571v-128c0-20 16.571-36.571 36.571-36.571h146.286c20 0 36.571 16.571 36.571 36.571zM309.714 109.714l-16 438.857c-0.571 20-17.714 36.571-37.714 36.571h-146.286c-20 0-37.143-16.571-37.714-36.571l-16-438.857c-0.571-20 15.429-36.571 35.429-36.571h182.857c20 0 36 16.571 35.429 36.571z" ], "attrs": [ - {}, - {}, - {}, {} ], + "width": 366, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "Tags" - ] + "exclamation" + ], + "grid": 14 }, "attrs": [ - {}, - {}, - {}, {} ], "properties": { - "order": 98, + "order": 1, "id": 0, - "name": "type-Tags", - "prevSize": 32, - "code": 59722 + "prevSize": 28, + "code": 59733, + "name": "exclamation" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 48 + "iconIdx": 4 }, { "icon": { "paths": [ - "M512 102.4c-200.4 0-366.954 144.072-402.4 334.2-0.031 0.165-0.069 0.335-0.1 0.5-2.974 16.061-4.76 32.441-5.8 49.1-0.017 0.271-0.084 0.529-0.1 0.8 0.019 0.004 0.080-0.004 0.1 0-0.503 8.31-1.3 16.564-1.3 25 0 226.202 183.398 409.6 409.6 409.6 208.165 0 379.707-155.44 405.8-356.5 0.004-0.033-0.004-0.067 0-0.1 1.94-14.978 3.124-30.16 3.4-45.6 0.044-2.487 0.4-4.903 0.4-7.4 0-226.202-183.398-409.6-409.6-409.6zM512 153.6c185.461 0 337.902 140.924 356.4 321.5-35.181-21.812-84.232-39.9-151.6-39.9-85.35 0-140.891 41.606-194.6 81.9-49.152 36.864-95.55 71.7-163.8 71.7-86.067 0-135.862-54.67-175.9-98.6-9.001-9.901-17.11-17.483-25.4-25.3 23.131-175.603 172.981-311.3 354.9-311.3zM716.8 486.4c77.828 0 125.173 28.221 152.2 52.8-13.96 185.173-168.254 331.2-357 331.2-190.097 0-345.175-148.14-357.2-335.2 41.826 45.372 102.577 104.8 203.6 104.8 85.35 0 140.891-41.606 194.6-81.9 49.152-36.915 95.55-71.7 163.8-71.7z" + "M491.055 637.673h-338.784c-12.301-39.564-19.283-81.787-19.283-125.673s6.649-86.109 19.283-125.673h557.548c69.153 0 125.008 56.519 125.008 126.005 0 69.153-55.855 125.34-125.008 125.34h-218.764zM475.096 679.564h-306.868c32.582 74.473 86.442 137.974 153.6 182.192v0c66.161 43.553 145.288 69.153 230.4 69.153 145.288 0 273.288-74.14 348.426-186.514-38.566-39.896-92.758-64.831-152.603-64.831h-272.956zM748.052 344.436c59.844 0 114.036-24.935 152.603-64.831-75.138-112.374-203.138-186.514-348.758-186.514-85.112 0-164.239 25.6-230.4 69.153v0c-67.158 44.551-121.018 107.719-153.6 182.192h580.156z" ], "attrs": [ {} ], + "width": 1071, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "activity" + "logo-elastic-elasticsearch-dk" ] }, "attrs": [ {} ], "properties": { - "order": 12, - "id": 36, - "name": "activity, history, time", - "prevSize": 32, - "code": 59652 + "order": 107, + "id": 210, + "name": "action-ElasticSearch", + "prevSize": 28, + "code": 59730 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 49 + "iconIdx": 5 }, { "icon": { "paths": [ - "M512 0c-35.392 0-64 28.608-64 64v384h-384c-35.392 0-64 28.608-64 64s28.608 64 64 64h384v384c0 35.392 28.608 64 64 64s64-28.608 64-64v-384h384c35.392 0 64-28.608 64-64s-28.608-64-64-64h-384v-384c0-35.392-28.608-64-64-64z" + "M868 443.429c46.857 0 82.857 34.286 82.857 81.143 0 36.571-18.857 62.286-53.143 74.286l-98.286 33.714 32 95.429c2.857 8.571 4 17.714 4 26.857 0 45.143-36.571 82.857-81.714 82.857-36 0-68-22.286-79.429-56.571l-31.429-94.286-177.143 60.571 31.429 93.714c2.857 8.571 4.571 17.714 4.571 26.857 0 44.571-36.571 82.857-82.286 82.857-36 0-67.429-22.286-78.857-56.571l-31.429-93.143-87.429 30.286c-9.143 2.857-18.857 5.143-28.571 5.143-46.286 0-81.143-34.286-81.143-80.571 0-35.429 22.857-67.429 56.571-78.857l89.143-30.286-60-178.857-89.143 30.857c-9.143 2.857-18.286 4.571-27.429 4.571-45.714 0-81.143-34.857-81.143-80.571 0-35.429 22.857-67.429 56.571-78.857l89.714-30.286-30.286-90.857c-2.857-8.571-4.571-17.714-4.571-26.857 0-45.143 36.571-82.857 82.286-82.857 36 0 67.429 22.286 78.857 56.571l30.857 91.429 177.143-60-30.857-91.429c-2.857-8.571-4.571-17.714-4.571-26.857 0-45.143 37.143-82.857 82.286-82.857 36 0 68 22.857 79.429 56.571l30.286 92 92.571-31.429c8-2.286 16-3.429 24.571-3.429 44.571 0 82.857 33.143 82.857 78.857 0 35.429-27.429 65.143-59.429 76l-89.714 30.857 60 180.571 93.714-32c8.571-2.857 17.714-4.571 26.286-4.571zM414.286 593.143l177.143-60-60-180-177.143 61.143z" ], "attrs": [ {} ], + "width": 951, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "add" - ] + "slack" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 13, - "id": 35, - "name": "add, plus", - "prevSize": 32, - "code": 59653 + "order": 1, + "id": 0, + "prevSize": 28, + "code": 59725, + "name": "action-Slack" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 50 + "iconIdx": 6 }, { "icon": { "paths": [ - "M512 102.4c-226.202 0-409.6 183.398-409.6 409.6s183.398 409.6 409.6 409.6c226.202 0 409.6-183.398 409.6-409.6s-183.398-409.6-409.6-409.6zM512 153.6c197.632 0 358.4 160.819 358.4 358.4s-160.768 358.4-358.4 358.4c-197.632 0-358.4-160.819-358.4-358.4s160.768-358.4 358.4-358.4zM691.9 333c-12.893 0.002-25.782 4.882-35.5 14.6l-222.2 221.9-67.7-67.5c-19.19-19.294-51.085-19.215-70.3 0-19.15 19.15-19.15 51.050 0 70.2 0.198 0.2 26.198 26.681 52 53 12.95 13.209 25.761 26.372 35.2 36 4.719 4.814 8.607 8.755 11.2 11.4 1.296 1.322 2.293 2.281 2.9 2.9 0.279 0.282 0.488 0.486 0.6 0.6 0.001 0.001 7.591-7.429 14.6-14.3l-14.5 14.4 0.2 0.2v0.1c19.43 19.327 51.57 19.327 71 0v-0.1l258.1-257.6c19.546-19.447 19.521-51.885-0.1-71.3-9.731-9.679-22.607-14.502-35.5-14.5z" + "M512 26.38l-424.96 242.8v485.64l424.96 242.8 424.96-242.8v-485.64l-424.96-242.8zM512 235.52l245.76 138.24v276.48l-245.76 138.24-245.76-138.24v-276.48l245.76-138.24z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "check-circle" + "orleans" ] }, "attrs": [ {} ], "properties": { - "order": 14, - "id": 34, - "name": "check-circle", - "prevSize": 32, - "code": 59654 + "order": 99, + "id": 209, + "name": "orleans", + "prevSize": 28, + "code": 59723 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 51 + "iconIdx": 7 }, { "icon": { "paths": [ - "M512 1024c-282.778 0-512-229.222-512-512s229.222-512 512-512 512 229.222 512 512-229.222 512-512 512zM855.808 270.592c-19.2-19.2-50.278-19.2-69.478 0l-376.73 376.73-171.878-171.93c-19.2-19.2-50.278-19.2-69.478 0s-19.2 50.278 0 69.478c0 0 201.523 205.261 204.8 208.486 9.984 10.138 23.347 14.643 36.557 14.080 13.21 0.563 26.573-3.942 36.608-14.029 3.277-3.226 409.6-413.286 409.6-413.286 19.2-19.2 19.2-50.33 0-69.53z" + "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v204.8h51.2v-204.8h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-307.2v51.2h307.2c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4z", + "M153.6 640v281.6h358.4v-281.6zM179.2 640v-76.8c0-84.48 69.12-153.6 153.6-153.6s153.6 69.12 153.6 153.6v76.8h-51.2v-76.8c0-56.32-46.080-102.4-102.4-102.4s-102.4 46.080-102.4 102.4v76.8z" ], "attrs": [ + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "check-circle-filled" + "document-lock" ] }, "attrs": [ + {}, {} ], "properties": { - "order": 27, - "id": 33, - "name": "check-circle-filled", - "prevSize": 32, - "code": 59655 + "order": 97, + "id": 208, + "name": "document-lock", + "prevSize": 28, + "code": 59721 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 52 + "iconIdx": 8 }, { "icon": { "paths": [ - "M601.024 512l276.736 276.736c24.512 24.576 24.512 64.384 0 89.024-24.64 24.576-64.384 24.576-89.024 0l-276.736-276.736-276.736 276.736c-24.512 24.576-64.384 24.576-89.024 0-24.512-24.64-24.512-64.448 0-89.024l276.736-276.736-276.736-276.736c-24.512-24.576-24.512-64.384 0-89.024 24.64-24.576 64.512-24.576 89.024 0l276.736 276.736 276.736-276.736c24.64-24.576 64.384-24.576 89.024 0 24.512 24.64 24.512 64.448 0 89.024l-276.736 276.736z" + "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v153.6h51.2v-153.6h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-292.2zM716.8 189.8l117.4 117.4h-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7z", + "M102.4 357.532h460.8v52.068h-460.8v-52.068z" ], "attrs": [ + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "close" + "document-unpublish" ] }, "attrs": [ + {}, {} ], "properties": { - "order": 28, - "id": 32, - "name": "close", - "prevSize": 32, - "code": 59656 - }, - "setIdx": 0, + "order": 96, + "id": 207, + "name": "document-unpublish", + "prevSize": 28, + "code": 59711 + }, + "setIdx": 1, "setId": 1, - "iconIdx": 53 + "iconIdx": 9 }, { "icon": { "paths": [ - "M409.6 435.2h-153.6v51.2h153.6v-51.2zM409.6 332.8h-153.6v51.2h153.6v-51.2zM256 691.2h409.6v-51.2h-409.6v51.2zM409.6 230.4h-153.6v51.2h153.6v-51.2zM870.4 179.2h-51.2v-51.2c0-28.262-22.938-51.2-51.2-51.2h-614.4c-28.262 0-51.2 22.938-51.2 51.2v665.6c0 28.262 22.938 51.2 51.2 51.2h51.2v51.2c0 28.262 22.938 51.2 51.2 51.2h614.4c28.262 0 51.2-22.938 51.2-51.2v-665.6c0-28.262-22.938-51.2-51.2-51.2zM179.2 793.6c-14.157 0-25.6-11.443-25.6-25.6v-614.4c0-14.131 11.443-25.6 25.6-25.6h563.2c14.157 0 25.6 11.469 25.6 25.6v614.4c0 14.157-11.443 25.6-25.6 25.6h-563.2zM870.4 870.4c0 14.157-11.443 25.6-25.6 25.6h-563.2c-14.157 0-25.6-11.443-25.6-25.6v-25.6h512c28.262 0 51.2-22.938 51.2-51.2v-563.2h25.6c14.157 0 25.6 11.469 25.6 25.6v614.4zM614.4 230.4h-102.4c-28.262 0-51.2 22.938-51.2 51.2v153.6c0 28.262 22.938 51.2 51.2 51.2h102.4c28.262 0 51.2-22.938 51.2-51.2v-153.6c0-28.262-22.938-51.2-51.2-51.2zM614.4 435.2h-102.4v-153.6h102.4v153.6zM256 588.8h409.6v-51.2h-409.6v51.2z" + "M614.286 420.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8-5.714 13.143-5.714 4.571 0 9.714 2.286 13.143 5.714l224.571 224.571 224.571-224.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8.571 5.714 13.143z" ], "attrs": [ {} ], + "width": 658, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "content" - ] + "angle-down" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 37, - "id": 31, - "name": "type-References", - "prevSize": 32, - "code": 59657 + "order": 1, + "id": 1, + "prevSize": 28, + "code": 59648, + "name": "angle-down" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 54 + "iconIdx": 10 }, { "icon": { "paths": [ - "M793.6 844.8c0 14.157-11.443 25.6-25.6 25.6h-665.6c-14.131 0-25.6-11.443-25.6-25.6v-665.6c0-14.157 11.469-25.6 25.6-25.6h665.6c14.157 0 25.6 11.443 25.6 25.6v102.4h51.2v-128c0-28.262-22.938-51.2-51.2-51.2h-716.8c-28.262 0-51.2 22.938-51.2 51.2v716.8c0 28.262 22.938 51.2 51.2 51.2h716.8c28.262 0 51.2-22.938 51.2-51.2v-281.6h-51.2v256zM991.078 237.747c-9.958-9.958-26.035-9.958-35.968 0l-391.91 391.91-238.31-238.31c-9.958-9.958-26.061-9.958-35.942 0-9.958 9.907-9.958 26.010 0 35.942l254.874 254.874c0.461 0.538 0.614 1.203 1.126 1.69 5.043 5.018 11.674 7.475 18.278 7.373 6.605 0.102 13.235-2.355 18.278-7.373 0.512-0.512 0.666-1.178 1.126-1.69l408.448-408.474c9.933-9.933 9.933-26.035 0-35.942z" + "M358.286 310.857c0 4.571-2.286 9.714-5.714 13.143l-224.571 224.571 224.571 224.571c3.429 3.429 5.714 8.571 5.714 13.143s-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-266.286-266.286c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l28.571 28.571c3.429 3.429 5.714 8 5.714 13.143z" ], "attrs": [ {} ], + "width": 384, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "control-checkbox" - ] + "angle-left" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 38, - "id": 30, - "name": "control-Checkbox", - "prevSize": 32, - "code": 59658 + "order": 2, + "id": 0, + "prevSize": 28, + "code": 59649, + "name": "angle-left" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 55 + "iconIdx": 11 }, { "icon": { "paths": [ - "M51.2 0c-28.262 0-51.2 22.938-51.2 51.2v281.6c0 28.262 22.938 51.2 51.2 51.2h921.6c28.262 0 51.2-22.938 51.2-51.2v-281.6c0-28.262-22.938-51.2-51.2-51.2h-921.6zM76.8 51.2h512v281.6h-512c-14.157 0-25.6-11.443-25.6-25.6v-230.4c0-14.157 11.443-25.6 25.6-25.6zM640 51.2h307.2c14.157 0 25.6 11.443 25.6 25.6v230.4c0 14.157-11.443 25.6-25.6 25.6h-307.2v-281.6zM716.8 153.6c-0.41 0.358 89.139 102.938 89.6 102.4 0.512 0 89.6-95.36 89.6-102.4 0 0.384-172.16 0-179.2 0zM128 435.2c-42.394 0-76.8 34.406-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.406 76.8-76.8s-34.406-76.8-76.8-76.8zM128 486.4c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 486.4c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 640c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 691.2c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 691.2c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640zM128 844.8c-42.394 0-76.8 34.381-76.8 76.8s34.406 76.8 76.8 76.8c42.394 0 76.8-34.381 76.8-76.8s-34.406-76.8-76.8-76.8zM128 896c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6zM307.2 896c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h640c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-640z" + "M340 548.571c0 4.571-2.286 9.714-5.714 13.143l-266.286 266.286c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8-5.714-13.143 0-4.571 2.286-9.714 5.714-13.143l224.571-224.571-224.571-224.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l28.571-28.571c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z" ], "attrs": [ {} ], + "width": 347, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "control-dropdown" - ] + "angle-right" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 39, - "id": 29, - "name": "control-Dropdown", - "prevSize": 32, - "code": 59659 + "order": 67, + "id": 0, + "prevSize": 28, + "code": 59697, + "name": "angle-right" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 56 + "iconIdx": 12 }, { "icon": { "paths": [ - "M512 0c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h128v870.4h-128c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h307.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-128v-870.4h128c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-307.2zM51.2 204.8c-28.262 0-51.2 22.938-51.2 51.2v460.8c0 28.262 22.938 51.2 51.2 51.2h537.6v-51.2h-512c-14.131 0-25.6-11.443-25.6-25.6v-409.6c0-14.157 11.469-25.6 25.6-25.6h512v-51.2h-537.6zM742.4 204.8v51.2h204.8c14.157 0 25.6 11.443 25.6 25.6v409.6c0 14.157-11.443 25.6-25.6 25.6h-204.8v51.2h230.4c28.262 0 51.2-22.938 51.2-51.2v-460.8c0-28.262-22.938-51.2-51.2-51.2h-230.4zM285.9 307c-0.589 0.051-1.161 0.048-1.75 0.15-8.243 0.051-16.396 4.474-20.85 13.050l-132.55 306.25c-6.656 12.749-2.866 28.981 8.5 36.2 11.341 7.219 25.97 2.749 32.6-10l27.65-63.85h170.5c0.512 0 0.914-0.224 1.4-0.25l27.45 64.050c6.63 12.749 21.136 17.269 32.4 10.050s15.005-23.451 8.4-36.2l-131.3-306.25c-4.454-8.576-12.432-12.973-20.65-13.050-0.614-0.102-1.211-0.099-1.8-0.15zM285.9 389.15l63.65 148.45h-127.9l64.25-148.45z" + "M614.286 676.571c0 4.571-2.286 9.714-5.714 13.143l-28.571 28.571c-3.429 3.429-8 5.714-13.143 5.714-4.571 0-9.714-2.286-13.143-5.714l-224.571-224.571-224.571 224.571c-3.429 3.429-8.571 5.714-13.143 5.714s-9.714-2.286-13.143-5.714l-28.571-28.571c-3.429-3.429-5.714-8.571-5.714-13.143s2.286-9.714 5.714-13.143l266.286-266.286c3.429-3.429 8.571-5.714 13.143-5.714s9.714 2.286 13.143 5.714l266.286 266.286c3.429 3.429 5.714 8.571 5.714 13.143z" ], "attrs": [ {} ], + "width": 658, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "control-input" - ] + "angle-up" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 41, - "id": 28, - "name": "control-Input", - "prevSize": 32, - "code": 59660 + "order": 2, + "id": 2, + "prevSize": 28, + "code": 59651, + "name": "angle-up" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 57 + "iconIdx": 13 }, { "icon": { "paths": [ - "M153.6 716.8c-84.787 0-153.6 68.813-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.813 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 972.8c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM384 179.2h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6zM998.4 486.4h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM153.6 0c-84.787 0-153.6 68.787-153.6 153.6s68.813 153.6 153.6 153.6c84.787 0 153.6-68.787 153.6-153.6s-68.813-153.6-153.6-153.6zM153.6 256c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 358.4c-84.787 0-153.6 68.787-153.6 153.6 0 84.787 68.813 153.6 153.6 153.6s153.6-68.813 153.6-153.6c0-84.813-68.813-153.6-153.6-153.6zM153.6 614.4c-56.55 0-102.4-45.85-102.4-102.4s45.85-102.4 102.4-102.4c56.55 0 102.4 45.85 102.4 102.4s-45.85 102.4-102.4 102.4zM153.6 102.4c-28.262 0-51.2 22.938-51.2 51.2s22.938 51.2 51.2 51.2c28.262 0 51.2-22.938 51.2-51.2s-22.938-51.2-51.2-51.2zM998.4 844.8h-614.4c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h614.4c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6z" + "M592 393.6h-156.8c-57.6 0-105.6-48-105.6-105.6v-182.4c0-57.6 48-105.6 105.6-105.6h156.8c57.6 0 105.6 48 105.6 105.6v182.4c-3.2 57.6-48 105.6-105.6 105.6zM432 64c-22.4 0-41.6 19.2-41.6 41.6v182.4c0 22.4 19.2 41.6 41.6 41.6h156.8c22.4 0 41.6-19.2 41.6-41.6v-182.4c0-22.4-19.2-41.6-41.6-41.6h-156.8z", + "M195.2 1024c-105.6 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c3.2 105.6-86.4 195.2-195.2 195.2zM195.2 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 134.4 131.2 134.4 73.6 0 131.2-60.8 131.2-131.2 3.2-73.6-57.6-134.4-131.2-134.4z", + "M828.8 1024c-108.8 0-195.2-89.6-195.2-195.2 0-108.8 89.6-195.2 195.2-195.2s195.2 89.6 195.2 195.2c0 105.6-89.6 195.2-195.2 195.2zM828.8 694.4c-73.6 0-131.2 60.8-131.2 131.2 0 73.6 60.8 131.2 131.2 131.2 73.6 0 131.2-60.8 131.2-131.2s-60.8-131.2-131.2-131.2z", + "M332.8 640c-6.4 0-12.8 0-16-3.2-16-9.6-19.2-28.8-9.6-44.8l83.2-137.6c9.6-16 28.8-19.2 44.8-9.6s19.2 28.8 9.6 44.8l-83.2 137.6c-6.4 6.4-16 12.8-28.8 12.8z", + "M691.2 640c-9.6 0-22.4-6.4-28.8-16l-83.2-137.6c-9.6-16-3.2-35.2 9.6-44.8s35.2-3.2 44.8 9.6l83.2 137.6c9.6 16 3.2 35.2-9.6 44.8-6.4 6.4-12.8 6.4-16 6.4z" ], "attrs": [ + {}, + {}, + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "control-radio" + "api" ] }, "attrs": [ + {}, + {}, + {}, + {}, {} ], "properties": { - "order": 42, - "id": 27, - "name": "control-Radio", - "prevSize": 32, - "code": 59661 + "order": 94, + "id": 206, + "name": "api", + "prevSize": 28, + "code": 59717 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 58 + "iconIdx": 14 }, { "icon": { "paths": [ - "M0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8h-204.8zM819.2 0v204.8h204.8v-204.8h-204.8zM51.2 51.2h102.4v102.4h-102.4v-102.4zM870.4 51.2h102.4v102.4h-102.4v-102.4zM281.6 76.8v51.2h102.4v-51.2h-102.4zM486.4 76.8v51.2h102.4v-51.2h-102.4zM691.2 76.8v51.2h102.4v-51.2h-102.4zM333.25 204.8c-7.091-0.307-14.348 2.097-19.75 7.55l-74.75 74.75c-10.317 10.291-10.317 27.083 0 37.4s27.059 10.317 37.35 0l68.45-68.5h141.85v486.4h-50.7c-7.117-0.307-14.348 2.097-19.75 7.55l-23.6 23.55c-10.317 10.317-10.317 27.083 0 37.4 10.291 10.317 27.109 10.317 37.4 0l17.25-17.3h129.75l18.050 18c10.394 10.368 27.181 10.368 37.6 0 10.368-10.394 10.368-27.181 0-37.6l-24-24c-5.478-5.478-12.682-7.907-19.85-7.6h-50.95v-486.4h141.55l69.25 69.2c10.394 10.368 27.155 10.368 37.6 0 10.368-10.368 10.368-27.181 0-37.6l-75.2-75.2c-5.478-5.478-12.706-7.907-19.9-7.6h-357.65zM896 281.6v102.4h51.2v-102.4h-51.2zM76.8 384v102.4h51.2v-102.4h-51.2zM896 486.4v102.4h51.2v-102.4h-51.2zM76.8 588.8v102.4h51.2v-102.4h-51.2zM896 691.2v102.4h51.2v-102.4h-51.2zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6h-51.2zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8h-204.8zM51.2 870.4h102.4v102.4h-102.4v-102.4zM870.4 870.4h102.4v102.4h-102.4v-102.4zM384 896v51.2h102.4v-51.2h-102.4zM588.8 896v51.2h102.4v-51.2h-102.4z" + "M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z", + "M771.2 860.8h-438.4c-12.8 0-22.4-6.4-28.8-19.2s-3.2-25.6 3.2-35.2l300.8-355.2c6.4-6.4 16-12.8 25.6-12.8s19.2 6.4 25.6 12.8l192 275.2c3.2 3.2 3.2 6.4 3.2 9.6 16 44.8 3.2 73.6-6.4 89.6-22.4 32-70.4 35.2-76.8 35.2zM403.2 796.8h371.2c6.4 0 22.4-3.2 25.6-9.6 3.2-3.2 3.2-12.8 0-25.6l-166.4-236.8-230.4 272z", + "M332.8 502.4c-76.8 0-140.8-64-140.8-140.8s64-140.8 140.8-140.8 140.8 64 140.8 140.8-60.8 140.8-140.8 140.8zM332.8 284.8c-41.6 0-76.8 32-76.8 76.8s35.2 76.8 76.8 76.8 76.8-35.2 76.8-76.8-32-76.8-76.8-76.8z" ], "attrs": [ + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "control-textarea" + "assets" ] }, "attrs": [ + {}, + {}, {} ], "properties": { - "order": 17, - "id": 26, - "name": "control-TextArea", - "prevSize": 32, - "code": 59662 + "order": 95, + "id": 205, + "name": "assets", + "prevSize": 28, + "code": 59720 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 59 + "iconIdx": 15 }, { "icon": { "paths": [ - "M332.8 25.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 76.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM332.8 128c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM332.8 179.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8zM332.8 537.6c-127.258 0-230.4 103.142-230.4 230.4s103.142 230.4 230.4 230.4h358.4c127.258 0 230.4-103.142 230.4-230.4s-103.142-230.4-230.4-230.4h-358.4zM332.8 588.8h358.4c98.97 0 179.2 80.23 179.2 179.2s-80.23 179.2-179.2 179.2h-358.4c-98.97 0-179.2-80.23-179.2-179.2s80.23-179.2 179.2-179.2zM691.2 640c-70.707 0-128 57.293-128 128s57.293 128 128 128c70.707 0 128-57.293 128-128s-57.293-128-128-128zM691.2 691.2c42.419 0 76.8 34.381 76.8 76.8s-34.381 76.8-76.8 76.8c-42.419 0-76.8-34.381-76.8-76.8s34.381-76.8 76.8-76.8z" + "M932.571 548.571c0 20-16.571 36.571-36.571 36.571h-128c0 71.429-15.429 125.143-38.286 165.714l118.857 119.429c14.286 14.286 14.286 37.143 0 51.429-6.857 7.429-16.571 10.857-25.714 10.857s-18.857-3.429-25.714-10.857l-113.143-112.571s-74.857 68.571-172 68.571v-512h-73.143v512c-103.429 0-178.857-75.429-178.857-75.429l-104.571 118.286c-7.429 8-17.143 12-27.429 12-8.571 0-17.143-2.857-24.571-9.143-14.857-13.714-16-36.571-2.857-52l115.429-129.714c-20-39.429-33.143-90.286-33.143-156.571h-128c-20 0-36.571-16.571-36.571-36.571s16.571-36.571 36.571-36.571h128v-168l-98.857-98.857c-14.286-14.286-14.286-37.143 0-51.429s37.143-14.286 51.429 0l98.857 98.857h482.286l98.857-98.857c14.286-14.286 37.143-14.286 51.429 0s14.286 37.143 0 51.429l-98.857 98.857v168h128c20 0 36.571 16.571 36.571 36.571zM658.286 219.429h-365.714c0-101.143 81.714-182.857 182.857-182.857s182.857 81.714 182.857 182.857z" ], "attrs": [ {} ], + "width": 951, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "control-toggle" - ] + "bug" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 16, - "id": 25, - "name": "control-Toggle", - "prevSize": 32, - "code": 59663 + "order": 1, + "id": 0, + "prevSize": 28, + "code": 59709, + "name": "bug" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 60 + "iconIdx": 16 }, { "icon": { "paths": [ - "M204.8 51.2c-56.525 0-102.4 45.875-102.4 102.4v512c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4h-409.6zM204.8 102.4h409.6c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2v-512c0-28.314 22.938-51.2 51.2-51.2zM768 204.8v51.2c28.262 0 51.2 22.886 51.2 51.2v512c0 28.314-22.938 51.2-51.2 51.2h-409.6c-28.262 0-51.2-22.886-51.2-51.2h-51.2c0 56.525 45.875 102.4 102.4 102.4h409.6c56.525 0 102.4-45.875 102.4-102.4v-512c0-56.525-45.875-102.4-102.4-102.4z" + "M585.143 402.286c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857s-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714 0-20 16.571-36.571 36.571-36.571h512c20 0 36.571 16.571 36.571 36.571z" ], "attrs": [ {} ], + "width": 585, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "copy" - ] + "caret-down" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 90, - "id": 24, - "name": "copy", - "prevSize": 32, - "code": 59664 + "order": 4, + "id": 4, + "prevSize": 28, + "code": 59692, + "name": "caret-down" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 61 + "iconIdx": 17 }, { "icon": { "paths": [ - "M828.8 1024h-633.6c-105.6 0-195.2-89.6-195.2-195.2v-320c0-281.6 227.2-508.8 505.6-508.8 288 0 518.4 230.4 518.4 518.4v310.4c0 105.6-89.6 195.2-195.2 195.2zM505.6 64c-243.2 0-441.6 198.4-441.6 441.6v320c0 73.6 60.8 134.4 131.2 134.4h630.4c73.6 0 131.2-60.8 131.2-131.2v-310.4c3.2-249.6-201.6-454.4-451.2-454.4z", - "M512 668.8c-3.2 0-6.4 0-6.4 0-32-3.2-64-19.2-80-48l-192-278.4c-9.6-9.6-9.6-25.6-0-38.4 9.6-9.6 25.6-12.8 38.4-6.4l294.4 172.8c28.8 16 48 44.8 51.2 76.8s-6.4 64-28.8 89.6c-19.2 22.4-48 32-76.8 32zM364.8 428.8l108.8 160c6.4 9.6 19.2 19.2 32 19.2s25.6-3.2 35.2-12.8c9.6-9.6 12.8-22.4 9.6-35.2s-9.6-22.4-19.2-32l-166.4-99.2z", - "M678.4 364.8c-6.4 0-12.8-3.2-19.2-6.4-16-9.6-19.2-28.8-9.6-44.8l54.4-83.2c9.6-16 28.8-19.2 44.8-9.6 19.2 12.8 22.4 35.2 12.8 48l-54.4 83.2c-6.4 9.6-16 12.8-28.8 12.8z" + "M365.714 256v512c0 20-16.571 36.571-36.571 36.571-9.714 0-18.857-4-25.714-10.857l-256-256c-6.857-6.857-10.857-16-10.857-25.714s4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857 20 0 36.571 16.571 36.571 36.571z" ], "attrs": [ - {}, - {}, {} ], + "width": 402, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "dashboard" - ] + "caret-left" + ], + "grid": 14 }, "attrs": [ - {}, - {}, {} ], "properties": { - "order": 26, - "id": 23, - "name": "dashboard", - "prevSize": 32, - "code": 59665 + "order": 2, + "id": 6, + "prevSize": 28, + "code": 59690, + "name": "caret-left" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 62 + "iconIdx": 18 }, { "icon": { "paths": [ - "M597.35 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.418 25.6 25.6 25.6zM776.55 204.8h-153.6v-51.2c0-28.314-22.886-51.2-51.2-51.2h-102.4c-28.262 0-51.2 22.886-51.2 51.2v51.2h-153.6c-28.262 0-51.2 22.886-51.2 51.2v102.4c0 28.314 22.938 51.2 51.2 51.2v460.8c0 28.314 22.938 51.2 51.2 51.2h409.6c28.314 0 51.2-22.886 51.2-51.2v-460.8c28.314 0 51.2-22.886 51.2-51.2v-102.4c0-28.314-22.938-51.2-51.2-51.2zM469.35 153.6h102.4v51.2h-102.4v-51.2zM725.35 870.4h-409.6v-460.8h409.6v460.8zM776.55 358.4h-512v-102.4h512v102.4zM443.75 819.2c14.131 0 25.6-11.469 25.6-25.6v-307.2c0-14.080-11.469-25.6-25.6-25.6s-25.6 11.52-25.6 25.6v307.2c0 14.131 11.469 25.6 25.6 25.6z" + "M329.143 512c0 9.714-4 18.857-10.857 25.714l-256 256c-6.857 6.857-16 10.857-25.714 10.857-20 0-36.571-16.571-36.571-36.571v-512c0-20 16.571-36.571 36.571-36.571 9.714 0 18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z" ], "attrs": [ {} ], + "width": 329, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "delete" - ] + "caret-right" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 29, - "id": 22, - "name": "delete, bin", - "prevSize": 32, - "code": 59666 + "order": 1, + "id": 7, + "prevSize": 28, + "code": 59689, + "name": "caret-right" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 63 + "iconIdx": 19 }, { "icon": { "paths": [ - "M832 128h-192v-64c0-35.392-28.608-64-64-64h-128c-35.328 0-64 28.608-64 64v64h-192c-35.328 0-64 28.608-64 64v128c0 35.392 28.672 64 64 64v512c0 35.392 28.672 64 64 64h512c35.392 0 64-28.608 64-64v-512c35.392 0 64-28.608 64-64v-128c0-35.392-28.608-64-64-64zM448 64h128v64h-128v-64zM448 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM640 800c0 17.664-14.336 32-32 32s-32-14.336-32-32v-320c0-17.6 14.336-32 32-32s32 14.4 32 32v320zM832 320h-640v-128h640v128z" + "M585.143 694.857c0 20-16.571 36.571-36.571 36.571h-512c-20 0-36.571-16.571-36.571-36.571 0-9.714 4-18.857 10.857-25.714l256-256c6.857-6.857 16-10.857 25.714-10.857s18.857 4 25.714 10.857l256 256c6.857 6.857 10.857 16 10.857 25.714z" ], "attrs": [ {} ], + "width": 585, "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "delete-filled" - ] + "caret-up" + ], + "grid": 14 }, "attrs": [ {} ], "properties": { - "order": 36, - "id": 21, - "name": "delete-filled", - "prevSize": 32, - "code": 59667 + "order": 3, + "id": 5, + "prevSize": 28, + "code": 59691, + "name": "caret-up" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 64 + "iconIdx": 20 }, { "icon": { "paths": [ - "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c98.816 0 179.2 80.384 179.2 179.2s-80.384 179.2-179.2 179.2c-98.816 0-179.2-80.384-179.2-179.2s80.384-179.2 179.2-179.2zM227.2 665.6c-12.39 0-22.4 10.061-22.4 22.4v6.4c0 12.39 10.010 22.4 22.4 22.4h211.2c12.39 0 22.4-10.010 22.4-22.4v-6.4c0-12.39-10.061-22.4-22.4-22.4h-211.2z" + "M800 1024h-576c-124.8 0-224-99.2-224-224v-576c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v576c0 124.8-99.2 224-224 224zM224 64c-89.6 0-160 70.4-160 160v576c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-576c0-89.6-70.4-160-160-160h-576z", + "M480 448h-211.2c-57.6 0-105.6-48-105.6-105.6v-73.6c0-57.6 48-105.6 105.6-105.6h211.2c57.6 0 105.6 48 105.6 105.6v73.6c0 57.6-48 105.6-105.6 105.6zM268.8 227.2c-22.4 0-41.6 19.2-41.6 41.6v73.6c0 22.4 19.2 41.6 41.6 41.6h211.2c22.4 0 41.6-19.2 41.6-41.6v-73.6c0-22.4-19.2-41.6-41.6-41.6h-211.2z", + "M828.8 611.2h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z", + "M553.6 777.6h-358.4c-19.2 0-32-12.8-32-32s12.8-32 32-32h355.2c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z" ], "attrs": [ + {}, + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "document-delete" + "content" ] }, "attrs": [ + {}, + {}, + {}, {} ], "properties": { - "order": 35, - "id": 20, - "name": "document-delete", - "prevSize": 32, - "code": 59668 + "order": 93, + "id": 204, + "name": "contents, trigger-ContentChanged", + "prevSize": 28, + "code": 59718 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 65 + "iconIdx": 21 }, { "icon": { "paths": [ - "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8c-127.232 0-230.4 103.168-230.4 230.4s103.168 230.4 230.4 230.4c127.232 0 230.4-103.168 230.4-230.4s-103.168-230.4-230.4-230.4zM332.8 512c39.934 0 76.475 13.533 106.3 35.7l-250.4 249c-21.807-29.683-35.1-65.924-35.1-105.5 0-98.816 80.384-179.2 179.2-179.2zM477 585.7c21.785 29.674 35 65.947 35 105.5 0 98.816-80.384 179.2-179.2 179.2-39.906 0-76.386-13.561-106.2-35.7l250.4-249z" + "M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "document-disable" + "control-date" ] }, "attrs": [ {} ], "properties": { - "order": 40, - "id": 19, - "name": "document-disable", - "prevSize": 32, - "code": 59669 + "order": 71, + "id": 42, + "name": "control-Date", + "prevSize": 28, + "code": 59702 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 66 + "iconIdx": 22 }, { "icon": { "paths": [ - "M358.4 102.4c-28.314 0-51.2 22.886-51.2 51.2v256h51.2v-256h307.2v153.6c0 28.314 22.886 51.2 51.2 51.2h153.6v512h-358.4v51.2h358.4c28.314 0 51.2-22.886 51.2-51.2v-548.2l-219.8-219.8h-343.4zM716.8 189.8l117.4 117.4h-117.4v-117.4zM332.8 460.8l-230.4 256v51.2h102.4v153.6h256v-153.6h102.4v-51.2l-230.4-256zM332.8 537.3l161.5 179.5h-84.7v153.6h-153.6v-153.6h-84.7l161.5-179.5z" + "M486.4 409.6h51.2c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6zM230.4 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM230.4 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM51.2 742.4v-435.2h665.6v102.4h51.2v-281.6c0-42.342-34.458-76.8-76.8-76.8h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-256v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v614.4c0 42.342 34.458 76.8 76.8 76.8h332.8v-51.2h-332.8c-14.080 0-25.6-11.469-25.6-25.6zM51.2 128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h256v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128h-665.6v-128zM384 409.6c14.080 0 25.6 11.52 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.52-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM742.4 460.8c-155.546 0-281.6 126.054-281.6 281.6s126.054 281.6 281.6 281.6 281.6-126.054 281.6-281.6-126.054-281.6-281.6-281.6zM742.4 972.8c-127.232 0-230.4-103.168-230.4-230.4s103.168-230.4 230.4-230.4 230.4 103.168 230.4 230.4-103.168 230.4-230.4 230.4zM384 512c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM384 614.4c14.080 0 25.6 11.469 25.6 25.6s-11.52 25.6-25.6 25.6h-51.2c-14.080 0-25.6-11.469-25.6-25.6s11.52-25.6 25.6-25.6h51.2zM844.8 716.8c14.131 0 25.6 11.469 25.6 25.6s-11.469 25.6-25.6 25.6h-102.4c-14.131 0-25.6-11.469-25.6-25.6v-102.4c0-14.131 11.469-25.6 25.6-25.6s25.6 11.469 25.6 25.6v76.8h76.8z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "document-publish" + "control-date-time" ] }, "attrs": [ {} ], "properties": { - "order": 44, - "id": 18, - "name": "document-publish", - "prevSize": 32, - "code": 59670 + "order": 70, + "id": 41, + "name": "control-DateTime", + "prevSize": 28, + "code": 59703 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 67 + "iconIdx": 23 }, { "icon": { "paths": [ - "M665.6 51.2v102.4h102.4v-102.4h-102.4zM460.8 153.6h102.4v-102.4h-102.4v102.4zM460.8 358.4h102.4v-102.4h-102.4v102.4zM665.6 358.4h102.4v-102.4h-102.4v102.4zM665.6 563.2h102.4v-102.4h-102.4v102.4zM460.8 563.2h102.4v-102.4h-102.4v102.4zM460.8 768h102.4v-102.4h-102.4v102.4zM665.6 768h102.4v-102.4h-102.4v102.4zM665.6 972.8h102.4v-102.4h-102.4v102.4zM460.8 972.8h102.4v-102.4h-102.4v102.4zM256 153.6h102.4v-102.4h-102.4v102.4zM256 358.4h102.4v-102.4h-102.4v102.4zM256 563.2h102.4v-102.4h-102.4v102.4zM256 768h102.4v-102.4h-102.4v102.4zM256 972.8h102.4v-102.4h-102.4v102.4z" + "M793.6 609.416h-61.838v-28.108h-0.783q-21.135 33.092-62.034 33.092-37.573 0-60.469-26.912-22.896-27.112-22.896-75.554 0-50.635 25.244-81.136t66.144-30.501q38.747 0 54.011 28.308h0.783v-121.405h61.838v302.216zM732.936 510.139v-15.35q0-19.935-11.35-33.092t-29.549-13.157q-20.548 0-32.093 16.546-11.546 16.347-11.546 45.053 0 26.912 11.154 41.465t30.919 14.553q18.786 0 30.528-15.35 11.937-15.35 11.937-40.668zM548.594 609.416h-61.643v-116.421q0-44.455-32.093-44.455-15.264 0-24.853 13.357t-9.589 33.292v114.228h-61.839v-117.617q0-43.259-31.506-43.259-15.851 0-25.44 12.758-9.393 12.758-9.393 34.687v113.431h-61.838v-204.135h61.838v31.896h0.783q9.589-16.347 26.81-26.514 17.417-10.366 37.964-10.366 42.465 0 58.12 38.076 22.896-38.076 67.318-38.076 65.361 0 65.361 82.133v126.987zM0 0v204.8h76.8v76.8h51.2v-76.8h76.8v-204.8zM819.2 0v204.8h204.8v-204.8zM51.2 51.2h102.4v102.4h-102.4zM870.4 51.2h102.4v102.4h-102.4zM281.6 76.8v51.2h102.4v-51.2zM486.4 76.8v51.2h102.4v-51.2zM691.2 76.8v51.2h102.4v-51.2zM896 281.6v102.4h51.2v-102.4zM76.8 384v102.4h51.2v-102.4zM896 486.4v102.4h51.2v-102.4zM76.8 588.8v102.4h51.2v-102.4zM896 691.2v102.4h51.2v-102.4zM76.8 793.6v25.6h-76.8v204.8h204.8v-76.8h76.8v-51.2h-76.8v-76.8h-76.8v-25.6zM819.2 819.2v76.8h-25.6v51.2h25.6v76.8h204.8v-204.8zM51.2 870.4h102.4v102.4h-102.4zM870.4 870.4h102.4v102.4h-102.4zM384 896v51.2h102.4v-51.2zM588.8 896v51.2h102.4v-51.2z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "drag" + "control-Markdown" ] }, "attrs": [ {} ], "properties": { - "order": 43, - "id": 17, - "name": "drag", - "prevSize": 32, - "code": 59671 + "order": 72, + "id": 43, + "name": "control-Markdown", + "prevSize": 28, + "code": 59704 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 68 + "iconIdx": 24 }, { "icon": { "paths": [ - "M921.6 281.958c0-70.707-171.878-128.154-384-128.154s-384 57.19-384 127.898c0 10.035 3.789 19.712 10.342 29.030 0-0.051 296.858 406.067 296.858 406.067v256l153.6-51.2v-204.8c0 0 298.752-408.166 299.725-409.702 0 0 7.475-16.64 7.475-25.139zM537.6 204.8c206.899 0 318.208 53.248 332.083 76.8-13.875 23.552-125.184 76.8-332.083 76.8s-318.208-53.248-332.083-76.8c13.875-23.552 125.184-76.8 332.083-76.8zM869.376 345.856v0 0zM573.030 686.592c-6.4 8.755-9.83 19.354-9.83 30.208v167.885l-51.2 17.050v-184.934c0-10.854-3.43-21.453-9.83-30.208l-228.147-312.115c68.762 21.709 161.382 35.123 263.578 35.123 102.298 0 195.021-13.414 263.834-35.174-0.102 0.051-0.205 0.051-0.307 0.102l-228.096 312.064z" + "M292.571 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM292.571 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 713.143v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM658.286 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 420.571v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857zM1024 128v109.714c0 30.286-24.571 54.857-54.857 54.857h-182.857c-30.286 0-54.857-24.571-54.857-54.857v-109.714c0-30.286 24.571-54.857 54.857-54.857h182.857c30.286 0 54.857 24.571 54.857 54.857z" ], - "attrs": [ - {} + "width": 1024, + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "th" ], + "defaultCode": 61450, + "grid": 14 + }, + "attrs": [], + "properties": { + "name": "grid", + "id": 14, + "order": 83, + "prevSize": 28, + "code": 61450 + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 25 + }, + { + "icon": { + "paths": [ + "M877.714 768v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 475.429v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571zM877.714 182.857v73.143c0 20-16.571 36.571-36.571 36.571h-804.571c-20 0-36.571-16.571-36.571-36.571v-73.143c0-20 16.571-36.571 36.571-36.571h804.571c20 0 36.571 16.571 36.571 36.571z" + ], + "width": 877.7142857142857, + "attrs": [], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "filter" - ] + "bars", + "navicon", + "reorder" + ], + "defaultCode": 61641, + "grid": 14 }, - "attrs": [ - {} - ], + "attrs": [], "properties": { - "order": 18, - "id": 16, - "name": "filter", - "prevSize": 32, - "code": 59672 + "name": "list", + "id": 178, + "order": 89, + "prevSize": 28, + "code": 61641 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 69 + "iconIdx": 26 }, { "icon": { "paths": [ - "M512 0c-282.88 0-512 229.248-512 512 0 226.24 146.688 418.112 350.080 485.76 25.6 4.8 35.008-11.008 35.008-24.64 0-12.16-0.448-44.352-0.64-87.040-142.464 30.912-172.48-68.672-172.48-68.672-23.296-59.136-56.96-74.88-56.96-74.88-46.4-31.744 3.584-31.104 3.584-31.104 51.392 3.584 78.4 52.736 78.4 52.736 45.696 78.272 119.872 55.68 149.12 42.56 4.608-33.088 17.792-55.68 32.448-68.48-113.728-12.8-233.216-56.832-233.216-252.992 0-55.872 19.84-101.568 52.672-137.408-5.76-12.928-23.040-64.96 4.48-135.488 0 0 42.88-13.76 140.8 52.48 40.96-11.392 84.48-17.024 128-17.28 43.52 0.256 87.040 5.888 128 17.28 97.28-66.24 140.16-52.48 140.16-52.48 27.52 70.528 10.24 122.56 5.12 135.488 32.64 35.84 52.48 81.536 52.48 137.408 0 196.672-119.68 240-233.6 252.608 17.92 15.36 34.56 46.72 34.56 94.72 0 68.48-0.64 123.52-0.64 140.16 0 13.44 8.96 29.44 35.2 24.32 204.864-67.136 351.424-259.136 351.424-485.056 0-282.752-229.248-512-512-512z" + "M512 64c-131.696 0-239.125 107.4-239.125 239 0 65.8 24.831 146.717 65.375 215.25 19.653 33.221 43.902 63.853 71.75 87.125-59.423 7.524-122.009 9.415-172.125 32-79.809 35.967-144.343 94.74-172.375 178.625-1.5 9.499 0 0-1.5 9v0.499c0 73.995 60.563 134.501 134.375 134.501h627.125c73.888 0 134.5-60.506 134.5-134.5l-1.5-9.375c-27.845-84.263-92.273-143.119-172.125-179-50.17-22.544-112.844-24.421-172.375-31.875 27.792-23.26 52.002-53.831 71.625-87 40.544-68.533 65.375-149.45 65.375-215.25 0-131.6-107.304-239-239-239zM512 124c99.241 0 179 79.875 179 179 0 49.562-21.877 125.381-57 184.75s-81.435 98.75-122 98.75c-40.565 0-86.877-39.381-122-98.75s-57.125-135.188-57.125-184.75c0-99.125 79.884-179 179.125-179zM512 646.5c92.551 0 180.829 14.406 249.75 45.375 66.784 30.009 113.649 74.724 136.5 137.75-2.447 39.259-32.9 70.375-72.75 70.375h-627.125c-39.678 0-70.116-31.051-72.625-70.25 22.978-62.705 69.953-107.523 136.75-137.625 68.937-31.067 157.205-45.625 249.5-45.625z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, + "grid": 14, "tags": [ - "brand", - "github" - ], - "grid": 0 + "user-o" + ] }, "attrs": [ {} ], "properties": { - "order": 77, - "id": 0, - "name": "github", - "prevSize": 32, - "code": 59713 + "order": 64, + "id": 38, + "name": "user-o", + "prevSize": 28, + "code": 59698 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 70 + "iconIdx": 27 }, { "icon": { "paths": [ - "M512 512h-204.8v51.2h204.8v-51.2zM768 153.6h-51.2c0-28.314-22.886-51.2-51.2-51.2h-307.2c-28.314 0-51.2 22.886-51.2 51.2h-51.2c-28.314 0-51.2 22.886-51.2 51.2v665.6c0 28.314 22.886 51.2 51.2 51.2h512c28.314 0 51.2-22.886 51.2-51.2v-665.6c0-28.314-22.886-51.2-51.2-51.2zM358.4 153.6h307.2v51.2h-307.2v-51.2zM768 819.2c0 28.314-22.886 51.2-51.2 51.2h-409.6c-28.314 0-51.2-22.886-51.2-51.2v-563.2c0-28.314 22.886-51.2 51.2-51.2 0 28.314 22.886 51.2 51.2 51.2h307.2c28.314 0 51.2-22.886 51.2-51.2 28.314 0 51.2 22.886 51.2 51.2v563.2zM307.2 460.8h409.6v-51.2h-409.6v51.2zM307.2 665.6h409.6v-51.2h-409.6v51.2z" + "M217.6 992c-3.2 0-3.2 0-6.4 0h-3.2c-144-25.6-208-144-208-249.6 0-99.2 57.6-208 185.6-240v-147.2c0-19.2 12.8-32 32-32s32 12.8 32 32v172.8c0 16-12.8 28.8-25.6 32-108.8 16-160 102.4-160 182.4s48 166.4 153.6 185.6h6.4c16 3.2 28.8 19.2 25.6 38.4-3.2 16-16 25.6-32 25.6z", + "M774.4 1001.6c0 0 0 0 0 0-102.4 0-211.2-60.8-243.2-185.6h-176c-19.2 0-32-12.8-32-32s12.8-32 32-32h201.6c16 0 28.8 12.8 32 25.6 16 108.8 102.4 156.8 182.4 160 80 0 166.4-48 185.6-153.6v-3.2c3.2-16 19.2-28.8 38.4-25.6 16 3.2 28.8 19.2 25.6 38.4v3.2c-22.4 140.8-140.8 204.8-246.4 204.8z", + "M787.2 678.4c-19.2 0-32-12.8-32-32v-176c0-16 12.8-28.8 25.6-32 108.8-16 156.8-102.4 160-182.4 0-80-48-166.4-153.6-185.6h-3.2c-19.2-6.4-32-22.4-28.8-38.4s19.2-28.8 38.4-25.6h3.2c144 25.6 208 144 208 249.6 0 99.2-60.8 208-185.6 240v150.4c0 16-16 32-32 32z", + "M41.6 246.4c-3.2 0-3.2 0-6.4 0-16-3.2-28.8-19.2-25.6-35.2v-3.2c25.6-144 140.8-208 246.4-208 0 0 3.2 0 3.2 0 99.2 0 208 60.8 240 185.6h147.2c19.2 0 32 12.8 32 32s-12.8 32-32 32h-172.8c-16 0-28.8-12.8-32-25.6-16-108.8-102.4-156.8-182.4-160-80 0-166.4 48-185.6 153.6v3.2c-3.2 16-16 25.6-32 25.6z", + "M256 387.2c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-25.6 22.4-57.6 35.2-92.8 35.2zM256 192c-16 0-32 6.4-44.8 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-32-19.2-44.8-28.8-19.2-48-19.2z", + "M771.2 873.6c-32 0-67.2-12.8-92.8-38.4-51.2-51.2-51.2-134.4 0-185.6 25.6-25.6 57.6-38.4 92.8-38.4s67.2 12.8 92.8 38.4c25.6 25.6 38.4 57.6 38.4 92.8s-12.8 67.2-38.4 92.8c-28.8 25.6-60.8 38.4-92.8 38.4zM771.2 678.4c-19.2 0-35.2 6.4-48 19.2-25.6 25.6-25.6 67.2 0 92.8s67.2 25.6 92.8 0c12.8-12.8 19.2-28.8 19.2-48s-6.4-35.2-19.2-48-28.8-16-44.8-16z", + "M745.6 387.2c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 60.8-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM745.6 192c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z", + "M259.2 873.6c-32 0-67.2-12.8-92.8-38.4s-38.4-57.6-38.4-92.8 12.8-67.2 38.4-92.8c25.6-22.4 57.6-35.2 92.8-35.2s67.2 12.8 92.8 38.4c51.2 51.2 51.2 134.4 0 185.6v0c-25.6 22.4-57.6 35.2-92.8 35.2zM259.2 678.4c-19.2 0-35.2 6.4-48 19.2s-19.2 28.8-19.2 48 6.4 35.2 19.2 48c25.6 25.6 67.2 25.6 92.8 0s25.6-67.2 0-92.8c-9.6-16-25.6-22.4-44.8-22.4z" ], "attrs": [ + {}, + {}, + {}, + {}, + {}, + {}, + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, + "grid": 14, "tags": [ - "help" + "webhooks" ] }, "attrs": [ + {}, + {}, + {}, + {}, + {}, + {}, + {}, {} ], "properties": { - "order": 19, - "id": 15, - "name": "help", - "prevSize": 32, - "code": 59673 + "order": 92, + "id": 203, + "name": "rules, action-Webhook", + "prevSize": 28, + "code": 59719 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 71 + "iconIdx": 28 }, { "icon": { "paths": [ - "M512 0c-169.421 0-307.2 137.779-307.2 307.2 0 78.643 15.258 164.915 45.261 256.41 23.859 72.55 56.986 148.582 98.56 226.099 70.707 131.635 140.339 220.774 143.309 224.512 4.813 6.195 12.288 9.779 20.070 9.779 7.834 0 15.258-3.584 20.122-9.779 2.97-3.686 72.602-92.826 143.309-224.512 41.574-77.517 74.701-153.549 98.56-226.099 29.952-91.494 45.21-177.766 45.21-256.41 0-169.421-137.83-307.2-307.2-307.2zM630.682 764.672c-46.234 86.374-92.979 154.982-118.682 190.822-25.6-35.635-72.038-103.885-118.221-189.952-62.874-117.146-137.779-291.738-137.779-458.342 0-141.158 114.842-256 256-256s256 114.842 256 256c0 166.298-74.65 340.582-137.318 457.472zM512 153.6c-84.685 0-153.6 68.915-153.6 153.6s68.915 153.6 153.6 153.6 153.6-68.915 153.6-153.6-68.915-153.6-153.6-153.6zM512 409.6c-56.525 0-102.4-45.875-102.4-102.4 0-56.474 45.875-102.4 102.4-102.4 56.474 0 102.4 45.926 102.4 102.4 0 56.525-45.926 102.4-102.4 102.4z" + "M728.992 512c137.754-87.334 231.008-255.208 231.008-448 0-21.676-1.192-43.034-3.478-64h-889.042c-2.29 20.968-3.48 42.326-3.48 64 0 192.792 93.254 360.666 231.006 448-137.752 87.334-231.006 255.208-231.006 448 0 21.676 1.19 43.034 3.478 64h889.042c2.288-20.966 3.478-42.324 3.478-64 0.002-192.792-93.252-360.666-231.006-448zM160 960c0-186.912 80.162-345.414 224-397.708v-100.586c-143.838-52.29-224-210.792-224-397.706v0h704c0 186.914-80.162 345.416-224 397.706v100.586c143.838 52.294 224 210.796 224 397.708h-704zM619.626 669.594c-71.654-40.644-75.608-93.368-75.626-125.366v-64.228c0-31.994 3.804-84.914 75.744-125.664 38.504-22.364 71.808-56.348 97.048-98.336h-409.582c25.266 42.032 58.612 76.042 97.166 98.406 71.654 40.644 75.606 93.366 75.626 125.366v64.228c0 31.992-3.804 84.914-75.744 125.664-72.622 42.18-126.738 125.684-143.090 226.336h501.67c-16.364-100.708-70.53-184.248-143.212-226.406z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "location" - ] + "hour-glass", + "loading", + "busy", + "wait" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 25, - "id": 13, - "name": "location, control-Map, type-Geolocation", + "order": 1, + "id": 1, "prevSize": 32, - "code": 59675 + "code": 59732, + "name": "hour-glass" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 72 + "iconIdx": 29 }, { "icon": { "paths": [ - "M512.273 83.782c-0.141 0.056-182.959 84.073-229.418 256.782-4.481 16.584 32.696 9.296 31.036 27.527-2.034 22.136-44.668 31.201-39.109 94.764 5.659 64.734 60.321 130.141 68.527 169.673v27.655c-0.497 8.54-4.566 31.715-18.018 43.036-7.378 6.19-17.322 8.421-30.436 6.782-18.205-2.275-25.449-14.468-28.345-24.309-4.753-16.218-0.322-35.123 10.345-44 10.724-8.924 12.17-24.842 3.236-35.564-8.934-10.712-24.858-12.161-35.582-3.218-25.995 21.64-36.887 61.52-26.491 97 9.815 33.392 36.197 55.884 70.6 60.182 4.903 0.609 9.566 0.909 14 0.909 26.623 0 44.661-10.175 55.582-19.455 32.866-27.97 35.449-74.593 35.636-79.818 0.009-0.309 0.018-0.618 0.018-0.927v-21.218h0.109v-1.418c0-12.351 10.008-22.364 22.382-22.364 11.944 0 21.609 9.346 22.273 21.109v202.491c-0.206 2.912-2.536 29.892-17.891 42.945-7.368 6.274-17.384 8.53-30.545 6.873-18.214-2.275-25.476-14.468-28.364-24.291-4.762-16.228-0.322-35.151 10.345-44.018 10.724-8.933 12.188-24.833 3.255-35.564-8.924-10.694-24.876-12.161-35.6-3.218-26.013 21.631-36.887 61.52-26.491 97 9.796 33.392 36.197 55.893 70.6 60.2 4.903 0.609 9.566 0.891 14 0.891 26.623 0 44.671-10.156 55.564-19.436 32.875-27.97 35.458-74.611 35.636-79.836 0.019-0.328 0.018-0.609 0.018-0.909v-225.636l0.127-0.055v-1c0-12.595 10.219-22.8 22.836-22.8 12.349 0 22.333 9.824 22.727 22.073v227.418c0 0.309-0 0.591 0.018 0.909 0.187 5.216 2.779 51.866 35.655 79.836 10.912 9.28 28.959 19.436 55.582 19.436 4.443 0 9.088-0.282 13.982-0.891 34.394-4.307 60.804-26.818 70.6-60.2 10.405-35.48-0.487-75.36-26.491-97-10.743-8.943-26.676-7.466-35.6 3.218-8.934 10.74-7.488 26.63 3.236 35.564 10.668 8.868 15.135 27.79 10.364 44.018-2.878 9.823-10.159 22.015-28.364 24.291-13.105 1.648-23.050-0.592-30.418-6.782-13.508-11.358-17.558-34.657-18.036-43v-201.818c0.297-12.093 10.14-21.818 22.327-21.818 12.374 0 22.4 10.003 22.4 22.364v1.418h0.073v21.218c0 0.318-0 0.628 0.018 0.927 0.178 5.216 2.779 51.848 35.655 79.818 10.912 9.28 28.941 19.455 55.564 19.455 4.434 0 9.107-0.292 14-0.891 34.394-4.298 60.786-26.818 70.582-60.2 10.405-35.48-0.487-75.351-26.491-97-10.743-8.933-26.667-7.476-35.582 3.236-8.943 10.722-7.488 26.622 3.236 35.545 10.668 8.877 15.117 27.8 10.345 44.018-2.878 9.842-10.159 22.025-28.364 24.291-13.086 1.648-23.050-0.583-30.418-6.764-13.508-11.368-17.549-34.675-18.018-43v-21.018c5.305-54.103 63.095-107.777 69.091-176.364 5.531-63.563-37.121-72.627-39.145-94.764-1.669-18.232 35.498-10.944 31.036-27.527-46.468-172.709-229.269-256.726-229.4-256.782z" + "M192 512c0-12.18 0.704-24.196 2.030-36.022l-184.98-60.104c-5.916 31.14-9.050 63.264-9.050 96.126 0 147.23 62.166 279.922 161.654 373.324l114.284-157.296c-52.124-56.926-83.938-132.758-83.938-216.028zM832 512c0 83.268-31.812 159.102-83.938 216.028l114.284 157.296c99.488-93.402 161.654-226.094 161.654-373.324 0-32.862-3.132-64.986-9.048-96.126l-184.98 60.104c1.324 11.828 2.028 23.842 2.028 36.022zM576 198.408c91.934 18.662 169.544 76.742 214.45 155.826l184.978-60.102c-73.196-155.42-222.24-268.060-399.428-290.156v194.432zM233.55 354.232c44.906-79.084 122.516-137.164 214.45-155.826v-194.43c-177.188 22.096-326.23 134.736-399.426 290.154l184.976 60.102zM644.556 803.328c-40.39 18.408-85.272 28.672-132.556 28.672s-92.166-10.264-132.554-28.67l-114.292 157.31c73.206 40.366 157.336 63.36 246.846 63.36s173.64-22.994 246.848-63.36l-114.292-157.312z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "logo" - ] + "spinner", + "loading", + "loading-wheel", + "busy", + "wait" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 31, - "id": 12, - "name": "logo", + "order": 1, + "id": 0, "prevSize": 32, - "code": 59676 + "code": 59731, + "name": "spinner" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 73 + "iconIdx": 30 }, { "icon": { "paths": [ - "M947.2 0h-870.4c-42.342 0-76.8 34.458-76.8 76.8v870.4c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-870.4c0-42.342-34.458-76.8-76.8-76.8zM972.8 947.2c0 14.157-11.443 25.6-25.6 25.6h-870.4c-14.131 0-25.6-11.443-25.6-25.6v-870.4c0-14.131 11.469-25.6 25.6-25.6h870.4c14.157 0 25.6 11.469 25.6 25.6v870.4zM665.6 460.8c56.448 0 102.4-45.926 102.4-102.4s-45.952-102.4-102.4-102.4c-56.448 0-102.4 45.926-102.4 102.4s45.952 102.4 102.4 102.4zM665.6 307.2c28.211 0 51.2 22.989 51.2 51.2s-22.989 51.2-51.2 51.2c-28.211 0-51.2-22.989-51.2-51.2s22.989-51.2 51.2-51.2zM896 102.4h-768c-14.131 0-25.6 11.469-25.6 25.6v614.4c0 14.157 11.469 25.6 25.6 25.6h768c14.157 0 25.6-11.443 25.6-25.6v-614.4c0-14.131-11.443-25.6-25.6-25.6zM153.6 716.8v-118.246l164.301-184.858c4.198-4.787 9.728-7.373 15.462-7.475 5.734-0.051 11.29 2.458 15.642 7.040l283.238 303.539h-478.643zM870.4 716.8h-168.090l-315.853-338.432c-14.285-15.334-33.331-23.603-53.709-23.347-20.326 0.256-39.219 9.011-53.094 24.627l-126.054 141.798v-367.846h716.8v563.2z" + "M658.744 749.256l-210.744-210.746v-282.51h128v229.49l173.256 173.254zM512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 896c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "media" - ] + "clock", + "time", + "schedule" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 30, - "id": 11, - "name": "media, type-Assets, trigger-AssetChanged", + "order": 1, + "id": 0, "prevSize": 32, - "code": 59677 + "code": 59728, + "name": "clock" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 74 + "iconIdx": 31 }, { "icon": { "paths": [ - "M128 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM512 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128zM896 384c-70.656 0-128 57.344-128 128s57.344 128 128 128c70.656 0 128-57.344 128-128s-57.344-128-128-128z" + "M128 320v640c0 35.2 28.8 64 64 64h576c35.2 0 64-28.8 64-64v-640h-704zM320 896h-64v-448h64v448zM448 896h-64v-448h64v448zM576 896h-64v-448h64v448zM704 896h-64v-448h64v448z", + "M848 128h-208v-80c0-26.4-21.6-48-48-48h-224c-26.4 0-48 21.6-48 48v80h-208c-26.4 0-48 21.6-48 48v80h832v-80c0-26.4-21.6-48-48-48zM576 128h-192v-63.198h192v63.198z" ], "attrs": [ + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "more" - ] + "bin", + "trashcan", + "remove", + "delete", + "recycle", + "dispose" + ], + "grid": 16 }, "attrs": [ + {}, {} ], "properties": { - "order": 34, - "id": 10, - "name": "more, dots", + "order": 1, + "id": 0, + "name": "bin2", "prevSize": 32, - "code": 59678 + "code": 59650 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 75 + "iconIdx": 32 }, { "icon": { "paths": [ - "M877.12 311.104l-66.304 66.368-228.224-228.224 66.368-66.368c25.216-25.152 66.048-25.152 91.264 0l136.896 137.024c25.216 25.216 25.216 65.984 0 91.2zM760.896 427.392l-386.176 386.112c-25.216 25.28-66.048 25.28-91.264 0l-136.96-136.896c-25.216-25.28-25.216-66.112 0-91.264l386.24-386.24 228.16 228.288zM64 896v-191.872l191.936 191.872h-191.936z" - ], - "attrs": [ - {} + "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 960.002c-62.958 0-122.872-13.012-177.23-36.452l233.148-262.29c5.206-5.858 8.082-13.422 8.082-21.26v-96c0-17.674-14.326-32-32-32-112.99 0-232.204-117.462-233.374-118.626-6-6.002-14.14-9.374-22.626-9.374h-128c-17.672 0-32 14.328-32 32v192c0 12.122 6.848 23.202 17.69 28.622l110.31 55.156v187.886c-116.052-80.956-192-215.432-192-367.664 0-68.714 15.49-133.806 43.138-192h116.862c8.488 0 16.626-3.372 22.628-9.372l128-128c6-6.002 9.372-14.14 9.372-22.628v-77.412c40.562-12.074 83.518-18.588 128-18.588 70.406 0 137.004 16.26 196.282 45.2-4.144 3.502-8.176 7.164-12.046 11.036-36.266 36.264-56.236 84.478-56.236 135.764s19.97 99.5 56.236 135.764c36.434 36.432 85.218 56.264 135.634 56.26 3.166 0 6.342-0.080 9.518-0.236 13.814 51.802 38.752 186.656-8.404 372.334-0.444 1.744-0.696 3.488-0.842 5.224-81.324 83.080-194.7 134.656-320.142 134.656z" ], + "attrs": [], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "pencil" - ] + "earth", + "globe", + "language", + "web", + "internet", + "sphere", + "planet" + ], + "defaultCode": 59850, + "grid": 16 }, - "attrs": [ - {} - ], + "attrs": [], "properties": { - "order": 47, - "id": 9, - "name": "pencil", + "ligatures": "earth, globe2", + "name": "earth", + "id": 202, + "order": 91, "prevSize": 32, - "code": 59679 + "code": 59850 }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 76 + "iconIdx": 33 }, { "icon": { "paths": [ - "M892.083 131.917c-73.523-73.498-193.152-73.498-266.65 0l-157.184 157.107c-9.958 10.035-9.958 26.214 0 36.275 10.061 9.984 26.24 9.984 36.25 0l157.133-157.107c53.504-53.555 140.672-53.555 194.176 0 53.581 53.504 53.581 140.672 0 194.176l-186.138 186.163c-53.53 53.581-140.672 53.581-194.176 0-10.086-10.010-26.24-10.010-36.275 0-10.035 10.086-10.035 26.189 0 36.25 36.787 36.736 84.992 55.117 133.325 55.117s96.589-18.432 133.376-55.117l186.163-186.214c73.498-73.472 73.498-193.152 0-266.65zM519.45 698.726l-157.082 157.082c-53.504 53.555-140.672 53.555-194.176 0-53.581-53.504-53.581-140.672 0-194.176l186.138-186.163c53.53-53.581 140.672-53.581 194.176 0 10.086 9.984 26.189 9.984 36.275 0 10.035-10.086 10.035-26.214 0-36.25-73.549-73.498-193.203-73.498-266.701 0l-186.163 186.163c-73.498 73.574-73.498 193.203 0 266.701 36.787 36.71 85.043 55.117 133.325 55.117 48.333 0 96.538-18.406 133.325-55.117l157.133-157.133c10.010-10.010 10.010-26.189 0-36.224-10.010-9.984-26.189-9.984-36.25 0z" + "M512.002 193.212v-65.212h128v-64c0-35.346-28.654-64-64.002-64h-191.998c-35.346 0-64 28.654-64 64v64h128v65.212c-214.798 16.338-384 195.802-384 414.788 0 229.75 186.25 416 416 416s416-186.25 416-416c0-218.984-169.202-398.448-384-414.788zM706.276 834.274c-60.442 60.44-140.798 93.726-226.274 93.726s-165.834-33.286-226.274-93.726c-60.44-60.44-93.726-140.8-93.726-226.274s33.286-165.834 93.726-226.274c58.040-58.038 134.448-91.018 216.114-93.548l-21.678 314.020c-1.86 26.29 12.464 37.802 31.836 37.802s33.698-11.512 31.836-37.802l-21.676-314.022c81.666 2.532 158.076 35.512 216.116 93.55 60.44 60.44 93.726 140.8 93.726 226.274s-33.286 165.834-93.726 226.274z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "reference" - ] + "stopwatch", + "time", + "speed", + "meter", + "chronometer" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 45, - "id": 8, - "name": "reference", + "order": 1, + "id": 2, "prevSize": 32, - "code": 59680 + "code": 59715, + "name": "elapsed" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 77 + "iconIdx": 34 }, { "icon": { "paths": [ - "M800 1024h-576c-124.8 0-224-99.2-224-224v-300.8c0-124.8 99.2-224 224-224h576c124.8 0 224 99.2 224 224v300.8c0 124.8-99.2 224-224 224zM224 339.2c-89.6 0-160 70.4-160 160v300.8c0 89.6 70.4 160 160 160h576c89.6 0 160-70.4 160-160v-300.8c0-89.6-70.4-160-160-160h-576z", - "M828.8 201.6h-633.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h630.4c19.2 0 32 12.8 32 32s-12.8 32-28.8 32z", - "M716.8 64h-409.6c-19.2 0-32-12.8-32-32s12.8-32 32-32h412.8c19.2 0 32 12.8 32 32s-16 32-35.2 32z", - "M800 416v64c0 48-38.4 83.2-83.2 83.2h-409.6c-44.8 3.2-83.2-35.2-83.2-83.2v-64h-54.4v64c0 76.8 64 140.8 140.8 140.8h406.4c76.8 0 140.8-64 140.8-140.8v-64h-57.6z" + "M522.2 438.8v175.6h290.4c-11.8 75.4-87.8 220.8-290.4 220.8-174.8 0-317.4-144.8-317.4-323.2s142.6-323.2 317.4-323.2c99.4 0 166 42.4 204 79l139-133.8c-89.2-83.6-204.8-134-343-134-283 0-512 229-512 512s229 512 512 512c295.4 0 491.6-207.8 491.6-500.2 0-33.6-3.6-59.2-8-84.8l-483.6-0.2z" ], "attrs": [ - {}, - {}, - {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "schemas" - ] + "google", + "brand" + ], + "grid": 16 }, "attrs": [ - {}, - {}, - {}, {} ], "properties": { - "order": 46, - "id": 7, - "name": "schemas", + "order": 1, + "id": 0, "prevSize": 32, - "code": 59681 + "code": 59707, + "name": "google" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 78 + "iconIdx": 35 }, { "icon": { "paths": [ - "M939.776 1003.776c-27.2 27.008-71.232 27.008-98.368 0l-168.96-168.96c-66.176 38.464-142.016 62.080-224 62.080-247.744 0-448.448-200.832-448.448-448.448 0-247.744 200.704-448.448 448.448-448.448 247.68 0 448.512 200.704 448.512 448.448 0 115.136-44.672 218.944-115.904 298.304l158.656 158.656c27.008 27.136 27.008 71.168 0.064 98.368zM448.448 128.128c-176.896 0-320.32 143.36-320.32 320.32s143.424 320.32 320.32 320.32c176.96 0 320.384-143.36 320.384-320.32s-143.488-320.32-320.384-320.32z" + "M592 448h-16v-192c0-105.87-86.13-192-192-192h-128c-105.87 0-192 86.13-192 192v192h-16c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h544c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48zM192 256c0-35.29 28.71-64 64-64h128c35.29 0 64 28.71 64 64v192h-256v-192z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "search" - ] + "lock", + "secure", + "private", + "encrypted" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 23, - "id": 6, - "name": "search", + "order": 2, + "id": 0, "prevSize": 32, - "code": 59682 + "code": 59700, + "name": "lock" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 79 + "iconIdx": 36 }, { "icon": { "paths": [ - "M1019.11 440.755c-1.946-13.747-14.438-23.398-28.16-21.888-16.947 1.843-34.253-0.589-50.048-7.091-52.25-21.504-77.261-81.459-55.757-133.709 6.605-15.846 16.947-29.85 30.208-40.602 10.803-8.653 12.698-24.294 4.352-35.354-28.902-37.99-62.797-71.706-100.838-100.045-10.701-8.090-25.805-6.451-34.662 3.661-28.8 33.254-75.546 44.262-116.198 27.546-40.704-16.742-66.099-57.498-63.206-101.453 0.845-13.338-8.755-25.19-21.99-27.008-47.002-6.605-94.797-6.605-142.054 0.077-13.722 1.946-23.398 14.387-21.862 28.211 1.843 16.896-0.614 34.202-7.168 49.997-21.504 52.25-81.408 77.21-133.632 55.706-15.821-6.502-29.85-16.947-40.602-30.157-8.653-10.752-24.32-12.698-35.379-4.301-37.99 28.851-71.68 62.694-100.045 100.762-8.090 10.701-6.451 25.83 3.635 34.637 33.28 28.902 44.288 75.597 27.546 116.301-16.742 40.653-57.498 66.048-101.427 63.155-13.363-0.845-25.19 8.755-26.982 21.99-6.63 47.002-6.63 94.822 0.102 142.080 1.946 13.696 14.387 23.322 28.16 21.811 16.896-1.818 34.202 0.691 50.022 7.168 52.224 21.53 77.21 81.459 55.706 133.734-6.502 15.795-16.947 29.773-30.157 40.525-10.803 8.73-12.698 24.346-4.352 35.354 28.877 38.042 62.822 71.731 100.813 100.122 1.741 1.357 3.661 2.355 5.606 3.2 9.933 4.045 21.709 1.536 29.082-6.938 28.826-33.178 75.571-44.262 116.275-27.52 40.653 16.742 66.048 57.498 63.13 101.453-0.819 13.338 8.755 25.165 22.067 27.059 47.002 6.579 94.72 6.554 142.029-0.102 13.645-1.971 23.347-14.464 21.811-28.237-1.843-16.947 0.691-34.253 7.194-50.048 21.504-52.25 81.459-77.21 133.658-55.68 15.795 6.528 29.85 16.947 40.55 30.157 8.704 10.803 24.346 12.698 35.405 4.326 37.99-28.902 71.654-62.746 100.096-100.813 7.987-10.675 6.4-25.805-3.712-34.662-33.254-28.826-44.288-75.571-27.546-116.224 16.742-40.73 57.498-66.099 101.453-63.232 13.338 0.922 25.139-8.678 27.008-21.965 6.554-47.002 6.502-94.771-0.128-142.003zM971.059 554.010c-56.141 5.274-105.702 41.114-127.642 94.464s-12.058 113.613 24.090 156.902c-17.69 21.478-37.453 41.318-58.854 59.315-12.749-11.213-27.392-20.352-43.238-26.854-78.259-32.282-168.243 5.197-200.499 83.584-6.502 15.718-10.291 32.563-11.29 49.536-27.853 2.56-55.859 2.637-83.61 0.077-5.274-56.090-41.114-105.677-94.464-127.616-53.35-21.99-113.613-11.981-156.928 24.064-21.504-17.69-41.318-37.453-59.29-58.88 11.213-12.723 20.352-27.392 26.906-43.136 32.205-78.387-5.274-168.294-83.584-200.55-15.821-6.502-32.589-10.342-49.613-11.366-2.534-27.853-2.586-55.859 0-83.558 56.090-5.299 105.626-41.088 127.565-94.438 21.965-53.402 12.058-113.638-24.090-156.902 17.69-21.555 37.478-41.395 58.88-59.341 12.749 11.213 27.392 20.352 43.213 26.854 78.285 32.256 168.218-5.248 200.474-83.558 6.528-15.795 10.342-32.589 11.366-49.613 27.853-2.509 55.808-2.56 83.558 0 5.299 56.090 41.139 105.6 94.49 127.59 53.35 21.939 113.638 12.006 156.902-24.090 21.504 17.741 41.293 37.453 59.29 58.854-11.213 12.8-20.352 27.392-26.854 43.213-32.256 78.31 5.248 168.294 83.507 200.499 15.846 6.502 32.691 10.342 49.638 11.392 2.56 27.853 2.611 55.808 0.077 83.558zM512 307.2c-113.101 0-204.8 91.699-204.8 204.8 0 113.126 91.699 204.826 204.8 204.826s204.8-91.699 204.8-204.826c0-113.101-91.699-204.8-204.8-204.8zM512 665.626c-84.813 0-153.6-68.813-153.6-153.626 0-84.838 68.787-153.6 153.6-153.6 84.838 0 153.6 68.762 153.6 153.6 0 84.813-68.762 153.626-153.6 153.626z" + "M0.35 512l-0.35-312.074 384-52.144v364.218zM448 138.482l511.872-74.482v448h-511.872zM959.998 576l-0.126 448-511.872-72.016v-375.984zM384 943.836l-383.688-52.594-0.020-315.242h383.708z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "settings" - ] + "windows8", + "brand", + "os" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 22, - "id": 5, - "name": "settings", + "order": 1, + "id": 1, "prevSize": 32, - "code": 59683 + "code": 59712, + "name": "microsoft, action-AzureQueue" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 80 + "iconIdx": 37 }, { "icon": { "paths": [ - "M77.005 102.605h128v332.8c0 14.131 11.418 25.6 25.6 25.6 14.106 0 25.6-11.469 25.6-25.6v-332.8h128c14.106 0 25.6-11.469 25.6-25.6 0-14.157-11.494-25.6-25.6-25.6h-307.2c-14.182 0-25.6 11.443-25.6 25.6 0 14.106 11.418 25.6 25.6 25.6zM947.405 716.979h-179.2v-102.4h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-204.8c-14.182 0-25.6 11.443-25.6 25.6v358.4c0 14.157 11.418 25.6 25.6 25.6 14.157 0 25.6-11.443 25.6-25.6v-179.2h179.2c14.157 0 25.6-11.443 25.6-25.6s-11.494-25.6-25.6-25.6zM965.094 58.47c-9.958-9.933-26.112-9.933-36.045 0l-870.605 870.579c-9.958 9.984-9.958 26.086 0 36.045 10.010 9.984 26.112 9.984 36.045 0l870.605-870.579c9.958-9.933 9.958-26.086 0-36.045z" + "M128 128h320v768h-320zM576 128h320v768h-320z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "type-boolean" - ] + "pause", + "player" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 21, - "id": 4, - "name": "type-Boolean", + "order": 2, + "id": 1, "prevSize": 32, - "code": 59684 + "code": 59695, + "name": "pause" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 81 + "iconIdx": 38 }, { "icon": { "paths": [ - "M947.2 102.4h-128v-25.6c0-14.131-11.469-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-512v-25.6c0-14.131-11.52-25.6-25.6-25.6s-25.6 11.469-25.6 25.6v25.6h-128c-42.342 0-76.8 34.458-76.8 76.8v716.8c0 42.342 34.458 76.8 76.8 76.8h870.4c42.342 0 76.8-34.458 76.8-76.8v-716.8c0-42.342-34.458-76.8-76.8-76.8zM972.8 896c0 14.131-11.469 25.6-25.6 25.6h-870.4c-14.080 0-25.6-11.469-25.6-25.6v-537.6h921.6v537.6zM972.8 307.2h-921.6v-128c0-14.080 11.52-25.6 25.6-25.6h128v76.8c0 14.080 11.52 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h512v76.8c0 14.080 11.469 25.6 25.6 25.6s25.6-11.52 25.6-25.6v-76.8h128c14.131 0 25.6 11.52 25.6 25.6v128zM332.8 512h51.2c14.080 0 25.6-11.52 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.52-25.6 25.6s11.52 25.6 25.6 25.6zM640 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 512h51.2c14.131 0 25.6-11.52 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.52-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 614.4h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 614.4h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 716.8h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 716.8h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM179.2 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM332.8 819.2h51.2c14.080 0 25.6-11.469 25.6-25.6s-11.52-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM486.4 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.080 0-25.6 11.469-25.6 25.6s11.52 25.6 25.6 25.6zM640 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6zM793.6 819.2h51.2c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-51.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6z" + "M192 128l640 384-640 384z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "type-datetime" - ] + "play", + "player" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 24, - "id": 3, - "name": "type-DateTime", + "order": 3, + "id": 0, "prevSize": 32, - "code": 59685 + "code": 59696, + "name": "play" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 82 + "iconIdx": 39 }, { "icon": { "paths": [ - "M179.2 256c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6h-25.6c-56.55 0-102.4 45.85-102.4 102.4v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 56.55 45.85 102.4 102.4 102.4h25.6c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-30.746-13.85-58.061-35.328-76.8 21.478-18.765 35.328-46.029 35.328-76.8v-179.2zM972.8 486.4h-25.6c-28.262 0-51.2-22.938-51.2-51.2v-179.2c0-56.55-45.85-102.4-102.4-102.4h-25.6c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6h25.6c28.262 0 51.2 22.938 51.2 51.2v179.2c0 30.771 13.85 58.035 35.328 76.8-21.478 18.739-35.328 46.054-35.328 76.8v179.2c0 28.262-22.938 51.2-51.2 51.2h-25.6c-14.157 0-25.6 11.443-25.6 25.6s11.443 25.6 25.6 25.6h25.6c56.55 0 102.4-45.85 102.4-102.4v-179.2c0-28.262 22.938-51.2 51.2-51.2h25.6c14.157 0 25.6-11.443 25.6-25.6 0-14.131-11.443-25.6-25.6-25.6zM512 332.8c-14.157 0-25.6 11.469-25.6 25.6 0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6c0-14.131-11.443-25.6-25.6-25.6zM512 435.2c-14.157 0-25.6 11.469-25.6 25.6v204.8c0 14.157 11.443 25.6 25.6 25.6s25.6-11.443 25.6-25.6v-204.8c0-14.131-11.443-25.6-25.6-25.6z" + "M889.68 166.32c-93.608-102.216-228.154-166.32-377.68-166.32-282.77 0-512 229.23-512 512h96c0-229.75 186.25-416 416-416 123.020 0 233.542 53.418 309.696 138.306l-149.696 149.694h352v-352l-134.32 134.32z", + "M928 512c0 229.75-186.25 416-416 416-123.020 0-233.542-53.418-309.694-138.306l149.694-149.694h-352v352l134.32-134.32c93.608 102.216 228.154 166.32 377.68 166.32 282.77 0 512-229.23 512-512h-96z" ], "attrs": [ + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "json" - ] + "loop", + "repeat", + "player", + "reload", + "refresh", + "update", + "synchronize", + "arrows" + ], + "grid": 16 }, "attrs": [ + {}, {} ], "properties": { - "order": 20, - "id": 14, - "name": "type-Json, json", + "order": 49, + "id": 2, "prevSize": 32, - "code": 59674 + "code": 59694, + "name": "reset" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 83 + "iconIdx": 40 }, { "icon": { "paths": [ - "M256 665.6h-76.8v-332.8c0-14.131-11.469-25.6-25.6-25.6h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h51.2v307.2h-76.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6zM614.4 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6v179.2c0 14.131 11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6s-11.469-25.6-25.6-25.6h-179.2v-128h179.2c14.131 0 25.6-11.469 25.6-25.6v-179.2c0-14.131-11.469-25.6-25.6-25.6zM972.8 307.2h-204.8c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h179.2v128h-179.2c-14.131 0-25.6 11.469-25.6 25.6s11.469 25.6 25.6 25.6h204.8c14.131 0 25.6-11.469 25.6-25.6v-358.4c0-14.131-11.469-25.6-25.6-25.6z" + "M933.79 610.25c-53.726-93.054-21.416-212.304 72.152-266.488l-100.626-174.292c-28.75 16.854-62.176 26.518-97.846 26.518-107.536 0-194.708-87.746-194.708-195.99h-201.258c0.266 33.41-8.074 67.282-25.958 98.252-53.724 93.056-173.156 124.702-266.862 70.758l-100.624 174.292c28.97 16.472 54.050 40.588 71.886 71.478 53.638 92.908 21.512 211.92-71.708 266.224l100.626 174.292c28.65-16.696 61.916-26.254 97.4-26.254 107.196 0 194.144 87.192 194.7 194.958h201.254c-0.086-33.074 8.272-66.57 25.966-97.218 53.636-92.906 172.776-124.594 266.414-71.012l100.626-174.29c-28.78-16.466-53.692-40.498-71.434-71.228zM512 719.332c-114.508 0-207.336-92.824-207.336-207.334 0-114.508 92.826-207.334 207.336-207.334 114.508 0 207.332 92.826 207.332 207.334-0.002 114.51-92.824 207.334-207.332 207.334z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "type-number" - ] + "cog", + "gear", + "preferences", + "settings", + "generate", + "control", + "options" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 32, - "id": 2, - "name": "type-Number", + "order": 1, + "id": 1, "prevSize": 32, - "code": 59686 + "code": 59693, + "name": "settings2" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 84 + "iconIdx": 41 }, { "icon": { "paths": [ - "M870.4 921.6h-716.8c-14.131 0-25.6 11.443-25.6 25.6s11.469 25.6 25.6 25.6h716.8c14.157 0 25.6-11.443 25.6-25.6s-11.443-25.6-25.6-25.6zM194.688 817.152c13.030 5.555 28.083-0.461 33.613-13.44l125.030-291.712h317.338l125.005 291.712c4.173 9.677 13.568 15.488 23.526 15.488 3.405 0 6.81-0.64 10.112-2.048 13.005-5.606 18.995-20.659 13.44-33.638l-131.61-306.944c-0.051-0.051-0.051-0.154-0.102-0.205l-175.488-409.6c-4.045-9.472-13.312-15.565-23.552-15.565s-19.507 6.093-23.552 15.514l-175.488 409.6c-0.051 0.051-0.051 0.154-0.102 0.205l-131.61 306.97c-5.53 13.005 0.461 28.058 13.44 33.664zM512 141.773l136.704 319.027h-273.408l136.704-319.027z" + "M512 128c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448zM512 936c-198.824 0-360-161.178-360-360 0-198.824 161.176-360 360-360 198.822 0 360 161.176 360 360 0 198.822-161.178 360-360 360zM934.784 287.174c16.042-28.052 25.216-60.542 25.216-95.174 0-106.040-85.96-192-192-192-61.818 0-116.802 29.222-151.92 74.596 131.884 27.236 245.206 105.198 318.704 212.578v0zM407.92 74.596c-35.116-45.374-90.102-74.596-151.92-74.596-106.040 0-192 85.96-192 192 0 34.632 9.174 67.122 25.216 95.174 73.5-107.38 186.822-185.342 318.704-212.578z", + "M512 576v-256h-64v320h256v-64z" ], "attrs": [ + {}, {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "type-string" - ] + "alarm", + "time", + "clock" + ], + "grid": 16 }, "attrs": [ + {}, {} ], "properties": { - "order": 48, + "order": 2, "id": 1, - "name": "type-String", "prevSize": 32, - "code": 59687 + "code": 59716, + "name": "timeout" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 85 + "iconIdx": 42 }, { "icon": { "paths": [ - "M955.221 848c0-0.109 10.752 0 0 0-52.751-161.392-240.461-224-443.178-224-202.269 0-389.979 63.392-443.066 224-11.2-0.109 0-1.232 0 0 0 61.936 49.615 112 110.654 112h664.823c61.151 0 110.766-50.064 110.766-112zM290.399 288c0 123.648 99.231 336 221.645 336s221.645-212.352 221.645-336c0-123.648-99.231-224-221.645-224s-221.645 100.352-221.645 224z" + "M768 64c105.87 0 192 86.13 192 192v192h-128v-192c0-35.29-28.71-64-64-64h-128c-35.29 0-64 28.71-64 64v192h16c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48h-544c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h400v-192c0-105.87 86.13-192 192-192h128z" ], "attrs": [ {} ], "isMulticolor": false, "isMulticolor2": false, - "grid": 0, "tags": [ - "user" - ] + "unlocked", + "lock-open" + ], + "grid": 16 }, "attrs": [ {} ], "properties": { - "order": 33, - "id": 0, - "name": "user", + "order": 1, + "id": 1, "prevSize": 32, - "code": 59688 + "code": 59699, + "name": "unlocked" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, - "iconIdx": 86 + "iconIdx": 43 }, { "icon": { @@ -2704,7 +2733,7 @@ "code": 59701, "name": "browser" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 87 }, @@ -2736,7 +2765,7 @@ "code": 59714, "name": "checkmark" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 88 }, @@ -2766,7 +2795,7 @@ "code": 59706, "name": "control-Stars" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 89 }, @@ -2795,7 +2824,7 @@ "code": 59705, "name": "control-RichText" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 90 }, @@ -2824,7 +2853,7 @@ "code": 59710, "name": "download" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 91 }, @@ -2853,7 +2882,7 @@ "code": 59708, "name": "info" }, - "setIdx": 0, + "setIdx": 1, "setId": 1, "iconIdx": 92 } diff --git a/src/Squidex/app/theme/icomoon/style.css b/src/Squidex/app/theme/icomoon/style.css index 3c0abb955..c700316d8 100644 --- a/src/Squidex/app/theme/icomoon/style.css +++ b/src/Squidex/app/theme/icomoon/style.css @@ -1,10 +1,10 @@ @font-face { font-family: 'icomoon'; - src: url('fonts/icomoon.eot?vrpp1i'); - src: url('fonts/icomoon.eot?vrpp1i#iefix') format('embedded-opentype'), - url('fonts/icomoon.ttf?vrpp1i') format('truetype'), - url('fonts/icomoon.woff?vrpp1i') format('woff'), - url('fonts/icomoon.svg?vrpp1i#icomoon') format('svg'); + src: url('fonts/icomoon.eot?o6u2w7'); + src: url('fonts/icomoon.eot?o6u2w7#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?o6u2w7') format('truetype'), + url('fonts/icomoon.woff?o6u2w7') format('woff'), + url('fonts/icomoon.svg?o6u2w7#icomoon') format('svg'); font-weight: normal; font-style: normal; } @@ -24,6 +24,168 @@ -moz-osx-font-smoothing: grayscale; } +.icon-action-Medium:before { + content: "\e959"; +} +.icon-circle:before { + content: "\e951"; +} +.icon-action-Fastly:before { + content: "\e94e"; +} +.icon-control-Slug:before { + content: "\e94f"; +} +.icon-action-Algolia:before { + content: "\e94c"; +} +.icon-type-Tags:before { + content: "\e94a"; +} +.icon-activity:before { + content: "\e904"; +} +.icon-history:before { + content: "\e904"; +} +.icon-time:before { + content: "\e904"; +} +.icon-add:before { + content: "\e905"; +} +.icon-plus:before { + content: "\e905"; +} +.icon-check-circle:before { + content: "\e906"; +} +.icon-check-circle-filled:before { + content: "\e907"; +} +.icon-close:before { + content: "\e908"; +} +.icon-type-References:before { + content: "\e909"; +} +.icon-control-Checkbox:before { + content: "\e90a"; +} +.icon-control-Dropdown:before { + content: "\e90b"; +} +.icon-control-Input:before { + content: "\e90c"; +} +.icon-control-Radio:before { + content: "\e90d"; +} +.icon-control-TextArea:before { + content: "\e90e"; +} +.icon-control-Toggle:before { + content: "\e90f"; +} +.icon-copy:before { + content: "\e910"; +} +.icon-dashboard:before { + content: "\e911"; +} +.icon-delete:before { + content: "\e912"; +} +.icon-bin:before { + content: "\e912"; +} +.icon-delete-filled:before { + content: "\e913"; +} +.icon-document-delete:before { + content: "\e914"; +} +.icon-document-disable:before { + content: "\e915"; +} +.icon-document-publish:before { + content: "\e916"; +} +.icon-drag:before { + content: "\e917"; +} +.icon-filter:before { + content: "\e918"; +} +.icon-github:before { + content: "\e941"; +} +.icon-help:before { + content: "\e919"; +} +.icon-location:before { + content: "\e91b"; +} +.icon-control-Map:before { + content: "\e91b"; +} +.icon-type-Geolocation:before { + content: "\e91b"; +} +.icon-logo:before { + content: "\e91c"; +} +.icon-media:before { + content: "\e91d"; +} +.icon-type-Assets:before { + content: "\e91d"; +} +.icon-trigger-AssetChanged:before { + content: "\e91d"; +} +.icon-more:before { + content: "\e91e"; +} +.icon-dots:before { + content: "\e91e"; +} +.icon-pencil:before { + content: "\e91f"; +} +.icon-reference:before { + content: "\e920"; +} +.icon-schemas:before { + content: "\e921"; +} +.icon-search:before { + content: "\e922"; +} +.icon-settings:before { + content: "\e923"; +} +.icon-type-Boolean:before { + content: "\e924"; +} +.icon-type-DateTime:before { + content: "\e925"; +} +.icon-type-Json:before { + content: "\e91a"; +} +.icon-json:before { + content: "\e91a"; +} +.icon-type-Number:before { + content: "\e926"; +} +.icon-type-String:before { + content: "\e927"; +} +.icon-user:before { + content: "\e928"; +} .icon-single-content:before { content: "\e958"; } @@ -162,60 +324,6 @@ .icon-unlocked:before { content: "\e933"; } -.icon-circle:before { - content: "\e951"; -} -.icon-action-Fastly:before { - content: "\e94e"; -} -.icon-control-Slug:before { - content: "\e94f"; -} -.icon-action-Algolia:before { - content: "\e94c"; -} -.icon-type-Tags:before { - content: "\e94a"; -} -.icon-activity:before { - content: "\e904"; -} -.icon-history:before { - content: "\e904"; -} -.icon-time:before { - content: "\e904"; -} -.icon-add:before { - content: "\e905"; -} -.icon-plus:before { - content: "\e905"; -} -.icon-check-circle:before { - content: "\e906"; -} -.icon-check-circle-filled:before { - content: "\e907"; -} -.icon-close:before { - content: "\e908"; -} -.icon-type-References:before { - content: "\e909"; -} -.icon-control-Checkbox:before { - content: "\e90a"; -} -.icon-control-Dropdown:before { - content: "\e90b"; -} -.icon-control-Input:before { - content: "\e90c"; -} -.icon-control-Radio:before { - content: "\e90d"; -} .icon-control-TextArea:before { content: "\e90e"; } @@ -258,69 +366,6 @@ .icon-help:before { content: "\e919"; } -.icon-location:before { - content: "\e91b"; -} -.icon-control-Map:before { - content: "\e91b"; -} -.icon-type-Geolocation:before { - content: "\e91b"; -} -.icon-logo:before { - content: "\e91c"; -} -.icon-media:before { - content: "\e91d"; -} -.icon-type-Assets:before { - content: "\e91d"; -} -.icon-trigger-AssetChanged:before { - content: "\e91d"; -} -.icon-more:before { - content: "\e91e"; -} -.icon-dots:before { - content: "\e91e"; -} -.icon-pencil:before { - content: "\e91f"; -} -.icon-reference:before { - content: "\e920"; -} -.icon-schemas:before { - content: "\e921"; -} -.icon-search:before { - content: "\e922"; -} -.icon-settings:before { - content: "\e923"; -} -.icon-type-Boolean:before { - content: "\e924"; -} -.icon-type-DateTime:before { - content: "\e925"; -} -.icon-type-Json:before { - content: "\e91a"; -} -.icon-json:before { - content: "\e91a"; -} -.icon-type-Number:before { - content: "\e926"; -} -.icon-type-String:before { - content: "\e927"; -} -.icon-user:before { - content: "\e928"; -} .icon-browser:before { content: "\e935"; } From ba0e601de50dc3959f3778ec87817a84d9154b68 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 1 Jul 2018 15:42:42 +0200 Subject: [PATCH 02/13] Tests brought back and fixed. --- .../Rules/Guards/RuleActionValidator.cs | 6 +- .../Rules/Guards/Actions/MediumActionTests.cs | 85 +++++++++++++++++++ 2 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/MediumActionTests.cs diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs b/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs index 68a8fc9c5..62e3947b5 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/Guards/RuleActionValidator.cs @@ -116,9 +116,9 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards errors.Add(new ValidationError("Access token is required.", nameof(action.AccessToken))); } - if (string.IsNullOrWhiteSpace(action.Author) && !string.IsNullOrWhiteSpace(action.Publication)) + if (string.IsNullOrWhiteSpace(action.Author) && string.IsNullOrWhiteSpace(action.Publication)) { - errors.Add(new ValidationError("Author or publication id is required.", nameof(action.Author), nameof(action.Publication))); + errors.Add(new ValidationError("Author or publication is required.", nameof(action.Author), nameof(action.Publication))); } if (string.IsNullOrWhiteSpace(action.Content)) @@ -128,7 +128,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Guards if (string.IsNullOrWhiteSpace(action.Title)) { - errors.Add(new ValidationError("Title is required.", nameof(action.Content))); + errors.Add(new ValidationError("Title is required.", nameof(action.Title))); } return Task.FromResult>(errors); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/MediumActionTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/MediumActionTests.cs new file mode 100644 index 000000000..4500a4081 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Guards/Actions/MediumActionTests.cs @@ -0,0 +1,85 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Collections.Generic; +using System.Threading.Tasks; +using FluentAssertions; +using Squidex.Domain.Apps.Core.Rules.Actions; +using Squidex.Infrastructure; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Rules.Guards.Actions +{ + public class MediumActionTests + { + [Fact] + public async Task Should_add_error_if_access_token_is_null() + { + var action = new MediumAction { AccessToken = null, Author = "author", Title = "title", Content = "content" }; + + var errors = await RuleActionValidator.ValidateAsync(action); + + errors.Should().BeEquivalentTo( + new List + { + new ValidationError("Access token is required.", "AccessToken") + }); + } + + [Fact] + public async Task Should_add_error_if_author_is_null() + { + var action = new MediumAction { AccessToken = "token", Author = null, Title = "title", Content = "content" }; + + var errors = await RuleActionValidator.ValidateAsync(action); + + errors.Should().BeEquivalentTo( + new List + { + new ValidationError("Author or publication is required.", "Author", "Publication") + }); + } + + [Fact] + public async Task Should_add_error_if_title_null() + { + var action = new MediumAction { AccessToken = "token", Author = "author", Title = null, Content = "content" }; + + var errors = await RuleActionValidator.ValidateAsync(action); + + errors.Should().BeEquivalentTo( + new List + { + new ValidationError("Title is required.", "Title") + }); + } + + [Fact] + public async Task Should_add_error_if_content_is_null() + { + var action = new MediumAction { AccessToken = "token", Author = "author", Title = "title", Content = null }; + + var errors = await RuleActionValidator.ValidateAsync(action); + + errors.Should().BeEquivalentTo( + new List + { + new ValidationError("Content is required.", "Content") + }); + } + + [Fact] + public async Task Should_not_add_error_if_values_are_valid() + { + var action = new MediumAction { AccessToken = "token", Author = "author", Title = "title", Content = "content" }; + + var errors = await RuleActionValidator.ValidateAsync(action); + + Assert.Empty(errors); + } + } +} From 4ed12e1a006980cc719dce936adfa295368a958a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 1 Jul 2018 17:36:41 +0200 Subject: [PATCH 03/13] Introduced enriched events. --- .../Actions/AlgoliaActionHandler.cs | 71 +++-------- .../Actions/AzureQueueActionHandler.cs | 8 +- .../Actions/ElasticSearchActionHandler.cs | 116 ++++-------------- .../Actions/FastlyActionHandler.cs | 23 ++-- .../Actions/MediumActionHandler.cs | 8 +- .../HandleRules/Actions/SlackActionHandler.cs | 14 +-- .../Actions/WebhookActionHandler.cs | 18 +-- .../EnrichedEvents/EnrichedContentEvent.cs | 33 +++++ .../EnrichedContentEventAction.cs | 19 +++ .../EnrichedEvents/EnrichedEvent.cs | 26 ++++ .../EnrichedEvents/EnrichedSchemaEvent.cs | 17 +++ .../HandleRules/IEventEnricher.cs | 19 +++ .../HandleRules/IRuleActionHandler.cs | 5 +- .../HandleRules/RuleActionHandler.cs | 9 +- .../HandleRules/RuleEventFormatter.cs | 77 ++++-------- .../HandleRules/RuleService.cs | 53 +++----- .../HandleRules/RuleEventFormatterTests.cs | 102 +++++++-------- .../HandleRules/RuleServiceTests.cs | 17 ++- 18 files changed, 286 insertions(+), 349 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/IEventEnricher.cs diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs index cec57ddae..83678590c 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs @@ -10,12 +10,9 @@ using System.Threading.Tasks; using Algolia.Search; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -using Squidex.Domain.Apps.Core.Contents; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; -using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; #pragma warning disable SA1649 // File name must match first type name @@ -24,6 +21,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class AlgoliaJob { public string AppId { get; set; } + public string ApiKey { get; set; } public string ContentId { get; set; } @@ -54,11 +52,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(Envelope @event, string eventName, AlgoliaAction action) + protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(EnrichedEvent @event, AlgoliaAction action) { - if (@event.Payload is ContentEvent contentEvent) + if (@event is EnrichedContentEvent contentEvent) { - var contentId = contentEvent.ContentId.ToString(); + var contentId = contentEvent.Id.ToString(); var ruleDescription = string.Empty; var ruleJob = new AlgoliaJob @@ -69,56 +67,17 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions IndexName = await formatter.FormatStringAsync(action.IndexName, @event) }; - var timestamp = @event.Headers.Timestamp().ToString(); - - switch (@event.Payload) + if (contentEvent.Action == EnrichedContentEventAction.Deleted || + contentEvent.Action == EnrichedContentEventAction.Archived) + { + ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; + } + else { - case ContentCreated created: - { - ruleDescription = $"Add entry to Algolia index: {action.IndexName}"; - - ruleJob.Content = new JObject( - new JProperty("objectID", contentId), - new JProperty("id", contentId), - new JProperty("created", timestamp), - new JProperty("createdBy", created.Actor.ToString()), - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", created.Actor.ToString()), - new JProperty("status", Status.Draft.ToString()), - new JProperty("data", formatter.ToRouteData(created.Data))); - break; - } - - case ContentUpdated updated: - { - ruleDescription = $"Update entry in Algolia index: {action.IndexName}"; - - ruleJob.Content = new JObject( - new JProperty("objectID", contentId), - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", updated.Actor.ToString()), - new JProperty("data", formatter.ToRouteData(updated.Data))); - break; - } - - case ContentStatusChanged statusChanged: - { - ruleDescription = $"Update entry in Algolia index: {action.IndexName}"; - - ruleJob.Content = new JObject( - new JProperty("objectID", contentId), - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", statusChanged.Actor.ToString()), - new JProperty("status", statusChanged.Status.ToString())); - break; - } - - case ContentDeleted deleted: - { - ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; - - break; - } + ruleDescription = $"Add entry to Algolia index: {action.IndexName}"; + + ruleJob.Content = formatter.ToPayload(contentEvent); + ruleJob.Content["objectID"] = contentId; } return (ruleDescription, ruleJob); diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs index 2b0e50b91..fece94b2f 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs @@ -11,10 +11,9 @@ using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Queue; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; #pragma warning disable SA1649 // File name must match first type name @@ -23,6 +22,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class AzureQueueJob { public string QueueConnectionString { get; set; } + public string QueueName { get; set; } public string MessageBodyV2 { get; set; } @@ -60,9 +60,9 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, AzureQueueJob Data)> CreateJobAsync(Envelope @event, string eventName, AzureQueueAction action) + protected override async Task<(string Description, AzureQueueJob Data)> CreateJobAsync(EnrichedEvent @event, AzureQueueAction action) { - var body = formatter.ToRouteData(@event, eventName).ToString(Formatting.Indented); + var body = formatter.ToEnvelope(@event).ToString(Formatting.Indented); var queueName = await formatter.FormatStringAsync(action.Queue, @event); diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs index 94df18789..7eb7fe61d 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs @@ -9,12 +9,9 @@ using System; using System.Threading.Tasks; using Elasticsearch.Net; using Newtonsoft.Json.Linq; -using Squidex.Domain.Apps.Core.Contents; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; -using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; #pragma warning disable SA1649 // File name must match first type name @@ -25,14 +22,14 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public string Host { get; set; } public string Username { get; set; } + public string Password { get; set; } public string ContentId { get; set; } public string IndexName { get; set; } - public string IndexType { get; set; } - public string Operation { get; set; } + public string IndexType { get; set; } public JObject Content { get; set; } } @@ -63,11 +60,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(Envelope @event, string eventName, ElasticSearchAction action) + protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(EnrichedEvent @event, ElasticSearchAction action) { - if (@event.Payload is ContentEvent contentEvent) + if (@event is EnrichedContentEvent contentEvent) { - var contentId = contentEvent.ContentId.ToString(); + var contentId = contentEvent.Id.ToString(); var ruleDescription = string.Empty; var ruleJob = new ElasticSearchJob @@ -80,59 +77,17 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions IndexType = await formatter.FormatStringAsync(action.IndexType, @event), }; - var timestamp = @event.Headers.Timestamp().ToString(); - - var actor = @event.Payload.Actor.ToString(); - - switch (@event.Payload) + if (contentEvent.Action == EnrichedContentEventAction.Deleted || + contentEvent.Action == EnrichedContentEventAction.Archived) { - case ContentCreated created: - { - ruleDescription = $"Add entry to ES index: {action.IndexName}"; - - ruleJob.Operation = "Create"; - ruleJob.Content = new JObject( - new JProperty("id", contentId), - new JProperty("created", timestamp), - new JProperty("createdBy", actor), - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", actor), - new JProperty("status", Status.Draft.ToString()), - new JProperty("data", formatter.ToRouteData(created.Data))); - break; - } - - case ContentUpdated updated: - { - ruleDescription = $"Update entry in ES index: {action.IndexName}"; - - ruleJob.Operation = "Update"; - ruleJob.Content = new JObject( - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", actor), - new JProperty("data", formatter.ToRouteData(updated.Data))); - break; - } - - case ContentStatusChanged statusChanged: - { - ruleDescription = $"Update entry in ES index: {action.IndexName}"; - - ruleJob.Operation = "Update"; - ruleJob.Content = new JObject( - new JProperty("lastModified", timestamp), - new JProperty("lastModifiedBy", actor), - new JProperty("status", statusChanged.Status.ToString())); - break; - } - - case ContentDeleted deleted: - { - ruleDescription = $"Delete entry from ES index: {action.IndexName}"; - - ruleJob.Operation = "Delete"; - break; - } + ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; + } + else + { + ruleDescription = $"Upsert to ES index: {action.IndexName}"; + + ruleJob.Content = formatter.ToPayload(contentEvent); + ruleJob.Content["objectID"] = contentId; } } @@ -141,44 +96,23 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(ElasticSearchJob job) { - if (string.IsNullOrWhiteSpace(job.Operation)) - { - return (null, new InvalidOperationException("The action cannot handle this event.")); - } - var client = clients.GetClient((new Uri(job.Host, UriKind.Absolute), job.Username, job.Password)); try { - switch (job.Operation) + if (job.Content != null) { - case "Create": - { - var doc = job.Content.ToString(); - - var response = await client.IndexAsync(job.IndexName, job.IndexType, job.ContentId, doc); - - return (response.Body, response.OriginalException); - } - - case "Update": - { - var doc = new JObject(new JProperty("doc", job.Content)).ToString(); + var doc = job.Content.ToString(); - var response = await client.UpdateAsync(job.IndexName, job.IndexType, job.ContentId, doc); + var response = await client.IndexAsync(job.IndexName, job.IndexType, job.ContentId, doc); - return (response.Body, response.OriginalException); - } - - case "Delete": - { - var response = await client.DeleteAsync(job.IndexName, job.IndexType, job.ContentId); - - return (response.Body, response.OriginalException); - } + return (response.Body, response.OriginalException); + } + else + { + var response = await client.DeleteAsync(job.IndexName, job.IndexType, job.ContentId); - default: - return (null, null); + return (response.Body, response.OriginalException); } } catch (ElasticsearchClientException ex) diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs index 8d76518cc..ef4f8c0e8 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs @@ -8,9 +8,8 @@ using System; using System.Net.Http; using System.Threading.Tasks; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -28,23 +27,17 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class FastlyActionHandler : RuleActionHandler { private const string Description = "Purge key in fastly"; - private const string DescriptionIgnore = "Ignore"; - protected override Task<(string Description, FastlyJob Data)> CreateJobAsync(Envelope @event, string eventName, FastlyAction action) + protected override Task<(string Description, FastlyJob Data)> CreateJobAsync(EnrichedEvent @event, FastlyAction action) { - if (@event.Headers.Contains(CommonHeaders.AggregateId)) + var ruleJob = new FastlyJob { - var ruleJob = new FastlyJob - { - Key = @event.Headers.AggregateId().ToString(), - FastlyApiKey = action.ApiKey, - FastlyServiceID = action.ServiceId - }; - - return Task.FromResult((Description, ruleJob)); - } + Key = @event.AggregateId.ToString(), + FastlyApiKey = action.ApiKey, + FastlyServiceID = action.ServiceId + }; - return Task.FromResult((DescriptionIgnore, new FastlyJob())); + return Task.FromResult((Description, ruleJob)); } protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(FastlyJob job) diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs index 75307c81c..62863eee5 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs @@ -13,10 +13,9 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Http; namespace Squidex.Domain.Apps.Core.HandleRules.Actions @@ -24,6 +23,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class MediumJob { public string RequestUrl { get; set; } + public string RequestBody { get; set; } public string AccessToken { get; set; } @@ -42,7 +42,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, MediumJob Data)> CreateJobAsync(Envelope @event, string eventName, MediumAction action) + protected override async Task<(string Description, MediumJob Data)> CreateJobAsync(EnrichedEvent @event, MediumAction action) { var requestUrl = !string.IsNullOrWhiteSpace(action.Author) ? @@ -67,7 +67,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (Description, ruleJob); } - private async Task ParseTagsAsync(Envelope @event, MediumAction action) + private async Task ParseTagsAsync(EnrichedEvent @event, MediumAction action) { if (string.IsNullOrWhiteSpace(action.Tags)) { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs index c9ec58e14..c783f8ee7 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs @@ -11,10 +11,9 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -50,9 +49,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, SlackJob Data)> CreateJobAsync(Envelope @event, string eventName, SlackAction action) + protected override async Task<(string Description, SlackJob Data)> CreateJobAsync(EnrichedEvent @event, SlackAction action) { - var body = await CreatePayloadAsync(@event, action.Text); + var body = + new JObject( + new JProperty("text", await formatter.FormatStringAsync(action.Text, @event))); var ruleJob = new SlackJob { @@ -63,11 +64,6 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (Description, ruleJob); } - private async Task CreatePayloadAsync(Envelope @event, string text) - { - return new JObject(new JProperty("text", await formatter.FormatStringAsync(text, @event))); - } - protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(SlackJob job) { var requestBody = job.Body; diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs index 316dc125b..d7a995810 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs @@ -11,10 +11,9 @@ using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules.Actions; -using Squidex.Domain.Apps.Events; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Http; #pragma warning disable SA1649 // File name must match first type name @@ -24,7 +23,9 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions public sealed class WebhookJob { public string RequestUrl { get; set; } + public string RequestSignature { get; set; } + public string RequestBodyV2 { get; set; } public JObject RequestBody { get; set; } @@ -49,16 +50,17 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, WebhookJob Data)> CreateJobAsync(Envelope @event, string eventName, WebhookAction action) + protected override async Task<(string Description, WebhookJob Data)> CreateJobAsync(EnrichedEvent @event, WebhookAction action) { - var body = formatter.ToRouteData(@event, eventName).ToString(Formatting.Indented); + var requestBody = formatter.ToEnvelope(@event).ToString(Formatting.Indented); + var requestUrl = await formatter.FormatStringAsync(action.Url.ToString(), @event); - var ruleDescription = $"Send event to webhook '{action.Url}'"; + var ruleDescription = $"Send event to webhook '{requestUrl}'"; var ruleJob = new WebhookJob { - RequestUrl = await formatter.FormatStringAsync(action.Url.ToString(), @event), - RequestSignature = $"{body}{action.SharedSecret}".Sha256Base64(), - RequestBodyV2 = body + RequestUrl = requestUrl, + RequestSignature = $"{requestBody}{action.SharedSecret}".Sha256Base64(), + RequestBodyV2 = requestBody }; return (ruleDescription, ruleJob); diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs new file mode 100644 index 000000000..730845f3b --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs @@ -0,0 +1,33 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using NodaTime; +using Squidex.Domain.Apps.Core.Contents; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public sealed class EnrichedContentEvent : EnrichedSchemaEvent + { + public EnrichedContentEventAction Action { get; set; } + + public Guid Id { get; set; } + + public Instant Created { get; set; } + + public Instant LastModified { get; set; } + + public RefToken CreatedBy { get; set; } + + public RefToken LastModifiedBy { get; set; } + + public NamedContentData Data { get; set; } + + public Status Status { get; set; } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs new file mode 100644 index 000000000..57d107e82 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs @@ -0,0 +1,19 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public enum EnrichedContentEventAction + { + Archived, + Created, + Deleted, + Published, + Restored, + Updated + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs new file mode 100644 index 000000000..d169ccdc9 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs @@ -0,0 +1,26 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using NodaTime; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public class EnrichedEvent + { + public Guid AggregateId { get; set; } + + public NamedId AppId { get; set; } + + public RefToken Actor { get; set; } + + public Instant Timestamp { get; set; } + + public string Name { get; set; } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs new file mode 100644 index 000000000..d62e2493a --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public class EnrichedSchemaEvent : EnrichedEvent + { + public NamedId SchemaId { get; set; } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IEventEnricher.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IEventEnricher.cs new file mode 100644 index 000000000..6d2e7961d --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IEventEnricher.cs @@ -0,0 +1,19 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.Threading.Tasks; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; +using Squidex.Domain.Apps.Events; +using Squidex.Infrastructure.EventSourcing; + +namespace Squidex.Domain.Apps.Core.HandleRules +{ + public interface IEventEnricher + { + Task EnrichAsync(Envelope @event); + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs index ec0fdf198..deced9228 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/IRuleActionHandler.cs @@ -8,9 +8,8 @@ using System; using System.Threading.Tasks; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules; -using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { @@ -18,7 +17,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules { Type ActionType { get; } - Task<(string Description, JObject Data)> CreateJobAsync(Envelope @event, string eventName, RuleAction action); + Task<(string Description, JObject Data)> CreateJobAsync(EnrichedEvent @event, RuleAction action); Task<(string Dump, Exception Exception)> ExecuteJobAsync(JObject data); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs index ea1ead7f5..1cf0e8666 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs @@ -8,9 +8,8 @@ using System; using System.Threading.Tasks; using Newtonsoft.Json.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules; -using Squidex.Domain.Apps.Events; -using Squidex.Infrastructure.EventSourcing; namespace Squidex.Domain.Apps.Core.HandleRules { @@ -21,9 +20,9 @@ namespace Squidex.Domain.Apps.Core.HandleRules get { return typeof(TAction); } } - async Task<(string Description, JObject Data)> IRuleActionHandler.CreateJobAsync(Envelope @event, string eventName, RuleAction action) + async Task<(string Description, JObject Data)> IRuleActionHandler.CreateJobAsync(EnrichedEvent @event, RuleAction action) { - var (description, data) = await CreateJobAsync(@event, eventName, (TAction)action); + var (description, data) = await CreateJobAsync(@event, (TAction)action); return (description, JObject.FromObject(data)); } @@ -35,7 +34,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules return await ExecuteJobAsync(typedData); } - protected abstract Task<(string Description, TData Data)> CreateJobAsync(Envelope @event, string eventName, TAction action); + protected abstract Task<(string Description, TData Data)> CreateJobAsync(EnrichedEvent @event, TAction action); protected abstract Task<(string Dump, Exception Exception)> ExecuteJobAsync(TData job); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs index 8adaafa90..5910dd143 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs @@ -14,11 +14,9 @@ using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.Contents; -using Squidex.Domain.Apps.Events; -using Squidex.Domain.Apps.Events.Contents; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Infrastructure; using Squidex.Infrastructure.Caching; -using Squidex.Infrastructure.EventSourcing; using Squidex.Shared.Users; namespace Squidex.Domain.Apps.Core.HandleRules @@ -61,20 +59,20 @@ namespace Squidex.Domain.Apps.Core.HandleRules this.urlGenerator = urlGenerator; } - public virtual JToken ToRouteData(object value) + public virtual JObject ToPayload(object @event) { - return JToken.FromObject(value, serializer); + return JObject.FromObject(@event, serializer); } - public virtual JToken ToRouteData(Envelope @event, string eventName) + public virtual JObject ToEnvelope(EnrichedEvent @event) { return new JObject( - new JProperty("type", eventName), - new JProperty("payload", JToken.FromObject(@event.Payload, serializer)), - new JProperty("timestamp", @event.Headers.Timestamp().ToString())); + new JProperty("type", @event), + new JProperty("payload", ToPayload(@event)), + new JProperty("timestamp", @event.Timestamp.ToString())); } - public async virtual Task FormatStringAsync(string text, Envelope @event) + public async virtual Task FormatStringAsync(string text, EnrichedEvent @event) { if (string.IsNullOrWhiteSpace(text)) { @@ -83,57 +81,46 @@ namespace Squidex.Domain.Apps.Core.HandleRules var sb = new StringBuilder(text); - if (@event.Headers.Contains(CommonHeaders.Timestamp)) - { - var timestamp = @event.Headers.Timestamp().ToDateTimeUtc(); - - sb.Replace(TimestampDateTimePlaceholder, timestamp.ToString("yyy-MM-dd-hh-mm-ss", CultureInfo.InvariantCulture)); - sb.Replace(TimestampDatePlaceholder, timestamp.ToString("yyy-MM-dd", CultureInfo.InvariantCulture)); - } + sb.Replace(TimestampDateTimePlaceholder, @event.Timestamp.ToString("yyy-MM-dd-hh-mm-ss", CultureInfo.InvariantCulture)); + sb.Replace(TimestampDatePlaceholder, @event.Timestamp.ToString("yyy-MM-dd", CultureInfo.InvariantCulture)); - if (@event.Payload.AppId != null) + if (@event.AppId != null) { - sb.Replace(AppIdPlaceholder, @event.Payload.AppId.Id.ToString()); - sb.Replace(AppNamePlaceholder, @event.Payload.AppId.Name); + sb.Replace(AppIdPlaceholder, @event.AppId.Id.ToString()); + sb.Replace(AppNamePlaceholder, @event.AppId.Name); } - if (@event.Payload is SchemaEvent schemaEvent && schemaEvent.SchemaId != null) + if (@event is EnrichedSchemaEvent schemaEvent && schemaEvent.SchemaId != null) { sb.Replace(SchemaIdPlaceholder, schemaEvent.SchemaId.Id.ToString()); sb.Replace(SchemaNamePlaceholder, schemaEvent.SchemaId.Name); } - if (@event.Payload is ContentEvent contentEvent) + if (@event is EnrichedContentEvent contentEvent) { - sb.Replace(ContentUrlPlaceholder, urlGenerator.GenerateContentUIUrl(@event.Payload.AppId, contentEvent.SchemaId, contentEvent.ContentId)); + sb.Replace(ContentUrlPlaceholder, urlGenerator.GenerateContentUIUrl(@event.AppId, contentEvent.SchemaId, contentEvent.Id)); + sb.Replace(ContentActionPlaceholder, contentEvent.Action.ToString()); } await FormatUserInfoAsync(@event, sb); - FormatContentAction(@event, sb); - var result = sb.ToString(); - if (@event.Payload is ContentCreated contentCreated && contentCreated.Data != null) + if (@event is EnrichedContentEvent contentEvent2) { - result = ReplaceData(contentCreated.Data, result); - } - - if (@event.Payload is ContentUpdated contentUpdated && contentUpdated.Data != null) - { - result = ReplaceData(contentUpdated.Data, result); + result = ReplaceData(contentEvent2.Data, result); } return result; } - private async Task FormatUserInfoAsync(Envelope @event, StringBuilder sb) + private async Task FormatUserInfoAsync(EnrichedEvent @event, StringBuilder sb) { var text = sb.ToString(); if (text.Contains(UserEmailPlaceholder) || text.Contains(UserNamePlaceholder)) { - var actor = @event.Payload.Actor; + var actor = @event.Actor; if (actor.Type.Equals("client", StringComparison.OrdinalIgnoreCase)) { @@ -160,28 +147,6 @@ namespace Squidex.Domain.Apps.Core.HandleRules } } - private static void FormatContentAction(Envelope @event, StringBuilder sb) - { - switch (@event.Payload) - { - case ContentCreated contentCreated: - sb.Replace(ContentActionPlaceholder, "created"); - break; - - case ContentUpdated contentUpdated: - sb.Replace(ContentActionPlaceholder, "updated"); - break; - - case ContentStatusChanged contentStatusChanged: - sb.Replace(ContentActionPlaceholder, $"set to {contentStatusChanged.Status.ToString().ToLowerInvariant()}"); - break; - - case ContentDeleted contentDeleted: - sb.Replace(ContentActionPlaceholder, "deleted"); - break; - } - } - private static string ReplaceData(NamedContentData data, string text) { text = ContentDataPlaceholder.Replace(text, match => diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs index 019399f0b..58e862cc6 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleService.cs @@ -26,17 +26,20 @@ namespace Squidex.Domain.Apps.Core.HandleRules private readonly Dictionary ruleActionHandlers; private readonly Dictionary ruleTriggerHandlers; private readonly TypeNameRegistry typeNameRegistry; + private readonly IEventEnricher eventEnricher; private readonly IClock clock; public RuleService( IEnumerable ruleTriggerHandlers, IEnumerable ruleActionHandlers, + IEventEnricher eventEnricher, IClock clock, TypeNameRegistry typeNameRegistry) { Guard.NotNull(ruleTriggerHandlers, nameof(ruleTriggerHandlers)); Guard.NotNull(ruleActionHandlers, nameof(ruleActionHandlers)); Guard.NotNull(typeNameRegistry, nameof(typeNameRegistry)); + Guard.NotNull(eventEnricher, nameof(eventEnricher)); Guard.NotNull(clock, nameof(clock)); this.typeNameRegistry = typeNameRegistry; @@ -44,6 +47,8 @@ namespace Squidex.Domain.Apps.Core.HandleRules this.ruleTriggerHandlers = ruleTriggerHandlers.ToDictionary(x => x.TriggerType); this.ruleActionHandlers = ruleActionHandlers.ToDictionary(x => x.ActionType); + this.eventEnricher = eventEnricher; + this.clock = clock; } @@ -76,41 +81,38 @@ namespace Squidex.Domain.Apps.Core.HandleRules return null; } - var eventName = CreateEventName(appEvent); - var now = clock.GetCurrentInstant(); - var actionName = typeNameRegistry.GetName(actionType); - var actionData = await actionHandler.CreateJobAsync(appEventEnvelope, eventName, rule.Action); - var eventTime = @event.Headers.Contains(CommonHeaders.Timestamp) ? @event.Headers.Timestamp() : now; - var aggregateId = - @event.Headers.Contains(CommonHeaders.AggregateId) ? - @event.Headers.AggregateId() : - Guid.NewGuid(); + var expires = eventTime.Plus(Constants.ExpirationTime); + + if (expires < now) + { + return null; + } + + var enrichedEvent = await eventEnricher.EnrichAsync(appEventEnvelope); + + var actionName = typeNameRegistry.GetName(actionType); + var actionData = await actionHandler.CreateJobAsync(enrichedEvent, rule.Action); var job = new RuleJob { JobId = Guid.NewGuid(), ActionName = actionName, ActionData = actionData.Data, - AggregateId = aggregateId, + AggregateId = enrichedEvent.AggregateId, AppId = appEvent.AppId.Id, Created = now, - EventName = eventName, - Expires = eventTime.Plus(Constants.ExpirationTime), + EventName = enrichedEvent.Name, + Expires = expires, Description = actionData.Description }; - if (job.Expires < now) - { - return null; - } - return job; } @@ -152,22 +154,5 @@ namespace Squidex.Domain.Apps.Core.HandleRules return (ex.ToString(), RuleResult.Failed, TimeSpan.Zero); } } - - private string CreateEventName(AppEvent appEvent) - { - var eventName = typeNameRegistry.GetName(appEvent.GetType()); - - if (appEvent is SchemaEvent schemaEvent) - { - if (eventName.StartsWith(ContentPrefix, StringComparison.Ordinal)) - { - eventName = eventName.Substring(ContentPrefix.Length); - } - - return $"{schemaEvent.SchemaId.Name.ToPascalCase()}{eventName}"; - } - - return eventName; - } } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs index 7112afd42..bbe33a476 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs @@ -17,10 +17,8 @@ using Newtonsoft.Json.Linq; using NodaTime; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.HandleRules; -using Squidex.Domain.Apps.Events; -using Squidex.Domain.Apps.Events.Contents; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Infrastructure; -using Squidex.Infrastructure.EventSourcing; using Squidex.Shared.Identity; using Squidex.Shared.Users; using Xunit; @@ -53,7 +51,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public void Should_serialize_object_to_json() { - var result = sut.ToRouteData(new { Value = 1 }); + var result = sut.ToPayload(new { Value = 1 }); Assert.True(result is JObject); } @@ -61,9 +59,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public void Should_create_route_data() { - var @event = new ContentCreated { AppId = appId }; + var @event = new EnrichedContentEvent { AppId = appId }; - var result = sut.ToRouteData(AsEnvelope(@event)); + var result = sut.ToPayload(@event); Assert.True(result is JObject); } @@ -71,9 +69,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public void Should_create_route_data_from_event() { - var @event = new ContentCreated { AppId = appId }; + var @event = new EnrichedContentEvent { AppId = appId, Name = "MyEventName" }; - var result = sut.ToRouteData(AsEnvelope(@event), "MyEventName"); + var result = sut.ToPayload(@event); Assert.Equal("MyEventName", result["type"]); } @@ -81,9 +79,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_replace_app_information_from_event() { - var @event = new ContentCreated { AppId = appId }; + var @event = new EnrichedContentEvent { AppId = appId }; - var result = await sut.FormatStringAsync("Name $APP_NAME has id $APP_ID", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("Name $APP_NAME has id $APP_ID", @event); Assert.Equal($"Name my-app has id {appId.Id}", result); } @@ -91,9 +89,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_replace_schema_information_from_event() { - var @event = new ContentCreated { SchemaId = schemaId }; + var @event = new EnrichedContentEvent { SchemaId = schemaId }; - var result = await sut.FormatStringAsync("Name $SCHEMA_NAME has id $SCHEMA_ID", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("Name $SCHEMA_NAME has id $SCHEMA_ID", @event); Assert.Equal($"Name my-schema has id {schemaId.Id}", result); } @@ -103,7 +101,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules { var now = DateTime.UtcNow; - var envelope = AsEnvelope(new ContentCreated()).SetTimestamp(Instant.FromDateTimeUtc(now)); + var envelope = new EnrichedContentEvent { Timestamp = Instant.FromDateTimeUtc(now) }; var result = await sut.FormatStringAsync("Date: $TIMESTAMP_DATE, Full: $TIMESTAMP_DATETIME", envelope); @@ -116,9 +114,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) .Returns(user); - var @event = new ContentCreated { Actor = new RefToken("subject", "123") }; + var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From me (me@email.com)", result); } @@ -129,9 +127,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) .Returns(Task.FromResult(null)); - var @event = new ContentCreated { Actor = new RefToken("subject", "123") }; + var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From UNDEFINED (UNDEFINED)", result); } @@ -142,9 +140,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) .Throws(new InvalidOperationException()); - var @event = new ContentCreated { Actor = new RefToken("subject", "123") }; + var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From UNDEFINED (UNDEFINED)", result); } @@ -152,9 +150,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_format_email_and_display_name_from_client() { - var @event = new ContentCreated { Actor = new RefToken("client", "android") }; + var @event = new EnrichedContentEvent { Actor = new RefToken("client", "android") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From client:android (client:android)", result); } @@ -167,9 +165,9 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules A.CallTo(() => urlGenerator.GenerateContentUIUrl(appId, schemaId, contentId)) .Returns(url); - var @event = new ContentCreated { AppId = appId, ContentId = contentId, SchemaId = schemaId }; + var @event = new EnrichedContentEvent { AppId = appId, Id = contentId, SchemaId = schemaId }; - var result = await sut.FormatStringAsync("Go to $CONTENT_URL", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("Go to $CONTENT_URL", @event); Assert.Equal($"Go to {url}", result); } @@ -177,7 +175,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_field_not_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -186,7 +184,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.country.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.country.iv", @event); Assert.Equal("UNDEFINED", result); } @@ -194,7 +192,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_partition_not_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -203,7 +201,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de", @event); Assert.Equal("UNDEFINED", result); } @@ -211,7 +209,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_array_item_not_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -220,7 +218,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", new JArray())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.10", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.10", @event); Assert.Equal("UNDEFINED", result); } @@ -228,7 +226,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_property_not_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -238,7 +236,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.Name", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.Name", @event); Assert.Equal("UNDEFINED", result); } @@ -246,7 +244,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_plain_value_when_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -255,7 +253,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); Assert.Equal("Berlin", result); } @@ -263,7 +261,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_plain_value_when_found_from_update_event() { - var @event = new ContentUpdated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -272,7 +270,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); Assert.Equal("Berlin", result); } @@ -280,7 +278,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_null() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -289,7 +287,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", JValue.CreateNull())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); Assert.Equal("UNDEFINED", result); } @@ -297,7 +295,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_undefined_when_undefined() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -306,7 +304,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", JValue.CreateUndefined())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); Assert.Equal("UNDEFINED", result); } @@ -314,7 +312,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_string_when_object() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -324,7 +322,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); Assert.Equal(JObject.FromObject(new { name = "Berlin" }).ToString(Formatting.Indented), result); } @@ -332,7 +330,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_plain_value_from_array_when_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -342,7 +340,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules "Berlin"))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.0", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.0", @event); Assert.Equal("Berlin", result); } @@ -350,7 +348,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_return_plain_value_from_object_when_found() { - var @event = new ContentCreated + var @event = new EnrichedContentEvent { Data = new NamedContentData() @@ -360,7 +358,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.name", AsEnvelope(@event)); + var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.name", @event); Assert.Equal("Berlin", result); } @@ -368,16 +366,10 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules [Fact] public async Task Should_format_content_actions_when_found() { - Assert.Equal("created", await sut.FormatStringAsync("$CONTENT_ACTION", AsEnvelope(new ContentCreated()))); - Assert.Equal("updated", await sut.FormatStringAsync("$CONTENT_ACTION", AsEnvelope(new ContentUpdated()))); - Assert.Equal("deleted", await sut.FormatStringAsync("$CONTENT_ACTION", AsEnvelope(new ContentDeleted()))); - - Assert.Equal("set to archived", await sut.FormatStringAsync("$CONTENT_ACTION", AsEnvelope(new ContentStatusChanged { Status = Status.Archived }))); - } - - private static Envelope AsEnvelope(T @event) where T : AppEvent - { - return Envelope.Create(@event).To(); + Assert.Equal("created", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Created })); + Assert.Equal("updated", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Updated })); + Assert.Equal("deleted", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Deleted })); + Assert.Equal("archived", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Archived })); } } } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs index f0bbc9d29..5c4b837b2 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleServiceTests.cs @@ -11,6 +11,7 @@ using FakeItEasy; using Newtonsoft.Json.Linq; using NodaTime; using Squidex.Domain.Apps.Core.HandleRules; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.Actions; using Squidex.Domain.Apps.Core.Rules.Triggers; @@ -28,6 +29,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules { private readonly IRuleTriggerHandler ruleTriggerHandler = A.Fake(); private readonly IRuleActionHandler ruleActionHandler = A.Fake(); + private readonly IEventEnricher eventEnricher = A.Fake(); private readonly IClock clock = A.Fake(); private readonly TypeNameRegistry typeNameRegistry = new TypeNameRegistry(); private readonly RuleService sut; @@ -57,13 +59,16 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules typeNameRegistry.Map(typeof(ContentCreated)); typeNameRegistry.Map(typeof(WebhookAction)); + A.CallTo(() => eventEnricher.EnrichAsync(A>.Ignored)) + .Returns(new EnrichedContentEvent()); + A.CallTo(() => ruleActionHandler.ActionType) .Returns(typeof(WebhookAction)); A.CallTo(() => ruleTriggerHandler.TriggerType) .Returns(typeof(ContentChangedTrigger)); - sut = new RuleService(new[] { ruleTriggerHandler }, new[] { ruleActionHandler }, clock, typeNameRegistry); + sut = new RuleService(new[] { ruleTriggerHandler }, new[] { ruleActionHandler }, eventEnricher, clock, typeNameRegistry); } [Fact] @@ -128,15 +133,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var actionData = new JObject(); var actionDescription = "MyDescription"; - var eventName = "MySchemaCreatedEvent"; - A.CallTo(() => clock.GetCurrentInstant()) .Returns(now); A.CallTo(() => ruleTriggerHandler.Triggers(A>.Ignored, ruleConfig.Trigger)) .Returns(true); - A.CallTo(() => ruleActionHandler.CreateJobAsync(A>.Ignored, eventName, ruleConfig.Action)) + A.CallTo(() => ruleActionHandler.CreateJobAsync(A.Ignored, ruleConfig.Action)) .Returns((actionDescription, actionData)); var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope); @@ -160,21 +163,17 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var actionData = new JObject(); var actionDescription = "MyDescription"; - var eventName = "MySchemaCreatedEvent"; - A.CallTo(() => clock.GetCurrentInstant()) .Returns(now); A.CallTo(() => ruleTriggerHandler.Triggers(A>.Ignored, ruleConfig.Trigger)) .Returns(true); - A.CallTo(() => ruleActionHandler.CreateJobAsync(A>.Ignored, eventName, ruleConfig.Action)) + A.CallTo(() => ruleActionHandler.CreateJobAsync(A.Ignored, ruleConfig.Action)) .Returns((actionDescription, actionData)); var job = await sut.CreateJobAsync(ruleConfig, ruleEnvelope); - Assert.Equal(eventName, job.EventName); - Assert.Equal(actionData, job.ActionData); Assert.Equal(actionName, job.ActionName); Assert.Equal(actionDescription, job.Description); From ecfafdc702fc31ce1cf4636ff887a72ee2f2436d Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 1 Jul 2018 18:48:14 +0200 Subject: [PATCH 04/13] Snapshot history. --- .../Apps/AppGrain.cs | 7 ++ .../Contents/ContentGrain.cs | 6 ++ .../Contents/IContentGrain.cs | 4 ++ .../Rules/RuleGrain.cs | 7 ++ .../Schemas/SchemaGrain.cs | 7 ++ .../Commands/DomainObjectGrain.cs | 60 ++++++++++++++--- .../Commands/DomainObjectGrainTests.cs | 67 +++++++++++++++++++ 7 files changed, 147 insertions(+), 11 deletions(-) diff --git a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs index 975b1cd36..43bf53061 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs @@ -57,6 +57,13 @@ namespace Squidex.Domain.Apps.Entities.Apps this.initialPatterns = initialPatterns; } + public override Task OnActivateAsync() + { + CleanupOldSnapshots(); + + return base.OnActivateAsync(); + } + protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotArchived(); diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs index 755e30a1d..161f433ae 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs @@ -20,6 +20,7 @@ using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Log; +using Squidex.Infrastructure.Orleans; using Squidex.Infrastructure.Reflection; using Squidex.Infrastructure.States; @@ -289,5 +290,10 @@ namespace Squidex.Domain.Apps.Entities.Contents return operationContext; } + + public Task> GetStateAsync(long version = -2) + { + return Task.FromResult(J.Of(GetSnapshot(version))); + } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs index 0b2d547c1..429a27746 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs @@ -5,11 +5,15 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Threading.Tasks; +using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.Orleans; namespace Squidex.Domain.Apps.Entities.Contents { public interface IContentGrain : IDomainObjectGrain { + Task> GetStateAsync(long version = EtagVersion.Any); } } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs b/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs index 81e475e4d..0ea48b9f2 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs @@ -34,6 +34,13 @@ namespace Squidex.Domain.Apps.Entities.Rules this.appProvider = appProvider; } + public override Task OnActivateAsync() + { + CleanupOldSnapshots(); + + return base.OnActivateAsync(); + } + protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotDeleted(); diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs index e7eb3a28d..3356a4bbe 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs @@ -40,6 +40,13 @@ namespace Squidex.Domain.Apps.Entities.Schemas this.registry = registry; } + public override Task OnActivateAsync() + { + CleanupOldSnapshots(); + + return base.OnActivateAsync(); + } + protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotDeleted(); diff --git a/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs b/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs index 91beac110..fcea5d4cc 100644 --- a/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs +++ b/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs @@ -21,8 +21,9 @@ namespace Squidex.Infrastructure.Commands private readonly List> uncomittedEvents = new List>(); private readonly IStore store; private readonly ISemanticLog log; + private readonly List snapshots = new List { new T { Version = EtagVersion.Empty } }; + private bool cleanup; private Guid id; - private T snapshot = new T { Version = EtagVersion.Empty }; private IPersistence persistence; public Guid Id @@ -32,17 +33,17 @@ namespace Squidex.Infrastructure.Commands public long Version { - get { return snapshot.Version; } + get { return snapshots.Count - 2; } } public long NewVersion { - get { return snapshot.Version + uncomittedEvents.Count; } + get { return Version; } } public T Snapshot { - get { return snapshot; } + get { return snapshots[snapshots.Count - 1]; } } protected DomainObjectGrain(IStore store, ISemanticLog log) @@ -55,6 +56,31 @@ namespace Squidex.Infrastructure.Commands this.log = log; } + public void CleanupOldSnapshots() + { + cleanup = true; + } + + public T GetSnapshot(long version) + { + if (version == EtagVersion.Any) + { + return Snapshot; + } + + if (version == EtagVersion.Empty) + { + return snapshots[0]; + } + + if (version >= 0 && version < snapshots.Count - 1) + { + return snapshots[(int)version + 1]; + } + + return default(T); + } + public override async Task OnActivateAsync(Guid key) { using (log.MeasureInformation(w => w @@ -96,9 +122,11 @@ namespace Squidex.Infrastructure.Commands uncomittedEvents.Clear(); } - public virtual void ApplySnapshot(T newSnapshot) + public virtual void ApplySnapshot(T snapshot) { - snapshot = newSnapshot; + snapshot.Version = snapshots.Count - 1; + + snapshots.Add(snapshot); } public virtual void ApplyEvent(Envelope @event) @@ -172,7 +200,8 @@ namespace Squidex.Infrastructure.Commands throw new DomainException("Object has already been created."); } - var previousSnapshot = snapshot; + var size = snapshots.Count; + try { var result = await handler(command); @@ -181,10 +210,8 @@ namespace Squidex.Infrastructure.Commands if (events.Length > 0) { - snapshot.Version = NewVersion; - await persistence.WriteEventsAsync(events); - await persistence.WriteSnapshotAsync(snapshot); + await persistence.WriteSnapshotAsync(Snapshot); } if (result == null) @@ -203,12 +230,23 @@ namespace Squidex.Infrastructure.Commands } catch { - snapshot = previousSnapshot; + while (snapshots.Count > size) + { + snapshots.RemoveAt(snapshots.Count - 1); + } throw; } finally { + if (cleanup) + { + for (var i = 0; i < snapshots.Count - 1; i++) + { + snapshots[i] = default(T); + } + } + uncomittedEvents.Clear(); } } diff --git a/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectGrainTests.cs b/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectGrainTests.cs index 95d2976ab..5c296deec 100644 --- a/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectGrainTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Commands/DomainObjectGrainTests.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using FakeItEasy; +using FluentAssertions; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Log; using Squidex.Infrastructure.Orleans; @@ -124,6 +125,72 @@ namespace Squidex.Infrastructure.Commands Assert.Equal(EtagVersion.Empty, sut.Version); } + [Fact] + public async Task Should_get_latestet_version_when_requesting_state_with_any() + { + await SetupEmptyAsync(); + + await sut.ExecuteAsync(C(new CreateAuto { Value = 5 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 10 })); + + var result = sut.GetSnapshot(EtagVersion.Any); + + result.Should().BeEquivalentTo(new MyDomainState { Value = 10, Version = 1 }); + } + + [Fact] + public async Task Should_get_empty_version_when_requesting_state_with_empty_version() + { + await SetupEmptyAsync(); + + await sut.ExecuteAsync(C(new CreateAuto { Value = 5 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 10 })); + + var result = sut.GetSnapshot(EtagVersion.Empty); + + result.Should().BeEquivalentTo(new MyDomainState { Value = 0, Version = -1 }); + } + + [Fact] + public async Task Should_get_specific_version_when_requesting_state_with_specific_version() + { + await SetupEmptyAsync(); + + await sut.ExecuteAsync(C(new CreateAuto { Value = 5 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 10 })); + + sut.GetSnapshot(0).Should().BeEquivalentTo(new MyDomainState { Value = 5, Version = 0 }); + sut.GetSnapshot(1).Should().BeEquivalentTo(new MyDomainState { Value = 10, Version = 1 }); + } + + [Fact] + public async Task Should_automatically_cleanup_old_snapshots_when_enabled() + { + await SetupEmptyAsync(); + + sut.CleanupOldSnapshots(); + + await sut.ExecuteAsync(C(new CreateAuto { Value = 5 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 10 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 15 })); + + Assert.Null(sut.GetSnapshot(0)); + Assert.Null(sut.GetSnapshot(1)); + Assert.NotNull(sut.GetSnapshot(2)); + } + + [Fact] + public async Task Should_get_null_state_when_requesting_state_with_invalid_version() + { + await SetupEmptyAsync(); + + await sut.ExecuteAsync(C(new CreateAuto { Value = 5 })); + await sut.ExecuteAsync(C(new UpdateAuto { Value = 10 })); + + Assert.Null(sut.GetSnapshot(-3)); + Assert.Null(sut.GetSnapshot(2)); + } + [Fact] public async Task Should_write_state_and_events_when_created() { From 91cd235c026bcd3ded4b1efd71e9caad2c6b6174 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 1 Jul 2018 20:00:30 +0200 Subject: [PATCH 05/13] Started with event enricher. --- .../Triggers/ContentChangedTriggerSchema.cs | 2 + .../Actions/AlgoliaActionHandler.cs | 2 +- .../Actions/ElasticSearchActionHandler.cs | 6 +- .../EnrichedContentEventAction.cs | 3 +- .../Triggers/ContentChangedTriggerHandler.cs | 34 ++++- .../Contents/ContentVersionLoader.cs | 33 ++--- .../Rules/EventEnricher.cs | 123 ++++++++++++++++++ .../ContentChangedTriggerSchemaDto.cs | 5 + 8 files changed, 174 insertions(+), 34 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs 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 33d073f5a..aca1f16e5 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs @@ -20,5 +20,7 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers public bool SendDelete { get; set; } public bool SendPublish { get; set; } + + public bool SendUnpublish { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs index 83678590c..3d7171141 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs @@ -68,7 +68,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }; if (contentEvent.Action == EnrichedContentEventAction.Deleted || - contentEvent.Action == EnrichedContentEventAction.Archived) + contentEvent.Action == EnrichedContentEventAction.Unpublished) { ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs index 7eb7fe61d..624795c6b 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs @@ -78,13 +78,13 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }; if (contentEvent.Action == EnrichedContentEventAction.Deleted || - contentEvent.Action == EnrichedContentEventAction.Archived) + contentEvent.Action == EnrichedContentEventAction.Unpublished) { - ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; + ruleDescription = $"Delete entry index: {action.IndexName}"; } else { - ruleDescription = $"Upsert to ES index: {action.IndexName}"; + ruleDescription = $"Upsert to index: {action.IndexName}"; ruleJob.Content = formatter.ToPayload(contentEvent); ruleJob.Content["objectID"] = contentId; diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs index 57d107e82..6c02c8f48 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs @@ -9,11 +9,10 @@ namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { public enum EnrichedContentEventAction { - Archived, Created, Deleted, Published, - Restored, + Unpublished, Updated } } 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 6914f3d44..c0505f309 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs @@ -44,10 +44,36 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Triggers private static bool MatchsType(ContentChangedTriggerSchema schema, SchemaEvent @event) { return - (schema.SendCreate && @event is ContentCreated) || - (schema.SendUpdate && @event is ContentUpdated) || - (schema.SendDelete && @event is ContentDeleted) || - (schema.SendPublish && @event is ContentStatusChanged statusChanged && statusChanged.Status == Status.Published); + IsCreate(schema, @event) || + IsUpdate(schema, @event) || + IsDelete(schema, @event) || + IsPublished(schema, @event) || + IsUnpublished(schema, @event); + } + + private static bool IsPublished(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendPublish && @event is ContentStatusChanged statusChanged && statusChanged.Status == Status.Published; + } + + private static bool IsUnpublished(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendUnpublish && @event is ContentStatusChanged statusChanged && statusChanged.Status != Status.Published; + } + + private static bool IsCreate(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendCreate && @event is ContentCreated; + } + + private static bool IsUpdate(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendUpdate && @event is ContentUpdated || schema.SendUpdate && @event is ContentChangesPublished; + } + + private static bool IsDelete(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return (schema.SendDelete && @event is ContentDeleted); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs index dca35ba34..7016766ef 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs @@ -7,52 +7,37 @@ using System; using System.Threading.Tasks; -using Squidex.Domain.Apps.Core.Schemas; -using Squidex.Domain.Apps.Entities.Contents.State; +using Orleans; using Squidex.Infrastructure; using Squidex.Infrastructure.Log; -using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Contents { public sealed class ContentVersionLoader : IContentVersionLoader { - private readonly IStore store; - private readonly FieldRegistry registry; + private readonly IGrainFactory grainFactory; - public ContentVersionLoader(IStore store, FieldRegistry registry) + public ContentVersionLoader(IGrainFactory grainFactory) { - Guard.NotNull(store, nameof(store)); - Guard.NotNull(registry, nameof(registry)); + Guard.NotNull(grainFactory, nameof(grainFactory)); - this.store = store; - - this.registry = registry; + this.grainFactory = grainFactory; } public async Task LoadAsync(Guid id, long version) { using (Profiler.TraceMethod()) { - var content = new ContentState(); - - var persistence = store.WithEventSourcing(id, e => - { - if (content.Version < version) - { - content = content.Apply(e); - content.Version++; - } - }); + var grain = grainFactory.GetGrain(id); - await persistence.ReadAsync(); + var content = await grain.GetStateAsync(version); - if (content.Version != version) + if (content.Value == null || content.Value.Version != version) { throw new DomainObjectNotFoundException(id.ToString(), typeof(IContentEntity)); } - return content; + return content.Value; } } } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs new file mode 100644 index 000000000..7c51d63cf --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs @@ -0,0 +1,123 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using NodaTime; +using Orleans; +using Squidex.Domain.Apps.Core.Contents; +using Squidex.Domain.Apps.Core.HandleRules; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; +using Squidex.Domain.Apps.Entities.Contents; +using Squidex.Domain.Apps.Events; +using Squidex.Domain.Apps.Events.Assets; +using Squidex.Domain.Apps.Events.Contents; +using Squidex.Infrastructure; +using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Reflection; + +namespace Squidex.Domain.Apps.Entities.Rules +{ + public sealed class EventEnricher : IEventEnricher + { + private readonly IGrainFactory grainFactory; + private readonly IClock clock; + + public EventEnricher(IGrainFactory grainFactory, IClock clock) + { + Guard.NotNull(grainFactory, nameof(grainFactory)); + Guard.NotNull(clock, nameof(clock)); + + this.grainFactory = grainFactory; + + this.clock = clock; + } + + public Task EnrichAsync(Envelope @event) + { + Guard.NotNull(@event, nameof(@event)); + + if (@event.Payload is ContentEvent contentEvent) + { + return CreateContentEventAsync(contentEvent, @event); + } + + if (@event.Payload is AssetEvent assetEvent) + { + } + + return Task.FromResult(null); + } + + private async Task CreateContentEventAsync(ContentEvent contentEvent, Envelope @event) + { + var result = new EnrichedContentEvent(); + + var content = + (await grainFactory + .GetGrain(contentEvent.ContentId) + .GetStateAsync(@event.Headers.EventStreamNumber())).Value; + + SimpleMapper.Map(content, result); + + result.Data = content.Data ?? content.DataDraft; + + switch (contentEvent) + { + case ContentCreated e: + result.Action = EnrichedContentEventAction.Created; + break; + case ContentDeleted e: + result.Action = EnrichedContentEventAction.Deleted; + break; + case ContentUpdated e: + result.Action = EnrichedContentEventAction.Updated; + break; + case ContentStatusChanged e: + if (e.Status == Status.Published) + { + result.Action = EnrichedContentEventAction.Published; + } + else + { + result.Action = EnrichedContentEventAction.Unpublished; + } + + break; + } + + result.Name = $"{content.SchemaId.Name.ToPascalCase()}{result.Action}"; + + SetDefault(result, @event); + + return result; + } + + private void SetDefault(EnrichedEvent result, Envelope @event) + { + result.Timestamp = + @event.Headers.Contains(CommonHeaders.Timestamp) ? + @event.Headers.Timestamp() : + clock.GetCurrentInstant(); + + result.AggregateId = + @event.Headers.Contains(CommonHeaders.AggregateId) ? + @event.Headers.AggregateId() : + Guid.NewGuid(); + + if (@event.Payload is SquidexEvent squidexEvent) + { + result.Actor = squidexEvent.Actor; + } + + if (@event.Payload is AppEvent appEvent) + { + result.AppId = appEvent.AppId; + } + } + } +} diff --git a/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs b/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs index dacd359b3..14e17c511 100644 --- a/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs @@ -35,5 +35,10 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers /// Determines whether to handle the event when a content is published. /// public bool SendPublish { get; set; } + + /// + /// Determines whether to handle the event when a content is unpublished. + /// + public bool SendUnpublish { get; set; } } } From 2b0237dadd2c8f471a22f42a5ef55e2e5c19b902 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 2 Jul 2018 11:42:01 +0200 Subject: [PATCH 06/13] Formatter improved. --- .../Actions/AlgoliaActionHandler.cs | 8 +- .../Actions/AzureQueueActionHandler.cs | 4 +- .../Actions/ElasticSearchActionHandler.cs | 10 +- .../Actions/FastlyActionHandler.cs | 4 +- .../Actions/MediumActionHandler.cs | 14 +- .../HandleRules/Actions/SlackActionHandler.cs | 4 +- .../Actions/WebhookActionHandler.cs | 4 +- .../EnrichedEvents/EnrichedAssetEvent.cs | 47 ++++ .../EnrichedEvents/EnrichedAssetEventType.cs | 17 ++ .../EnrichedEvents/EnrichedContentEvent.cs | 7 +- ...tAction.cs => EnrichedContentEventType.cs} | 2 +- .../EnrichedEvents/EnrichedEvent.cs | 15 +- .../EnrichedEvents/EnrichedSchemaEvent.cs | 2 +- .../HandleRules/RuleActionHandler.cs | 12 +- .../HandleRules/RuleEventFormatter.cs | 257 +++++++++++------- ...Squidex.Domain.Apps.Core.Operations.csproj | 2 +- ...quidex.Domain.Apps.Entities.MongoDb.csproj | 2 +- .../Apps/AppGrain.cs | 2 +- .../Assets/AssetGrain.cs | 6 +- .../Assets/IAssetGrain.cs | 4 + .../Contents/ContentGrain.cs | 4 +- .../Rules/EventEnricher.cs | 118 ++++++-- .../Schemas/SchemaGrain.cs | 2 +- .../Squidex.Domain.Apps.Entities.csproj | 2 +- .../HandleRules/RuleEventFormatterTests.cs | 125 ++++----- .../Contents/ContentVersionLoaderTests.cs | 72 +++++ tools/Migrate_01/Migrate_01.csproj | 4 +- 27 files changed, 508 insertions(+), 242 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEvent.cs create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEventType.cs rename src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/{EnrichedContentEventAction.cs => EnrichedContentEventType.cs} (92%) create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs index 3d7171141..12d0bf225 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AlgoliaActionHandler.cs @@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, AlgoliaJob Data)> CreateJobAsync(EnrichedEvent @event, AlgoliaAction action) + protected override (string Description, AlgoliaJob Data) CreateJob(EnrichedEvent @event, AlgoliaAction action) { if (@event is EnrichedContentEvent contentEvent) { @@ -64,11 +64,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions AppId = action.AppId, ApiKey = action.ApiKey, ContentId = contentId, - IndexName = await formatter.FormatStringAsync(action.IndexName, @event) + IndexName = formatter.Format(action.IndexName, @event) }; - if (contentEvent.Action == EnrichedContentEventAction.Deleted || - contentEvent.Action == EnrichedContentEventAction.Unpublished) + if (contentEvent.Type == EnrichedContentEventType.Deleted || + contentEvent.Type == EnrichedContentEventType.Unpublished) { ruleDescription = $"Delete entry from Algolia index: {action.IndexName}"; } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs index fece94b2f..72af2b839 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/AzureQueueActionHandler.cs @@ -60,11 +60,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, AzureQueueJob Data)> CreateJobAsync(EnrichedEvent @event, AzureQueueAction action) + protected override (string Description, AzureQueueJob Data) CreateJob(EnrichedEvent @event, AzureQueueAction action) { var body = formatter.ToEnvelope(@event).ToString(Formatting.Indented); - var queueName = await formatter.FormatStringAsync(action.Queue, @event); + var queueName = formatter.Format(action.Queue, @event); var ruleDescription = $"Send AzureQueueJob to azure queue '{action.Queue}'"; var ruleJob = new AzureQueueJob diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs index 624795c6b..b51b2d5bf 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/ElasticSearchActionHandler.cs @@ -60,7 +60,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions }); } - protected override async Task<(string Description, ElasticSearchJob Data)> CreateJobAsync(EnrichedEvent @event, ElasticSearchAction action) + protected override (string Description, ElasticSearchJob Data) CreateJob(EnrichedEvent @event, ElasticSearchAction action) { if (@event is EnrichedContentEvent contentEvent) { @@ -73,12 +73,12 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions Username = action.Username, Password = action.Password, ContentId = contentId, - IndexName = await formatter.FormatStringAsync(action.IndexName, @event), - IndexType = await formatter.FormatStringAsync(action.IndexType, @event), + IndexName = formatter.Format(action.IndexName, @event), + IndexType = formatter.Format(action.IndexType, @event), }; - if (contentEvent.Action == EnrichedContentEventAction.Deleted || - contentEvent.Action == EnrichedContentEventAction.Unpublished) + if (contentEvent.Type == EnrichedContentEventType.Deleted || + contentEvent.Type == EnrichedContentEventType.Unpublished) { ruleDescription = $"Delete entry index: {action.IndexName}"; } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs index ef4f8c0e8..937674741 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/FastlyActionHandler.cs @@ -28,7 +28,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions { private const string Description = "Purge key in fastly"; - protected override Task<(string Description, FastlyJob Data)> CreateJobAsync(EnrichedEvent @event, FastlyAction action) + protected override (string Description, FastlyJob Data) CreateJob(EnrichedEvent @event, FastlyAction action) { var ruleJob = new FastlyJob { @@ -37,7 +37,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions FastlyServiceID = action.ServiceId }; - return Task.FromResult((Description, ruleJob)); + return (Description, ruleJob); } protected override async Task<(string Dump, Exception Exception)> ExecuteJobAsync(FastlyJob job) diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs index 62863eee5..ba089042f 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/MediumActionHandler.cs @@ -42,7 +42,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, MediumJob Data)> CreateJobAsync(EnrichedEvent @event, MediumAction action) + protected override (string Description, MediumJob Data) CreateJob(EnrichedEvent @event, MediumAction action) { var requestUrl = !string.IsNullOrWhiteSpace(action.Author) ? @@ -51,11 +51,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions var requestBody = new JObject( - new JProperty("title", await formatter.FormatStringAsync(action.Title, @event)), + new JProperty("title", formatter.Format(action.Title, @event)), new JProperty("contentFormat", action.IsHtml ? "html" : "markdown"), - new JProperty("content", await formatter.FormatStringAsync(action.Content, @event)), - new JProperty("canonicalUrl", await formatter.FormatStringAsync(action.CanonicalUrl, @event)), - new JProperty("tags", await ParseTagsAsync(@event, action))); + new JProperty("content", formatter.Format(action.Content, @event)), + new JProperty("canonicalUrl", formatter.Format(action.CanonicalUrl, @event)), + new JProperty("tags", ParseTags(@event, action))); var ruleJob = new MediumJob { @@ -67,7 +67,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions return (Description, ruleJob); } - private async Task ParseTagsAsync(EnrichedEvent @event, MediumAction action) + private JArray ParseTags(EnrichedEvent @event, MediumAction action) { if (string.IsNullOrWhiteSpace(action.Tags)) { @@ -77,7 +77,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions string[] tags; try { - var jsonTags = await formatter.FormatStringAsync(action.Tags, @event); + var jsonTags = formatter.Format(action.Tags, @event); tags = JsonConvert.DeserializeObject(jsonTags); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs index c783f8ee7..c7f64fbe4 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/SlackActionHandler.cs @@ -49,11 +49,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, SlackJob Data)> CreateJobAsync(EnrichedEvent @event, SlackAction action) + protected override (string Description, SlackJob Data) CreateJob(EnrichedEvent @event, SlackAction action) { var body = new JObject( - new JProperty("text", await formatter.FormatStringAsync(action.Text, @event))); + new JProperty("text", formatter.Format(action.Text, @event))); var ruleJob = new SlackJob { diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs index d7a995810..385d47530 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Actions/WebhookActionHandler.cs @@ -50,10 +50,10 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Actions this.formatter = formatter; } - protected override async Task<(string Description, WebhookJob Data)> CreateJobAsync(EnrichedEvent @event, WebhookAction action) + protected override (string Description, WebhookJob Data) CreateJob(EnrichedEvent @event, WebhookAction action) { var requestBody = formatter.ToEnvelope(@event).ToString(Formatting.Indented); - var requestUrl = await formatter.FormatStringAsync(action.Url.ToString(), @event); + var requestUrl = formatter.Format(action.Url.ToString(), @event); var ruleDescription = $"Send event to webhook '{requestUrl}'"; var ruleJob = new WebhookJob diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEvent.cs new file mode 100644 index 000000000..56e0303b0 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEvent.cs @@ -0,0 +1,47 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using NodaTime; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public sealed class EnrichedAssetEvent : EnrichedEvent + { + public EnrichedAssetEventType Type { get; set; } + + public Guid Id { get; set; } + + public Instant Created { get; set; } + + public Instant LastModified { get; set; } + + public RefToken CreatedBy { get; set; } + + public RefToken LastModifiedBy { get; set; } + + public string MimeType { get; set; } + + public string FileName { get; set; } + + public long FileVersion { get; set; } + + public long FileSize { get; set; } + + public bool IsImage { get; set; } + + public int? PixelWidth { get; set; } + + public int? PixelHeight { get; set; } + + public override Guid AggregateId + { + get { return Id; } + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEventType.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEventType.cs new file mode 100644 index 000000000..0e66499b2 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedAssetEventType.cs @@ -0,0 +1,17 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents +{ + public enum EnrichedAssetEventType + { + Created, + Deleted, + Renamed, + Updated + } +} \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs index 730845f3b..88af9945c 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEvent.cs @@ -14,7 +14,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { public sealed class EnrichedContentEvent : EnrichedSchemaEvent { - public EnrichedContentEventAction Action { get; set; } + public EnrichedContentEventType Type { get; set; } public Guid Id { get; set; } @@ -29,5 +29,10 @@ namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents public NamedContentData Data { get; set; } public Status Status { get; set; } + + public override Guid AggregateId + { + get { return Id; } + } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs similarity index 92% rename from src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs rename to src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs index 6c02c8f48..ccefbeaf2 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventAction.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs @@ -7,7 +7,7 @@ namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { - public enum EnrichedContentEventAction + public enum EnrichedContentEventType { Created, Deleted, diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs index d169ccdc9..b95a939bf 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedEvent.cs @@ -6,21 +6,30 @@ // ========================================================================== using System; +using Newtonsoft.Json; using NodaTime; using Squidex.Infrastructure; +using Squidex.Shared.Users; namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { - public class EnrichedEvent + public abstract class EnrichedEvent { - public Guid AggregateId { get; set; } - public NamedId AppId { get; set; } public RefToken Actor { get; set; } public Instant Timestamp { get; set; } + public long Version { get; set; } + + [JsonIgnore] + public abstract Guid AggregateId { get; } + + [JsonIgnore] public string Name { get; set; } + + [JsonIgnore] + public IUser User { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs index d62e2493a..528121c3b 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedSchemaEvent.cs @@ -10,7 +10,7 @@ using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { - public class EnrichedSchemaEvent : EnrichedEvent + public abstract class EnrichedSchemaEvent : EnrichedEvent { public NamedId SchemaId { get; set; } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs index 1cf0e8666..ddab38183 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleActionHandler.cs @@ -11,6 +11,8 @@ using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Domain.Apps.Core.Rules; +#pragma warning disable RECS0083 // Shows NotImplementedException throws in the quick task bar + namespace Squidex.Domain.Apps.Core.HandleRules { public abstract class RuleActionHandler : IRuleActionHandler where TAction : RuleAction @@ -34,7 +36,15 @@ namespace Squidex.Domain.Apps.Core.HandleRules return await ExecuteJobAsync(typedData); } - protected abstract Task<(string Description, TData Data)> CreateJobAsync(EnrichedEvent @event, TAction action); + protected virtual Task<(string Description, TData Data)> CreateJobAsync(EnrichedEvent @event, TAction action) + { + return Task.FromResult(CreateJob(@event, action)); + } + + protected virtual (string Description, TData Data) CreateJob(EnrichedEvent @event, TAction action) + { + throw new NotImplementedException(); + } protected abstract Task<(string Dump, Exception Exception)> ExecuteJobAsync(TData job); } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs index 5910dd143..c724565b8 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleEventFormatter.cs @@ -6,17 +6,15 @@ // =========================================-================================= using System; +using System.Collections.Generic; using System.Globalization; using System.Text; using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; using Squidex.Infrastructure; -using Squidex.Infrastructure.Caching; using Squidex.Shared.Users; namespace Squidex.Domain.Apps.Core.HandleRules @@ -24,42 +22,38 @@ namespace Squidex.Domain.Apps.Core.HandleRules public class RuleEventFormatter { private const string Undefined = "UNDEFINED"; - private const string AppIdPlaceholder = "$APP_ID"; - private const string AppNamePlaceholder = "$APP_NAME"; - private const string SchemaIdPlaceholder = "$SCHEMA_ID"; - private const string SchemaNamePlaceholder = "$SCHEMA_NAME"; - private const string TimestampDatePlaceholder = "$TIMESTAMP_DATE"; - private const string TimestampDateTimePlaceholder = "$TIMESTAMP_DATETIME"; - private const string ContentActionPlaceholder = "$CONTENT_ACTION"; - private const string ContentUrlPlaceholder = "$CONTENT_URL"; - private const string UserNamePlaceholder = "$USER_NAME"; - private const string UserEmailPlaceholder = "$USER_EMAIL"; - private static readonly Regex ContentDataPlaceholder = new Regex(@"\$CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}", RegexOptions.Compiled); - private static readonly Regex ContentDataPlaceholderV2 = new Regex(@"\$\{CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}\}", RegexOptions.Compiled); - private static readonly TimeSpan UserCacheDuration = TimeSpan.FromMinutes(10); + private static readonly Regex ContentDataPlaceholder = new Regex(@"^CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}", RegexOptions.Compiled); + private static readonly Regex ContentDataPlaceholder2 = new Regex(@"^\{CONTENT_DATA(\.([0-9A-Za-z\-_]*)){2,}\}", RegexOptions.Compiled); + private readonly List<(string Pattern, Func Replacer)> patterns = new List<(string Pattern, Func Replacer)>(); private readonly JsonSerializer serializer; private readonly IRuleUrlGenerator urlGenerator; - private readonly IMemoryCache memoryCache; - private readonly IUserResolver userResolver; - public RuleEventFormatter( - JsonSerializer serializer, - IRuleUrlGenerator urlGenerator, - IMemoryCache memoryCache, - IUserResolver userResolver) + public RuleEventFormatter(JsonSerializer serializer, IRuleUrlGenerator urlGenerator) { - Guard.NotNull(memoryCache, nameof(memoryCache)); Guard.NotNull(serializer, nameof(serializer)); Guard.NotNull(urlGenerator, nameof(urlGenerator)); - Guard.NotNull(userResolver, nameof(userResolver)); - this.memoryCache = memoryCache; this.serializer = serializer; - this.userResolver = userResolver; this.urlGenerator = urlGenerator; + + AddPattern("APP_ID", AppId); + AddPattern("APP_NAME", AppName); + AddPattern("CONTENT_ACTION", ContentAction); + AddPattern("CONTENT_URL", ContentUrl); + AddPattern("SCHEMA_ID", SchemaId); + AddPattern("SCHEMA_NAME", SchemaName); + AddPattern("TIMESTAMP_DATETIME", TimestampTime); + AddPattern("TIMESTAMP_DATE", TimestampDate); + AddPattern("USER_NAME", UserName); + AddPattern("USER_EMAIL", UserEmail); } - public virtual JObject ToPayload(object @event) + private void AddPattern(string placeholder, Func generator) + { + patterns.Add((placeholder, generator)); + } + + public virtual JObject ToPayload(T @event) { return JObject.FromObject(@event, serializer); } @@ -67,102 +61,184 @@ namespace Squidex.Domain.Apps.Core.HandleRules public virtual JObject ToEnvelope(EnrichedEvent @event) { return new JObject( - new JProperty("type", @event), + new JProperty("type", @event.Name), new JProperty("payload", ToPayload(@event)), new JProperty("timestamp", @event.Timestamp.ToString())); } - public async virtual Task FormatStringAsync(string text, EnrichedEvent @event) + public string Format(string text, EnrichedEvent @event) { if (string.IsNullOrWhiteSpace(text)) { return text; } - var sb = new StringBuilder(text); + var current = text.AsSpan(); - sb.Replace(TimestampDateTimePlaceholder, @event.Timestamp.ToString("yyy-MM-dd-hh-mm-ss", CultureInfo.InvariantCulture)); - sb.Replace(TimestampDatePlaceholder, @event.Timestamp.ToString("yyy-MM-dd", CultureInfo.InvariantCulture)); + var sb = new StringBuilder(); - if (@event.AppId != null) + for (var i = 0; i < current.Length; i++) { - sb.Replace(AppIdPlaceholder, @event.AppId.Id.ToString()); - sb.Replace(AppNamePlaceholder, @event.AppId.Name); + var c = current[i]; + + if (c == '$') + { + sb.Append(current.Slice(0, i)); + + current = current.Slice(i); + + var test = current.Slice(1); + var tested = false; + + for (var j = 0; j < patterns.Count; j++) + { + var (Pattern, Replacer) = patterns[j]; + + if (test.StartsWith(Pattern, StringComparison.OrdinalIgnoreCase)) + { + sb.Append(Replacer(@event)); + + current = current.Slice(Pattern.Length + 1); + i = 0; + + tested = true; + break; + } + } + + if (!tested && + (test.StartsWith("CONTENT_DATA", StringComparison.OrdinalIgnoreCase) || + test.StartsWith("{CONTENT_DATA", StringComparison.OrdinalIgnoreCase))) + { + var currentString = new string(test); + + var match = ContentDataPlaceholder.Match(currentString); + + if (!match.Success) + { + match = ContentDataPlaceholder2.Match(currentString); + } + + if (match.Success) + { + if (@event is EnrichedContentEvent contentEvent) + { + sb.Append(CalculateData(contentEvent.Data, match)); + } + else + { + sb.Append(Undefined); + } + + current = current.Slice(match.Length + 1); + i = 0; + } + } + } } - if (@event is EnrichedSchemaEvent schemaEvent && schemaEvent.SchemaId != null) + sb.Append(current); + + return sb.ToString(); + } + + private static string TimestampDate(EnrichedEvent @event) + { + return @event.Timestamp.ToDateTimeUtc().ToString("yyy-MM-dd", CultureInfo.InvariantCulture); + } + + private static string TimestampTime(EnrichedEvent @event) + { + return @event.Timestamp.ToDateTimeUtc().ToString("yyy-MM-dd-hh-mm-ss", CultureInfo.InvariantCulture); + } + + private static string AppId(EnrichedEvent @event) + { + return @event.AppId.Id.ToString(); + } + + private static string AppName(EnrichedEvent @event) + { + return @event.AppId.Name; + } + + private static string SchemaId(EnrichedEvent @event) + { + if (@event is EnrichedSchemaEvent schemaEvent) { - sb.Replace(SchemaIdPlaceholder, schemaEvent.SchemaId.Id.ToString()); - sb.Replace(SchemaNamePlaceholder, schemaEvent.SchemaId.Name); + return schemaEvent.SchemaId.Id.ToString(); } - if (@event is EnrichedContentEvent contentEvent) + return Undefined; + } + + private static string SchemaName(EnrichedEvent @event) + { + if (@event is EnrichedSchemaEvent schemaEvent) { - sb.Replace(ContentUrlPlaceholder, urlGenerator.GenerateContentUIUrl(@event.AppId, contentEvent.SchemaId, contentEvent.Id)); - sb.Replace(ContentActionPlaceholder, contentEvent.Action.ToString()); + return schemaEvent.SchemaId.Name; } - await FormatUserInfoAsync(@event, sb); - - var result = sb.ToString(); + return Undefined; + } - if (@event is EnrichedContentEvent contentEvent2) + private static string ContentAction(EnrichedEvent @event) + { + if (@event is EnrichedContentEvent contentEvent) { - result = ReplaceData(contentEvent2.Data, result); + return contentEvent.Type.ToString().ToLowerInvariant(); } - return result; + return Undefined; } - private async Task FormatUserInfoAsync(EnrichedEvent @event, StringBuilder sb) + private string ContentUrl(EnrichedEvent @event) { - var text = sb.ToString(); - - if (text.Contains(UserEmailPlaceholder) || text.Contains(UserNamePlaceholder)) + if (@event is EnrichedContentEvent contentEvent) { - var actor = @event.Actor; + return urlGenerator.GenerateContentUIUrl(contentEvent.AppId, contentEvent.SchemaId, contentEvent.Id); + } - if (actor.Type.Equals("client", StringComparison.OrdinalIgnoreCase)) - { - var displayText = actor.ToString(); + return Undefined; + } - sb.Replace(UserEmailPlaceholder, displayText); - sb.Replace(UserNamePlaceholder, displayText); - } - else + private static string UserName(EnrichedEvent @event) + { + if (@event.Actor != null) + { + if (@event.Actor.Type.Equals("client", StringComparison.OrdinalIgnoreCase)) { - var user = await FindUserAsync(actor); + return @event.Actor.ToString(); + } - if (user != null) - { - sb.Replace(UserEmailPlaceholder, user.Email); - sb.Replace(UserNamePlaceholder, user.DisplayName()); - } - else - { - sb.Replace(UserEmailPlaceholder, Undefined); - sb.Replace(UserNamePlaceholder, Undefined); - } + if (@event.User != null) + { + return @event.User.DisplayName(); } } + + return Undefined; } - private static string ReplaceData(NamedContentData data, string text) + private static string UserEmail(EnrichedEvent @event) { - text = ContentDataPlaceholder.Replace(text, match => + if (@event.Actor != null) { - return Replace(data, match); - }); + if (@event.Actor.Type.Equals("client", StringComparison.OrdinalIgnoreCase)) + { + return @event.Actor.ToString(); + } - text = ContentDataPlaceholderV2.Replace(text, match => - { - return Replace(data, match); - }); + if (@event.User != null) + { + return @event.User.Email; + } + } - return text; + return Undefined; } - private static string Replace(NamedContentData data, Match match) + private static string CalculateData(NamedContentData data, Match match) { var captures = match.Groups[2].Captures; @@ -212,24 +288,5 @@ namespace Squidex.Domain.Apps.Core.HandleRules return value?.ToString(Formatting.Indented) ?? Undefined; } - - private Task FindUserAsync(RefToken actor) - { - var key = $"RuleEventFormatter_Users_${actor.Identifier}"; - - return memoryCache.GetOrCreateAsync(key, async x => - { - x.AbsoluteExpirationRelativeToNow = UserCacheDuration; - - try - { - return await userResolver.FindByIdOrEmailAsync(actor.Identifier); - } - catch - { - return null; - } - }); - } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj index a109f585f..2bd9be1b5 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj +++ b/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj @@ -1,6 +1,6 @@  - netstandard2.0 + netcoreapp2.1 Squidex.Domain.Apps.Core diff --git a/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj b/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj index 0e0ab5bc1..7cb1a8a49 100644 --- a/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj +++ b/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj @@ -1,6 +1,6 @@  - netstandard2.0 + netcoreapp2.1 full diff --git a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs index 43bf53061..6839d4b56 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs @@ -26,7 +26,7 @@ using Squidex.Shared.Users; namespace Squidex.Domain.Apps.Entities.Apps { - public class AppGrain : SquidexDomainObjectGrain, IAppGrain + public sealed class AppGrain : SquidexDomainObjectGrain, IAppGrain { private readonly InitialPatterns initialPatterns; private readonly IAppProvider appProvider; diff --git a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs index d9d1520b4..00fa7b95e 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs @@ -22,7 +22,7 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Assets { - public class AssetGrain : SquidexDomainObjectGrain, IAssetGrain + public sealed class AssetGrain : SquidexDomainObjectGrain, IAssetGrain { public AssetGrain(IStore store, ISemanticLog log) : base(store, log) @@ -140,9 +140,9 @@ namespace Squidex.Domain.Apps.Entities.Assets ApplySnapshot(Snapshot.Apply(@event)); } - public Task> GetStateAsync() + public Task> GetStateAsync(long version = EtagVersion.Empty) { - return J.AsTask(Snapshot); + return J.AsTask(GetSnapshot(version)); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs b/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs index 864c0256a..4018d7e3d 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs @@ -5,11 +5,15 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Threading.Tasks; +using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.Orleans; namespace Squidex.Domain.Apps.Entities.Assets { public interface IAssetGrain : IDomainObjectGrain { + Task> GetStateAsync(long version = EtagVersion.Any); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs index 161f433ae..e9439de49 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs @@ -26,7 +26,7 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Contents { - public class ContentGrain : SquidexDomainObjectGrain, IContentGrain + public sealed class ContentGrain : SquidexDomainObjectGrain, IContentGrain { private readonly IAppProvider appProvider; private readonly IAssetRepository assetRepository; @@ -293,7 +293,7 @@ namespace Squidex.Domain.Apps.Entities.Contents public Task> GetStateAsync(long version = -2) { - return Task.FromResult(J.Of(GetSnapshot(version))); + return J.AsTask(GetSnapshot(version)); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs index 7c51d63cf..f4f449bce 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs @@ -7,11 +7,13 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Memory; using NodaTime; using Orleans; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; +using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Events; using Squidex.Domain.Apps.Events.Assets; @@ -19,44 +21,90 @@ using Squidex.Domain.Apps.Events.Contents; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.Reflection; +using Squidex.Shared.Users; namespace Squidex.Domain.Apps.Entities.Rules { public sealed class EventEnricher : IEventEnricher { + private static readonly TimeSpan UserCacheDuration = TimeSpan.FromMinutes(10); private readonly IGrainFactory grainFactory; + private readonly IMemoryCache cache; + private readonly IUserResolver userResolver; private readonly IClock clock; - public EventEnricher(IGrainFactory grainFactory, IClock clock) + public EventEnricher(IGrainFactory grainFactory, IMemoryCache cache, IUserResolver userResolver, IClock clock) { Guard.NotNull(grainFactory, nameof(grainFactory)); + Guard.NotNull(cache, nameof(cache)); Guard.NotNull(clock, nameof(clock)); + Guard.NotNull(userResolver, nameof(userResolver)); - this.grainFactory = grainFactory; - + this.userResolver = userResolver; + this.cache = cache; this.clock = clock; + this.grainFactory = grainFactory; } - public Task EnrichAsync(Envelope @event) + public async Task EnrichAsync(Envelope @event) { Guard.NotNull(@event, nameof(@event)); if (@event.Payload is ContentEvent contentEvent) { - return CreateContentEventAsync(contentEvent, @event); + var result = new EnrichedContentEvent(); + + await Task.WhenAll( + EnrichContentAsync(result, contentEvent, @event), + EnrichDefaultAsync(result, @event)); + + return result; } if (@event.Payload is AssetEvent assetEvent) { + var result = new EnrichedAssetEvent(); + + await Task.WhenAll( + EnrichAssetAsync(result, assetEvent, @event), + EnrichDefaultAsync(result, @event)); + + return result; } - return Task.FromResult(null); + return null; } - private async Task CreateContentEventAsync(ContentEvent contentEvent, Envelope @event) + private async Task EnrichAssetAsync(EnrichedAssetEvent result, AssetEvent assetEvent, Envelope @event) { - var result = new EnrichedContentEvent(); + var asset = + (await grainFactory + .GetGrain(assetEvent.AssetId) + .GetStateAsync(@event.Headers.EventStreamNumber())).Value; + + SimpleMapper.Map(asset, result); + switch (assetEvent) + { + case AssetCreated _: + result.Type = EnrichedAssetEventType.Created; + break; + case AssetRenamed _: + result.Type = EnrichedAssetEventType.Renamed; + break; + case AssetUpdated _: + result.Type = EnrichedAssetEventType.Updated; + break; + case AssetDeleted _: + result.Type = EnrichedAssetEventType.Deleted; + break; + } + + result.Name = $"Asset{result.Type}"; + } + + private async Task EnrichContentAsync(EnrichedContentEvent result, ContentEvent contentEvent, Envelope @event) + { var content = (await grainFactory .GetGrain(contentEvent.ContentId) @@ -68,47 +116,38 @@ namespace Squidex.Domain.Apps.Entities.Rules switch (contentEvent) { - case ContentCreated e: - result.Action = EnrichedContentEventAction.Created; + case ContentCreated _: + result.Type = EnrichedContentEventType.Created; break; - case ContentDeleted e: - result.Action = EnrichedContentEventAction.Deleted; + case ContentDeleted _: + result.Type = EnrichedContentEventType.Deleted; break; - case ContentUpdated e: - result.Action = EnrichedContentEventAction.Updated; + case ContentUpdated _: + result.Type = EnrichedContentEventType.Updated; break; - case ContentStatusChanged e: - if (e.Status == Status.Published) + case ContentStatusChanged contentStatusChanged: + if (contentStatusChanged.Status == Status.Published) { - result.Action = EnrichedContentEventAction.Published; + result.Type = EnrichedContentEventType.Published; } else { - result.Action = EnrichedContentEventAction.Unpublished; + result.Type = EnrichedContentEventType.Unpublished; } break; } - result.Name = $"{content.SchemaId.Name.ToPascalCase()}{result.Action}"; - - SetDefault(result, @event); - - return result; + result.Name = $"{content.SchemaId.Name.ToPascalCase()}{result.Type}"; } - private void SetDefault(EnrichedEvent result, Envelope @event) + private async Task EnrichDefaultAsync(EnrichedEvent result, Envelope @event) { result.Timestamp = @event.Headers.Contains(CommonHeaders.Timestamp) ? @event.Headers.Timestamp() : clock.GetCurrentInstant(); - result.AggregateId = - @event.Headers.Contains(CommonHeaders.AggregateId) ? - @event.Headers.AggregateId() : - Guid.NewGuid(); - if (@event.Payload is SquidexEvent squidexEvent) { result.Actor = squidexEvent.Actor; @@ -118,6 +157,27 @@ namespace Squidex.Domain.Apps.Entities.Rules { result.AppId = appEvent.AppId; } + + result.User = await FindUserAsync(result.Actor); + } + + private Task FindUserAsync(RefToken actor) + { + var key = $"EventEnrichers_Users_${actor.Identifier}"; + + return cache.GetOrCreateAsync(key, async x => + { + x.AbsoluteExpirationRelativeToNow = UserCacheDuration; + + try + { + return await userResolver.FindByIdOrEmailAsync(actor.Identifier); + } + catch + { + return null; + } + }); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs index 3356a4bbe..aed31f013 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs @@ -24,7 +24,7 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Schemas { - public class SchemaGrain : SquidexDomainObjectGrain, ISchemaGrain + public sealed class SchemaGrain : SquidexDomainObjectGrain, ISchemaGrain { private readonly IAppProvider appProvider; private readonly FieldRegistry registry; diff --git a/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index 9a624c05e..b2186ae40 100644 --- a/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -1,6 +1,6 @@  - netstandard2.0 + netcoreapp2.1 full diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs index bbe33a476..0bec1cd1d 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Operations/HandleRules/RuleEventFormatterTests.cs @@ -8,10 +8,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using System.Threading.Tasks; using FakeItEasy; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NodaTime; @@ -28,8 +25,6 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules public class RuleEventFormatterTests { private readonly JsonSerializer serializer = JsonSerializer.CreateDefault(); - private readonly MemoryCache memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); - private readonly IUserResolver userResolver = A.Fake(); private readonly IUser user = A.Fake(); private readonly IRuleUrlGenerator urlGenerator = A.Fake(); private readonly NamedId appId = NamedId.Of(Guid.NewGuid(), "my-app"); @@ -45,7 +40,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules A.CallTo(() => user.Claims) .Returns(new List { new Claim(SquidexClaimTypes.SquidexDisplayName, "me") }); - sut = new RuleEventFormatter(serializer, urlGenerator, memoryCache, userResolver); + sut = new RuleEventFormatter(serializer, urlGenerator); } [Fact] @@ -57,7 +52,7 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules } [Fact] - public void Should_create_route_data() + public void Should_create_payload() { var @event = new EnrichedContentEvent { AppId = appId }; @@ -67,98 +62,79 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules } [Fact] - public void Should_create_route_data_from_event() + public void Should_create_envelope_data_from_event() { var @event = new EnrichedContentEvent { AppId = appId, Name = "MyEventName" }; - var result = sut.ToPayload(@event); + var result = sut.ToEnvelope(@event); Assert.Equal("MyEventName", result["type"]); } [Fact] - public async Task Should_replace_app_information_from_event() + public void Should_replace_app_information_from_event() { var @event = new EnrichedContentEvent { AppId = appId }; - var result = await sut.FormatStringAsync("Name $APP_NAME has id $APP_ID", @event); + var result = sut.Format("Name $APP_NAME has id $APP_ID", @event); Assert.Equal($"Name my-app has id {appId.Id}", result); } [Fact] - public async Task Should_replace_schema_information_from_event() + public void Should_replace_schema_information_from_event() { var @event = new EnrichedContentEvent { SchemaId = schemaId }; - var result = await sut.FormatStringAsync("Name $SCHEMA_NAME has id $SCHEMA_ID", @event); + var result = sut.Format("Name $SCHEMA_NAME has id $SCHEMA_ID", @event); Assert.Equal($"Name my-schema has id {schemaId.Id}", result); } [Fact] - public async Task Should_replace_timestamp_information_from_event() + public void Should_replace_timestamp_information_from_event() { var now = DateTime.UtcNow; var envelope = new EnrichedContentEvent { Timestamp = Instant.FromDateTimeUtc(now) }; - var result = await sut.FormatStringAsync("Date: $TIMESTAMP_DATE, Full: $TIMESTAMP_DATETIME", envelope); + var result = sut.Format("Date: $TIMESTAMP_DATE, Full: $TIMESTAMP_DATETIME", envelope); Assert.Equal($"Date: {now:yyyy-MM-dd}, Full: {now:yyyy-MM-dd-hh-mm-ss}", result); } [Fact] - public async Task Should_format_email_and_display_name_from_user() + public void Should_format_email_and_display_name_from_user() { - A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) - .Returns(user); - - var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; + var @event = new EnrichedContentEvent { User = user, Actor = new RefToken("subject", "123") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); + var result = sut.Format("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From me (me@email.com)", result); } [Fact] - public async Task Should_return_undefined_if_user_is_not_found() + public void Should_return_undefined_if_user_is_not_found() { - A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) - .Returns(Task.FromResult(null)); - var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); + var result = sut.Format("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From UNDEFINED (UNDEFINED)", result); } [Fact] - public async Task Should_return_undefined_if_user_failed_to_resolve() - { - A.CallTo(() => userResolver.FindByIdOrEmailAsync("123")) - .Throws(new InvalidOperationException()); - - var @event = new EnrichedContentEvent { Actor = new RefToken("subject", "123") }; - - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); - - Assert.Equal($"From UNDEFINED (UNDEFINED)", result); - } - - [Fact] - public async Task Should_format_email_and_display_name_from_client() + public void Should_format_email_and_display_name_from_client() { var @event = new EnrichedContentEvent { Actor = new RefToken("client", "android") }; - var result = await sut.FormatStringAsync("From $USER_NAME ($USER_EMAIL)", @event); + var result = sut.Format("From $USER_NAME ($USER_EMAIL)", @event); Assert.Equal($"From client:android (client:android)", result); } [Fact] - public async Task Should_replace_content_url_from_event() + public void Should_replace_content_url_from_event() { var url = "http://content"; @@ -167,13 +143,19 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules var @event = new EnrichedContentEvent { AppId = appId, Id = contentId, SchemaId = schemaId }; - var result = await sut.FormatStringAsync("Go to $CONTENT_URL", @event); + var result = sut.Format("Go to $CONTENT_URL", @event); Assert.Equal($"Go to {url}", result); } [Fact] - public async Task Should_return_undefined_when_field_not_found() + public void Should_format_content_url_when_not_found() + { + Assert.Equal("UNDEFINED", sut.Format("$CONTENT_URL", new EnrichedAssetEvent())); + } + + [Fact] + public void Should_return_undefined_when_field_not_found() { var @event = new EnrichedContentEvent { @@ -184,13 +166,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.country.iv", @event); + var result = sut.Format("$CONTENT_DATA.country.iv", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_undefined_when_partition_not_found() + public void Should_return_undefined_when_partition_not_found() { var @event = new EnrichedContentEvent { @@ -201,13 +183,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de", @event); + var result = sut.Format("$CONTENT_DATA.city.de", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_undefined_when_array_item_not_found() + public void Should_return_undefined_when_array_item_not_found() { var @event = new EnrichedContentEvent { @@ -218,13 +200,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", new JArray())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.10", @event); + var result = sut.Format("$CONTENT_DATA.city.de.10", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_undefined_when_property_not_found() + public void Should_return_undefined_when_property_not_found() { var @event = new EnrichedContentEvent { @@ -236,13 +218,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.de.Name", @event); + var result = sut.Format("$CONTENT_DATA.city.de.Name", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_plain_value_when_found() + public void Should_return_plain_value_when_found() { var @event = new EnrichedContentEvent { @@ -253,13 +235,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); + var result = sut.Format("$CONTENT_DATA.city.iv", @event); Assert.Equal("Berlin", result); } [Fact] - public async Task Should_return_plain_value_when_found_from_update_event() + public void Should_return_plain_value_when_found_from_update_event() { var @event = new EnrichedContentEvent { @@ -270,13 +252,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", "Berlin")) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); + var result = sut.Format("$CONTENT_DATA.city.iv", @event); Assert.Equal("Berlin", result); } [Fact] - public async Task Should_return_undefined_when_null() + public void Should_return_undefined_when_null() { var @event = new EnrichedContentEvent { @@ -287,13 +269,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", JValue.CreateNull())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); + var result = sut.Format("$CONTENT_DATA.city.iv", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_undefined_when_undefined() + public void Should_return_undefined_when_undefined() { var @event = new EnrichedContentEvent { @@ -304,13 +286,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules .AddValue("iv", JValue.CreateUndefined())) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); + var result = sut.Format("$CONTENT_DATA.city.iv", @event); Assert.Equal("UNDEFINED", result); } [Fact] - public async Task Should_return_string_when_object() + public void Should_return_string_when_object() { var @event = new EnrichedContentEvent { @@ -322,13 +304,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv", @event); + var result = sut.Format("$CONTENT_DATA.city.iv", @event); Assert.Equal(JObject.FromObject(new { name = "Berlin" }).ToString(Formatting.Indented), result); } [Fact] - public async Task Should_return_plain_value_from_array_when_found() + public void Should_return_plain_value_from_array_when_found() { var @event = new EnrichedContentEvent { @@ -340,13 +322,13 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules "Berlin"))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.0", @event); + var result = sut.Format("$CONTENT_DATA.city.iv.0", @event); Assert.Equal("Berlin", result); } [Fact] - public async Task Should_return_plain_value_from_object_when_found() + public void Should_return_plain_value_from_object_when_found() { var @event = new EnrichedContentEvent { @@ -358,18 +340,21 @@ namespace Squidex.Domain.Apps.Core.Operations.HandleRules new JProperty("name", "Berlin")))) }; - var result = await sut.FormatStringAsync("$CONTENT_DATA.city.iv.name", @event); + var result = sut.Format("$CONTENT_DATA.city.iv.name", @event); Assert.Equal("Berlin", result); } [Fact] - public async Task Should_format_content_actions_when_found() + public void Should_format_content_actions_when_found() + { + Assert.Equal("created", sut.Format("$CONTENT_ACTION", new EnrichedContentEvent { Type = EnrichedContentEventType.Created })); + } + + [Fact] + public void Should_format_content_actions_when_not_found() { - Assert.Equal("created", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Created })); - Assert.Equal("updated", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Updated })); - Assert.Equal("deleted", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Deleted })); - Assert.Equal("archived", await sut.FormatStringAsync("$CONTENT_ACTION", new EnrichedContentEvent { Action = EnrichedContentEventAction.Archived })); + Assert.Equal("UNDEFINED", sut.Format("$CONTENT_ACTION", new EnrichedAssetEvent())); } } } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs new file mode 100644 index 000000000..9b0c35c1c --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs @@ -0,0 +1,72 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Orleans; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Contents +{ + public class ContentVersionLoaderTests + { + private readonly IGrainFactory grainFactory = A.Fake(); + private readonly IContentGrain grain = A.Fake(); + private readonly Guid id = Guid.NewGuid(); + private readonly ContentVersionLoader sut; + + public ContentVersionLoaderTests() + { + A.CallTo(() => grainFactory.GetGrain(id, null)) + .Returns(grain); + + sut = new ContentVersionLoader(grainFactory); + } + + [Fact] + public async Task Should_throw_exception_if_no_state_returned() + { + A.CallTo(() => grain.GetStateAsync(10)) + .Returns(new J(null)); + + await Assert.ThrowsAsync(() => sut.LoadAsync(id, 10)); + } + + [Fact] + public async Task Should_throw_exception_if_state_has_other_version() + { + var entity = A.Fake(); + + A.CallTo(() => entity.Version) + .Returns(5); + + A.CallTo(() => grain.GetStateAsync(10)) + .Returns(J.Of(entity)); + + await Assert.ThrowsAsync(() => sut.LoadAsync(id, 10)); + } + + [Fact] + public async Task Should_return_content_from_state() + { + var entity = A.Fake(); + + A.CallTo(() => entity.Version) + .Returns(10); + + A.CallTo(() => grain.GetStateAsync(10)) + .Returns(J.Of(entity)); + + var result = await sut.LoadAsync(id, 10); + + Assert.Same(entity, result); + } + } +} diff --git a/tools/Migrate_01/Migrate_01.csproj b/tools/Migrate_01/Migrate_01.csproj index 27d9fd97a..371f76a9b 100644 --- a/tools/Migrate_01/Migrate_01.csproj +++ b/tools/Migrate_01/Migrate_01.csproj @@ -1,6 +1,6 @@ - + - netstandard2.0 + netcoreapp2.1 From 753419d07e8071c1f0c1bcd7627756776f0b4315 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 3 Jul 2018 10:01:24 +0200 Subject: [PATCH 07/13] Temporary commit. --- .../Triggers/ContentChangedTriggerSchema.cs | 4 + .../EnrichedContentEventType.cs | 2 + .../Triggers/ContentChangedTriggerHandler.cs | 24 +++++- .../AppProvider.cs | 1 + .../Apps/AppGrain.cs | 7 -- .../Assets/AssetGrain.cs | 4 +- .../Assets/IAssetGrain.cs | 3 +- .../Contents/ContentGrain.cs | 44 +++++++---- .../Contents/ContentVersionLoader.cs | 35 ++++++--- .../Contents/IContentGrain.cs | 3 +- .../Contents/State/ContentState.cs | 4 +- .../Rules/EventEnricher.cs | 42 +++++----- .../Rules/RuleGrain.cs | 7 -- .../Schemas/SchemaGrain.cs | 7 -- .../Contents/ContentStatusChanged.cs | 2 + .../Commands/DomainObjectGrain.cs | 62 +++------------ .../ValidationException.cs | 2 +- .../ContentChangedTriggerSchemaDto.cs | 10 +++ src/Squidex/Config/Domain/RuleServices.cs | 3 + .../Pipeline/ApiExceptionFilterAttribute.cs | 2 +- .../content-changed-trigger.component.html | 21 +++++ .../content-changed-trigger.component.ts | 26 ++++++- src/Squidex/app/shared/state/rules.state.ts | 2 +- .../Triggers/ContentChangedTriggerTests.cs | 43 +++++++---- .../Contents/ContentGrainTests.cs | 77 ++++++++++++++++++- .../Contents/ContentVersionLoaderTests.cs | 72 ----------------- .../Commands/DomainObjectGrainTests.cs | 67 ---------------- 27 files changed, 288 insertions(+), 288 deletions(-) delete mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Contents/ContentVersionLoaderTests.cs 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 aca1f16e5..cfcb516d1 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs @@ -22,5 +22,9 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers public bool SendPublish { get; set; } public bool SendUnpublish { get; set; } + + public bool SendArchived { get; set; } + + public bool SendRestore { get; set; } } } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs index ccefbeaf2..45148a8e2 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/EnrichedEvents/EnrichedContentEventType.cs @@ -9,9 +9,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents { public enum EnrichedContentEventType { + Archived, Created, Deleted, Published, + Restored, Unpublished, Updated } 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 c0505f309..a65ccbcc7 100644 --- a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/Triggers/ContentChangedTriggerHandler.cs @@ -17,7 +17,11 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Triggers { protected override bool Triggers(Envelope @event, ContentChangedTrigger trigger) { - if (trigger.HandleAll && @event.Payload is ContentEvent) + if (trigger.HandleAll && + @event.Payload is ContentEvent && + !(@event.Payload is ContentChangesPublished) && + !(@event.Payload is ContentChangesDiscarded) && + !(@event.Payload is ContentUpdateProposed)) { return true; } @@ -44,21 +48,33 @@ namespace Squidex.Domain.Apps.Core.HandleRules.Triggers private static bool MatchsType(ContentChangedTriggerSchema schema, SchemaEvent @event) { return + IsArchived(schema, @event) || IsCreate(schema, @event) || - IsUpdate(schema, @event) || IsDelete(schema, @event) || IsPublished(schema, @event) || + IsRestored(schema, @event) || + IsUpdate(schema, @event) || IsUnpublished(schema, @event); } private static bool IsPublished(ContentChangedTriggerSchema schema, SchemaEvent @event) { - return schema.SendPublish && @event is ContentStatusChanged statusChanged && statusChanged.Status == Status.Published; + return schema.SendPublish && @event is ContentStatusChanged statusChanged && statusChanged.Change == StatusChange.Published; + } + + private static bool IsRestored(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendRestore && @event is ContentStatusChanged statusChanged && statusChanged.Change == StatusChange.Restored; + } + + private static bool IsArchived(ContentChangedTriggerSchema schema, SchemaEvent @event) + { + return schema.SendArchived && @event is ContentStatusChanged statusChanged && statusChanged.Change == StatusChange.Archived; } private static bool IsUnpublished(ContentChangedTriggerSchema schema, SchemaEvent @event) { - return schema.SendUnpublish && @event is ContentStatusChanged statusChanged && statusChanged.Status != Status.Published; + return schema.SendUnpublish && @event is ContentStatusChanged statusChanged && statusChanged.Change == StatusChange.Unpublished; } private static bool IsCreate(ContentChangedTriggerSchema schema, SchemaEvent @event) diff --git a/src/Squidex.Domain.Apps.Entities/AppProvider.cs b/src/Squidex.Domain.Apps.Entities/AppProvider.cs index a00bda2d7..c8c821f49 100644 --- a/src/Squidex.Domain.Apps.Entities/AppProvider.cs +++ b/src/Squidex.Domain.Apps.Entities/AppProvider.cs @@ -31,6 +31,7 @@ namespace Squidex.Domain.Apps.Entities Guard.NotNull(localCache, nameof(localCache)); this.grainFactory = grainFactory; + this.localCache = localCache; } diff --git a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs index 6839d4b56..62961abc4 100644 --- a/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Apps/AppGrain.cs @@ -57,13 +57,6 @@ namespace Squidex.Domain.Apps.Entities.Apps this.initialPatterns = initialPatterns; } - public override Task OnActivateAsync() - { - CleanupOldSnapshots(); - - return base.OnActivateAsync(); - } - protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotArchived(); diff --git a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs index 00fa7b95e..969d0852e 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs @@ -140,9 +140,9 @@ namespace Squidex.Domain.Apps.Entities.Assets ApplySnapshot(Snapshot.Apply(@event)); } - public Task> GetStateAsync(long version = EtagVersion.Empty) + public Task> GetStateAsync() { - return J.AsTask(GetSnapshot(version)); + return J.AsTask(Snapshot); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs b/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs index 4018d7e3d..f76f5e48f 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/IAssetGrain.cs @@ -6,7 +6,6 @@ // ========================================================================== using System.Threading.Tasks; -using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Orleans; @@ -14,6 +13,6 @@ namespace Squidex.Domain.Apps.Entities.Assets { public interface IAssetGrain : IDomainObjectGrain { - Task> GetStateAsync(long version = EtagVersion.Any); + Task> GetStateAsync(); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs index e9439de49..9e2698cdb 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentGrain.cs @@ -117,9 +117,28 @@ namespace Squidex.Domain.Apps.Entities.Contents } else { - await ctx.ExecuteScriptAsync(x => x.ScriptChange, c.Status, c, Snapshot.Data); - - ChangeStatus(c); + var reason = StatusChange.Published; + + if (c.Status == Status.Published) + { + reason = StatusChange.Published; + } + else if (c.Status == Status.Archived) + { + reason = StatusChange.Archived; + } + else if (Snapshot.Status == Status.Published) + { + reason = StatusChange.Unpublished; + } + else + { + reason = StatusChange.Restored; + } + + await ctx.ExecuteScriptAsync(x => x.ScriptChange, reason, c, Snapshot.Data); + + ChangeStatus(c, reason); } } } @@ -206,7 +225,7 @@ namespace Squidex.Domain.Apps.Entities.Contents if (command.Publish) { - RaiseEvent(SimpleMapper.Map(command, new ContentStatusChanged { Status = Status.Published })); + RaiseEvent(SimpleMapper.Map(command, new ContentStatusChanged { Status = Status.Published, Change = StatusChange.Published })); } } @@ -245,9 +264,9 @@ namespace Squidex.Domain.Apps.Entities.Contents RaiseEvent(SimpleMapper.Map(command, new ContentStatusScheduled { DueTime = command.DueTime.Value })); } - public void ChangeStatus(ChangeContentStatus command) + public void ChangeStatus(ChangeContentStatus command, StatusChange reason) { - RaiseEvent(SimpleMapper.Map(command, new ContentStatusChanged())); + RaiseEvent(SimpleMapper.Map(command, new ContentStatusChanged { Change = reason })); } private void RaiseEvent(SchemaEvent @event) @@ -281,19 +300,16 @@ namespace Squidex.Domain.Apps.Entities.Contents private async Task CreateContext(Guid appId, Guid schemaId, Func message) { var operationContext = - await ContentOperationContext.CreateAsync(appId, schemaId, - appProvider, - assetRepository, - contentRepository, - scriptEngine, - message); + await ContentOperationContext.CreateAsync( + appId, schemaId, + appProvider, assetRepository, contentRepository, scriptEngine, message); return operationContext; } - public Task> GetStateAsync(long version = -2) + public Task> GetStateAsync() { - return J.AsTask(GetSnapshot(version)); + return J.AsTask(Snapshot); } } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs index 7016766ef..25ec318e2 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentVersionLoader.cs @@ -7,38 +7,53 @@ using System; using System.Threading.Tasks; -using Orleans; +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Domain.Apps.Entities.Contents.State; using Squidex.Infrastructure; using Squidex.Infrastructure.Log; +using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Contents { public sealed class ContentVersionLoader : IContentVersionLoader { - private readonly IGrainFactory grainFactory; + private readonly IStore store; + private readonly FieldRegistry registry; - public ContentVersionLoader(IGrainFactory grainFactory) + public ContentVersionLoader(IStore store, FieldRegistry registry) { - Guard.NotNull(grainFactory, nameof(grainFactory)); + Guard.NotNull(store, nameof(store)); + Guard.NotNull(registry, nameof(registry)); - this.grainFactory = grainFactory; + this.store = store; + + this.registry = registry; } public async Task LoadAsync(Guid id, long version) { using (Profiler.TraceMethod()) { - var grain = grainFactory.GetGrain(id); + var content = new ContentState(); + + var persistence = store.WithEventSourcing(id, e => + { + if (content.Version < version) + { + content = content.Apply(e); + content.Version++; + } + }); - var content = await grain.GetStateAsync(version); + await persistence.ReadAsync(); - if (content.Value == null || content.Value.Version != version) + if (content.Version != version) { throw new DomainObjectNotFoundException(id.ToString(), typeof(IContentEntity)); } - return content.Value; + return content; } } } -} +} \ No newline at end of file diff --git a/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs b/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs index 429a27746..24eddbcc5 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/IContentGrain.cs @@ -6,7 +6,6 @@ // ========================================================================== using System.Threading.Tasks; -using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Orleans; @@ -14,6 +13,6 @@ namespace Squidex.Domain.Apps.Entities.Contents { public interface IContentGrain : IDomainObjectGrain { - Task> GetStateAsync(long version = EtagVersion.Any); + Task> GetStateAsync(); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs index f9028fcbf..aa3746811 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs @@ -32,10 +32,10 @@ namespace Squidex.Domain.Apps.Entities.Contents.State public NamedContentData DataDraft { get; set; } [JsonProperty] - public Status Status { get; set; } + public ScheduleJob ScheduleJob { get; set; } [JsonProperty] - public ScheduleJob ScheduleJob { get; set; } + public Status Status { get; set; } [JsonProperty] public bool IsPending { get; set; } diff --git a/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs index f4f449bce..d3072ca78 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/EventEnricher.cs @@ -8,7 +8,6 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; -using NodaTime; using Orleans; using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.HandleRules; @@ -31,19 +30,16 @@ namespace Squidex.Domain.Apps.Entities.Rules private readonly IGrainFactory grainFactory; private readonly IMemoryCache cache; private readonly IUserResolver userResolver; - private readonly IClock clock; - public EventEnricher(IGrainFactory grainFactory, IMemoryCache cache, IUserResolver userResolver, IClock clock) + public EventEnricher(IGrainFactory grainFactory, IMemoryCache cache, IUserResolver userResolver) { Guard.NotNull(grainFactory, nameof(grainFactory)); Guard.NotNull(cache, nameof(cache)); - Guard.NotNull(clock, nameof(clock)); Guard.NotNull(userResolver, nameof(userResolver)); - this.userResolver = userResolver; - this.cache = cache; - this.clock = clock; this.grainFactory = grainFactory; + this.cache = cache; + this.userResolver = userResolver; } public async Task EnrichAsync(Envelope @event) @@ -80,9 +76,10 @@ namespace Squidex.Domain.Apps.Entities.Rules var asset = (await grainFactory .GetGrain(assetEvent.AssetId) - .GetStateAsync(@event.Headers.EventStreamNumber())).Value; + .GetStateAsync()).Value; SimpleMapper.Map(asset, result); + SimpleMapper.Map(assetEvent, result); switch (assetEvent) { @@ -108,12 +105,14 @@ namespace Squidex.Domain.Apps.Entities.Rules var content = (await grainFactory .GetGrain(contentEvent.ContentId) - .GetStateAsync(@event.Headers.EventStreamNumber())).Value; + .GetStateAsync()).Value; SimpleMapper.Map(content, result); result.Data = content.Data ?? content.DataDraft; + SimpleMapper.Map(contentEvent, result); + switch (contentEvent) { case ContentCreated _: @@ -122,17 +121,25 @@ namespace Squidex.Domain.Apps.Entities.Rules case ContentDeleted _: result.Type = EnrichedContentEventType.Deleted; break; + case ContentChangesPublished _: case ContentUpdated _: result.Type = EnrichedContentEventType.Updated; break; case ContentStatusChanged contentStatusChanged: - if (contentStatusChanged.Status == Status.Published) - { - result.Type = EnrichedContentEventType.Published; - } - else + switch (contentStatusChanged.Change) { - result.Type = EnrichedContentEventType.Unpublished; + case StatusChange.Published: + result.Type = EnrichedContentEventType.Published; + break; + case StatusChange.Unpublished: + result.Type = EnrichedContentEventType.Unpublished; + break; + case StatusChange.Archived: + result.Type = EnrichedContentEventType.Archived; + break; + case StatusChange.Restored: + result.Type = EnrichedContentEventType.Restored; + break; } break; @@ -143,10 +150,7 @@ namespace Squidex.Domain.Apps.Entities.Rules private async Task EnrichDefaultAsync(EnrichedEvent result, Envelope @event) { - result.Timestamp = - @event.Headers.Contains(CommonHeaders.Timestamp) ? - @event.Headers.Timestamp() : - clock.GetCurrentInstant(); + result.Timestamp = @event.Headers.Timestamp(); if (@event.Payload is SquidexEvent squidexEvent) { diff --git a/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs b/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs index 0ea48b9f2..81e475e4d 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/RuleGrain.cs @@ -34,13 +34,6 @@ namespace Squidex.Domain.Apps.Entities.Rules this.appProvider = appProvider; } - public override Task OnActivateAsync() - { - CleanupOldSnapshots(); - - return base.OnActivateAsync(); - } - protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotDeleted(); diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs index aed31f013..0939f5332 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs @@ -40,13 +40,6 @@ namespace Squidex.Domain.Apps.Entities.Schemas this.registry = registry; } - public override Task OnActivateAsync() - { - CleanupOldSnapshots(); - - return base.OnActivateAsync(); - } - protected override Task ExecuteAsync(IAggregateCommand command) { VerifyNotDeleted(); diff --git a/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs b/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs index 2c97f5902..81b95e5fb 100644 --- a/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs +++ b/src/Squidex.Domain.Apps.Events/Contents/ContentStatusChanged.cs @@ -13,6 +13,8 @@ namespace Squidex.Domain.Apps.Events.Contents [EventType(nameof(ContentStatusChanged))] public sealed class ContentStatusChanged : ContentEvent { + public StatusChange? Change { get; set; } + public Status Status { get; set; } } } diff --git a/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs b/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs index fcea5d4cc..3036d25dc 100644 --- a/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs +++ b/src/Squidex.Infrastructure/Commands/DomainObjectGrain.cs @@ -21,9 +21,8 @@ namespace Squidex.Infrastructure.Commands private readonly List> uncomittedEvents = new List>(); private readonly IStore store; private readonly ISemanticLog log; - private readonly List snapshots = new List { new T { Version = EtagVersion.Empty } }; - private bool cleanup; private Guid id; + private T snapshot = new T { Version = EtagVersion.Empty }; private IPersistence persistence; public Guid Id @@ -33,17 +32,17 @@ namespace Squidex.Infrastructure.Commands public long Version { - get { return snapshots.Count - 2; } + get { return snapshot.Version; } } public long NewVersion { - get { return Version; } + get { return snapshot.Version + uncomittedEvents.Count; } } public T Snapshot { - get { return snapshots[snapshots.Count - 1]; } + get { return snapshot; } } protected DomainObjectGrain(IStore store, ISemanticLog log) @@ -56,31 +55,6 @@ namespace Squidex.Infrastructure.Commands this.log = log; } - public void CleanupOldSnapshots() - { - cleanup = true; - } - - public T GetSnapshot(long version) - { - if (version == EtagVersion.Any) - { - return Snapshot; - } - - if (version == EtagVersion.Empty) - { - return snapshots[0]; - } - - if (version >= 0 && version < snapshots.Count - 1) - { - return snapshots[(int)version + 1]; - } - - return default(T); - } - public override async Task OnActivateAsync(Guid key) { using (log.MeasureInformation(w => w @@ -122,11 +96,9 @@ namespace Squidex.Infrastructure.Commands uncomittedEvents.Clear(); } - public virtual void ApplySnapshot(T snapshot) + public virtual void ApplySnapshot(T newSnapshot) { - snapshot.Version = snapshots.Count - 1; - - snapshots.Add(snapshot); + snapshot = newSnapshot; } public virtual void ApplyEvent(Envelope @event) @@ -200,8 +172,7 @@ namespace Squidex.Infrastructure.Commands throw new DomainException("Object has already been created."); } - var size = snapshots.Count; - + var previousSnapshot = snapshot; try { var result = await handler(command); @@ -210,8 +181,10 @@ namespace Squidex.Infrastructure.Commands if (events.Length > 0) { + snapshot.Version = NewVersion; + await persistence.WriteEventsAsync(events); - await persistence.WriteSnapshotAsync(Snapshot); + await persistence.WriteSnapshotAsync(snapshot); } if (result == null) @@ -230,23 +203,12 @@ namespace Squidex.Infrastructure.Commands } catch { - while (snapshots.Count > size) - { - snapshots.RemoveAt(snapshots.Count - 1); - } + snapshot = previousSnapshot; throw; } finally { - if (cleanup) - { - for (var i = 0; i < snapshots.Count - 1; i++) - { - snapshots[i] = default(T); - } - } - uncomittedEvents.Clear(); } } @@ -260,4 +222,4 @@ namespace Squidex.Infrastructure.Commands protected abstract Task ExecuteAsync(IAggregateCommand command); } -} +} \ No newline at end of file diff --git a/src/Squidex.Infrastructure/ValidationException.cs b/src/Squidex.Infrastructure/ValidationException.cs index 163904187..764e45ab7 100644 --- a/src/Squidex.Infrastructure/ValidationException.cs +++ b/src/Squidex.Infrastructure/ValidationException.cs @@ -21,7 +21,7 @@ namespace Squidex.Infrastructure public IReadOnlyList Errors { - get { return errors; } + get { return errors ?? FallbackErrors; } } public string Summary { get; } diff --git a/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs b/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs index 14e17c511..2a16e9639 100644 --- a/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedTriggerSchemaDto.cs @@ -40,5 +40,15 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers /// Determines whether to handle the event when a content is unpublished. /// public bool SendUnpublish { get; set; } + + /// + /// Determines whether to handle the event when a content is archived. + /// + public bool SendArchived { get; set; } + + /// + /// Determines whether to handle the event when a content is restored. + /// + public bool SendRestore { get; set; } } } diff --git a/src/Squidex/Config/Domain/RuleServices.cs b/src/Squidex/Config/Domain/RuleServices.cs index d80b0e5c7..3a9ae24d1 100644 --- a/src/Squidex/Config/Domain/RuleServices.cs +++ b/src/Squidex/Config/Domain/RuleServices.cs @@ -18,6 +18,9 @@ namespace Squidex.Config.Domain { public static void AddMyRuleServices(this IServiceCollection services) { + services.AddSingletonAs() + .As(); + services.AddSingletonAs() .As(); diff --git a/src/Squidex/Pipeline/ApiExceptionFilterAttribute.cs b/src/Squidex/Pipeline/ApiExceptionFilterAttribute.cs index 3dfd01123..dc5375d28 100644 --- a/src/Squidex/Pipeline/ApiExceptionFilterAttribute.cs +++ b/src/Squidex/Pipeline/ApiExceptionFilterAttribute.cs @@ -54,7 +54,7 @@ namespace Squidex.Pipeline private static IActionResult OnValidationException(ValidationException ex) { - return ErrorResult(400, new ErrorDto { Message = ex.Summary, Details = ex.Errors.Select(e => e.Message).ToArray() }); + return ErrorResult(400, new ErrorDto { Message = ex.Summary, Details = ex.Errors?.Select(e => e.Message).ToArray() }); } private static IActionResult ErrorResult(int statusCode, ErrorDto error) 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 495888ae6..cbd5fe4d6 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 @@ -10,6 +10,9 @@ + + + @@ -31,6 +34,15 @@
Published
+ +
Unpublished
+ + +
Archived
+ + +
Restored
+ @@ -53,6 +65,15 @@ + + + + + + + + +