Browse Source

Merge pull request #359 from Squidex/feature/separators

Feature/separators
pull/362/head
Sebastian Stehle 7 years ago
committed by GitHub
parent
commit
7020359978
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs
  2. 20
      src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs
  3. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs
  4. 2
      src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs
  5. 14
      src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldEditor.cs
  6. 34
      src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs
  7. 2
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs
  8. 2
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs
  9. 2
      src/Squidex.Domain.Apps.Core.Operations/EnrichContent/ContentEnricher.cs
  10. 5
      src/Squidex.Domain.Apps.Core.Operations/EnrichContent/DefaultValueFactory.cs
  11. 5
      src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs
  12. 5
      src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs
  13. 2
      src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs
  14. 5
      src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs
  15. 64
      src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/Builder.cs
  16. 30
      src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs
  17. 28
      src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs
  18. 156
      src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs
  19. 22
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs
  20. 31
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Extensions.cs
  21. 85
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.cs
  22. 19
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldValueValidatorsFactory.cs
  23. 5
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs
  24. 24
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Undefined.cs
  25. 33
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AggregateValidator.cs
  26. 9
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs
  27. 41
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/FieldValidator.cs
  28. 30
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs
  29. 12
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/ObjectValidator.cs
  30. 44
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs
  31. 11
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs
  32. 2
      src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredValidator.cs
  33. 15
      src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs
  34. 2
      src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs
  35. 5
      src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs
  36. 22
      src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs
  37. 15
      src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs
  38. 10
      src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs
  39. 5
      src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs
  40. 26
      src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/UIFieldPropertiesDto.cs
  41. 28
      src/Squidex/app/features/content/pages/content/content-field.component.html
  42. 36
      src/Squidex/app/features/content/pages/content/content-field.component.ts
  43. 10
      src/Squidex/app/features/content/pages/content/content-page.component.ts
  44. 3
      src/Squidex/app/features/content/shared/array-editor.component.html
  45. 13
      src/Squidex/app/features/content/shared/array-item.component.html
  46. 8
      src/Squidex/app/features/content/shared/array-item.component.scss
  47. 5
      src/Squidex/app/features/content/shared/array-item.component.ts
  48. 129
      src/Squidex/app/features/content/shared/field-editor.component.html
  49. 16
      src/Squidex/app/features/content/shared/field-editor.component.scss
  50. 10
      src/Squidex/app/features/content/shared/field-editor.component.ts
  51. 3
      src/Squidex/app/features/content/shared/references-dropdown.component.ts
  52. 1
      src/Squidex/app/features/schemas/declarations.ts
  53. 4
      src/Squidex/app/features/schemas/module.ts
  54. 2
      src/Squidex/app/features/schemas/pages/schema/field-wizard.component.html
  55. 38
      src/Squidex/app/features/schemas/pages/schema/field.component.html
  56. 2
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-common.component.html
  57. 29
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.html
  58. 2
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.scss
  59. 29
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.ts
  60. 29
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.html
  61. 2
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.scss
  62. 32
      src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.ts
  63. 8
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.html
  64. 3
      src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.html
  65. 2
      src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.scss
  66. 27
      src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.ts
  67. 2
      src/Squidex/app/framework/angular/forms/form-alert.component.ts
  68. 7
      src/Squidex/app/framework/angular/forms/form-error.component.ts
  69. 3
      src/Squidex/app/shared/components/table-header.component.ts
  70. 2
      src/Squidex/app/shared/services/schemas.service.ts
  71. 44
      src/Squidex/app/shared/services/schemas.types.ts
  72. 71
      src/Squidex/app/shared/state/contents.forms.ts
  73. 3
      src/Squidex/app/shared/state/schemas.forms.ts
  74. 1
      src/Squidex/app/theme/_bootstrap-vars.scss
  75. 20
      src/Squidex/app/theme/_bootstrap.scss
  76. 2
      src/Squidex/app/theme/icomoon/demo-files/demo.css
  77. 888
      src/Squidex/app/theme/icomoon/demo.html
  78. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.eot
  79. 89
      src/Squidex/app/theme/icomoon/fonts/icomoon.svg
  80. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.ttf
  81. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.woff
  82. 2
      src/Squidex/app/theme/icomoon/selection.json
  83. 245
      src/Squidex/app/theme/icomoon/style.css
  84. 55
      tests/Squidex.Domain.Apps.Core.Tests/Operations/GenerateJsonSchema/JsonSchemaTests.cs
  85. 18
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs
  86. 128
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs
  87. 24
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs
  88. 54
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs
  89. 9
      tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs
  90. 43
      tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/FieldProperties/UIFieldPropertiesTests.cs
  91. 81
      tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/GuardSchemaFieldTests.cs
  92. 39
      tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/GuardSchemaTests.cs

21
src/Squidex.Domain.Apps.Core.Model/Schemas/FieldExtensions.cs

@ -7,6 +7,7 @@
using Squidex.Infrastructure;
using System.Collections.Generic;
using System.Linq;
using NamedIdStatic = Squidex.Infrastructure.NamedId;
namespace Squidex.Domain.Apps.Core.Schemas
@ -18,6 +19,26 @@ namespace Squidex.Domain.Apps.Core.Schemas
return NamedIdStatic.Of(field.Id, field.Name);
}
public static IEnumerable<T> NonHidden<T>(this FieldCollection<T> fields, bool withHidden = false) where T : IField
{
return fields.Ordered.ForApi(withHidden);
}
public static IEnumerable<T> ForApi<T>(this IEnumerable<T> fields, bool withHidden = false) where T : IField
{
return fields.Where(x => IsForApi(x, withHidden));
}
public static bool IsForApi<T>(this T field, bool withHidden = false) where T : IField
{
return (withHidden || !field.IsHidden) && field.RawProperties.IsForApi();
}
public static bool IsForApi<T>(this T properties) where T : FieldProperties
{
return !(properties is UIFieldProperties);
}
public static Schema ReorderFields(this Schema schema, List<long> ids, long? parentId = null)
{
if (parentId != null)

20
src/Squidex.Domain.Apps.Core.Model/Schemas/Fields.cs

@ -66,6 +66,11 @@ namespace Squidex.Domain.Apps.Core.Schemas
return new RootField<TagsFieldProperties>(id, name, partitioning, properties, settings);
}
public static RootField<UIFieldProperties> UI(long id, string name, Partitioning partitioning, UIFieldProperties properties = null, IFieldSettings settings = null)
{
return new RootField<UIFieldProperties>(id, name, partitioning, properties, settings);
}
public static NestedField<AssetsFieldProperties> Assets(long id, string name, AssetsFieldProperties properties = null, IFieldSettings settings = null)
{
return new NestedField<AssetsFieldProperties>(id, name, properties, settings);
@ -111,6 +116,11 @@ namespace Squidex.Domain.Apps.Core.Schemas
return new NestedField<TagsFieldProperties>(id, name, properties, settings);
}
public static NestedField<UIFieldProperties> UI(long id, string name, UIFieldProperties properties = null, IFieldSettings settings = null)
{
return new NestedField<UIFieldProperties>(id, name, properties, settings);
}
public static Schema AddArray(this Schema schema, long id, string name, Partitioning partitioning, Func<ArrayField, ArrayField> handler = null, ArrayFieldProperties properties = null, IFieldSettings settings = null)
{
var field = Array(id, name, partitioning, properties, settings);
@ -168,6 +178,11 @@ namespace Squidex.Domain.Apps.Core.Schemas
return schema.AddField(Tags(id, name, partitioning, properties, settings));
}
public static Schema AddUI(this Schema schema, long id, string name, Partitioning partitioning, UIFieldProperties properties = null, IFieldSettings settings = null)
{
return schema.AddField(UI(id, name, partitioning, properties, settings));
}
public static ArrayField AddAssets(this ArrayField field, long id, string name, AssetsFieldProperties properties = null, IFieldSettings settings = null)
{
return field.AddField(Assets(id, name, properties, settings));
@ -212,5 +227,10 @@ namespace Squidex.Domain.Apps.Core.Schemas
{
return field.AddField(Tags(id, name, properties, settings));
}
public static ArrayField AddUI(this ArrayField field, long id, string name, UIFieldProperties properties = null, IFieldSettings settings = null)
{
return field.AddField(UI(id, name, properties, settings));
}
}
}

2
src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldPropertiesVisitor.cs

@ -28,5 +28,7 @@ namespace Squidex.Domain.Apps.Core.Schemas
T Visit(StringFieldProperties properties);
T Visit(TagsFieldProperties properties);
T Visit(UIFieldProperties properties);
}
}

2
src/Squidex.Domain.Apps.Core.Model/Schemas/IFieldVisitor.cs

@ -28,5 +28,7 @@ namespace Squidex.Domain.Apps.Core.Schemas
T Visit(IField<StringFieldProperties> field);
T Visit(IField<TagsFieldProperties> field);
T Visit(IField<UIFieldProperties> field);
}
}

14
src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldEditor.cs

@ -0,0 +1,14 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Domain.Apps.Core.Schemas
{
public enum UIFieldEditor
{
Separator
}
}

34
src/Squidex.Domain.Apps.Core.Model/Schemas/UIFieldProperties.cs

@ -0,0 +1,34 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Domain.Apps.Core.Schemas
{
public sealed class UIFieldProperties : FieldProperties
{
public UIFieldEditor Editor { get; set; }
public override T Accept<T>(IFieldPropertiesVisitor<T> visitor)
{
return visitor.Visit(this);
}
public override T Accept<T>(IFieldVisitor<T> visitor, IField field)
{
return visitor.Visit((IField<UIFieldProperties>)field);
}
public override NestedField CreateNestedField(long id, string name, IFieldSettings settings = null)
{
return new NestedField<UIFieldProperties>(id, name, this, settings);
}
public override RootField CreateRootField(long id, string name, Partitioning partitioning, IFieldSettings settings = null)
{
return new RootField<UIFieldProperties>(id, name, partitioning, this, settings);
}
}
}

2
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs

@ -34,7 +34,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
public static FieldConverter ExcludeHidden()
{
return (data, field) => field.IsHidden ? null : data;
return (data, field) => !field.IsForApi() ? null : data;
}
public static FieldConverter ExcludeChangedTypes()

2
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs

@ -50,7 +50,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
public static ValueConverter ExcludeHidden()
{
return (value, field) => field.IsHidden ? Value.Unset : value;
return (value, field) => !field.IsForApi() ? Value.Unset : value;
}
public static ValueConverter ExcludeChangedTypes()

2
src/Squidex.Domain.Apps.Core.Operations/EnrichContent/ContentEnricher.cs

@ -55,7 +55,7 @@ namespace Squidex.Domain.Apps.Core.EnrichContent
var defaultValue = DefaultValueFactory.CreateDefaultValue(field, SystemClock.Instance.GetCurrentInstant());
if (field.RawProperties.IsRequired || defaultValue.Type == JsonValueType.Null)
if (field.RawProperties.IsRequired || defaultValue == null || defaultValue.Type == JsonValueType.Null)
{
return;
}

5
src/Squidex.Domain.Apps.Core.Operations/EnrichContent/DefaultValueFactory.cs

@ -74,6 +74,11 @@ namespace Squidex.Domain.Apps.Core.EnrichContent
return JsonValue.Array();
}
public IJsonValue Visit(IField<UIFieldProperties> field)
{
return JsonValue.Null;
}
public IJsonValue Visit(IField<DateTimeFieldProperties> field)
{
if (field.Properties.CalculatedDefaultValue == DateTimeCalculatedDefaultValue.Now)

5
src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesCleaner.cs

@ -93,6 +93,11 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
return value;
}
public IJsonValue Visit(IField<UIFieldProperties> field)
{
return value;
}
public IJsonValue Visit(IArrayField field)
{
return value;

5
src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs

@ -101,5 +101,10 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
{
return Enumerable.Empty<Guid>();
}
public IEnumerable<Guid> Visit(IField<UIFieldProperties> field)
{
return Enumerable.Empty<Guid>();
}
}
}

2
src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmSchemaExtensions.cs

@ -36,7 +36,7 @@ namespace Squidex.Domain.Apps.Core.GenerateEdmSchema
foreach (var field in schema.FieldsByName.Values)
{
if (!withHidden && field.IsHidden)
if (!field.IsForApi(withHidden))
{
continue;
}

5
src/Squidex.Domain.Apps.Core.Operations/GenerateEdmSchema/EdmTypeVisitor.cs

@ -90,6 +90,11 @@ namespace Squidex.Domain.Apps.Core.GenerateEdmSchema
return CreatePrimitive(EdmPrimitiveTypeKind.String, field);
}
public IEdmTypeReference Visit(IField<UIFieldProperties> field)
{
return null;
}
private static IEdmTypeReference CreatePrimitive(EdmPrimitiveTypeKind kind, IField field)
{
return EdmCoreModel.Instance.GetPrimitive(kind, !field.RawProperties.IsRequired);

64
src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/Builder.cs

@ -0,0 +1,64 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using NJsonSchema;
namespace Squidex.Domain.Apps.Core.GenerateJsonSchema
{
public static class Builder
{
public static JsonSchema4 Object()
{
return new JsonSchema4 { Type = JsonObjectType.Object, AllowAdditionalItems = false };
}
public static JsonSchema4 Guid()
{
return new JsonSchema4 { Type = JsonObjectType.String, Format = JsonFormatStrings.Guid };
}
public static JsonSchema4 String()
{
return new JsonSchema4 { Type = JsonObjectType.String };
}
public static JsonProperty ArrayProperty(JsonSchema4 item)
{
return new JsonProperty { Type = JsonObjectType.Array, Item = item };
}
public static JsonProperty BooleanProperty()
{
return new JsonProperty { Type = JsonObjectType.Boolean };
}
public static JsonProperty DateTimeProperty(string description = null, bool isRequired = false)
{
return new JsonProperty { Type = JsonObjectType.Number, Format = JsonFormatStrings.DateTime, Description = description, IsRequired = isRequired };
}
public static JsonProperty GuidProperty(string description = null, bool isRequired = false)
{
return new JsonProperty { Type = JsonObjectType.String, Format = JsonFormatStrings.Guid, Description = description, IsRequired = isRequired };
}
public static JsonProperty NumberProperty(string description = null, bool isRequired = false)
{
return new JsonProperty { Type = JsonObjectType.Number, Description = description, IsRequired = isRequired };
}
public static JsonProperty ObjectProperty(JsonSchema4 item, string description = null, bool isRequired = false)
{
return new JsonProperty { Type = JsonObjectType.Object, Reference = item, Description = description, IsRequired = isRequired };
}
public static JsonProperty StringProperty(string description = null, bool isRequired = false)
{
return new JsonProperty { Type = JsonObjectType.String, Description = description, IsRequired = isRequired };
}
}
}

30
src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/ContentSchemaBuilder.cs

@ -24,33 +24,19 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema
{
Properties =
{
["id"] = CreateProperty($"The id of the {schemaName} content."),
["data"] = CreateProperty($"The data of the {schemaName}.", dataSchema),
["version"] = CreateProperty($"The version of the {schemaName}.", JsonObjectType.Number),
["created"] = CreateProperty($"The date and time when the {schemaName} content has been created.", "date-time"),
["createdBy"] = CreateProperty($"The user that has created the {schemaName} content."),
["lastModified"] = CreateProperty($"The date and time when the {schemaName} content has been modified last.", "date-time"),
["lastModifiedBy"] = CreateProperty($"The user that has updated the {schemaName} content last.")
["id"] = Builder.GuidProperty($"The id of the {schemaName} content.", true),
["data"] = Builder.ObjectProperty(dataSchema, $"The data of the {schemaName}.", true),
["dataDraft"] = Builder.ObjectProperty(dataSchema, $"The draft data of the {schemaName}.", false),
["version"] = Builder.NumberProperty($"The version of the {schemaName}.", true),
["created"] = Builder.DateTimeProperty($"The date and time when the {schemaName} content has been created.", true),
["createdBy"] = Builder.StringProperty($"The user that has created the {schemaName} content.", true),
["lastModified"] = Builder.DateTimeProperty($"The date and time when the {schemaName} content has been modified last.", true),
["lastModifiedBy"] = Builder.StringProperty($"The user that has updated the {schemaName} content last.", true)
},
Type = JsonObjectType.Object
};
return contentSchema;
}
private static JsonProperty CreateProperty(string description, JsonSchema4 dataSchema)
{
return new JsonProperty { Description = description, IsRequired = true, Type = JsonObjectType.Object, Reference = dataSchema };
}
private static JsonProperty CreateProperty(string description, JsonObjectType type)
{
return new JsonProperty { Description = description, IsRequired = true, Type = type };
}
private static JsonProperty CreateProperty(string description, string format = null)
{
return new JsonProperty { Description = description, Format = format, IsRequired = true, Type = JsonObjectType.String };
}
}
}

28
src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonSchemaExtensions.cs

@ -6,7 +6,6 @@
// ==========================================================================
using System;
using System.Linq;
using NJsonSchema;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure;
@ -25,33 +24,38 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema
var jsonTypeVisitor = new JsonTypeVisitor(schemaResolver);
var jsonSchema = new JsonSchema4 { Type = JsonObjectType.Object };
foreach (var field in schema.Fields.Where(x => !x.IsHidden))
foreach (var field in schema.Fields.ForApi())
{
var partitionProperty = CreateProperty(field);
var partitionObject = new JsonSchema4 { Type = JsonObjectType.Object, AllowAdditionalProperties = false };
var partitionObject = Builder.Object();
var partition = partitionResolver(field.Partitioning);
foreach (var partitionItem in partition)
{
var partitionItemProperty = field.Accept(jsonTypeVisitor);
partitionItemProperty.Description = partitionItem.Name;
partitionItemProperty.IsRequired = field.RawProperties.IsRequired && !partitionItem.IsOptional;
if (partitionItemProperty != null)
{
partitionItemProperty.Description = partitionItem.Name;
partitionItemProperty.IsRequired = field.RawProperties.IsRequired && !partitionItem.IsOptional;
partitionObject.Properties.Add(partitionItem.Key, partitionItemProperty);
partitionObject.Properties.Add(partitionItem.Key, partitionItemProperty);
}
}
partitionProperty.Reference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}Property", partitionObject);
if (partitionObject.Properties.Count > 0)
{
var propertyReference = schemaResolver($"{schemaName}{field.Name.ToPascalCase()}Property", partitionObject);
jsonSchema.Properties.Add(field.Name, partitionProperty);
jsonSchema.Properties.Add(field.Name, CreateProperty(field, propertyReference));
}
}
return jsonSchema;
}
public static JsonProperty CreateProperty(IField field)
public static JsonProperty CreateProperty(IField field, JsonSchema4 reference)
{
var jsonProperty = new JsonProperty { IsRequired = field.RawProperties.IsRequired, Type = JsonObjectType.Object };
var jsonProperty = Builder.ObjectProperty(reference);
if (!string.IsNullOrWhiteSpace(field.RawProperties.Hints))
{
@ -62,6 +66,8 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema
jsonProperty.Description = field.Name;
}
jsonProperty.IsRequired = field.RawProperties.IsRequired;
return jsonProperty;
}
}

156
src/Squidex.Domain.Apps.Core.Operations/GenerateJsonSchema/JsonTypeVisitor.cs

@ -7,7 +7,6 @@
using System;
using System.Collections.ObjectModel;
using System.Linq;
using NJsonSchema;
using Squidex.Domain.Apps.Core.Schemas;
@ -24,164 +23,125 @@ namespace Squidex.Domain.Apps.Core.GenerateJsonSchema
public JsonProperty Visit(IArrayField field)
{
return CreateProperty(field, jsonProperty =>
var item = Builder.Object();
foreach (var nestedField in field.Fields.ForApi())
{
var itemSchema = new JsonSchema4
{
Type = JsonObjectType.Object
};
var childProperty = nestedField.Accept(this);
foreach (var nestedField in field.Fields.Where(x => !x.IsHidden))
if (childProperty != null)
{
var childProperty = nestedField.Accept(this);
childProperty.Description = nestedField.RawProperties.Hints;
childProperty.IsRequired = nestedField.RawProperties.IsRequired;
itemSchema.Properties.Add(nestedField.Name, childProperty);
item.Properties.Add(nestedField.Name, childProperty);
}
}
jsonProperty.Type = JsonObjectType.Object;
jsonProperty.Item = itemSchema;
});
return Builder.ArrayProperty(item);
}
public JsonProperty Visit(IField<AssetsFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
var itemSchema = schemaResolver("AssetItem", new JsonSchema4 { Type = JsonObjectType.String });
var item = schemaResolver("AssetItem", Builder.Guid());
jsonProperty.Type = JsonObjectType.Array;
jsonProperty.Item = itemSchema;
});
return Builder.ArrayProperty(item);
}
public JsonProperty Visit(IField<BooleanFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
jsonProperty.Type = JsonObjectType.Boolean;
});
return Builder.BooleanProperty();
}
public JsonProperty Visit(IField<DateTimeFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
jsonProperty.Type = JsonObjectType.String;
jsonProperty.Format = JsonFormatStrings.DateTime;
});
return Builder.DateTimeProperty();
}
public JsonProperty Visit(IField<GeolocationFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
var geolocationSchema = new JsonSchema4
{
AllowAdditionalProperties = false
};
var geolocationSchema = Builder.Object();
geolocationSchema.Properties.Add("latitude", new JsonProperty
{
Type = JsonObjectType.Number,
Minimum = -90,
Maximum = 90,
IsRequired = true
});
geolocationSchema.Properties.Add("latitude", new JsonProperty
{
Type = JsonObjectType.Number,
Minimum = -90,
Maximum = 90,
IsRequired = true
});
geolocationSchema.Properties.Add("longitude", new JsonProperty
{
Type = JsonObjectType.Number,
Minimum = -180,
Maximum = 180,
IsRequired = true
});
geolocationSchema.Properties.Add("longitude", new JsonProperty
{
Type = JsonObjectType.Number,
Minimum = -180,
Maximum = 180,
IsRequired = true
});
var schemaReference = schemaResolver("GeolocationDto", geolocationSchema);
var reference = schemaResolver("GeolocationDto", geolocationSchema);
jsonProperty.Type = JsonObjectType.Object;
jsonProperty.Reference = schemaReference;
});
return Builder.ObjectProperty(reference);
}
public JsonProperty Visit(IField<JsonFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
jsonProperty.Type = JsonObjectType.Object;
});
return Builder.StringProperty();
}
public JsonProperty Visit(IField<NumberFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
var property = Builder.NumberProperty();
if (field.Properties.MinValue.HasValue)
{
jsonProperty.Type = JsonObjectType.Number;
property.Minimum = (decimal)field.Properties.MinValue.Value;
}
if (field.Properties.MinValue.HasValue)
{
jsonProperty.Minimum = (decimal)field.Properties.MinValue.Value;
}
if (field.Properties.MaxValue.HasValue)
{
property.Maximum = (decimal)field.Properties.MaxValue.Value;
}
if (field.Properties.MaxValue.HasValue)
{
jsonProperty.Maximum = (decimal)field.Properties.MaxValue.Value;
}
});
return property;
}
public JsonProperty Visit(IField<ReferencesFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
var itemSchema = schemaResolver("ReferenceItem", new JsonSchema4 { Type = JsonObjectType.String });
var item = schemaResolver("ReferenceItem", Builder.Guid());
jsonProperty.Type = JsonObjectType.Array;
jsonProperty.Item = itemSchema;
});
return Builder.ArrayProperty(item);
}
public JsonProperty Visit(IField<StringFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
jsonProperty.Type = JsonObjectType.String;
var property = Builder.StringProperty();
jsonProperty.MinLength = field.Properties.MinLength;
jsonProperty.MaxLength = field.Properties.MaxLength;
property.MinLength = field.Properties.MinLength;
property.MaxLength = field.Properties.MaxLength;
if (field.Properties.AllowedValues != null)
{
var names = jsonProperty.EnumerationNames = jsonProperty.EnumerationNames ?? new Collection<string>();
if (field.Properties.AllowedValues != null)
{
var names = property.EnumerationNames = property.EnumerationNames ?? new Collection<string>();
foreach (var value in field.Properties.AllowedValues)
{
names.Add(value);
}
foreach (var value in field.Properties.AllowedValues)
{
names.Add(value);
}
});
}
return property;
}
public JsonProperty Visit(IField<TagsFieldProperties> field)
{
return CreateProperty(field, jsonProperty =>
{
var itemSchema = schemaResolver("TagsItem", new JsonSchema4 { Type = JsonObjectType.String });
var item = schemaResolver("ReferenceItem", Builder.String());
jsonProperty.Type = JsonObjectType.Array;
jsonProperty.Item = itemSchema;
});
return Builder.ArrayProperty(item);
}
private static JsonProperty CreateProperty(IField field, Action<JsonProperty> updater)
public JsonProperty Visit(IField<UIFieldProperties> field)
{
var property = new JsonProperty { IsRequired = field.RawProperties.IsRequired };
updater(property);
return property;
return null;
}
}
}

22
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ContentValidator.cs

@ -21,7 +21,6 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
{
public sealed class ContentValidator
{
private static readonly ContentFieldData DefaultFieldData = new ContentFieldData();
private readonly Schema schema;
private readonly PartitionResolver partitionResolver;
private readonly ValidationContext context;
@ -35,6 +34,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
public ContentValidator(Schema schema, PartitionResolver partitionResolver, ValidationContext context)
{
Guard.NotNull(schema, nameof(schema));
Guard.NotNull(context, nameof(context));
Guard.NotNull(partitionResolver, nameof(partitionResolver));
this.schema = schema;
@ -71,19 +71,19 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
{
var fieldsValidators = new Dictionary<string, (bool IsOptional, IValidator Validator)>(schema.Fields.Count);
foreach (var field in schema.FieldsByName)
foreach (var field in schema.Fields)
{
fieldsValidators[field.Key] = (!field.Value.RawProperties.IsRequired, CreateFieldValidator(field.Value, isPartial));
fieldsValidators[field.Name] = (!field.RawProperties.IsRequired, CreateFieldValidator(field, isPartial));
}
return new ObjectValidator<ContentFieldData>(fieldsValidators, isPartial, "field", DefaultFieldData);
return new ObjectValidator<ContentFieldData>(fieldsValidators, isPartial, "field");
}
private IValidator CreateFieldValidator(IRootField field, bool isPartial)
{
var partitioning = partitionResolver(field.Partitioning);
var fieldValidator = new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field);
var fieldValidator = field.CreateValidator();
var fieldsValidators = new Dictionary<string, (bool IsOptional, IValidator Validator)>();
foreach (var partition in partitioning)
@ -91,11 +91,17 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
fieldsValidators[partition.Key] = (partition.IsOptional, fieldValidator);
}
var isLanguage = field.Partitioning.Equals(Partitioning.Language);
return new AggregateValidator(
field.CreateBagValidator()
.Union(Enumerable.Repeat(
new ObjectValidator<IJsonValue>(fieldsValidators, isPartial, TypeName(field)), 1)));
}
var type = isLanguage ? "language" : "invariant value";
private static string TypeName(IRootField field)
{
var isLanguage = field.Partitioning.Equals(Partitioning.Language);
return new ObjectValidator<IJsonValue>(fieldsValidators, isPartial, type, JsonValue.Null);
return isLanguage ? "language" : "invariant value";
}
}
}

31
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Extensions.cs

@ -0,0 +1,31 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.ValidateContent.Validators;
namespace Squidex.Domain.Apps.Core.ValidateContent
{
public static class Extensions
{
public static FieldValidator CreateValidator(this IField field)
{
return new FieldValidator(CreateValueValidators(field), field);
}
private static IEnumerable<IValidator> CreateValueValidators(IField field)
{
return FieldValueValidatorsFactory.CreateValidators(field);
}
public static IEnumerable<IValidator> CreateBagValidator(this IField field)
{
return FieldBagValidatorsFactory.CreateValidators(field);
}
}
}

85
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldBagValidatorsFactory.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 Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.ValidateContent.Validators;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.ValidateContent
{
public sealed class FieldBagValidatorsFactory : IFieldVisitor<IEnumerable<IValidator>>
{
private static readonly FieldBagValidatorsFactory Instance = new FieldBagValidatorsFactory();
private FieldBagValidatorsFactory()
{
}
public static IEnumerable<IValidator> CreateValidators(IField field)
{
Guard.NotNull(field, nameof(field));
return field.Accept(Instance);
}
public IEnumerable<IValidator> Visit(IArrayField field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<AssetsFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<BooleanFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<DateTimeFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<GeolocationFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<JsonFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<NumberFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<ReferencesFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<StringFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<TagsFieldProperties> field)
{
yield break;
}
public IEnumerable<IValidator> Visit(IField<UIFieldProperties> field)
{
yield return NoValueValidator.Instance;
}
}
}

19
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/ValidatorsFactory.cs → src/Squidex.Domain.Apps.Core.Operations/ValidateContent/FieldValueValidatorsFactory.cs

@ -7,7 +7,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NodaTime;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.ValidateContent.Validators;
@ -16,11 +15,11 @@ using Squidex.Infrastructure.Json.Objects;
namespace Squidex.Domain.Apps.Core.ValidateContent
{
public sealed class ValidatorsFactory : IFieldVisitor<IEnumerable<IValidator>>
public sealed class FieldValueValidatorsFactory : IFieldVisitor<IEnumerable<IValidator>>
{
private static readonly ValidatorsFactory Instance = new ValidatorsFactory();
private static readonly FieldValueValidatorsFactory Instance = new FieldValueValidatorsFactory();
private ValidatorsFactory()
private FieldValueValidatorsFactory()
{
}
@ -42,10 +41,10 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
foreach (var nestedField in field.Fields)
{
nestedSchema[nestedField.Name] = (false, new FieldValidator(nestedField.Accept(this).ToArray(), nestedField));
nestedSchema[nestedField.Name] = (false, nestedField.CreateValidator());
}
yield return new CollectionItemValidator(new ObjectValidator<IJsonValue>(nestedSchema, false, "field", JsonValue.Null));
yield return new CollectionItemValidator(new ObjectValidator<IJsonValue>(nestedSchema, false, "field"));
}
public IEnumerable<IValidator> Visit(IField<AssetsFieldProperties> field)
@ -183,5 +182,13 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
yield return new CollectionItemValidator(new RequiredStringValidator(true));
}
public IEnumerable<IValidator> Visit(IField<UIFieldProperties> field)
{
if (field is INestedField)
{
yield return NoValueValidator.Instance;
}
}
}
}

5
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/JsonValueConverter.cs

@ -78,6 +78,11 @@ namespace Squidex.Domain.Apps.Core.ValidateContent
throw new InvalidCastException("Invalid json type, expected string.");
}
public object Visit(IField<UIFieldProperties> field)
{
return value;
}
public object Visit(IField<DateTimeFieldProperties> field)
{
if (value.Type == JsonValueType.String)

24
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Undefined.cs

@ -0,0 +1,24 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
namespace Squidex.Domain.Apps.Core.ValidateContent
{
public static class Undefined
{
public static readonly object Value = new object();
public static bool IsUndefined(this object other)
{
return ReferenceEquals(other, Value);
}
public static bool IsNullOrUndefined(this object other)
{
return other == null || other.IsUndefined();
}
}
}

33
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AggregateValidator.cs

@ -0,0 +1,33 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
{
public sealed class AggregateValidator : IValidator
{
private readonly IValidator[] validators;
public AggregateValidator(IEnumerable<IValidator> validators)
{
this.validators = validators?.ToArray();
}
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (validators?.Length > 0)
{
return Task.WhenAll(validators.Select(x => x.ValidateAsync(value, context, addError)));
}
return Task.CompletedTask;
}
}
}

9
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/AllowedValuesValidator.cs

@ -31,14 +31,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (value == null)
{
return TaskHelper.Done;
}
var typedValue = (T)value;
if (!allowedValues.Contains(typedValue))
if (value != null && value is T typedValue && !allowedValues.Contains(typedValue))
{
addError(context.Path, "Not an allowed value.");
}

41
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/FieldValidator.cs

@ -6,8 +6,10 @@
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Json.Objects;
namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
@ -17,9 +19,12 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
private readonly IValidator[] validators;
private readonly IField field;
public FieldValidator(IValidator[] validators, IField field)
public FieldValidator(IEnumerable<IValidator> validators, IField field)
{
this.validators = validators;
Guard.NotNull(field, nameof(field));
this.validators = validators.ToArray();
this.field = field;
}
@ -27,21 +32,35 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
{
try
{
object typedValue = null;
var typedValue = value;
if (value is IJsonValue jsonValue)
if (value == null)
{
typedValue = jsonValue.Type == JsonValueType.Null ? null : JsonValueConverter.ConvertValue(field, jsonValue);
typedValue = Undefined.Value;
}
var tasks = new List<Task>();
foreach (var validator in validators)
else if (value is IJsonValue jsonValue)
{
tasks.Add(validator.ValidateAsync(typedValue, context, addError));
if (jsonValue.Type == JsonValueType.Null)
{
typedValue = null;
}
else
{
typedValue = JsonValueConverter.ConvertValue(field, jsonValue);
}
}
await Task.WhenAll(tasks);
if (validators?.Length > 0)
{
var tasks = new List<Task>();
foreach (var validator in validators)
{
tasks.Add(validator.ValidateAsync(typedValue, context, addError));
}
await Task.WhenAll(tasks);
}
}
catch
{

30
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/NoValueValidator.cs

@ -0,0 +1,30 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Threading.Tasks;
namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
{
public sealed class NoValueValidator : IValidator
{
public static readonly NoValueValidator Instance = new NoValueValidator();
private NoValueValidator()
{
}
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (!value.IsUndefined())
{
addError(context.Path, "Value must not be defined.");
}
return Task.CompletedTask;
}
}
}

12
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/ObjectValidator.cs

@ -12,21 +12,25 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
{
public sealed class ObjectValidator<TValue> : IValidator
{
private static readonly IReadOnlyDictionary<string, TValue> DefaultValue = new Dictionary<string, TValue>();
private readonly IDictionary<string, (bool IsOptional, IValidator Validator)> schema;
private readonly bool isPartial;
private readonly string fieldType;
private readonly TValue fieldDefault;
public ObjectValidator(IDictionary<string, (bool IsOptional, IValidator Validator)> schema, bool isPartial, string fieldType, TValue fieldDefault)
public ObjectValidator(IDictionary<string, (bool IsOptional, IValidator Validator)> schema, bool isPartial, string fieldType)
{
this.schema = schema;
this.fieldDefault = fieldDefault;
this.fieldType = fieldType;
this.isPartial = isPartial;
}
public async Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (value == null)
{
value = DefaultValue;
}
if (value is IReadOnlyDictionary<string, TValue> values)
{
foreach (var fieldData in values)
@ -52,7 +56,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
continue;
}
fieldValue = fieldDefault;
fieldValue = default;
}
var (isOptional, validator) = field.Value;

44
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RangeValidator.cs

@ -29,34 +29,30 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (value == null)
if (value != null && value is T typedValue)
{
return TaskHelper.Done;
}
var typedValue = (T)value;
if (min.HasValue && max.HasValue)
{
if (Equals(min, max) && Equals(min.Value, max.Value))
{
addError(context.Path, $"Must be exactly '{max}'.");
}
else if (typedValue.CompareTo(min.Value) < 0 || typedValue.CompareTo(max.Value) > 0)
if (min.HasValue && max.HasValue)
{
addError(context.Path, $"Must be between '{min}' and '{max}'.");
if (Equals(min, max) && Equals(min.Value, max.Value))
{
addError(context.Path, $"Must be exactly '{max}'.");
}
else if (typedValue.CompareTo(min.Value) < 0 || typedValue.CompareTo(max.Value) > 0)
{
addError(context.Path, $"Must be between '{min}' and '{max}'.");
}
}
}
else
{
if (min.HasValue && typedValue.CompareTo(min.Value) < 0)
{
addError(context.Path, $"Must be greater or equal to '{min}'.");
}
if (max.HasValue && typedValue.CompareTo(max.Value) > 0)
else
{
addError(context.Path, $"Must be less or equal to '{max}'.");
if (min.HasValue && typedValue.CompareTo(min.Value) < 0)
{
addError(context.Path, $"Must be greater or equal to '{min}'.");
}
if (max.HasValue && typedValue.CompareTo(max.Value) > 0)
{
addError(context.Path, $"Must be less or equal to '{max}'.");
}
}
}

11
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredStringValidator.cs

@ -21,19 +21,22 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (context.IsOptional || (value != null && !(value is string)))
if (context.IsOptional)
{
return TaskHelper.Done;
}
var valueAsString = (string)value;
if (valueAsString == null || (validateEmptyStrings && string.IsNullOrWhiteSpace(valueAsString)))
if (value.IsNullOrUndefined() || IsEmptyString(value))
{
addError(context.Path, "Field is required.");
}
return TaskHelper.Done;
}
private bool IsEmptyString(object value)
{
return value is string typed && validateEmptyStrings && string.IsNullOrWhiteSpace(typed);
}
}
}

2
src/Squidex.Domain.Apps.Core.Operations/ValidateContent/Validators/RequiredValidator.cs

@ -14,7 +14,7 @@ namespace Squidex.Domain.Apps.Core.ValidateContent.Validators
{
public Task ValidateAsync(object value, ValidationContext context, AddError addError)
{
if (value == null && !context.IsOptional)
if (value.IsNullOrUndefined() && !context.IsOptional)
{
addError(context.Path, "Field is required.");
}

15
src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs

@ -6,7 +6,6 @@
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using GraphQL.Resolvers;
using GraphQL.Types;
using Squidex.Domain.Apps.Core.Contents;
@ -26,11 +25,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types
Name = $"{schemaType}DataDto";
foreach (var field in schema.SchemaDef.Fields.Where(x => !x.IsHidden))
foreach (var field in schema.SchemaDef.Fields.ForApi())
{
var fieldInfo = model.GetGraphType(schema, field);
var (resolvedType, valueResolver) = model.GetGraphType(schema, field);
if (fieldInfo.ResolveType != null)
if (valueResolver != null)
{
var fieldType = field.TypeName();
var fieldName = field.DisplayName();
@ -46,11 +45,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types
{
var key = partitionItem.Key;
var resolver = new FuncFieldResolver<object>(c =>
var partitionResolver = new FuncFieldResolver<object>(c =>
{
if (((ContentFieldData)c.Source).TryGetValue(key, out var value))
{
return fieldInfo.Resolver(value, c);
return valueResolver(value, c);
}
else
{
@ -61,8 +60,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types
fieldGraphType.AddField(new FieldType
{
Name = key.EscapePartition(),
Resolver = resolver,
ResolvedType = fieldInfo.ResolveType,
Resolver = partitionResolver,
ResolvedType = resolvedType,
Description = field.RawProperties.Hints
});
}

2
src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs

@ -26,7 +26,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types
Name = $"{schemaType}{fieldName}ChildDto";
foreach (var nestedField in field.Fields.Where(x => !x.IsHidden))
foreach (var nestedField in field.Fields.ForApi())
{
var fieldInfo = model.GetGraphType(schema, nestedField);

5
src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs

@ -81,6 +81,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types
return ResolveDefault(AllTypes.NoopTags);
}
public (IGraphType ResolveType, ValueResolver Resolver) Visit(IField<UIFieldProperties> field)
{
return (null, null);
}
private static (IGraphType ResolveType, ValueResolver Resolver) ResolveDefault(IGraphType type)
{
return (type, NoopResolver);

22
src/Squidex.Domain.Apps.Entities/Schemas/Guards/FieldPropertiesValidator.cs

@ -21,7 +21,18 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
public static IEnumerable<ValidationError> Validate(FieldProperties properties)
{
return properties?.Accept(Instance);
if (properties != null)
{
if (!properties.IsForApi() && properties.IsListField)
{
yield return new ValidationError("UI field cannot be a list field.", nameof(properties.IsListField));
}
foreach (var error in properties.Accept(Instance))
{
yield return error;
}
}
}
public IEnumerable<ValidationError> Visit(ArrayFieldProperties properties)
@ -268,5 +279,14 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
nameof(properties.MaxItems));
}
}
public IEnumerable<ValidationError> Visit(UIFieldProperties properties)
{
if (!properties.Editor.IsEnumValue())
{
yield return new ValidationError(Not.Valid("Editor"),
nameof(properties.Editor));
}
}
}
}

15
src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchema.cs

@ -13,6 +13,8 @@ using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Infrastructure;
#pragma warning disable IDE0060 // Remove unused parameter
namespace Squidex.Domain.Apps.Entities.Schemas.Guards
{
public static class GuardSchema
@ -199,6 +201,19 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
}
else
{
if (!field.Properties.IsForApi())
{
if (field.IsHidden)
{
e("UI field cannot be hidden.", $"{prefix}.{nameof(field.IsHidden)}");
}
if (field.IsDisabled)
{
e("UI field cannot be disabled.", $"{prefix}.{nameof(field.IsDisabled)}");
}
}
var errors = FieldPropertiesValidator.Validate(field.Properties);
errors.Foreach(x => x.WithPrefix($"{prefix}.{nameof(field.Properties)}").AddTo(e));

10
src/Squidex.Domain.Apps.Entities/Schemas/Guards/GuardSchemaField.cs

@ -101,6 +101,11 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
{
throw new DomainException("Schema field is already hidden.");
}
if (!field.IsForApi())
{
throw new DomainException("UI field cannot be hidden.");
}
}
public static void CanDisable(Schema schema, DisableField command)
@ -113,6 +118,11 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
{
throw new DomainException("Schema field is already disabled.");
}
if (!field.IsForApi())
{
throw new DomainException("UI field cannot be disabled.");
}
}
public static void CanDelete(Schema schema, DeleteField command)

5
src/Squidex/Areas/Api/Controllers/Schemas/Models/Converters/FieldPropertiesDtoFactory.cs

@ -55,6 +55,11 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models.Converters
return SimpleMapper.Map(properties, new ReferencesFieldPropertiesDto());
}
public FieldPropertiesDto Visit(UIFieldProperties properties)
{
return SimpleMapper.Map(properties, new UIFieldPropertiesDto());
}
public FieldPropertiesDto Visit(TagsFieldProperties properties)
{
var result = SimpleMapper.Map(properties, new TagsFieldPropertiesDto());

26
src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/UIFieldPropertiesDto.cs

@ -0,0 +1,26 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure.Collections;
using Squidex.Infrastructure.Reflection;
namespace Squidex.Areas.Api.Controllers.Schemas.Models.Fields
{
public sealed class UIFieldPropertiesDto : FieldPropertiesDto
{
/// <summary>
/// The editor that is used to manage this field.
/// </summary>
public UIFieldEditor Editor { get; set; }
public override FieldProperties ToProperties()
{
return SimpleMapper.Map(this, new UIFieldProperties());
}
}
}

28
src/Squidex/app/features/content/pages/content/content-field.component.html

@ -1,6 +1,6 @@
<div class="row no-gutters" [class.compare]="fieldFormCompare">
<div [class.col-12]="!fieldFormCompare" [class.col-6]="fieldFormCompare">
<div class="table-items-row" [class.field-invalid]="isInvalid | async">
<div class="table-items-row" [class.field-invalid]="isInvalid | async" *ngIf="field.properties.isContentField; else uiField">
<div class="languages-buttons">
<button *ngIf="isTranslatable" type="button" class="btn btn-text-secondary btn-sm mr-1" (click)="translate()" title="Autotranslate from master language">
<i class="icon-translate"></i>
@ -41,14 +41,25 @@
</sqx-field-editor>
</ng-template>
</div>
<ng-template #uiField>
<sqx-field-editor
[form]="form"
[field]="field"
[language]="language"
[languages]="languages"
[isCompact]="!!fieldFormCompare"
[control]="selectedFormControl">
</sqx-field-editor>
</ng-template>
</div>
<div class="col-6 col-right" *ngIf="fieldFormCompare">
<button type="button" class="btn btn-primary btn-sm field-copy" (click)="copy()" *ngIf="isDifferent | async">
<button type="button" class="btn btn-primary btn-sm field-copy" (click)="copy()" *ngIf="field.properties.isContentField && (isDifferent | async)">
<i class="icon-arrow_back"></i>
</button>
<div class="table-items-row">
<div class="table-items-row" *ngIf="field.properties.isContentField; else uiField">
<div class="languages-buttons">
<sqx-field-languages
[field]="field"
@ -83,5 +94,16 @@
</sqx-field-editor>
</ng-template>
</div>
<ng-template #uiField>
<sqx-field-editor
[form]="form"
[field]="field"
[language]="language"
[languages]="languages"
[isCompact]="!!fieldFormCompare"
[control]="selectedFormControl">
</sqx-field-editor>
</ng-template>
</div>
</div>

36
src/Squidex/app/features/content/pages/content/content-field.component.ts

@ -5,7 +5,7 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import { Component, DoCheck, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
import { AbstractControl, FormGroup } from '@angular/forms';
import { Observable } from 'rxjs';
import { combineLatest } from 'rxjs/operators';
@ -29,7 +29,7 @@ import {
styleUrls: ['./content-field.component.scss'],
templateUrl: './content-field.component.html'
})
export class ContentFieldComponent implements OnChanges {
export class ContentFieldComponent implements DoCheck, OnChanges {
@Input()
public form: EditContentForm;
@ -75,7 +75,7 @@ export class ContentFieldComponent implements OnChanges {
this.showAllControls = this.localStore.getBoolean(this.configKey());
}
if (changes['fieldForm']) {
if (changes['fieldForm'] && this.fieldForm) {
this.isInvalid = invalid$(this.fieldForm);
}
@ -89,26 +89,30 @@ export class ContentFieldComponent implements OnChanges {
combineLatest(value$(this.fieldFormCompare),
(lhs, rhs) => !Types.jsJsonEquals(lhs, rhs)));
}
}
public ngDoCheck() {
if (this.fieldForm) {
const control = this.findControl(this.fieldForm);
const control = this.findControl(this.fieldForm);
if (this.selectedFormControl !== control) {
if (this.selectedFormControl && Types.isFunction(this.selectedFormControl['_clearChangeFns'])) {
this.selectedFormControl['_clearChangeFns']();
}
if (this.selectedFormControl !== control) {
if (this.selectedFormControl && Types.isFunction(this.selectedFormControl['_clearChangeFns'])) {
this.selectedFormControl['_clearChangeFns']();
this.selectedFormControl = control;
}
this.selectedFormControl = control;
}
if (this.fieldFormCompare) {
const controlCompare = this.findControl(this.fieldFormCompare);
if (this.fieldFormCompare) {
const controlCompare = this.findControl(this.fieldFormCompare);
if (this.selectedFormControlCompare !== controlCompare) {
if (this.selectedFormControlCompare && Types.isFunction(this.selectedFormControlCompare['_clearChangeFns'])) {
this.selectedFormControlCompare['_clearChangeFns']();
}
if (this.selectedFormControlCompare !== controlCompare) {
if (this.selectedFormControlCompare && Types.isFunction(this.selectedFormControlCompare['_clearChangeFns'])) {
this.selectedFormControlCompare['_clearChangeFns']();
this.selectedFormControlCompare = controlCompare;
}
this.selectedFormControlCompare = controlCompare;
}
}
}

10
src/Squidex/app/features/content/pages/content/content-page.component.ts

@ -214,7 +214,7 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
if (!this.content || version === null || version.eq(this.content.version)) {
this.contentFormCompare = null;
this.contentVersion = null;
this.contentForm.load(this.content.dataDraft);
this.loadContent(this.content.dataDraft);
} else {
this.contentsState.loadVersion(this.content, version)
.subscribe(dto => {
@ -224,14 +224,16 @@ export class ContentPageComponent extends ResourceOwner implements CanComponentD
this.contentFormCompare.form.disable();
}
this.contentFormCompare.load(dto.payload);
this.contentForm.load(this.content.dataDraft);
const isArchive = this.content && this.content.status === 'Archived';
this.contentFormCompare.loadContent(dto.payload, true);
this.contentForm.loadContent(this.content.dataDraft, isArchive);
} else {
if (this.contentFormCompare) {
this.contentFormCompare = null;
}
this.contentForm.load(dto.payload);
this.loadContent(dto.payload);
}
this.contentVersion = version;

3
src/Squidex/app/features/content/shared/array-editor.component.html

@ -6,6 +6,7 @@
[form]="form"
[field]="field"
[isHidden]="snapshot.isHidden"
[isDisabled]="arrayControl.disabled"
[isFirst]="i === 0"
[isLast]="i === arrayControl.controls.length - 1"
[index]="i"
@ -20,7 +21,7 @@
</div>
</div>
<button type="button" class="btn btn-success" [disabled]="field.nested.length === 0" (click)="addItem(undefined)">
<button type="button" class="btn btn-success" [disabled]="field.nested.length === 0 || arrayControl.disabled" (click)="addItem(undefined)">
Add Item
</button>

13
src/Squidex/app/features/content/shared/array-item.component.html

@ -5,16 +5,16 @@
<span class="header-text text-decent">Item #{{index + 1}}</span>
<button type="button" class="btn btn-text-secondary" [disabled]="isFirst" (click)="emitMoveTop()">
<button type="button" class="btn btn-text-secondary" [disabled]="isDisabled || isFirst" (click)="emitMoveTop()">
<i class="icon-caret-top"></i>
</button>
<button type="button" class="btn btn-text-secondary" [disabled]="isFirst" (click)="emitMoveUp()">
<button type="button" class="btn btn-text-secondary" [disabled]="isDisabled || isFirst" (click)="emitMoveUp()">
<i class="icon-caret-up"></i>
</button>
<button type="button" class="btn btn-text-secondary" [disabled]="isLast" (click)="emitMoveDown()">
<button type="button" class="btn btn-text-secondary" [disabled]="isDisabled || isLast" (click)="emitMoveDown()">
<i class="icon-caret-down"></i>
</button>
<button type="button" class="btn btn-text-secondary" [disabled]="isLast" (click)="emitMoveBottom()">
<button type="button" class="btn btn-text-secondary" [disabled]="isDisabled || isLast" (click)="emitMoveBottom()">
<i class="icon-caret-bottom"></i>
</button>
<button type="button" class="btn btn-text-secondary" [class.hidden]="!isHidden" (click)="emitToggle(false)" title="Open all items">
@ -26,14 +26,13 @@
</span>
<span class="float-right">
<button type="button" class="btn btn-text-secondary" (click)="emitClone()">
<button type="button" class="btn btn-text-secondary" [disabled]="isDisabled" (click)="emitClone()">
<i class="icon-clone"></i>
</button>
<button type="button" class="btn btn-text-danger" (click)="emitRemove()">
<button type="button" class="btn btn-text-danger" [disabled]="isDisabled" (click)="emitRemove()">
<i class="icon-bin2"></i>
</button>
</span>
</div>

8
src/Squidex/app/features/content/shared/array-item.component.scss

@ -1,6 +1,14 @@
@import '_vars';
@import '_mixins';
:host /deep/ {
.ui-separator {
border-color: $color-border !important;
font-size: 1.2rem;
font-weight: normal;
}
}
.card {
& {
border: 1px solid darken($color-border, 5%);

5
src/Squidex/app/features/content/shared/array-item.component.ts

@ -51,6 +51,9 @@ export class ArrayItemComponent implements OnChanges {
@Input()
public isLast = false;
@Input()
public isDisabled = false;
@Input()
public index: number;
@ -73,7 +76,7 @@ export class ArrayItemComponent implements OnChanges {
}
if (changes['itemForm'] || changes['field']) {
this.fieldControls = this.field.nested.map(field => ({ field, control: this.itemForm.get(field.name)! })).filter(x => !!x.control);
this.fieldControls = this.field.nested.map(field => ({ field, control: this.itemForm.get(field.name)! })).filter(x => !x.field.properties.isContentField || !!x.control);
}
}

129
src/Squidex/app/features/content/shared/field-editor.component.html

@ -1,11 +1,13 @@
<ng-container *ngIf="field">
<label>
{{field.displayName}} {{displaySuffix}} <span class="field-required" [class.hidden]="!field.properties.isRequired">*</span>
</label>
<span class="field-disabled pl-1" *ngIf="field.isDisabled">Disabled</span>
<sqx-control-errors *ngIf="form" [for]="control" [fieldName]="field.displayName" [submitted]="form.submitted | async"></sqx-control-errors>
<div [class.ui]="!field.properties.isContentField" *ngIf="field">
<ng-container *ngIf="field.properties.isContentField">
<label>
{{field.displayName}} {{displaySuffix}} <span class="field-required" [class.hidden]="!field.properties.isRequired">*</span>
</label>
<span class="field-disabled pl-1" *ngIf="field.isDisabled">Disabled</span>
<sqx-control-errors *ngIf="form" [for]="control" [fieldName]="field.displayName" [submitted]="form.submitted | async"></sqx-control-errors>
</ng-container>
<div>
<ng-container *ngIf="field.properties.editorUrl; else noEditor">
@ -14,6 +16,37 @@
<ng-template #noEditor>
<ng-container [ngSwitch]="field.properties.fieldType">
<ng-container *ngSwitchCase="'Array'">
<sqx-array-editor
[arrayControl]="control"
[form]="form"
[field]="field"
[language]="language"
[languages]="languages">
</sqx-array-editor>
</ng-container>
<ng-container *ngSwitchCase="'Assets'">
<sqx-assets-editor [formControl]="control" [isCompact]="isCompact"></sqx-assets-editor>
</ng-container>
<ng-container *ngSwitchCase="'Boolean'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'Toggle'">
<sqx-toggle [formControl]="control" [threeStates]="!field.properties.isRequired"></sqx-toggle>
</ng-container>
<ng-container *ngSwitchCase="'Checkbox'">
<input type="checkbox" [formControl]="control" class="form-check" sqxIndeterminateValue />
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-editor enforceTime="true" [mode]="field.properties['editor']" [formControl]="control"></sqx-date-time-editor>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-editor [formControl]="control"></sqx-geolocation-editor>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-editor [formControl]="control"></sqx-json-editor>
</ng-container>
<ng-container *ngSwitchCase="'Number'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'Input'">
@ -38,6 +71,27 @@
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'List'">
<sqx-references-editor
[formControl]="control"
[allowDuplicates]="field.properties['allowDuplicated']"
[language]="language"
[languages]="languages"
[schemaId]="field.properties['schemaId']"
[isCompact]="isCompact">
</sqx-references-editor>
</ng-container>
<ng-container *ngSwitchCase="'Dropdown'">
<sqx-references-dropdown
[formControl]="control"
[language]="language"
[schemaId]="field.properties['schemaId']">
</sqx-references-dropdown>
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'String'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'Input'">
@ -77,28 +131,6 @@
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'Boolean'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'Toggle'">
<sqx-toggle [formControl]="control" [threeStates]="!field.properties.isRequired"></sqx-toggle>
</ng-container>
<ng-container *ngSwitchCase="'Checkbox'">
<input type="checkbox" [formControl]="control" class="form-check" sqxIndeterminateValue />
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-editor enforceTime="true" [mode]="field.properties['editor']" [formControl]="control"></sqx-date-time-editor>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-editor [formControl]="control"></sqx-geolocation-editor>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-editor [formControl]="control"></sqx-json-editor>
</ng-container>
<ng-container *ngSwitchCase="'Assets'">
<sqx-assets-editor [formControl]="control" [isCompact]="isCompact"></sqx-assets-editor>
</ng-container>
<ng-container *ngSwitchCase="'Tags'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'Tags'">
@ -113,37 +145,10 @@
</select>
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'Array'">
<sqx-array-editor
[arrayControl]="control"
[form]="form"
[field]="field"
[language]="language"
[languages]="languages">
</sqx-array-editor>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<ng-container [ngSwitch]="field.properties['editor']">
<ng-container *ngSwitchCase="'List'">
<sqx-references-editor
[formControl]="control"
[allowDuplicates]="field.properties['allowDuplicated']"
[language]="language"
[languages]="languages"
[schemaId]="field.properties['schemaId']"
[isCompact]="isCompact">
</sqx-references-editor>
</ng-container>
<ng-container *ngSwitchCase="'Dropdown'">
<sqx-references-dropdown
[formControl]="control"
[language]="language"
[schemaId]="field.properties['schemaId']">
</sqx-references-dropdown>
</ng-container>
</ng-container>
</ng-container>
</ng-container>
<ng-container *ngSwitchCase="'UI'">
<h4 class="ui-separator">{{field.displayName}}</h4>
</ng-container>
</ng-container>
</ng-template>
</div>
@ -153,4 +158,4 @@
{{hints}}
</sqx-form-hint>
</ng-container>
</ng-container>
</div>

16
src/Squidex/app/features/content/shared/field-editor.component.scss

@ -11,4 +11,20 @@
font-size: .8rem;
font-weight: normal;
}
}
.ui {
& {
margin-bottom: 1rem;
}
&-separator {
color: lighten($color-text, 20%);
border-bottom: 1px solid darken($color-border, 5%);
font-size: 1.3rem;
font-weight: normal;
padding: .25rem 0;
margin-top: 1.5rem;
margin-bottom: 0;
}
}

10
src/Squidex/app/features/content/shared/field-editor.component.ts

@ -5,7 +5,7 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component, Input } from '@angular/core';
import { Component, Input, OnChanges } from '@angular/core';
import { FormControl } from '@angular/forms';
import {
@ -20,7 +20,7 @@ import {
styleUrls: ['./field-editor.component.scss'],
templateUrl: './field-editor.component.html'
})
export class FieldEditorComponent {
export class FieldEditorComponent implements OnChanges {
@Input()
public form: EditContentForm;
@ -43,4 +43,10 @@ export class FieldEditorComponent {
public displaySuffix: string;
public uniqueId = MathHelper.guid();
public ngOnChanges() {
let a = 0;
a++;
console.log(a);
}
}

3
src/Squidex/app/features/content/shared/references-dropdown.component.ts

@ -45,8 +45,7 @@ type ContentName = { name: string, id: string };
<select class="form-control" [formControl]="selectedId">
<option [ngValue]="null"></option>
<option *ngFor="let content of snapshot.contentNames" [ngValue]="content.id">{{content.name}}</option>
</select>
`,
</select>`,
providers: [SQX_REFERENCES_DROPDOWN_CONTROL_VALUE_ACCESSOR],
changeDetection: ChangeDetectionStrategy.OnPush
})

1
src/Squidex/app/features/schemas/declarations.ts

@ -5,7 +5,6 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
export * from './pages/schema/types/assets-ui.component';
export * from './pages/schema/types/assets-validation.component';
export * from './pages/schema/types/boolean-ui.component';
export * from './pages/schema/types/boolean-validation.component';

4
src/Squidex/app/features/schemas/module.ts

@ -17,7 +17,6 @@ import {
} from '@app/shared';
import {
AssetsUIComponent,
AssetsValidationComponent,
BooleanUIComponent,
BooleanValidationComponent,
@ -81,13 +80,12 @@ const routes: Routes = [
SchemaMustExistGuard
],
declarations: [
FieldComponent,
AssetsUIComponent,
AssetsValidationComponent,
BooleanUIComponent,
BooleanValidationComponent,
DateTimeUIComponent,
DateTimeValidationComponent,
FieldComponent,
FieldFormCommonComponent,
FieldFormUIComponent,
FieldFormValidationComponent,

2
src/Squidex/app/features/schemas/pages/schema/field-wizard.component.html

@ -44,7 +44,7 @@
placeholder="Enter field name" sqxFocusOnInit />
</div>
<div class="form-group" *ngIf="!parent">
<div class="form-group" *ngIf="!parent && (addFieldForm.isContentField | async)">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="isLocalizable" formControlName="isLocalizable" />
<label class="form-check-label" for="isLocalizable">

38
src/Squidex/app/features/schemas/pages/schema/field.component.html

@ -13,9 +13,9 @@
</div>
<div class="col col-tags">
<div class="float-right">
<span class="badge badge-pill badge-danger" *ngIf="field.isLocked">Locked</span>
<span class="badge badge-pill badge-success" *ngIf="!field.isDisabled">Enabled</span>
<span class="badge badge-pill badge-danger" *ngIf="field.isDisabled">Disabled</span>
<span class="ml-1 badge badge-pill badge-danger" *ngIf="field.isLocked">Locked</span>
<span class="ml-1 badge badge-pill badge-success" *ngIf="!field.isDisabled">Enabled</span>
<span class="ml-1 badge badge-pill badge-danger" *ngIf="field.isDisabled">Disabled</span>
</div>
</div>
<div class="col col-options">
@ -25,22 +25,24 @@
</button>
<div class="dropdown dropdown-options">
<button type="button" class="btn btn-text-secondary ml-1" (click)="dropdown.toggle()" [class.active]="dropdown.isOpen | async" #optionsButton>
<button type="button" class="btn btn-text-secondary ml-1" (click)="dropdown.toggle()" [disabled]="!field.properties.isContentField && field.isLocked" [class.active]="dropdown.isOpen | async" #optionsButton>
<i class="icon-dots"></i>
</button>
<div class="dropdown-menu" *sqxModalView="dropdown;closeAlways:true" [sqxModalTarget]="optionsButton" @fade>
<a class="dropdown-item" (click)="enableField()" *ngIf="field.isDisabled">
Enable in UI
</a>
<a class="dropdown-item" (click)="disableField()" *ngIf="!field.isDisabled">
Disable in UI
</a>
<a class="dropdown-item" (click)="hideField()" *ngIf="!field.isHidden && !field.isLocked">
Hide in API
</a>
<a class="dropdown-item" (click)="showField()" *ngIf="field.isHidden && !field.isLocked">
Show in API
</a>
<ng-container *ngIf="field.properties.isContentField">
<a class="dropdown-item" (click)="enableField()" *ngIf="field.isDisabled">
Enable in UI
</a>
<a class="dropdown-item" (click)="disableField()" *ngIf="!field.isDisabled">
Disable in UI
</a>
<a class="dropdown-item" (click)="hideField()" *ngIf="!field.isHidden && !field.isLocked">
Hide in API
</a>
<a class="dropdown-item" (click)="showField()" *ngIf="field.isHidden && !field.isLocked">
Show in API
</a>
</ng-container>
<ng-container *ngIf="!field.isLocked">
<div class="dropdown-divider"></div>
@ -75,10 +77,10 @@
<li class="nav-item">
<a class="nav-link" (click)="selectTab(0)" [class.active]="selectedTab === 0">Common</a>
</li>
<li class="nav-item">
<li class="nav-item" [class.hidden]="!field.properties.isContentField">
<a class="nav-link" (click)="selectTab(1)" [class.active]="selectedTab === 1">Validation</a>
</li>
<li class="nav-item">
<li class="nav-item" [class.hidden]="!field.properties.isContentField || field.properties.fieldType === 'Assets'">
<a class="nav-link" (click)="selectTab(2)" [class.active]="selectedTab === 2">Editing</a>
</li>
</ul>

2
src/Squidex/app/features/schemas/pages/schema/forms/field-form-common.component.html

@ -39,7 +39,7 @@
</div>
</div>
<div class="form-group row">
<div class="form-group row" *ngIf="field.properties.isContentField">
<div class="col-6 offset-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="{{field.fieldId}}_fieldListfield" formControlName="isListField" />

29
src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.html

@ -1,29 +0,0 @@
<ng-container [ngSwitch]="field.properties.fieldType">
<ng-container *ngSwitchCase="'Number'">
<sqx-number-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-number-ui>
</ng-container>
<ng-container *ngSwitchCase="'String'">
<sqx-string-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-string-ui>
</ng-container>
<ng-container *ngSwitchCase="'Boolean'">
<sqx-boolean-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-boolean-ui>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-date-time-ui>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-geolocation-ui>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-json-ui>
</ng-container>
<ng-container *ngSwitchCase="'Assets'">
<sqx-assets-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-assets-ui>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<sqx-references-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-references-ui>
</ng-container>
<ng-container *ngSwitchCase="'Tags'">
<sqx-tags-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-tags-ui>
</ng-container>
</ng-container>

2
src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.scss

@ -1,2 +0,0 @@
@import '_vars';
@import '_mixins';

29
src/Squidex/app/features/schemas/pages/schema/forms/field-form-ui.component.ts

@ -12,8 +12,33 @@ import { FieldDto } from '@app/shared';
@Component({
selector: 'sqx-field-form-ui',
styleUrls: ['field-form-ui.component.scss'],
templateUrl: 'field-form-ui.component.html'
template: `
<ng-container [ngSwitch]="field.properties.fieldType">
<ng-container *ngSwitchCase="'Boolean'">
<sqx-boolean-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-boolean-ui>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-date-time-ui>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-geolocation-ui>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-json-ui>
</ng-container>
<ng-container *ngSwitchCase="'Number'">
<sqx-number-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-number-ui>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<sqx-references-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-references-ui>
</ng-container>
<ng-container *ngSwitchCase="'String'">
<sqx-string-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-string-ui>
</ng-container>
<ng-container *ngSwitchCase="'Tags'">
<sqx-tags-ui [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-tags-ui>
</ng-container>
</ng-container>`
})
export class FieldFormUIComponent {
@Input()

29
src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.html

@ -1,29 +0,0 @@
<ng-container [ngSwitch]="field.properties.fieldType">
<ng-container *ngSwitchCase="'Number'">
<sqx-number-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-number-validation>
</ng-container>
<ng-container *ngSwitchCase="'String'">
<sqx-string-validation [editForm]="editForm" [field]="field" [properties]="field.properties" [patterns]="patterns"></sqx-string-validation>
</ng-container>
<ng-container *ngSwitchCase="'Boolean'">
<sqx-boolean-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-boolean-validation>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-date-time-validation>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-geolocation-validation>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-json-validation>
</ng-container>
<ng-container *ngSwitchCase="'Assets'">
<sqx-assets-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-assets-validation>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<sqx-references-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-references-validation>
</ng-container>
<ng-container *ngSwitchCase="'Tags'">
<sqx-tags-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-tags-validation>
</ng-container>
</ng-container>

2
src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.scss

@ -1,2 +0,0 @@
@import '_vars';
@import '_mixins';

32
src/Squidex/app/features/schemas/pages/schema/forms/field-form-validation.component.ts

@ -16,8 +16,36 @@ import {
@Component({
selector: 'sqx-field-form-validation',
styleUrls: ['field-form-validation.component.scss'],
templateUrl: 'field-form-validation.component.html'
template: `
<ng-container [ngSwitch]="field.properties.fieldType">
<ng-container *ngSwitchCase="'Assets'">
<sqx-assets-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-assets-validation>
</ng-container>
<ng-container *ngSwitchCase="'DateTime'">
<sqx-date-time-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-date-time-validation>
</ng-container>
<ng-container *ngSwitchCase="'Boolean'">
<sqx-boolean-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-boolean-validation>
</ng-container>
<ng-container *ngSwitchCase="'Geolocation'">
<sqx-geolocation-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-geolocation-validation>
</ng-container>
<ng-container *ngSwitchCase="'Json'">
<sqx-json-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-json-validation>
</ng-container>
<ng-container *ngSwitchCase="'Number'">
<sqx-number-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-number-validation>
</ng-container>
<ng-container *ngSwitchCase="'References'">
<sqx-references-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-references-validation>
</ng-container>
<ng-container *ngSwitchCase="'String'">
<sqx-string-validation [editForm]="editForm" [field]="field" [properties]="field.properties" [patterns]="patterns"></sqx-string-validation>
</ng-container>
<ng-container *ngSwitchCase="'Tags'">
<sqx-tags-validation [editForm]="editForm" [field]="field" [properties]="field.properties"></sqx-tags-validation>
</ng-container>
</ng-container>`
})
export class FieldFormValidationComponent {
@Input()

8
src/Squidex/app/features/schemas/pages/schema/schema-page.component.html

@ -70,11 +70,9 @@
<div class="schemas"
[sqxSortModel]="schema.fields"
(sqxSort)="sortFields($event)">
<sqx-field *ngFor="let field of schema.fields; trackBy: trackByField.bind(this)"
[field]="field"
[schema]="schema"
[patterns]="patterns">
</sqx-field>
<div *ngFor="let field of schema.fields; trackBy: trackByField.bind(this)">
<sqx-field [field]="field" [schema]="schema" [patterns]="patterns"></sqx-field>
</div>
</div>
<button type="button" class="btn btn-success field-button" (click)="addFieldDialog.show()">

3
src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.html

@ -1,3 +0,0 @@
<div [formGroup]="editForm">
<span>Nothing to setup</span>
</div>

2
src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.scss

@ -1,2 +0,0 @@
@import '_vars';
@import '_mixins';

27
src/Squidex/app/features/schemas/pages/schema/types/assets-ui.component.ts

@ -1,27 +0,0 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component, Input } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { AssetsFieldPropertiesDto, FieldDto } from '@app/shared';
@Component({
selector: 'sqx-assets-ui',
styleUrls: ['assets-ui.component.scss'],
templateUrl: 'assets-ui.component.html'
})
export class AssetsUIComponent {
@Input()
public editForm: FormGroup;
@Input()
public field: FieldDto;
@Input()
public properties: AssetsFieldPropertiesDto;
}

2
src/Squidex/app/framework/angular/forms/form-alert.component.ts

@ -10,7 +10,7 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
@Component({
selector: 'sqx-form-alert',
template: `
<div class="alert alert-info mt-2 {{class}}">
<div class="alert alert-hint mt-2 {{class}}">
<i class="icon-info-outline"></i> <ng-content></ng-content>
</div>`,
changeDetection: ChangeDetectionStrategy.OnPush

7
src/Squidex/app/framework/angular/forms/form-error.component.ts

@ -7,17 +7,12 @@
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { fadeAnimation } from './../animations';
@Component({
selector: 'sqx-form-error',
template: `
<ng-container *ngIf="error">
<div class="form-alert form-alert-error" [innerHTML]="error" @fade></div>
<div class="form-alert form-alert-error" [innerHTML]="error"></div>
</ng-container>`,
animations: [
fadeAnimation
],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class FormErrorComponent {

3
src/Squidex/app/shared/components/table-header.component.ts

@ -21,8 +21,7 @@ import { Sorting } from '@app/shared/internal';
<ng-template #notSortable>
{{text}}
</ng-template>
`,
</ng-template>`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TableHeaderComponent {

2
src/Squidex/app/shared/services/schemas.service.ts

@ -71,7 +71,7 @@ export class SchemaDetailsDto extends SchemaDto {
protected onCloned() {
if (this.fields) {
let fields = this.fields.filter(x => x.properties.isListField);
let fields = this.fields.filter(x => x.properties.isListField && x.properties.isContentField);
if (fields.length === 0 && this.fields.length > 0) {
fields = [this.fields[0]];

44
src/Squidex/app/shared/services/schemas.types.ts

@ -15,7 +15,8 @@ export type FieldType =
'Number' |
'References' |
'String' |
'Tags';
'Tags' |
'UI';
export const fieldTypes: { type: FieldType, description: string }[] = [
{
@ -48,6 +49,9 @@ export const fieldTypes: { type: FieldType, description: string }[] = [
}, {
type: 'Array',
description: 'List of embedded objects.'
}, {
type: 'UI',
description: 'Separator for editing UI.'
}
];
@ -87,6 +91,12 @@ export function createProperties(fieldType: FieldType, values: Object | null = n
case 'Tags':
properties = new TagsFieldPropertiesDto('Tags');
break;
case 'Tags':
properties = new TagsFieldPropertiesDto('Tags');
break;
case 'UI':
properties = new UIFieldPropertiesDto();
break;
default:
throw 'Invalid properties type';
}
@ -118,6 +128,8 @@ export interface FieldPropertiesVisitor<T> {
visitString(properties: StringFieldPropertiesDto): T;
visitTags(properties: TagsFieldPropertiesDto): T;
visitUI(properties: UIFieldPropertiesDto): T;
}
export abstract class FieldPropertiesDto {
@ -146,6 +158,10 @@ export abstract class FieldPropertiesDto {
return true;
}
public get isContentField() {
return true;
}
public abstract accept<T>(visitor: FieldPropertiesVisitor<T>): T;
}
@ -378,4 +394,30 @@ export class TagsFieldPropertiesDto extends FieldPropertiesDto {
public accept<T>(visitor: FieldPropertiesVisitor<T>): T {
return visitor.visitTags(this);
}
}
export class UIFieldPropertiesDto extends FieldPropertiesDto {
public readonly fieldType = 'UI';
public get isComplexUI() {
return false;
}
public get isSortable() {
return false;
}
public get isContentField() {
return false;
}
constructor(
props?: Partial<TagsFieldPropertiesDto>
) {
super('Separator', props);
}
public accept<T>(visitor: FieldPropertiesVisitor<T>): T {
return visitor.visitUI(this);
}
}

71
src/Squidex/app/shared/state/contents.forms.ts

@ -32,7 +32,8 @@ import {
NumberFieldPropertiesDto,
ReferencesFieldPropertiesDto,
StringFieldPropertiesDto,
TagsFieldPropertiesDto
TagsFieldPropertiesDto,
UIFieldPropertiesDto
} from './../services/schemas.types';
export class SaveQueryForm extends Form<FormGroup, any> {
@ -126,6 +127,10 @@ export class FieldFormatter implements FieldPropertiesVisitor<string> {
public visitString(properties: StringFieldPropertiesDto): string {
return this.value;
}
public visitUI(properties: UIFieldPropertiesDto): string {
return this.value;
}
}
export class FieldValidatorsFactory implements FieldPropertiesVisitor<ValidatorFn[]> {
@ -245,6 +250,10 @@ export class FieldValidatorsFactory implements FieldPropertiesVisitor<ValidatorF
public visitJson(properties: JsonFieldPropertiesDto): ValidatorFn[] {
return [];
}
public visitUI(properties: UIFieldPropertiesDto): ValidatorFn[] {
return [];
}
}
export class FieldDefaultValue implements FieldPropertiesVisitor<any> {
@ -304,6 +313,10 @@ export class FieldDefaultValue implements FieldPropertiesVisitor<any> {
public visitTags(properties: TagsFieldPropertiesDto): any {
return null;
}
public visitUI(properties: UIFieldPropertiesDto): any {
return null;
}
}
export class EditContentForm extends Form<FormGroup, any> {
@ -314,28 +327,30 @@ export class EditContentForm extends Form<FormGroup, any> {
super(new FormGroup({}));
for (const field of schema.fields) {
const fieldForm = new FormGroup({});
const fieldDefault = FieldDefaultValue.get(field);
if (field.properties.fieldType !== 'UI') {
const fieldForm = new FormGroup({});
const fieldDefault = FieldDefaultValue.get(field);
const createControl = (isOptional: boolean) => {
const validators = FieldValidatorsFactory.createValidators(field, isOptional);
const createControl = (isOptional: boolean) => {
const validators = FieldValidatorsFactory.createValidators(field, isOptional);
if (field.isArray) {
return new FormArray([], validators);
if (field.isArray) {
return new FormArray([], validators);
} else {
return new FormControl(fieldDefault, validators);
}
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
fieldForm.setControl(language.iso2Code, createControl(language.isOptional));
}
} else {
return new FormControl(fieldDefault, validators);
fieldForm.setControl(fieldInvariant, createControl(false));
}
};
if (field.isLocalizable) {
for (let language of this.languages.values) {
fieldForm.setControl(language.iso2Code, createControl(language.isOptional));
}
} else {
fieldForm.setControl(fieldInvariant, createControl(false));
this.form.setControl(field.name, fieldForm);
}
this.form.setControl(field.name, fieldForm);
}
this.enable();
@ -359,19 +374,21 @@ export class EditContentForm extends Form<FormGroup, any> {
let isOptional = field.isLocalizable && !!language && language.isOptional;
for (let nested of field.nested) {
const nestedValidators = FieldValidatorsFactory.createValidators(nested, isOptional);
if (nested.properties.fieldType !== 'UI') {
const nestedValidators = FieldValidatorsFactory.createValidators(nested, isOptional);
let value = FieldDefaultValue.get(nested);
let value = FieldDefaultValue.get(nested);
if (source) {
const sourceField = source.get(nested.name);
if (source) {
const sourceField = source.get(nested.name);
if (sourceField) {
value = sourceField.value;
if (sourceField) {
value = sourceField.value;
}
}
}
itemForm.setControl(nested.name, new FormControl(value, nestedValidators));
itemForm.setControl(nested.name, new FormControl(value, nestedValidators));
}
}
partitionForm.push(itemForm);
@ -387,7 +404,7 @@ export class EditContentForm extends Form<FormGroup, any> {
}
}
public loadContent(value: any, isArchive: boolean) {
public loadContent(value: any, disable: boolean) {
for (let field of this.schema.fields) {
if (field.isArray && field.nested.length > 0) {
const fieldForm = <FormGroup>this.form.get(field.name);
@ -425,7 +442,7 @@ export class EditContentForm extends Form<FormGroup, any> {
super.load(value);
if (isArchive) {
if (disable) {
this.disable();
} else {
this.enable();

3
src/Squidex/app/shared/state/schemas.forms.ts

@ -6,6 +6,7 @@
*/
import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
import { map } from 'rxjs/operators';
import {
Form,
@ -181,6 +182,8 @@ export class EditSchemaForm extends Form<FormGroup, { label?: string, hints?: st
}
export class AddFieldForm extends Form<FormGroup, AddFieldDto> {
public isContentField = value$(this.form.get('type')!).pipe(map(x => x !== 'UI'));
constructor(formBuilder: FormBuilder) {
super(formBuilder.group({
type: ['String',

1
src/Squidex/app/theme/_bootstrap-vars.scss

@ -24,7 +24,6 @@ $warning: $color-theme-orange;
$alert-bg-level: 0;
$alert-color-level: -12.5;
$alert-margin-bottom: 0;
$input-bg-disabled: $color-input-disabled;
$input-border-color: $color-input;

20
src/Squidex/app/theme/_bootstrap.scss

@ -77,10 +77,16 @@
}
.alert-info {
background: $color-theme-blue;
border: 0;
}
.alert-hint {
@include border-radius(0);
background: lighten($color-theme-blue, 35%);
border: 1px solid $color-border;
font-size: 90%;
font-weight: normal;
color: $color-text;
.alert-link {
@ -191,6 +197,20 @@ a {
}
}
.dropdown-divider {
&:first-child {
display: none;
}
&:last-child {
display: none;
}
& + .dropdown-divider {
display: none;
}
}
//
// Dark vertical menu for dark panels.
//

2
src/Squidex/app/theme/icomoon/demo-files/demo.css

@ -150,7 +150,7 @@ p {
font-size: 24px;
}
.fs2 {
font-size: 32px;
font-size: 24px;
}
.fs3 {
font-size: 32px;

888
src/Squidex/app/theme/icomoon/demo.html

File diff suppressed because it is too large

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.eot

Binary file not shown.

89
src/Squidex/app/theme/icomoon/fonts/icomoon.svg

@ -11,43 +11,43 @@
<glyph unicode="&#xe901;" glyph-name="angle-left" horiz-adv-x="384" d="M358.286 640c0-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" />
<glyph unicode="&#xe902;" glyph-name="bin2" d="M128 640v-640c0-35.2 28.8-64 64-64h576c35.2 0 64 28.8 64 64v640h-704zM320 64h-64v448h64v-448zM448 64h-64v448h64v-448zM576 64h-64v448h64v-448zM704 64h-64v448h64v-448zM848 832h-208v80c0 26.4-21.6 48-48 48h-224c-26.4 0-48-21.6-48-48v-80h-208c-26.4 0-48-21.6-48-48v-80h832v80c0 26.4-21.6 48-48 48zM576 832h-192v63.198h192v-63.198z" />
<glyph unicode="&#xe903;" glyph-name="angle-up" horiz-adv-x="658" d="M614.286 274.286c0-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" />
<glyph unicode="&#xe904;" glyph-name="activity, history, time" d="M512 857.6c-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 806.4c185.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 473.6c77.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" />
<glyph unicode="&#xe905;" glyph-name="add, plus" d="M512 960c-35.392 0-64-28.608-64-64v-384h-384c-35.392 0-64-28.608-64-64s28.608-64 64-64h384v-384c0-35.392 28.608-64 64-64s64 28.608 64 64v384h384c35.392 0 64 28.608 64 64s-28.608 64-64 64h-384v384c0 35.392-28.608 64-64 64z" />
<glyph unicode="&#xe906;" glyph-name="check-circle" d="M512 857.6c-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 806.4c197.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 627c-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.2v-0.1c19.43-19.327 51.57-19.327 71 0v0.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" />
<glyph unicode="&#xe907;" glyph-name="check-circle-filled" d="M512-64c-282.778 0-512 229.222-512 512s229.222 512 512 512 512-229.222 512-512-229.222-512-512-512zM855.808 689.408c-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" />
<glyph unicode="&#xe908;" glyph-name="close" d="M601.024 448l276.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" />
<glyph unicode="&#xe909;" glyph-name="type-References" d="M409.6 524.8h-153.6v-51.2h153.6v51.2zM409.6 627.2h-153.6v-51.2h153.6v51.2zM256 268.8h409.6v51.2h-409.6v-51.2zM409.6 729.6h-153.6v-51.2h153.6v51.2zM870.4 780.8h-51.2v51.2c0 28.262-22.938 51.2-51.2 51.2h-614.4c-28.262 0-51.2-22.938-51.2-51.2v-665.6c0-28.262 22.938-51.2 51.2-51.2h51.2v-51.2c0-28.262 22.938-51.2 51.2-51.2h614.4c28.262 0 51.2 22.938 51.2 51.2v665.6c0 28.262-22.938 51.2-51.2 51.2zM179.2 166.4c-14.157 0-25.6 11.443-25.6 25.6v614.4c0 14.131 11.443 25.6 25.6 25.6h563.2c14.157 0 25.6-11.469 25.6-25.6v-614.4c0-14.157-11.443-25.6-25.6-25.6h-563.2zM870.4 89.6c0-14.157-11.443-25.6-25.6-25.6h-563.2c-14.157 0-25.6 11.443-25.6 25.6v25.6h512c28.262 0 51.2 22.938 51.2 51.2v563.2h25.6c14.157 0 25.6-11.469 25.6-25.6v-614.4zM614.4 729.6h-102.4c-28.262 0-51.2-22.938-51.2-51.2v-153.6c0-28.262 22.938-51.2 51.2-51.2h102.4c28.262 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.938 51.2-51.2 51.2zM614.4 524.8h-102.4v153.6h102.4v-153.6zM256 371.2h409.6v51.2h-409.6v-51.2z" />
<glyph unicode="&#xe90a;" glyph-name="control-Checkbox" d="M793.6 115.2c0-14.157-11.443-25.6-25.6-25.6h-665.6c-14.131 0-25.6 11.443-25.6 25.6v665.6c0 14.157 11.469 25.6 25.6 25.6h665.6c14.157 0 25.6-11.443 25.6-25.6v-102.4h51.2v128c0 28.262-22.938 51.2-51.2 51.2h-716.8c-28.262 0-51.2-22.938-51.2-51.2v-716.8c0-28.262 22.938-51.2 51.2-51.2h716.8c28.262 0 51.2 22.938 51.2 51.2v281.6h-51.2v-256zM991.078 722.253c-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" />
<glyph unicode="&#xe90b;" glyph-name="control-Dropdown" d="M51.2 960c-28.262 0-51.2-22.938-51.2-51.2v-281.6c0-28.262 22.938-51.2 51.2-51.2h921.6c28.262 0 51.2 22.938 51.2 51.2v281.6c0 28.262-22.938 51.2-51.2 51.2h-921.6zM76.8 908.8h512v-281.6h-512c-14.157 0-25.6 11.443-25.6 25.6v230.4c0 14.157 11.443 25.6 25.6 25.6zM640 908.8h307.2c14.157 0 25.6-11.443 25.6-25.6v-230.4c0-14.157-11.443-25.6-25.6-25.6h-307.2v281.6zM716.8 806.4c-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 524.8c-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 473.6c14.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 473.6c-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 320c-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 268.8c14.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 268.8c-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 115.2c-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 64c14.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 64c-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" />
<glyph unicode="&#xe90c;" glyph-name="control-Input" d="M512 960c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h128v-870.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-128v870.4h128c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-307.2zM51.2 755.2c-28.262 0-51.2-22.938-51.2-51.2v-460.8c0-28.262 22.938-51.2 51.2-51.2h537.6v51.2h-512c-14.131 0-25.6 11.443-25.6 25.6v409.6c0 14.157 11.469 25.6 25.6 25.6h512v51.2h-537.6zM742.4 755.2v-51.2h204.8c14.157 0 25.6-11.443 25.6-25.6v-409.6c0-14.157-11.443-25.6-25.6-25.6h-204.8v-51.2h230.4c28.262 0 51.2 22.938 51.2 51.2v460.8c0 28.262-22.938 51.2-51.2 51.2h-230.4zM285.9 653c-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 570.85l63.65-148.45h-127.9l64.25 148.45z" />
<glyph unicode="&#xe90d;" glyph-name="control-Radio" d="M153.6 243.2c-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-12.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 780.8h614.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 473.6h-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 960c-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 704c-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 601.6c-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 345.6c-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 857.6c-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 115.2h-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" />
<glyph unicode="&#xe90e;" glyph-name="control-TextArea" d="M0 960v-204.8h76.8v-76.8h51.2v76.8h76.8v204.8h-204.8zM819.2 960v-204.8h204.8v204.8h-204.8zM51.2 908.8h102.4v-102.4h-102.4v102.4zM870.4 908.8h102.4v-102.4h-102.4v102.4zM281.6 883.2v-51.2h102.4v51.2h-102.4zM486.4 883.2v-51.2h102.4v51.2h-102.4zM691.2 883.2v-51.2h102.4v51.2h-102.4zM333.25 755.2c-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.85v-486.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.95v486.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 678.4v-102.4h51.2v102.4h-51.2zM76.8 576v-102.4h51.2v102.4h-51.2zM896 473.6v-102.4h51.2v102.4h-51.2zM76.8 371.2v-102.4h51.2v102.4h-51.2zM896 268.8v-102.4h51.2v102.4h-51.2zM76.8 166.4v-25.6h-76.8v-204.8h204.8v76.8h76.8v51.2h-76.8v76.8h-76.8v25.6h-51.2zM819.2 140.8v-76.8h-25.6v-51.2h25.6v-76.8h204.8v204.8h-204.8zM51.2 89.6h102.4v-102.4h-102.4v102.4zM870.4 89.6h102.4v-102.4h-102.4v102.4zM384 64v-51.2h102.4v51.2h-102.4zM588.8 64v-51.2h102.4v51.2h-102.4z" />
<glyph unicode="&#xe90f;" glyph-name="control-Toggle" d="M332.8 934.4c-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 883.2h358.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 832c-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 780.8c42.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 422.4c-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 371.2h358.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 320c-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 268.8c42.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" />
<glyph unicode="&#xe910;" glyph-name="copy" d="M204.8 908.8c-56.525 0-102.4-45.875-102.4-102.4v-512c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4h-409.6zM204.8 857.6h409.6c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2v512c0 28.314 22.938 51.2 51.2 51.2zM768 755.2v-51.2c28.262 0 51.2-22.886 51.2-51.2v-512c0-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.4v512c0 56.525-45.875 102.4-102.4 102.4z" />
<glyph unicode="&#xe911;" glyph-name="dashboard" d="M828.8-64h-633.6c-105.6 0-195.2 89.6-195.2 195.2v320c0 281.6 227.2 508.8 505.6 508.8 288 0 518.4-230.4 518.4-518.4v-310.4c0-105.6-89.6-195.2-195.2-195.2zM505.6 896c-243.2 0-441.6-198.4-441.6-441.6v-320c0-73.6 60.8-134.4 131.2-134.4h630.4c73.6 0 131.2 60.8 131.2 131.2v310.4c3.2 249.6-201.6 454.4-451.2 454.4zM512 291.2c-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 531.2l108.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.2zM678.4 595.2c-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" />
<glyph unicode="&#xe912;" glyph-name="delete, bin" d="M597.35 140.8c14.131 0 25.6 11.469 25.6 25.6v307.2c0 14.080-11.469 25.6-25.6 25.6s-25.6-11.52-25.6-25.6v-307.2c0-14.131 11.418-25.6 25.6-25.6zM776.55 755.2h-153.6v51.2c0 28.314-22.886 51.2-51.2 51.2h-102.4c-28.262 0-51.2-22.886-51.2-51.2v-51.2h-153.6c-28.262 0-51.2-22.886-51.2-51.2v-102.4c0-28.314 22.938-51.2 51.2-51.2v-460.8c0-28.314 22.938-51.2 51.2-51.2h409.6c28.314 0 51.2 22.886 51.2 51.2v460.8c28.314 0 51.2 22.886 51.2 51.2v102.4c0 28.314-22.938 51.2-51.2 51.2zM469.35 806.4h102.4v-51.2h-102.4v51.2zM725.35 89.6h-409.6v460.8h409.6v-460.8zM776.55 601.6h-512v102.4h512v-102.4zM443.75 140.8c14.131 0 25.6 11.469 25.6 25.6v307.2c0 14.080-11.469 25.6-25.6 25.6s-25.6-11.52-25.6-25.6v-307.2c0-14.131 11.469-25.6 25.6-25.6z" />
<glyph unicode="&#xe913;" glyph-name="delete-filled" d="M832 832h-192v64c0 35.392-28.608 64-64 64h-128c-35.328 0-64-28.608-64-64v-64h-192c-35.328 0-64-28.608-64-64v-128c0-35.392 28.672-64 64-64v-512c0-35.392 28.672-64 64-64h512c35.392 0 64 28.608 64 64v512c35.392 0 64 28.608 64 64v128c0 35.392-28.608 64-64 64zM448 896h128v-64h-128v64zM448 160c0-17.664-14.336-32-32-32s-32 14.336-32 32v320c0 17.6 14.336 32 32 32s32-14.4 32-32v-320zM640 160c0-17.664-14.336-32-32-32s-32 14.336-32 32v320c0 17.6 14.336 32 32 32s32-14.4 32-32v-320zM832 640h-640v128h640v-128z" />
<glyph unicode="&#xe914;" glyph-name="document-delete" d="M358.4 857.6c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 770.2l117.4-117.4h-117.4v117.4zM332.8 499.2c-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 448c98.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 294.4c-12.39 0-22.4-10.061-22.4-22.4v-6.4c0-12.39 10.010-22.4 22.4-22.4h211.2c12.39 0 22.4 10.010 22.4 22.4v6.4c0 12.39-10.061 22.4-22.4 22.4h-211.2z" />
<glyph unicode="&#xe915;" glyph-name="document-disable" d="M358.4 857.6c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 770.2l117.4-117.4h-117.4v117.4zM332.8 499.2c-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 448c39.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 374.3c21.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" />
<glyph unicode="&#xe916;" glyph-name="document-publish" d="M358.4 857.6c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 770.2l117.4-117.4h-117.4v117.4zM332.8 499.2l-230.4-256v-51.2h102.4v-153.6h256v153.6h102.4v51.2l-230.4 256zM332.8 422.7l161.5-179.5h-84.7v-153.6h-153.6v153.6h-84.7l161.5 179.5z" />
<glyph unicode="&#xe917;" glyph-name="drag" d="M665.6 908.8v-102.4h102.4v102.4h-102.4zM460.8 806.4h102.4v102.4h-102.4v-102.4zM460.8 601.6h102.4v102.4h-102.4v-102.4zM665.6 601.6h102.4v102.4h-102.4v-102.4zM665.6 396.8h102.4v102.4h-102.4v-102.4zM460.8 396.8h102.4v102.4h-102.4v-102.4zM460.8 192h102.4v102.4h-102.4v-102.4zM665.6 192h102.4v102.4h-102.4v-102.4zM665.6-12.8h102.4v102.4h-102.4v-102.4zM460.8-12.8h102.4v102.4h-102.4v-102.4zM256 806.4h102.4v102.4h-102.4v-102.4zM256 601.6h102.4v102.4h-102.4v-102.4zM256 396.8h102.4v102.4h-102.4v-102.4zM256 192h102.4v102.4h-102.4v-102.4zM256-12.8h102.4v102.4h-102.4v-102.4z" />
<glyph unicode="&#xe918;" glyph-name="filter" d="M921.6 678.042c0 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.067v-256l153.6 51.2v204.8c0 0 298.752 408.166 299.725 409.702 0 0 7.475 16.64 7.475 25.139zM537.6 755.2c206.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 614.144v0 0zM573.030 273.408c-6.4-8.755-9.83-19.354-9.83-30.208v-167.885l-51.2-17.050v184.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" />
<glyph unicode="&#xe919;" glyph-name="help" d="M512 448h-204.8v-51.2h204.8v51.2zM768 806.4h-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.2v-665.6c0-28.314 22.886-51.2 51.2-51.2h512c28.314 0 51.2 22.886 51.2 51.2v665.6c0 28.314-22.886 51.2-51.2 51.2zM358.4 806.4h307.2v-51.2h-307.2v51.2zM768 140.8c0-28.314-22.886-51.2-51.2-51.2h-409.6c-28.314 0-51.2 22.886-51.2 51.2v563.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.2v-563.2zM307.2 499.2h409.6v51.2h-409.6v-51.2zM307.2 294.4h409.6v51.2h-409.6v-51.2z" />
<glyph unicode="&#xe91a;" glyph-name="type-Json, json" d="M179.2 704c0 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.4v-179.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.2v-179.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.2v179.2c0 30.746-13.85 58.061-35.328 76.8 21.478 18.765 35.328 46.029 35.328 76.8v179.2zM972.8 473.6h-25.6c-28.262 0-51.2 22.938-51.2 51.2v179.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.2v-179.2c0-30.771 13.85-58.035 35.328-76.8-21.478-18.739-35.328-46.054-35.328-76.8v-179.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.4v179.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 627.2c-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 524.8c-14.157 0-25.6-11.469-25.6-25.6v-204.8c0-14.157 11.443-25.6 25.6-25.6s25.6 11.443 25.6 25.6v204.8c0 14.131-11.443 25.6-25.6 25.6z" />
<glyph unicode="&#xe91b;" glyph-name="location, control-Map, type-Geolocation" d="M512 960c-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 195.328c-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 806.4c-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 550.4c-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" />
<glyph unicode="&#xe91c;" glyph-name="logo" d="M512.273 876.218c-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.673v-27.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.927v21.218h0.109v1.418c0 12.351 10.008 22.364 22.382 22.364 11.944 0 21.609-9.346 22.273-21.109v-202.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.909v225.636l0.127 0.055v1c0 12.595 10.219 22.8 22.836 22.8 12.349 0 22.333-9.824 22.727-22.073v-227.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 43v201.818c0.297 12.093 10.14 21.818 22.327 21.818 12.374 0 22.4-10.003 22.4-22.364v-1.418h0.073v-21.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 43v21.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" />
<glyph unicode="&#xe91d;" glyph-name="media, type-Assets, trigger-AssetChanged" d="M947.2 960h-870.4c-42.342 0-76.8-34.458-76.8-76.8v-870.4c0-42.342 34.458-76.8 76.8-76.8h870.4c42.342 0 76.8 34.458 76.8 76.8v870.4c0 42.342-34.458 76.8-76.8 76.8zM972.8 12.8c0-14.157-11.443-25.6-25.6-25.6h-870.4c-14.131 0-25.6 11.443-25.6 25.6v870.4c0 14.131 11.469 25.6 25.6 25.6h870.4c14.157 0 25.6-11.469 25.6-25.6v-870.4zM665.6 499.2c56.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 652.8c28.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 857.6h-768c-14.131 0-25.6-11.469-25.6-25.6v-614.4c0-14.157 11.469-25.6 25.6-25.6h768c14.157 0 25.6 11.443 25.6 25.6v614.4c0 14.131-11.443 25.6-25.6 25.6zM153.6 243.2v118.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 243.2h-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.798v367.846h716.8v-563.2z" />
<glyph unicode="&#xe91e;" glyph-name="more, dots" d="M128 576c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128zM512 576c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128zM896 576c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128z" />
<glyph unicode="&#xe91f;" glyph-name="pencil" d="M877.12 648.896l-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 532.608l-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 64v191.872l191.936-191.872h-191.936z" />
<glyph unicode="&#xe920;" glyph-name="reference" d="M892.083 828.083c-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 261.274l-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" />
<glyph unicode="&#xe921;" glyph-name="schemas" d="M800-64h-576c-124.8 0-224 99.2-224 224v300.8c0 124.8 99.2 224 224 224h576c124.8 0 224-99.2 224-224v-300.8c0-124.8-99.2-224-224-224zM224 620.8c-89.6 0-160-70.4-160-160v-300.8c0-89.6 70.4-160 160-160h576c89.6 0 160 70.4 160 160v300.8c0 89.6-70.4 160-160 160h-576zM828.8 758.4h-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-32zM716.8 896h-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-32zM800 544v-64c0-48-38.4-83.2-83.2-83.2h-409.6c-44.8-3.2-83.2 35.2-83.2 83.2v64h-54.4v-64c0-76.8 64-140.8 140.8-140.8h406.4c76.8 0 140.8 64 140.8 140.8v64h-57.6z" />
<glyph unicode="&#xe922;" glyph-name="search" d="M939.776-43.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 831.872c-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" />
<glyph unicode="&#xe923;" glyph-name="settings" d="M1019.11 519.245c-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 405.99c-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 652.8c-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 294.374c-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" />
<glyph unicode="&#xe924;" glyph-name="type-Boolean" d="M77.005 857.395h128v-332.8c0-14.131 11.418-25.6 25.6-25.6 14.106 0 25.6 11.469 25.6 25.6v332.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 243.021h-179.2v102.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.6v-358.4c0-14.157 11.418-25.6 25.6-25.6 14.157 0 25.6 11.443 25.6 25.6v179.2h179.2c14.157 0 25.6 11.443 25.6 25.6s-11.494 25.6-25.6 25.6zM965.094 901.53c-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" />
<glyph unicode="&#xe925;" glyph-name="type-DateTime" d="M947.2 857.6h-128v25.6c0 14.131-11.469 25.6-25.6 25.6s-25.6-11.469-25.6-25.6v-25.6h-512v25.6c0 14.131-11.52 25.6-25.6 25.6s-25.6-11.469-25.6-25.6v-25.6h-128c-42.342 0-76.8-34.458-76.8-76.8v-716.8c0-42.342 34.458-76.8 76.8-76.8h870.4c42.342 0 76.8 34.458 76.8 76.8v716.8c0 42.342-34.458 76.8-76.8 76.8zM972.8 64c0-14.131-11.469-25.6-25.6-25.6h-870.4c-14.080 0-25.6 11.469-25.6 25.6v537.6h921.6v-537.6zM972.8 652.8h-921.6v128c0 14.080 11.52 25.6 25.6 25.6h128v-76.8c0-14.080 11.52-25.6 25.6-25.6s25.6 11.52 25.6 25.6v76.8h512v-76.8c0-14.080 11.469-25.6 25.6-25.6s25.6 11.52 25.6 25.6v76.8h128c14.131 0 25.6-11.52 25.6-25.6v-128zM332.8 448h51.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 448h51.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 448h51.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 448h51.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 345.6h51.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 345.6h51.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 345.6h51.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 345.6h51.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 345.6h51.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 243.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 243.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 243.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 243.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 243.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.6zM179.2 140.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 140.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 140.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 140.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 140.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.6z" />
<glyph unicode="&#xe926;" glyph-name="type-Number" d="M256 294.4h-76.8v332.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.2v-307.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 652.8h-204.8c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-179.2c-14.131 0-25.6-11.469-25.6-25.6v-179.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.2v128h179.2c14.131 0 25.6 11.469 25.6 25.6v179.2c0 14.131-11.469 25.6-25.6 25.6zM972.8 652.8h-204.8c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-179.2c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-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.6v358.4c0 14.131-11.469 25.6-25.6 25.6z" />
<glyph unicode="&#xe927;" glyph-name="type-String" d="M870.4 38.4h-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 142.848c13.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 818.227l136.704-319.027h-273.408l136.704 319.027z" />
<glyph unicode="&#xe928;" glyph-name="user" d="M955.221 112c0 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 672c0-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" />
<glyph unicode="&#xe904;" glyph-name="activity, history, time" d="M512 836.267c-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 785.067c185.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 452.267c77.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" />
<glyph unicode="&#xe905;" glyph-name="add, plus" d="M512 938.667c-35.392 0-64-28.608-64-64v-384h-384c-35.392 0-64-28.608-64-64s28.608-64 64-64h384v-384c0-35.392 28.608-64 64-64s64 28.608 64 64v384h384c35.392 0 64 28.608 64 64s-28.608 64-64 64h-384v384c0 35.392-28.608 64-64 64z" />
<glyph unicode="&#xe906;" glyph-name="check-circle" d="M512 836.267c-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 785.067c197.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 605.667c-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.2v-0.1c19.43-19.327 51.57-19.327 71 0v0.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" />
<glyph unicode="&#xe907;" glyph-name="check-circle-filled" d="M512-85.333c-282.778 0-512 229.222-512 512s229.222 512 512 512 512-229.222 512-512-229.222-512-512-512zM855.808 668.075c-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" />
<glyph unicode="&#xe908;" glyph-name="close" d="M601.024 426.667l276.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" />
<glyph unicode="&#xe909;" glyph-name="type-References" d="M409.6 503.467h-153.6v-51.2h153.6v51.2zM409.6 605.867h-153.6v-51.2h153.6v51.2zM256 247.467h409.6v51.2h-409.6v-51.2zM409.6 708.267h-153.6v-51.2h153.6v51.2zM870.4 759.467h-51.2v51.2c0 28.262-22.938 51.2-51.2 51.2h-614.4c-28.262 0-51.2-22.938-51.2-51.2v-665.6c0-28.262 22.938-51.2 51.2-51.2h51.2v-51.2c0-28.262 22.938-51.2 51.2-51.2h614.4c28.262 0 51.2 22.938 51.2 51.2v665.6c0 28.262-22.938 51.2-51.2 51.2zM179.2 145.067c-14.157 0-25.6 11.443-25.6 25.6v614.4c0 14.131 11.443 25.6 25.6 25.6h563.2c14.157 0 25.6-11.469 25.6-25.6v-614.4c0-14.157-11.443-25.6-25.6-25.6h-563.2zM870.4 68.267c0-14.157-11.443-25.6-25.6-25.6h-563.2c-14.157 0-25.6 11.443-25.6 25.6v25.6h512c28.262 0 51.2 22.938 51.2 51.2v563.2h25.6c14.157 0 25.6-11.469 25.6-25.6v-614.4zM614.4 708.267h-102.4c-28.262 0-51.2-22.938-51.2-51.2v-153.6c0-28.262 22.938-51.2 51.2-51.2h102.4c28.262 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.938 51.2-51.2 51.2zM614.4 503.467h-102.4v153.6h102.4v-153.6zM256 349.867h409.6v51.2h-409.6v-51.2z" />
<glyph unicode="&#xe90a;" glyph-name="control-Checkbox" d="M793.6 93.867c0-14.157-11.443-25.6-25.6-25.6h-665.6c-14.131 0-25.6 11.443-25.6 25.6v665.6c0 14.157 11.469 25.6 25.6 25.6h665.6c14.157 0 25.6-11.443 25.6-25.6v-102.4h51.2v128c0 28.262-22.938 51.2-51.2 51.2h-716.8c-28.262 0-51.2-22.938-51.2-51.2v-716.8c0-28.262 22.938-51.2 51.2-51.2h716.8c28.262 0 51.2 22.938 51.2 51.2v281.6h-51.2v-256zM991.078 700.92c-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" />
<glyph unicode="&#xe90b;" glyph-name="control-Dropdown" d="M51.2 938.667c-28.262 0-51.2-22.938-51.2-51.2v-281.6c0-28.262 22.938-51.2 51.2-51.2h921.6c28.262 0 51.2 22.938 51.2 51.2v281.6c0 28.262-22.938 51.2-51.2 51.2h-921.6zM76.8 887.467h512v-281.6h-512c-14.157 0-25.6 11.443-25.6 25.6v230.4c0 14.157 11.443 25.6 25.6 25.6zM640 887.467h307.2c14.157 0 25.6-11.443 25.6-25.6v-230.4c0-14.157-11.443-25.6-25.6-25.6h-307.2v281.6zM716.8 785.067c-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 503.467c-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 452.267c14.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 452.267c-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 298.667c-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 247.467c14.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 247.467c-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 93.867c-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 42.667c14.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 42.667c-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" />
<glyph unicode="&#xe90c;" glyph-name="control-Input" d="M512 938.667c-14.157 0-25.6-11.443-25.6-25.6s11.443-25.6 25.6-25.6h128v-870.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-128v870.4h128c14.157 0 25.6 11.443 25.6 25.6s-11.443 25.6-25.6 25.6h-307.2zM51.2 733.867c-28.262 0-51.2-22.938-51.2-51.2v-460.8c0-28.262 22.938-51.2 51.2-51.2h537.6v51.2h-512c-14.131 0-25.6 11.443-25.6 25.6v409.6c0 14.157 11.469 25.6 25.6 25.6h512v51.2h-537.6zM742.4 733.867v-51.2h204.8c14.157 0 25.6-11.443 25.6-25.6v-409.6c0-14.157-11.443-25.6-25.6-25.6h-204.8v-51.2h230.4c28.262 0 51.2 22.938 51.2 51.2v460.8c0 28.262-22.938 51.2-51.2 51.2h-230.4zM285.9 631.667c-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 549.517l63.65-148.45h-127.9l64.25 148.45z" />
<glyph unicode="&#xe90d;" glyph-name="control-Radio" d="M153.6 221.867c-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-34.133c-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 759.467h614.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 452.267h-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 938.667c-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 682.667c-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 580.267c-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 324.267c-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 836.267c-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 93.867h-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" />
<glyph unicode="&#xe90e;" glyph-name="control-TextArea" d="M0 938.667v-204.8h76.8v-76.8h51.2v76.8h76.8v204.8h-204.8zM819.2 938.667v-204.8h204.8v204.8h-204.8zM51.2 887.467h102.4v-102.4h-102.4v102.4zM870.4 887.467h102.4v-102.4h-102.4v102.4zM281.6 861.867v-51.2h102.4v51.2h-102.4zM486.4 861.867v-51.2h102.4v51.2h-102.4zM691.2 861.867v-51.2h102.4v51.2h-102.4zM333.25 733.867c-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.85v-486.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.95v486.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 657.067v-102.4h51.2v102.4h-51.2zM76.8 554.667v-102.4h51.2v102.4h-51.2zM896 452.267v-102.4h51.2v102.4h-51.2zM76.8 349.867v-102.4h51.2v102.4h-51.2zM896 247.467v-102.4h51.2v102.4h-51.2zM76.8 145.067v-25.6h-76.8v-204.8h204.8v76.8h76.8v51.2h-76.8v76.8h-76.8v25.6h-51.2zM819.2 119.467v-76.8h-25.6v-51.2h25.6v-76.8h204.8v204.8h-204.8zM51.2 68.267h102.4v-102.4h-102.4v102.4zM870.4 68.267h102.4v-102.4h-102.4v102.4zM384 42.667v-51.2h102.4v51.2h-102.4zM588.8 42.667v-51.2h102.4v51.2h-102.4z" />
<glyph unicode="&#xe90f;" glyph-name="control-Toggle" d="M332.8 913.067c-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 861.867h358.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 810.667c-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 759.467c42.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 401.067c-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 349.867h358.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 298.667c-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 247.467c42.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" />
<glyph unicode="&#xe910;" glyph-name="copy" d="M204.8 887.467c-56.525 0-102.4-45.875-102.4-102.4v-512c0-56.525 45.875-102.4 102.4-102.4h409.6c56.525 0 102.4 45.875 102.4 102.4v512c0 56.525-45.875 102.4-102.4 102.4h-409.6zM204.8 836.267h409.6c28.262 0 51.2-22.886 51.2-51.2v-512c0-28.314-22.938-51.2-51.2-51.2h-409.6c-28.262 0-51.2 22.886-51.2 51.2v512c0 28.314 22.938 51.2 51.2 51.2zM768 733.867v-51.2c28.262 0 51.2-22.886 51.2-51.2v-512c0-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.4v512c0 56.525-45.875 102.4-102.4 102.4z" />
<glyph unicode="&#xe911;" glyph-name="dashboard" d="M828.8-85.333h-633.6c-105.6 0-195.2 89.6-195.2 195.2v320c0 281.6 227.2 508.8 505.6 508.8 288 0 518.4-230.4 518.4-518.4v-310.4c0-105.6-89.6-195.2-195.2-195.2zM505.6 874.667c-243.2 0-441.6-198.4-441.6-441.6v-320c0-73.6 60.8-134.4 131.2-134.4h630.4c73.6 0 131.2 60.8 131.2 131.2v310.4c3.2 249.6-201.6 454.4-451.2 454.4zM512 269.867c-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 509.867l108.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.2zM678.4 573.867c-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" />
<glyph unicode="&#xe912;" glyph-name="delete, bin" d="M597.35 119.467c14.131 0 25.6 11.469 25.6 25.6v307.2c0 14.080-11.469 25.6-25.6 25.6s-25.6-11.52-25.6-25.6v-307.2c0-14.131 11.418-25.6 25.6-25.6zM776.55 733.867h-153.6v51.2c0 28.314-22.886 51.2-51.2 51.2h-102.4c-28.262 0-51.2-22.886-51.2-51.2v-51.2h-153.6c-28.262 0-51.2-22.886-51.2-51.2v-102.4c0-28.314 22.938-51.2 51.2-51.2v-460.8c0-28.314 22.938-51.2 51.2-51.2h409.6c28.314 0 51.2 22.886 51.2 51.2v460.8c28.314 0 51.2 22.886 51.2 51.2v102.4c0 28.314-22.938 51.2-51.2 51.2zM469.35 785.067h102.4v-51.2h-102.4v51.2zM725.35 68.267h-409.6v460.8h409.6v-460.8zM776.55 580.267h-512v102.4h512v-102.4zM443.75 119.467c14.131 0 25.6 11.469 25.6 25.6v307.2c0 14.080-11.469 25.6-25.6 25.6s-25.6-11.52-25.6-25.6v-307.2c0-14.131 11.469-25.6 25.6-25.6z" />
<glyph unicode="&#xe913;" glyph-name="delete-filled" d="M832 810.667h-192v64c0 35.392-28.608 64-64 64h-128c-35.328 0-64-28.608-64-64v-64h-192c-35.328 0-64-28.608-64-64v-128c0-35.392 28.672-64 64-64v-512c0-35.392 28.672-64 64-64h512c35.392 0 64 28.608 64 64v512c35.392 0 64 28.608 64 64v128c0 35.392-28.608 64-64 64zM448 874.667h128v-64h-128v64zM448 138.667c0-17.664-14.336-32-32-32s-32 14.336-32 32v320c0 17.6 14.336 32 32 32s32-14.4 32-32v-320zM640 138.667c0-17.664-14.336-32-32-32s-32 14.336-32 32v320c0 17.6 14.336 32 32 32s32-14.4 32-32v-320zM832 618.667h-640v128h640v-128z" />
<glyph unicode="&#xe914;" glyph-name="document-delete" d="M358.4 836.267c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 748.867l117.4-117.4h-117.4v117.4zM332.8 477.867c-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 426.667c98.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 273.067c-12.39 0-22.4-10.061-22.4-22.4v-6.4c0-12.39 10.010-22.4 22.4-22.4h211.2c12.39 0 22.4 10.010 22.4 22.4v6.4c0 12.39-10.061 22.4-22.4 22.4h-211.2z" />
<glyph unicode="&#xe915;" glyph-name="document-disable" d="M358.4 836.267c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 748.867l117.4-117.4h-117.4v117.4zM332.8 477.867c-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 426.667c39.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 352.967c21.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" />
<glyph unicode="&#xe916;" glyph-name="document-publish" d="M358.4 836.267c-28.314 0-51.2-22.886-51.2-51.2v-256h51.2v256h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-343.4zM716.8 748.867l117.4-117.4h-117.4v117.4zM332.8 477.867l-230.4-256v-51.2h102.4v-153.6h256v153.6h102.4v51.2l-230.4 256zM332.8 401.367l161.5-179.5h-84.7v-153.6h-153.6v153.6h-84.7l161.5 179.5z" />
<glyph unicode="&#xe917;" glyph-name="drag" d="M665.6 887.467v-102.4h102.4v102.4h-102.4zM460.8 785.067h102.4v102.4h-102.4v-102.4zM460.8 580.267h102.4v102.4h-102.4v-102.4zM665.6 580.267h102.4v102.4h-102.4v-102.4zM665.6 375.467h102.4v102.4h-102.4v-102.4zM460.8 375.467h102.4v102.4h-102.4v-102.4zM460.8 170.667h102.4v102.4h-102.4v-102.4zM665.6 170.667h102.4v102.4h-102.4v-102.4zM665.6-34.133h102.4v102.4h-102.4v-102.4zM460.8-34.133h102.4v102.4h-102.4v-102.4zM256 785.067h102.4v102.4h-102.4v-102.4zM256 580.267h102.4v102.4h-102.4v-102.4zM256 375.467h102.4v102.4h-102.4v-102.4zM256 170.667h102.4v102.4h-102.4v-102.4zM256-34.133h102.4v102.4h-102.4v-102.4z" />
<glyph unicode="&#xe918;" glyph-name="filter" d="M921.6 656.709c0 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.067v-256l153.6 51.2v204.8c0 0 298.752 408.166 299.725 409.702 0 0 7.475 16.64 7.475 25.139zM537.6 733.867c206.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 592.811v0 0zM573.030 252.075c-6.4-8.755-9.83-19.354-9.83-30.208v-167.885l-51.2-17.050v184.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" />
<glyph unicode="&#xe919;" glyph-name="help" d="M512 426.667h-204.8v-51.2h204.8v51.2zM768 785.067h-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.2v-665.6c0-28.314 22.886-51.2 51.2-51.2h512c28.314 0 51.2 22.886 51.2 51.2v665.6c0 28.314-22.886 51.2-51.2 51.2zM358.4 785.067h307.2v-51.2h-307.2v51.2zM768 119.467c0-28.314-22.886-51.2-51.2-51.2h-409.6c-28.314 0-51.2 22.886-51.2 51.2v563.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.2v-563.2zM307.2 477.867h409.6v51.2h-409.6v-51.2zM307.2 273.067h409.6v51.2h-409.6v-51.2z" />
<glyph unicode="&#xe91a;" glyph-name="type-Json, json" d="M179.2 682.667c0 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.4v-179.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.2v-179.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.2v179.2c0 30.746-13.85 58.061-35.328 76.8 21.478 18.765 35.328 46.029 35.328 76.8v179.2zM972.8 452.267h-25.6c-28.262 0-51.2 22.938-51.2 51.2v179.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.2v-179.2c0-30.771 13.85-58.035 35.328-76.8-21.478-18.739-35.328-46.054-35.328-76.8v-179.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.4v179.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 605.867c-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 503.467c-14.157 0-25.6-11.469-25.6-25.6v-204.8c0-14.157 11.443-25.6 25.6-25.6s25.6 11.443 25.6 25.6v204.8c0 14.131-11.443 25.6-25.6 25.6z" />
<glyph unicode="&#xe91b;" glyph-name="location, control-Map, type-Geolocation" d="M512 938.667c-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 173.995c-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 785.067c-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 529.067c-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" />
<glyph unicode="&#xe91c;" glyph-name="logo" d="M512.273 854.885c-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.673v-27.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.927v21.218h0.109v1.418c0 12.351 10.008 22.364 22.382 22.364 11.944 0 21.609-9.346 22.273-21.109v-202.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.909v225.636l0.127 0.055v1c0 12.595 10.219 22.8 22.836 22.8 12.349 0 22.333-9.824 22.727-22.073v-227.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 43v201.818c0.297 12.093 10.14 21.818 22.327 21.818 12.374 0 22.4-10.003 22.4-22.364v-1.418h0.073v-21.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 43v21.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" />
<glyph unicode="&#xe91d;" glyph-name="media, type-Assets, trigger-AssetChanged" d="M947.2 938.667h-870.4c-42.342 0-76.8-34.458-76.8-76.8v-870.4c0-42.342 34.458-76.8 76.8-76.8h870.4c42.342 0 76.8 34.458 76.8 76.8v870.4c0 42.342-34.458 76.8-76.8 76.8zM972.8-8.533c0-14.157-11.443-25.6-25.6-25.6h-870.4c-14.131 0-25.6 11.443-25.6 25.6v870.4c0 14.131 11.469 25.6 25.6 25.6h870.4c14.157 0 25.6-11.469 25.6-25.6v-870.4zM665.6 477.867c56.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 631.467c28.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 836.267h-768c-14.131 0-25.6-11.469-25.6-25.6v-614.4c0-14.157 11.469-25.6 25.6-25.6h768c14.157 0 25.6 11.443 25.6 25.6v614.4c0 14.131-11.443 25.6-25.6 25.6zM153.6 221.867v118.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 221.867h-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.798v367.846h716.8v-563.2z" />
<glyph unicode="&#xe91e;" glyph-name="more, dots" d="M128 554.667c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128zM512 554.667c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128zM896 554.667c-70.656 0-128-57.344-128-128s57.344-128 128-128c70.656 0 128 57.344 128 128s-57.344 128-128 128z" />
<glyph unicode="&#xe91f;" glyph-name="pencil" d="M877.12 627.563l-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 511.275l-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 42.667v191.872l191.936-191.872h-191.936z" />
<glyph unicode="&#xe920;" glyph-name="reference" d="M892.083 806.75c-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 239.941l-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" />
<glyph unicode="&#xe921;" glyph-name="schemas" d="M800-85.333h-576c-124.8 0-224 99.2-224 224v300.8c0 124.8 99.2 224 224 224h576c124.8 0 224-99.2 224-224v-300.8c0-124.8-99.2-224-224-224zM224 599.467c-89.6 0-160-70.4-160-160v-300.8c0-89.6 70.4-160 160-160h576c89.6 0 160 70.4 160 160v300.8c0 89.6-70.4 160-160 160h-576zM828.8 737.067h-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-32zM716.8 874.667h-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-32zM800 522.667v-64c0-48-38.4-83.2-83.2-83.2h-409.6c-44.8-3.2-83.2 35.2-83.2 83.2v64h-54.4v-64c0-76.8 64-140.8 140.8-140.8h406.4c76.8 0 140.8 64 140.8 140.8v64h-57.6z" />
<glyph unicode="&#xe922;" glyph-name="search" d="M939.776-65.109c-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 810.539c-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" />
<glyph unicode="&#xe923;" glyph-name="settings" d="M1019.11 497.912c-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 384.657c-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 631.467c-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 273.041c-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" />
<glyph unicode="&#xe924;" glyph-name="type-Boolean" d="M77.005 836.062h128v-332.8c0-14.131 11.418-25.6 25.6-25.6 14.106 0 25.6 11.469 25.6 25.6v332.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 221.688h-179.2v102.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.6v-358.4c0-14.157 11.418-25.6 25.6-25.6 14.157 0 25.6 11.443 25.6 25.6v179.2h179.2c14.157 0 25.6 11.443 25.6 25.6s-11.494 25.6-25.6 25.6zM965.094 880.197c-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" />
<glyph unicode="&#xe925;" glyph-name="type-DateTime" d="M947.2 836.267h-128v25.6c0 14.131-11.469 25.6-25.6 25.6s-25.6-11.469-25.6-25.6v-25.6h-512v25.6c0 14.131-11.52 25.6-25.6 25.6s-25.6-11.469-25.6-25.6v-25.6h-128c-42.342 0-76.8-34.458-76.8-76.8v-716.8c0-42.342 34.458-76.8 76.8-76.8h870.4c42.342 0 76.8 34.458 76.8 76.8v716.8c0 42.342-34.458 76.8-76.8 76.8zM972.8 42.667c0-14.131-11.469-25.6-25.6-25.6h-870.4c-14.080 0-25.6 11.469-25.6 25.6v537.6h921.6v-537.6zM972.8 631.467h-921.6v128c0 14.080 11.52 25.6 25.6 25.6h128v-76.8c0-14.080 11.52-25.6 25.6-25.6s25.6 11.52 25.6 25.6v76.8h512v-76.8c0-14.080 11.469-25.6 25.6-25.6s25.6 11.52 25.6 25.6v76.8h128c14.131 0 25.6-11.52 25.6-25.6v-128zM332.8 426.667h51.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 426.667h51.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 426.667h51.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 426.667h51.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 324.267h51.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 324.267h51.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 324.267h51.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 324.267h51.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 324.267h51.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 221.867h51.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 221.867h51.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 221.867h51.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 221.867h51.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 221.867h51.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 119.467h51.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 119.467h51.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 119.467h51.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 119.467h51.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 119.467h51.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" />
<glyph unicode="&#xe926;" glyph-name="type-Number" d="M256 273.067h-76.8v332.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.2v-307.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 631.467h-204.8c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-179.2c-14.131 0-25.6-11.469-25.6-25.6v-179.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.2v128h179.2c14.131 0 25.6 11.469 25.6 25.6v179.2c0 14.131-11.469 25.6-25.6 25.6zM972.8 631.467h-204.8c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-179.2c-14.131 0-25.6-11.469-25.6-25.6s11.469-25.6 25.6-25.6h179.2v-128h-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.6v358.4c0 14.131-11.469 25.6-25.6 25.6z" />
<glyph unicode="&#xe927;" glyph-name="type-String" d="M870.4 17.067h-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 121.515c13.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 796.894l136.704-319.027h-273.408l136.704 319.027z" />
<glyph unicode="&#xe928;" glyph-name="user" d="M955.221 90.667c0 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 650.667c0-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" />
<glyph unicode="&#xe929;" glyph-name="caret-right" horiz-adv-x="329" d="M329.143 438.857c0-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.571v512c0 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" />
<glyph unicode="&#xe92a;" glyph-name="caret-left" horiz-adv-x="402" d="M365.714 694.857v-512c0-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" />
<glyph unicode="&#xe92b;" glyph-name="caret-up" horiz-adv-x="585" d="M585.143 256c0-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" />
@ -72,7 +72,7 @@
<glyph unicode="&#xe93e;" glyph-name="download" d="M640 853.334q78 0 149.167-30.5t122.5-81.833 81.833-122.5 30.5-149.167q0-85-35-160.667t-96.667-129.167-140-77.5l21 20.667q18 18.333 28 42.667 9.333 22.667 9.333 49.333 0 6.667-0.333 9.333 59.333 41.333 93.833 105.833t34.5 139.5q0 60.667-23.667 116t-63.667 95.333-95.333 63.667-116 23.667q-55.333 0-106.5-19.833t-90-53.833-65-81.333-33.833-101h-88.667q-70.667 0-120.667-50t-50-120.667q0-38.667 15.167-71.667t39.833-54.167 54.833-33 60.833-11.833h50q11.667-29.333 30-48l37.667-37.333h-117.667q-69.667 0-128.5 34.333t-93.167 93.167-34.333 128.5 34.333 128.5 93.167 93.167 128.5 34.333h22q26.333 74.333 79.333 132.167t126.833 90.833 155.833 33zM554.667 512q17.667 0 30.167-12.5t12.5-30.167v-281l55 55.333q12.333 12.333 30.333 12.333 18.333 0 30.5-12.167t12.167-30.5q0-18-12.333-30.333l-128-128q-12.333-12.333-30.333-12.333t-30.333 12.333l-128 128q-12.333 13-12.333 30.333 0 17.667 12.5 30.167t30.167 12.5q18 0 30.333-12.333l55-55.333v281q0 17.667 12.5 30.167t30.167 12.5z" />
<glyph unicode="&#xe93f;" glyph-name="document-unpublish" d="M358.4 848.457c-28.314 0-51.2-22.886-51.2-51.2v-153.6h51.2v153.6h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-358.4v-51.2h358.4c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-292.2zM716.8 761.057l117.4-117.4h-117.4zM332.8 490.057l-230.4-256v-51.2h102.4v-153.6h256v153.6h102.4v51.2zM332.8 413.557l161.5-179.5h-84.7v-153.6h-153.6v153.6h-84.7zM102.4 593.325h460.8v-52.068h-460.8v52.068z" />
<glyph unicode="&#xe940;" glyph-name="microsoft" d="M0.35 448l-0.35 312.074 384 52.144v-364.218zM448 821.518l511.872 74.482v-448h-511.872zM959.998 384l-0.126-448-511.872 72.016v375.984zM384 16.164l-383.688 52.594-0.020 315.242h383.708z" />
<glyph unicode="&#xe941;" glyph-name="github" d="M512 960c-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" />
<glyph unicode="&#xe941;" glyph-name="github" d="M512 938.667c-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" />
<glyph unicode="&#xe942;" glyph-name="checkmark" d="M927.936 687.008l-68.288 68.288c-12.608 12.576-32.96 12.576-45.536 0l-409.44-409.44-194.752 196.16c-12.576 12.576-32.928 12.576-45.536 0l-68.288-68.288c-12.576-12.608-12.576-32.96 0-45.536l285.568-287.488c12.576-12.576 32.96-12.576 45.536 0l500.736 500.768c12.576 12.544 12.576 32.96 0 45.536z" />
<glyph unicode="&#xe943;" glyph-name="elapsed" d="M512.002 766.788v65.212h128v64c0 35.346-28.654 64-64.002 64h-191.998c-35.346 0-64-28.654-64-64v-64h128v-65.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 125.726c-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" />
<glyph unicode="&#xe944;" glyph-name="timeout" d="M512 832c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448zM512 24c-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 672.826c16.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 885.404c-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.578zM512 384v256h-64v-320h256v64z" />
@ -81,14 +81,14 @@
<glyph unicode="&#xe947;" glyph-name="rules" d="M217.6-41.143c-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 240v147.2c0 19.2 12.8 32 32 32s32-12.8 32-32v-172.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.6zM774.4-50.743c0 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.6v3.2c3.2 16 19.2 28.8 38.4 25.6 16-3.2 28.8-19.2 25.6-38.4v-3.2c-22.4-140.8-140.8-204.8-246.4-204.8zM787.2 272.457c-19.2 0-32 12.8-32 32v176c0 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-240v-150.4c0-16-16-32-32-32zM41.6 704.457c-3.2 0-3.2 0-6.4 0-16 3.2-28.8 19.2-25.6 35.2v3.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.6v-3.2c-3.2-16-16-25.6-32-25.6zM256 563.657c-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 758.857c-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.2zM771.2 77.257c-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 272.457c-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 16zM745.6 563.657c-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 758.857c-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.4zM259.2 77.257c-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 272.457c-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" />
<glyph unicode="&#xe948;" glyph-name="assets" d="M800-73.143h-576c-124.8 0-224 99.2-224 224v576c0 124.8 99.2 224 224 224h576c124.8 0 224-99.2 224-224v-576c0-124.8-99.2-224-224-224zM224 886.857c-89.6 0-160-70.4-160-160v-576c0-89.6 70.4-160 160-160h576c89.6 0 160 70.4 160 160v576c0 89.6-70.4 160-160 160h-576zM771.2 90.057h-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 154.057h371.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-272zM332.8 448.457c-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 666.057c-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" />
<glyph unicode="&#xe949;" glyph-name="document-lock" d="M358.4 848.457c-28.314 0-51.2-22.886-51.2-51.2v-204.8h51.2v204.8h307.2v-153.6c0-28.314 22.886-51.2 51.2-51.2h153.6v-512h-307.2v-51.2h307.2c28.314 0 51.2 22.886 51.2 51.2v548.2l-219.8 219.8h-292.2zM716.8 761.057l117.4-117.4h-117.4zM153.6 310.857v-281.6h358.4v281.6zM179.2 310.857v76.8c0 84.48 69.12 153.6 153.6 153.6s153.6-69.12 153.6-153.6v-76.8h-51.2v76.8c0 56.32-46.080 102.4-102.4 102.4s-102.4-46.080-102.4-102.4v-76.8z" />
<glyph unicode="&#xe94a;" glyph-name="type-Tags" d="M295.954 137.249h-94.705c-47.353 0-88.786 41.434-88.786 88.786v491.283c0 47.353 41.434 88.786 88.786 88.786h94.705v59.191h-94.705c-82.867 0-147.977-65.11-147.977-147.977v-491.283c0-82.867 65.11-147.977 147.977-147.977h94.705v59.191zM970.728 486.474c-82.867 171.653-201.249 378.821-272.277 378.821h-112.462v-59.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.462v-59.191h112.462c71.029 0 183.491 207.168 272.277 384.74l5.919 11.838-5.919 17.757zM266.358 622.659v-260.462h59.191v260.462zM479.422 622.659v-260.462h59.191v260.462z" />
<glyph unicode="&#xe94a;" glyph-name="type-Tags" d="M295.954 115.916h-94.705c-47.353 0-88.786 41.434-88.786 88.786v491.283c0 47.353 41.434 88.786 88.786 88.786h94.705v59.191h-94.705c-82.867 0-147.977-65.11-147.977-147.977v-491.283c0-82.867 65.11-147.977 147.977-147.977h94.705v59.191zM970.728 465.141c-82.867 171.653-201.249 378.821-272.277 378.821h-112.462v-59.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.462v-59.191h112.462c71.029 0 183.491 207.168 272.277 384.74l5.919 11.838-5.919 17.757zM266.358 601.326v-260.462h59.191v260.462zM479.422 601.326v-260.462h59.191v260.462z" />
<glyph unicode="&#xe94b;" glyph-name="orleans" d="M512 924.477l-424.96-242.8v-485.64l424.96-242.8 424.96 242.8v485.64l-424.96 242.8zM512 715.337l245.76-138.24v-276.48l-245.76-138.24-245.76 138.24v276.48l245.76 138.24z" />
<glyph unicode="&#xe94c;" glyph-name="prerender" d="M66.337 384.509l276.668 171.531v57.177l-331.627-207.614v-42.189l331.627-207.614v57.177zM957.663 384.51l-276.668 171.531v57.177l331.627-207.614v-42.189l-331.627-207.614v57.177zM583.295 745.817l-200.825-621.623 53.007-17.527 200.837 621.623z" />
<glyph unicode="&#xe94c;" glyph-name="prerender" d="M66.337 363.176l276.668 171.531v57.177l-331.627-207.614v-42.189l331.627-207.614v57.177zM957.663 363.177l-276.668 171.531v57.177l331.627-207.614v-42.189l-331.627-207.614v57.177zM583.295 724.484l-200.825-621.623 53.007-17.527 200.837 621.623z" />
<glyph unicode="&#xe94d;" glyph-name="control-Color" d="M832 544h-320v-64h-64v96h384v192h-32v-96c0-17.664-14.336-32-32-32h-576c-17.696 0-32 14.336-32 32v128c0 17.696 14.304 32 32 32h576c17.664 0 32-14.304 32-32h64v-256h-32zM736 800h-512v-32h512v32zM544 128c0-35.328-28.672-64-64-64s-64 28.672-64 64v320h128v-320zM480 173.344c-17.696 0-32-14.336-32-32 0-17.696 14.304-32 32-32 17.664 0 32 14.304 32 32 0 17.664-14.336 32-32 32z" />
<glyph unicode="&#xe94e;" glyph-name="list" d="M737.28 512h-296.96c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2h296.96c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2zM839.68 256h-399.36c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2h399.36c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2zM440.32 665.6h399.36c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2h-399.36c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2zM276.48 512h-92.16c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2h92.16c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2zM276.48 256h-92.16c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2h92.16c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2zM276.48 768h-92.16c-28.262 0-30.72-22.886-30.72-51.2s2.458-51.2 30.72-51.2h92.16c28.262 0 30.72 22.886 30.72 51.2s-2.458 51.2-30.72 51.2z" />
<glyph unicode="&#xe94f;" glyph-name="control-Slug" d="M512 960c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h128v-870.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-128v870.4h128c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6h-307.2zM51.2 755.2c-28.16 0-51.2-23.040-51.2-51.2v-460.8c0-28.16 23.040-51.2 51.2-51.2h537.6v51.2h-512c-15.36 0-25.6 10.24-25.6 25.6v409.6c0 15.36 10.24 25.6 25.6 25.6h512v51.2h-537.6zM742.4 755.2v-51.2h204.8c15.36 0 25.6-10.24 25.6-25.6v-409.6c0-15.36-10.24-25.6-25.6-25.6h-204.8v-51.2h230.4c28.16 0 51.2 23.040 51.2 51.2v460.8c0 28.16-23.040 51.2-51.2 51.2h-230.4zM386.56 353.28c0-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.12v38.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.16v-181.76zM345.6 458.24h-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.24v99.84z" />
<glyph unicode="&#xe94f;" glyph-name="control-Slug" d="M512 938.667c-15.36 0-25.6-10.24-25.6-25.6s10.24-25.6 25.6-25.6h128v-870.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-128v870.4h128c15.36 0 25.6 10.24 25.6 25.6s-10.24 25.6-25.6 25.6h-307.2zM51.2 733.867c-28.16 0-51.2-23.040-51.2-51.2v-460.8c0-28.16 23.040-51.2 51.2-51.2h537.6v51.2h-512c-15.36 0-25.6 10.24-25.6 25.6v409.6c0 15.36 10.24 25.6 25.6 25.6h512v51.2h-537.6zM742.4 733.867v-51.2h204.8c15.36 0 25.6-10.24 25.6-25.6v-409.6c0-15.36-10.24-25.6-25.6-25.6h-204.8v-51.2h230.4c28.16 0 51.2 23.040 51.2 51.2v460.8c0 28.16-23.040 51.2-51.2 51.2h-230.4zM386.56 331.947c0-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.12v38.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.16v-181.76zM345.6 436.907h-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.24v99.84z" />
<glyph unicode="&#xe950;" glyph-name="clock" d="M658.744 210.744l-210.744 210.746v282.51h128v-229.49l173.256-173.254zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384z" />
<glyph unicode="&#xe951;" glyph-name="circle" d="M1024 448c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 282.77 229.23 512 512 512s512-229.23 512-512z" />
<glyph unicode="&#xe951;" glyph-name="circle" d="M1024 426.667c0-282.77-229.23-512-512-512s-512 229.23-512 512c0 282.77 229.23 512 512 512s512-229.23 512-512z" />
<glyph unicode="&#xe952;" glyph-name="grid1" d="M409.6 768h-153.6c-28.314 0-51.2-22.886-51.2-51.2v-153.6c0-28.262 22.886-51.2 51.2-51.2h153.6c28.314 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.886 51.2-51.2 51.2zM768 768h-153.6c-28.314 0-51.2-22.886-51.2-51.2v-153.6c0-28.262 22.886-51.2 51.2-51.2h153.6c28.314 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.886 51.2-51.2 51.2zM409.6 409.6h-153.6c-28.314 0-51.2-22.886-51.2-51.2v-153.6c0-28.262 22.886-51.2 51.2-51.2h153.6c28.314 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.886 51.2-51.2 51.2zM768 409.6h-153.6c-28.314 0-51.2-22.886-51.2-51.2v-153.6c0-28.262 22.886-51.2 51.2-51.2h153.6c28.314 0 51.2 22.938 51.2 51.2v153.6c0 28.262-22.886 51.2-51.2 51.2z" />
<glyph unicode="&#xe953;" glyph-name="spinner" d="M192 448c0 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 448c0-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 761.592c91.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.156v-194.432zM233.55 605.768c44.906 79.084 122.516 137.164 214.45 155.826v194.43c-177.188-22.096-326.23-134.736-399.426-290.154l184.976-60.102zM644.556 156.672c-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" />
<glyph unicode="&#xe954;" glyph-name="hour-glass" d="M728.992 448c137.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 0c0 186.912 80.162 345.414 224 397.708v100.586c-143.838 52.29-224 210.792-224 397.706v0h704c0-186.914-80.162-345.416-224-397.706v-100.586c143.838-52.294 224-210.796 224-397.708h-704zM619.626 290.406c-71.654 40.644-75.608 93.368-75.626 125.366v64.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.366v-64.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" />
@ -120,10 +120,11 @@
<glyph unicode="&#xe96e;" glyph-name="arrow_back" d="M854 468.667v-84h-520l238-240-60-60-342 342 342 342 60-60-238-240h520z" />
<glyph unicode="&#xe96f;" glyph-name="translate" d="M678 212.667h138l-70 186zM790 512.667l192-512h-86l-48 128h-202l-48-128h-86l192 512h86zM550 296.667l-34-88-132 132-214-212-60 60 218 214c-54 60-96 124-128 194h86c26-50 58-98 98-142 62 68 108 146 136 228h-478v86h300v84h84v-84h300v-86h-126c-32-100-84-196-158-278l-2-2z" />
<glyph unicode="&#xe970;" glyph-name="upload" d="M448 384h128v256h192l-256 256-256-256h192zM640 528v-98.712l293.066-109.288-421.066-157.018-421.066 157.018 293.066 109.288v98.712l-384-144v-256l512-192 512 192v256z" />
<glyph unicode="&#xe971;" glyph-name="upload-4" d="M853.333 320v-170.667c0-5.845-1.152-11.349-3.2-16.299-2.133-5.205-5.333-9.899-9.301-13.867s-8.661-7.125-13.867-9.301c-4.949-2.048-10.453-3.2-16.299-3.2h-597.333c-5.845 0-11.349 1.152-16.299 3.2-5.205 2.133-9.899 5.333-13.867 9.301s-7.125 8.661-9.301 13.867c-2.048 4.949-3.2 10.453-3.2 16.299v170.667c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-170.667c0-17.28 3.456-33.835 9.728-48.981 6.485-15.701 16-29.781 27.776-41.557s25.856-21.291 41.557-27.776c15.104-6.229 31.659-9.685 48.939-9.685h597.333c17.28 0 33.835 3.456 48.981 9.728 15.701 6.485 29.781 16 41.557 27.776s21.291 25.856 27.776 41.557c6.229 15.104 9.685 31.659 9.685 48.939v170.667c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667zM469.333 729.003v-409.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v409.003l140.501-140.501c16.683-16.683 43.691-16.683 60.331 0s16.683 43.691 0 60.331l-213.333 213.333c-0.043 0.043-0.128 0.085-0.171 0.171-4.053 4.011-8.704 7.040-13.653 9.088-10.453 4.309-22.229 4.309-32.683 0-4.949-2.048-9.6-5.077-13.653-9.088-0.043-0.043-0.128-0.085-0.171-0.171l-213.333-213.333c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0z" />
<glyph unicode="&#xe971;" glyph-name="upload-4" d="M853.333 298.667v-170.667c0-5.845-1.152-11.349-3.2-16.299-2.133-5.205-5.333-9.899-9.301-13.867s-8.661-7.125-13.867-9.301c-4.949-2.048-10.453-3.2-16.299-3.2h-597.333c-5.845 0-11.349 1.152-16.299 3.2-5.205 2.133-9.899 5.333-13.867 9.301s-7.125 8.661-9.301 13.867c-2.048 4.949-3.2 10.453-3.2 16.299v170.667c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667v-170.667c0-17.28 3.456-33.835 9.728-48.981 6.485-15.701 16-29.781 27.776-41.557s25.856-21.291 41.557-27.776c15.104-6.229 31.659-9.685 48.939-9.685h597.333c17.28 0 33.835 3.456 48.981 9.728 15.701 6.485 29.781 16 41.557 27.776s21.291 25.856 27.776 41.557c6.229 15.104 9.685 31.659 9.685 48.939v170.667c0 23.552-19.115 42.667-42.667 42.667s-42.667-19.115-42.667-42.667zM469.333 707.67v-409.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v409.003l140.501-140.501c16.683-16.683 43.691-16.683 60.331 0s16.683 43.691 0 60.331l-213.333 213.333c-0.043 0.043-0.128 0.085-0.171 0.171-4.053 4.011-8.704 7.040-13.653 9.088-10.453 4.309-22.229 4.309-32.683 0-4.949-2.048-9.6-5.077-13.653-9.088-0.043-0.043-0.128-0.085-0.171-0.171l-213.333-213.333c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0z" />
<glyph unicode="&#xe972;" glyph-name="upload-2" d="M214 170.667h596v-86h-596v86zM384 256.667v256h-170l298 298 298-298h-170v-256h-256z" />
<glyph unicode="&#xe973;" glyph-name="upload-3" d="M469.333 345.003v-281.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v281.003l97.835-97.835c16.683-16.683 43.691-16.683 60.331 0s16.683 43.691 0 60.331l-170.667 170.667c-0.085 0.085-0.171 0.171-0.256 0.256-4.053 3.968-8.661 6.955-13.568 9.003-5.12 2.133-10.624 3.2-16.085 3.243-0.171 0-0.341 0-0.469 0-5.461-0.043-10.965-1.109-16.085-3.243-4.949-2.048-9.557-5.035-13.568-9.003-0.085-0.085-0.171-0.171-0.256-0.256l-170.667-170.667c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0zM890.411 137.899c30.379 16.555 56.149 38.443 76.672 63.915 21.333 26.411 36.949 56.619 46.379 88.576s12.629 65.835 9.003 99.584c-3.456 32.512-13.269 64.896-29.824 95.232-14.208 26.069-32.384 48.768-53.376 67.669-21.717 19.541-46.421 34.944-72.875 45.952-30.891 12.8-64.171 19.584-98.048 19.84h-22.528c-13.312 37.717-32.085 72.235-55.168 102.912-30.635 40.661-68.821 74.453-111.915 99.84s-91.179 42.411-141.568 49.536c-48.597 6.784-99.243 4.395-149.504-8.619s-95.744-35.413-134.912-64.939c-40.661-30.635-74.453-68.821-99.84-111.915s-42.411-91.179-49.493-141.568c-6.827-48.555-4.395-99.2 8.576-149.461 15.872-61.312 45.781-115.627 84.267-158.421 15.744-17.536 42.752-18.944 60.245-3.2s18.944 42.752 3.2 60.245c-29.355 32.64-52.693 74.667-65.109 122.752-10.155 39.253-11.989 78.592-6.699 116.224 5.504 39.125 18.773 76.501 38.571 110.123s46.080 63.317 77.653 87.083c30.379 22.869 65.664 40.32 104.917 50.475s78.592 11.989 116.224 6.699c39.125-5.504 76.544-18.731 110.123-38.528s63.317-46.080 87.083-77.653c22.869-30.379 40.32-65.664 50.475-104.917 4.907-18.56 21.547-32 41.301-32h53.461c22.869-0.171 45.269-4.736 65.92-13.312 17.707-7.339 34.133-17.621 48.512-30.592 13.909-12.501 25.984-27.605 35.541-45.099 11.093-20.352 17.579-41.899 19.883-63.488 2.389-22.443 0.256-45.013-6.016-66.432s-16.725-41.515-30.933-59.093c-13.611-16.896-30.763-31.445-51.115-42.581-20.693-11.264-28.331-37.205-17.024-57.899s37.205-28.331 57.899-17.024z" />
<glyph unicode="&#xe973;" glyph-name="upload-3" d="M469.333 323.67v-281.003c0-23.552 19.115-42.667 42.667-42.667s42.667 19.115 42.667 42.667v281.003l97.835-97.835c16.683-16.683 43.691-16.683 60.331 0s16.683 43.691 0 60.331l-170.667 170.667c-0.085 0.085-0.171 0.171-0.256 0.256-4.053 3.968-8.661 6.955-13.568 9.003-5.12 2.133-10.624 3.2-16.085 3.243-0.171 0-0.341 0-0.469 0-5.461-0.043-10.965-1.109-16.085-3.243-4.949-2.048-9.557-5.035-13.568-9.003-0.085-0.085-0.171-0.171-0.256-0.256l-170.667-170.667c-16.683-16.683-16.683-43.691 0-60.331s43.691-16.683 60.331 0zM890.411 116.566c30.379 16.555 56.149 38.443 76.672 63.915 21.333 26.411 36.949 56.619 46.379 88.576s12.629 65.835 9.003 99.584c-3.456 32.512-13.269 64.896-29.824 95.232-14.208 26.069-32.384 48.768-53.376 67.669-21.717 19.541-46.421 34.944-72.875 45.952-30.891 12.8-64.171 19.584-98.048 19.84h-22.528c-13.312 37.717-32.085 72.235-55.168 102.912-30.635 40.661-68.821 74.453-111.915 99.84s-91.179 42.411-141.568 49.536c-48.597 6.784-99.243 4.395-149.504-8.619s-95.744-35.413-134.912-64.939c-40.661-30.635-74.453-68.821-99.84-111.915s-42.411-91.179-49.493-141.568c-6.827-48.555-4.395-99.2 8.576-149.461 15.872-61.312 45.781-115.627 84.267-158.421 15.744-17.536 42.752-18.944 60.245-3.2s18.944 42.752 3.2 60.245c-29.355 32.64-52.693 74.667-65.109 122.752-10.155 39.253-11.989 78.592-6.699 116.224 5.504 39.125 18.773 76.501 38.571 110.123s46.080 63.317 77.653 87.083c30.379 22.869 65.664 40.32 104.917 50.475s78.592 11.989 116.224 6.699c39.125-5.504 76.544-18.731 110.123-38.528s63.317-46.080 87.083-77.653c22.869-30.379 40.32-65.664 50.475-104.917 4.907-18.56 21.547-32 41.301-32h53.461c22.869-0.171 45.269-4.736 65.92-13.312 17.707-7.339 34.133-17.621 48.512-30.592 13.909-12.501 25.984-27.605 35.541-45.099 11.093-20.352 17.579-41.899 19.883-63.488 2.389-22.443 0.256-45.013-6.016-66.432s-16.725-41.515-30.933-59.093c-13.611-16.896-30.763-31.445-51.115-42.581-20.693-11.264-28.331-37.205-17.024-57.899s37.205-28.331 57.899-17.024z" />
<glyph unicode="&#xe974;" glyph-name="info-outline" d="M470 554.667v86h84v-86h-84zM512 84.667c188 0 342 154 342 342s-154 342-342 342-342-154-342-342 154-342 342-342zM512 852.667c236 0 426-190 426-426s-190-426-426-426-426 190-426 426 190 426 426 426zM470 212.667v256h84v-256h-84z" />
<glyph unicode="&#xe975;" glyph-name="type-UI" d="M512 256h-341.333c-5.845 0-11.349 1.152-16.299 3.2-5.205 2.133-9.899 5.333-13.867 9.301s-7.125 8.661-9.301 13.867c-2.048 4.949-3.2 10.453-3.2 16.299v426.667c0 5.845 1.152 11.349 3.2 16.299 2.133 5.205 5.333 9.899 9.301 13.867s8.661 7.125 13.867 9.301c4.949 2.048 10.453 3.2 16.299 3.2h682.667c5.845 0 11.349-1.152 16.299-3.2 5.205-2.133 9.899-5.333 13.867-9.301s7.125-8.661 9.301-13.867c2.048-4.949 3.2-10.453 3.2-16.299v-426.667c0-5.845-1.152-11.349-3.2-16.299-2.133-5.205-5.333-9.899-9.301-13.867s-8.661-7.125-13.867-9.301c-4.949-2.048-10.453-3.2-16.299-3.2zM469.333 170.667v-85.333h-128c-23.552 0-42.667-19.115-42.667-42.667s19.115-42.667 42.667-42.667h341.333c23.552 0 42.667 19.115 42.667 42.667s-19.115 42.667-42.667 42.667h-128v85.333h298.667c17.28 0 33.835 3.456 48.981 9.728 15.701 6.485 29.781 16 41.557 27.776s21.291 25.856 27.776 41.557c6.229 15.104 9.685 31.659 9.685 48.939v426.667c0 17.28-3.456 33.835-9.728 48.981-6.485 15.701-16 29.781-27.776 41.557s-25.856 21.291-41.557 27.776c-15.104 6.229-31.659 9.685-48.939 9.685h-682.667c-17.28 0-33.835-3.456-48.981-9.728-15.659-6.485-29.739-16-41.515-27.776s-21.291-25.856-27.776-41.515c-6.272-15.147-9.728-31.701-9.728-48.981v-426.667c0-17.28 3.456-33.835 9.728-48.981 6.485-15.701 16-29.781 27.776-41.557s25.856-21.291 41.557-27.776c15.104-6.229 31.659-9.685 48.939-9.685z" />
<glyph unicode="&#xe9ca;" glyph-name="earth" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512-0.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.26v96c0 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-32v-192c0-12.122 6.848-23.202 17.69-28.622l110.31-55.156v-187.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.628v77.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" />
<glyph unicode="&#xf00a;" glyph-name="grid" d="M292.571 237.714v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM292.571 530.286v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM658.286 237.714v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM292.571 822.857v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM658.286 530.286v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM1024 237.714v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM658.286 822.857v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM1024 530.286v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857zM1024 822.857v-109.714c0-30.286-24.571-54.857-54.857-54.857h-182.857c-30.286 0-54.857 24.571-54.857 54.857v109.714c0 30.286 24.571 54.857 54.857 54.857h182.857c30.286 0 54.857-24.571 54.857-54.857z" />
<glyph unicode="&#xf0c9;" glyph-name="list1" horiz-adv-x="878" d="M877.714 182.857v-73.143c0-20-16.571-36.571-36.571-36.571h-804.571c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h804.571c20 0 36.571-16.571 36.571-36.571zM877.714 475.428v-73.143c0-20-16.571-36.571-36.571-36.571h-804.571c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h804.571c20 0 36.571-16.571 36.571-36.571zM877.714 768v-73.143c0-20-16.571-36.571-36.571-36.571h-804.571c-20 0-36.571 16.571-36.571 36.571v73.143c0 20 16.571 36.571 36.571 36.571h804.571c20 0 36.571-16.571 36.571-36.571z" />

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 94 KiB

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.ttf

Binary file not shown.

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.woff

Binary file not shown.

2
src/Squidex/app/theme/icomoon/selection.json

File diff suppressed because one or more lines are too long

245
src/Squidex/app/theme/icomoon/style.css

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?f0elb7');
src: url('fonts/icomoon.eot?f0elb7#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?f0elb7') format('truetype'),
url('fonts/icomoon.woff?f0elb7') format('woff'),
url('fonts/icomoon.svg?f0elb7#icomoon') format('svg');
src: url('fonts/icomoon.eot?wt9idh');
src: url('fonts/icomoon.eot?wt9idh#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?wt9idh') format('truetype'),
url('fonts/icomoon.woff?wt9idh') format('woff'),
url('fonts/icomoon.svg?wt9idh#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
@ -24,122 +24,8 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-info-outline:before {
content: "\e974";
}
.icon-upload-2:before {
content: "\e972";
}
.icon-translate:before {
content: "\e96f";
}
.icon-arrow_back:before {
content: "\e96e";
}
.icon-external-link:before {
content: "\e96d";
}
.icon-minus-square:before {
content: "\e969";
}
.icon-plus-square:before {
content: "\e968";
}
.icon-drag2:before {
content: "\e961";
}
.icon-comments:before {
content: "\e95f";
}
.icon-backup:before {
content: "\e95b";
}
.icon-support:before {
content: "\e95a";
}
.icon-control-RichText:before {
content: "\e939";
}
.icon-download:before {
content: "\e93e";
}
.icon-upload:before {
content: "\e970";
}
.icon-caret-bottom:before {
content: "\e96b";
}
.icon-caret-top:before {
content: "\e96c";
}
.icon-show:before {
content: "\e964";
}
.icon-show-all:before {
content: "\e965";
}
.icon-hide:before {
content: "\e966";
}
.icon-hide-all:before {
content: "\e967";
}
.icon-spinner2:before {
content: "\e959";
}
.icon-star-full:before {
content: "\e95d";
}
.icon-star-empty:before {
content: "\e95e";
}
.icon-twitter:before {
content: "\e95c";
}
.icon-hour-glass:before {
content: "\e954";
}
.icon-spinner:before {
content: "\e953";
}
.icon-clock:before {
content: "\e950";
}
.icon-bin2:before {
content: "\e902";
}
.icon-earth:before {
content: "\e9ca";
}
.icon-elapsed:before {
content: "\e943";
}
.icon-google:before {
content: "\e93b";
}
.icon-lock:before {
content: "\e934";
}
.icon-microsoft:before {
content: "\e940";
}
.icon-pause:before {
content: "\e92f";
}
.icon-play:before {
content: "\e930";
}
.icon-reset:before {
content: "\e92e";
}
.icon-settings2:before {
content: "\e92d";
}
.icon-timeout:before {
content: "\e944";
}
.icon-unlocked:before {
content: "\e933";
.icon-type-UI:before {
content: "\e975";
}
.icon-prerender:before {
content: "\e94c";
@ -303,6 +189,123 @@
.icon-upload-4:before {
content: "\e971";
}
.icon-info-outline:before {
content: "\e974";
}
.icon-upload-2:before {
content: "\e972";
}
.icon-translate:before {
content: "\e96f";
}
.icon-arrow_back:before {
content: "\e96e";
}
.icon-external-link:before {
content: "\e96d";
}
.icon-minus-square:before {
content: "\e969";
}
.icon-plus-square:before {
content: "\e968";
}
.icon-drag2:before {
content: "\e961";
}
.icon-comments:before {
content: "\e95f";
}
.icon-backup:before {
content: "\e95b";
}
.icon-support:before {
content: "\e95a";
}
.icon-control-RichText:before {
content: "\e939";
}
.icon-download:before {
content: "\e93e";
}
.icon-upload:before {
content: "\e970";
}
.icon-caret-bottom:before {
content: "\e96b";
}
.icon-caret-top:before {
content: "\e96c";
}
.icon-show:before {
content: "\e964";
}
.icon-show-all:before {
content: "\e965";
}
.icon-hide:before {
content: "\e966";
}
.icon-hide-all:before {
content: "\e967";
}
.icon-spinner2:before {
content: "\e959";
}
.icon-star-full:before {
content: "\e95d";
}
.icon-star-empty:before {
content: "\e95e";
}
.icon-twitter:before {
content: "\e95c";
}
.icon-hour-glass:before {
content: "\e954";
}
.icon-spinner:before {
content: "\e953";
}
.icon-clock:before {
content: "\e950";
}
.icon-bin2:before {
content: "\e902";
}
.icon-earth:before {
content: "\e9ca";
}
.icon-elapsed:before {
content: "\e943";
}
.icon-google:before {
content: "\e93b";
}
.icon-lock:before {
content: "\e934";
}
.icon-microsoft:before {
content: "\e940";
}
.icon-pause:before {
content: "\e92f";
}
.icon-play:before {
content: "\e930";
}
.icon-reset:before {
content: "\e92e";
}
.icon-settings2:before {
content: "\e92d";
}
.icon-timeout:before {
content: "\e944";
}
.icon-unlocked:before {
content: "\e933";
}
.icon-control-Color:before {
content: "\e94d";
}

55
tests/Squidex.Domain.Apps.Core.Tests/Operations/GenerateJsonSchema/JsonSchemaTests.cs

@ -5,6 +5,7 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using NJsonSchema;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Core.GenerateJsonSchema;
@ -24,8 +25,32 @@ namespace Squidex.Domain.Apps.Core.Operations.GenerateJsonSchema
var languagesConfig = LanguagesConfig.Build(Language.DE, Language.EN);
var jsonSchema = schema.BuildJsonSchema(languagesConfig.ToResolver(), (n, s) => new JsonSchema4 { Reference = s });
var jsonProperties = AllPropertyNames(jsonSchema);
Assert.NotNull(jsonSchema);
void CheckField(IField field)
{
if (!field.IsForApi())
{
Assert.DoesNotContain(field.Name, jsonProperties);
}
else
{
Assert.Contains(field.Name, jsonProperties);
}
if (field is IArrayField array)
{
foreach (var nested in array.Fields)
{
CheckField(nested);
}
}
}
foreach (var field in schema.Fields)
{
CheckField(field);
}
}
[Fact]
@ -37,5 +62,33 @@ namespace Squidex.Domain.Apps.Core.Operations.GenerateJsonSchema
Assert.NotNull(new ContentSchemaBuilder().CreateContentSchema(schema, jsonSchema));
}
private static HashSet<string> AllPropertyNames(JsonSchema4 schema)
{
var result = new HashSet<string>();
void AddProperties(JsonSchema4 current)
{
if (current != null)
{
if (current.Properties != null)
{
foreach (var property in current.Properties)
{
result.Add(property.Key);
AddProperties(property.Value);
}
}
AddProperties(current.Item);
AddProperties(current.Reference);
}
}
AddProperties(schema);
return result;
}
}
}

18
tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ContentValidationTests.cs

@ -122,6 +122,24 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent
});
}
[Fact]
public async Task Should_add_error_if_required_data_string_field_is_not_in_bag()
{
schema = schema.AddString(1, "my-field", Partitioning.Invariant,
new StringFieldProperties { IsRequired = true });
var data =
new NamedContentData();
await data.ValidateAsync(context, schema, languagesConfig.ToResolver(), errors);
errors.Should().BeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Field is required.", "my-field")
});
}
[Fact]
public async Task Should_add_error_if_data_contains_invalid_language()
{

128
tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/UIFieldTests.cs

@ -0,0 +1,128 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.ValidateContent;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Json.Objects;
using Xunit;
namespace Squidex.Domain.Apps.Core.Operations.ValidateContent
{
public class UIFieldTests
{
private readonly List<string> errors = new List<string>();
[Fact]
public void Should_instantiate_field()
{
var sut = Field(new UIFieldProperties());
Assert.Equal("my-ui", sut.Name);
}
[Fact]
public async Task Should_not_add_error_if_value_is_undefined()
{
var sut = Field(new UIFieldProperties());
await sut.ValidateAsync(Undefined.Value, errors, ValidationTestExtensions.ValidContext);
Assert.Empty(errors);
}
[Fact]
public async Task Should_add_error_if_value_is_json_null()
{
var sut = Field(new UIFieldProperties());
await sut.ValidateAsync(JsonValue.Null, errors);
errors.Should().BeEquivalentTo(
new[] { "Value must not be defined." });
}
[Fact]
public async Task Should_add_error_if_value_is_valid()
{
var sut = Field(new UIFieldProperties { IsRequired = true });
await sut.ValidateAsync(JsonValue.True, errors);
errors.Should().BeEquivalentTo(
new[] { "Value must not be defined." });
}
[Fact]
public async Task Should_add_error_if_field_object_is_defined()
{
var schema =
new Schema("my-schema")
.AddUI(1, "my-ui1", Partitioning.Invariant)
.AddUI(2, "my-ui2", Partitioning.Invariant);
var data =
new NamedContentData()
.AddField("my-ui1", new ContentFieldData())
.AddField("my-ui2", new ContentFieldData()
.AddValue("iv", null));
var validationContext = ValidationTestExtensions.ValidContext;
var validator = new ContentValidator(schema, new PartitionResolver(x => InvariantPartitioning.Instance), validationContext);
await validator.ValidateAsync(data);
validator.Errors.Should().BeEquivalentTo(
new[]
{
new ValidationError("Value must not be defined.", "my-ui1"),
new ValidationError("Value must not be defined.", "my-ui2")
});
}
[Fact]
public async Task Should_add_error_if_array_item_field_is_defined()
{
var schema =
new Schema("my-schema")
.AddArray(1, "my-array", Partitioning.Invariant, array => array
.AddUI(101, "my-ui"));
var data =
new NamedContentData()
.AddField("my-array", new ContentFieldData()
.AddValue("iv",
JsonValue.Array(
JsonValue.Object()
.Add("my-ui", null))));
var validationContext =
new ValidationContext(
Guid.NewGuid(),
Guid.NewGuid(),
(c, s) => null,
(c) => null);
var validator = new ContentValidator(schema, new PartitionResolver(x => InvariantPartitioning.Instance), validationContext);
await validator.ValidateAsync(data);
validator.Errors.Should().BeEquivalentTo(
new[] { new ValidationError("Value must not be defined.", "my-array[1].my-ui") });
}
private static NestedField<UIFieldProperties> Field(UIFieldProperties properties)
{
return new NestedField<UIFieldProperties>(1, "my-ui", properties);
}
}
}

24
tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/ValidationTestExtensions.cs

@ -12,7 +12,6 @@ using System.Threading.Tasks;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Core.ValidateContent;
using Squidex.Domain.Apps.Core.ValidateContent.Validators;
using Squidex.Infrastructure.Json.Objects;
namespace Squidex.Domain.Apps.Core.Operations.ValidateContent
{
@ -32,23 +31,28 @@ namespace Squidex.Domain.Apps.Core.Operations.ValidateContent
public static Task ValidateOptionalAsync(this IValidator validator, object value, IList<string> errors, ValidationContext context = null)
{
return validator.ValidateAsync(value,
return validator.ValidateAsync(
value,
CreateContext(context).Optional(true),
CreateFormatter(errors));
}
public static Task ValidateAsync(this IField field, IJsonValue value, IList<string> errors, ValidationContext context = null)
public static Task ValidateAsync(this IField field, object value, IList<string> errors, ValidationContext context = null)
{
return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field).ValidateAsync(value,
CreateContext(context),
CreateFormatter(errors));
return new FieldValidator(FieldValueValidatorsFactory.CreateValidators(field).ToArray(), field)
.ValidateAsync(
value,
CreateContext(context),
CreateFormatter(errors));
}
public static Task ValidateOptionalAsync(this IField field, IJsonValue value, IList<string> errors, ValidationContext context = null)
public static Task ValidateOptionalAsync(this IField field, object value, IList<string> errors, ValidationContext context = null)
{
return new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field).ValidateAsync(value,
CreateContext(context).Optional(true),
CreateFormatter(errors));
return new FieldValidator(FieldValueValidatorsFactory.CreateValidators(field).ToArray(), field)
.ValidateAsync(
value,
CreateContext(context).Optional(true),
CreateFormatter(errors));
}
private static AddError CreateFormatter(IList<string> errors)

54
tests/Squidex.Domain.Apps.Core.Tests/Operations/ValidateContent/Validators/NoValueValidatorTests.cs

@ -0,0 +1,54 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Threading.Tasks;
using FluentAssertions;
using Squidex.Domain.Apps.Core.ValidateContent;
using Squidex.Domain.Apps.Core.ValidateContent.Validators;
using Squidex.Infrastructure.Json.Objects;
using Xunit;
namespace Squidex.Domain.Apps.Core.Operations.ValidateContent.Validators
{
public class NoValueValidatorTests
{
private readonly List<string> errors = new List<string>();
[Fact]
public async Task Should_not_add_error_if_value_is_undefined()
{
var sut = NoValueValidator.Instance;
await sut.ValidateAsync(Undefined.Value, errors);
Assert.Empty(errors);
}
[Fact]
public async Task Should_add_error_if_value_is_json_null()
{
var sut = NoValueValidator.Instance;
await sut.ValidateAsync(JsonValue.Null, errors);
errors.Should().BeEquivalentTo(
new[] { "Value must not be defined." });
}
[Fact]
public async Task Should_add_error_if_value_is_valid()
{
var sut = NoValueValidator.Instance;
await sut.ValidateAsync(JsonValue.True, errors);
errors.Should().BeEquivalentTo(
new[] { "Value must not be defined." });
}
}
}

9
tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs

@ -78,7 +78,8 @@ namespace Squidex.Domain.Apps.Core
.AddNumber(206, "nested-number")
.AddReferences(207, "nested-references")
.AddString(208, "nested-string")
.AddTags(209, "nested-tags"))
.AddTags(209, "nested-tags")
.AddUI(210, "nested-ui"))
.AddAssets(102, "root-assets", Partitioning.Invariant,
new AssetsFieldProperties())
.AddBoolean(103, "root-boolean", Partitioning.Invariant,
@ -101,6 +102,8 @@ namespace Squidex.Domain.Apps.Core
new StringFieldProperties { Hints = "My String1" })
.AddTags(112, "root-tags", Partitioning.Language,
new TagsFieldProperties())
.AddUI(113, "root-ui", Partitioning.Language,
new UIFieldProperties())
.Update(new SchemaProperties { Hints = "The User" })
.HideField(104)
.HideField(211, 101)
@ -116,10 +119,8 @@ namespace Squidex.Domain.Apps.Core
return DefaultSerializer.Deserialize<T>(DefaultSerializer.Serialize(value));
}
public static void TestFreeze(IFreezable freezable)
public static void TestFreeze(IFreezable sut)
{
var sut = new AssetsFieldProperties();
foreach (var property in sut.GetType().GetRuntimeProperties().Where(x => x.Name != "IsFrozen"))
{
var value =

43
tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/FieldProperties/UIFieldPropertiesTests.cs

@ -0,0 +1,43 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Schemas.Guards.FieldProperties
{
public class UIFieldPropertiesTests
{
[Fact]
public void Should_not_add_error_if_editor_is_correct()
{
var sut = new UIFieldProperties { Editor = UIFieldEditor.Separator };
var errors = FieldPropertiesValidator.Validate(sut).ToList();
Assert.Empty(errors);
}
[Fact]
public void Should_add_error_if_editor_is_not_valid()
{
var sut = new UIFieldProperties { Editor = (UIFieldEditor)123 };
var errors = FieldPropertiesValidator.Validate(sut).ToList();
errors.Should().BeEquivalentTo(
new List<ValidationError>
{
new ValidationError("Editor is not a valid value.", "Editor")
});
}
}
}

81
tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/GuardSchemaFieldTests.cs

@ -32,7 +32,8 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
.AddString(1, "field1", Partitioning.Invariant)
.AddString(2, "field2", Partitioning.Invariant)
.AddArray(3, "field3", Partitioning.Invariant, f => f
.AddNumber(301, "field301"));
.AddNumber(301, "field301"))
.AddUI(4, "field4", Partitioning.Invariant);
}
private static Action<Schema, T> A<T>(Action<Schema, T> method) where T : FieldCommand
@ -163,6 +164,32 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
Assert.Throws<DomainException>(() => GuardSchemaField.CanDelete(schema_1, command));
}
[Fact]
public void CanDisable_should_throw_exception_if_already_disabled()
{
var command = new DisableField { FieldId = 1 };
var schema_1 = schema_0.UpdateField(1, f => f.Disable());
Assert.Throws<DomainException>(() => GuardSchemaField.CanDisable(schema_1, command));
}
[Fact]
public void CanDisable_should_throw_exception_if_ui_field()
{
var command = new DisableField { FieldId = 4 };
Assert.Throws<DomainException>(() => GuardSchemaField.CanDisable(schema_0, command));
}
[Fact]
public void CanEnable_should_throw_exception_if_already_enabled()
{
var command = new EnableField { FieldId = 1 };
Assert.Throws<DomainException>(() => GuardSchemaField.CanEnable(schema_0, command));
}
[Fact]
public void CanHide_should_throw_exception_if_locked()
{
@ -173,6 +200,32 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
Assert.Throws<DomainException>(() => GuardSchemaField.CanHide(schema_1, command));
}
[Fact]
public void CanHide_should_throw_exception_if_already_hidden()
{
var command = new HideField { FieldId = 1 };
var schema_1 = schema_0.UpdateField(1, f => f.Hide());
Assert.Throws<DomainException>(() => GuardSchemaField.CanHide(schema_1, command));
}
[Fact]
public void CanHide_should_throw_exception_if_ui_field()
{
var command = new HideField { FieldId = 4 };
Assert.Throws<DomainException>(() => GuardSchemaField.CanHide(schema_0, command));
}
[Fact]
public void CanShow_should_throw_exception_if_already_visible()
{
var command = new ShowField { FieldId = 4 };
Assert.Throws<DomainException>(() => GuardSchemaField.CanShow(schema_0, command));
}
[Fact]
public void CanDelete_should_not_throw_exception_if_not_locked()
{
@ -199,6 +252,15 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
GuardSchemaField.CanUpdate(schema_0, command);
}
[Fact]
public void CanUpdate_should_throw_exception_if_marking_a_ui_field_as_list_field()
{
var command = new UpdateField { FieldId = 4, Properties = new UIFieldProperties { IsListField = true } };
ValidationAssert.Throws(() => GuardSchemaField.CanUpdate(schema_0, command),
new ValidationError("UI field cannot be a list field.", "Properties.IsListField"));
}
[Fact]
public void CanUpdate_should_throw_exception_if_properties_null()
{
@ -247,7 +309,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
[Fact]
public void CanAdd_should_throw_exception_if_properties_not_valid()
{
var command = new AddField { Name = "field4", Properties = invalidProperties };
var command = new AddField { Name = "field5", Properties = invalidProperties };
ValidationAssert.Throws(() => GuardSchemaField.CanAdd(schema_0, command),
new ValidationError("Max length must be greater or equal to min length.", "Properties.MinLength", "Properties.MaxLength"));
@ -256,7 +318,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
[Fact]
public void CanAdd_should_throw_exception_if_properties_null()
{
var command = new AddField { Name = "field4", Properties = null };
var command = new AddField { Name = "field5", Properties = null };
ValidationAssert.Throws(() => GuardSchemaField.CanAdd(schema_0, command),
new ValidationError("Properties is required.", "Properties"));
@ -265,12 +327,21 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
[Fact]
public void CanAdd_should_throw_exception_if_partitioning_not_valid()
{
var command = new AddField { Name = "field4", Partitioning = "INVALID_PARTITIONING", Properties = validProperties };
var command = new AddField { Name = "field5", Partitioning = "INVALID_PARTITIONING", Properties = validProperties };
ValidationAssert.Throws(() => GuardSchemaField.CanAdd(schema_0, command),
new ValidationError("Partitioning is not a valid value.", "Partitioning"));
}
[Fact]
public void CanAdd_should_throw_exception_if_creating_a_ui_field_as_list_field()
{
var command = new AddField { Name = "field5", Properties = new UIFieldProperties { IsListField = true } };
ValidationAssert.Throws(() => GuardSchemaField.CanAdd(schema_0, command),
new ValidationError("UI field cannot be a list field.", "Properties.IsListField"));
}
[Fact]
public void CanAdd_should_throw_exception_if_parent_not_exists()
{
@ -282,7 +353,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
[Fact]
public void CanAdd_should_not_throw_exception_if_field_not_exists()
{
var command = new AddField { Name = "field4", Properties = validProperties };
var command = new AddField { Name = "field5", Properties = validProperties };
GuardSchemaField.CanAdd(schema_0, command);
}

39
tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Guards/GuardSchemaTests.cs

@ -341,6 +341,38 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
"Fields[1].Nested"));
}
[Fact]
public async Task CanCreate_should_throw_exception_if_ui_field_is_invalid()
{
var command = new CreateSchema
{
AppId = appId,
Fields = new List<UpsertSchemaField>
{
new UpsertSchemaField
{
Name = "field1",
Properties = new UIFieldProperties
{
IsListField = true
},
IsHidden = true,
IsDisabled = true,
Partitioning = Partitioning.Invariant.Key
}
},
Name = "new-schema"
};
await ValidationAssert.ThrowsAsync(() => GuardSchema.CanCreate(command, appProvider),
new ValidationError("UI field cannot be a list field.",
"Fields[1].Properties.IsListField"),
new ValidationError("UI field cannot be hidden.",
"Fields[1].IsHidden"),
new ValidationError("UI field cannot be disabled.",
"Fields[1].IsDisabled"));
}
[Fact]
public async Task CanCreate_should_not_throw_exception_if_command_is_valid()
{
@ -352,7 +384,12 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Guards
new UpsertSchemaField
{
Name = "field1",
Properties = ValidProperties(),
Properties = new StringFieldProperties
{
IsListField = true
},
IsHidden = true,
IsDisabled = true,
Partitioning = Partitioning.Invariant.Key
},
new UpsertSchemaField

Loading…
Cancel
Save