Browse Source

Started with message handling

pull/1/head
Sebastian 9 years ago
parent
commit
b2c07da40a
  1. 17
      src/Squidex.Read/History/IHistoryEventEntity.cs
  2. 18
      src/Squidex.Read/History/Repositories/IHistoryEventRepository.cs
  3. 6
      src/Squidex.Read/IEntity.cs
  4. 16
      src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs
  5. 17
      src/Squidex.Store.MongoDb/History/Messages.cs
  6. 30
      src/Squidex.Store.MongoDb/History/MessagesEN.cs
  7. 61
      src/Squidex.Store.MongoDb/History/MongoHistoryEventEntity.cs
  8. 79
      src/Squidex.Store.MongoDb/History/MongoHistoryEventRepository.cs
  9. 62
      src/Squidex.Store.MongoDb/History/ParsedHistoryEvent.cs
  10. 2
      src/Squidex.Store.MongoDb/Infrastructure/MongoStreamPositionEntity.cs
  11. 24
      src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs
  12. 8
      src/Squidex.Store.MongoDb/Utils/EntityMapper.cs
  13. BIN
      src/Squidex/app-libs/icomoon/fonts/icomoon.eot
  14. 3
      src/Squidex/app-libs/icomoon/fonts/icomoon.svg
  15. BIN
      src/Squidex/app-libs/icomoon/fonts/icomoon.ttf
  16. BIN
      src/Squidex/app-libs/icomoon/fonts/icomoon.woff
  17. 88
      src/Squidex/app-libs/icomoon/selection.json
  18. 19
      src/Squidex/app-libs/icomoon/style.css

17
src/Squidex.Read/History/IHistoryEventEntity.cs

@ -0,0 +1,17 @@
// ==========================================================================
// IHistoryEventEntity.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
namespace Squidex.Read.History
{
public interface IHistoryEventEntity : IEntity
{
string Channel { get; }
string Message { get; }
}
}

18
src/Squidex.Read/History/Repositories/IHistoryEventRepository.cs

@ -0,0 +1,18 @@
// ==========================================================================
// IHistoryEventRepository.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Squidex.Read.History.Repositories
{
public interface IHistoryEventRepository
{
Task<List<IHistoryEventEntity>> FindHistoryByChannel(string channelPrefix, int count);
}
}

6
src/Squidex.Read/IEntity.cs

@ -12,10 +12,10 @@ namespace Squidex.Read
{
public interface IEntity
{
Guid Id { get; set; }
Guid Id { get; }
DateTime Created { get; set; }
DateTime Created { get; }
DateTime LastModified { get; set; }
DateTime LastModified { get; }
}
}

16
src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs

@ -22,7 +22,7 @@ using Squidex.Infrastructure;
namespace Squidex.Store.MongoDb.Apps
{
public sealed class MongoAppRepository : MongoRepositoryBase<MongoAppEntity>, IAppRepository, ICatchEventConsumer
public class MongoAppRepository : MongoRepositoryBase<MongoAppEntity>, IAppRepository, ICatchEventConsumer
{
public MongoAppRepository(IMongoDatabase database)
: base(database)
@ -55,7 +55,7 @@ namespace Squidex.Store.MongoDb.Apps
return entity;
}
public Task On(AppCreated @event, EnvelopeHeaders headers)
protected Task On(AppCreated @event, EnvelopeHeaders headers)
{
return Collection.CreateAsync(headers, a =>
{
@ -63,7 +63,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppContributorRemoved @event, EnvelopeHeaders headers)
protected Task On(AppContributorRemoved @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{
@ -71,7 +71,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppLanguagesConfigured @event, EnvelopeHeaders headers)
protected Task On(AppLanguagesConfigured @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{
@ -79,7 +79,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppClientAttached @event, EnvelopeHeaders headers)
protected Task On(AppClientAttached @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{
@ -87,7 +87,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppClientRevoked @event, EnvelopeHeaders headers)
protected Task On(AppClientRevoked @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{
@ -95,7 +95,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppClientRenamed @event, EnvelopeHeaders headers)
protected Task On(AppClientRenamed @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{
@ -103,7 +103,7 @@ namespace Squidex.Store.MongoDb.Apps
});
}
public Task On(AppContributorAssigned @event, EnvelopeHeaders headers)
protected Task On(AppContributorAssigned @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, a =>
{

17
src/Squidex.Store.MongoDb/History/Messages.cs

@ -0,0 +1,17 @@
// ==========================================================================
// Messages.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
namespace Squidex.Store.MongoDb.History
{
public static class Messages
{
public const string AppCreated = "AppCreated";
public const string AppContributor = "SchemaDeleted";
}
}

30
src/Squidex.Store.MongoDb/History/MessagesEN.cs

@ -0,0 +1,30 @@
// ==========================================================================
// MessagesEN.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System.Collections.Generic;
using Squidex.Events.Apps;
using Squidex.Infrastructure;
namespace Squidex.Store.MongoDb.History
{
public static class MessagesEN
{
public static readonly IReadOnlyDictionary<string, string> Texts =
new Dictionary<string, string>
{
{
TypeNameRegistry.GetName<AppContributorAssigned>(),
"[User] assigned [Contributor] to app with permission [Permission]"
},
{
TypeNameRegistry.GetName<AppContributorRemoved>(),
"[User] removed [Contributor] from app"
}
};
}
}

61
src/Squidex.Store.MongoDb/History/MongoHistoryEventEntity.cs

@ -0,0 +1,61 @@
// ==========================================================================
// MongoHistoryEventEntity.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System.Collections.Generic;
using MongoDB.Bson.Serialization.Attributes;
using Squidex.Infrastructure;
using Squidex.Infrastructure.CQRS;
using Squidex.Store.MongoDb.Utils;
namespace Squidex.Store.MongoDb.History
{
public sealed class MongoHistoryEventEntity : MongoEntity
{
[BsonRequired]
[BsonElement]
public string Channel { get; set; }
[BsonRequired]
[BsonElement]
public string Message { get; set; }
[BsonRequired]
[BsonElement]
public UserToken User { get; set; }
[BsonRequired]
[BsonElement]
public Dictionary<string, string> Parameters { get; set; }
public MongoHistoryEventEntity()
{
Parameters = new Dictionary<string, string>();
}
public MongoHistoryEventEntity Setup<T>(EnvelopeHeaders headers, string channel)
{
Channel = channel;
if (headers.Contains(CommonHeaders.User))
{
AddParameter("User", headers[CommonHeaders.User].ToString());
}
Message = TypeNameRegistry.GetName<T>();
return this;
}
public MongoHistoryEventEntity AddParameter(string key, string value)
{
Parameters.Add(key, value);
return this;
}
}
}

79
src/Squidex.Store.MongoDb/History/MongoHistoryEventRepository.cs

@ -0,0 +1,79 @@
// ==========================================================================
// MongoHistoryEventRepository.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MongoDB.Driver;
using Squidex.Events.Apps;
using Squidex.Infrastructure.CQRS;
using Squidex.Infrastructure.CQRS.Events;
using Squidex.Infrastructure.Dispatching;
using Squidex.Read.History;
using Squidex.Read.History.Repositories;
using Squidex.Store.MongoDb.Utils;
using System.Linq;
namespace Squidex.Store.MongoDb.History
{
public class MongoHistoryEventRepository : MongoRepositoryBase<MongoHistoryEventEntity>, IHistoryEventRepository, ICatchEventConsumer
{
public MongoHistoryEventRepository(IMongoDatabase database)
: base(database)
{
}
protected override string CollectionName()
{
return "Projections_History";
}
protected override Task SetupCollectionAsync(IMongoCollection<MongoHistoryEventEntity> collection)
{
return Task.WhenAll(
collection.Indexes.CreateOneAsync(IndexKeys.Ascending(x => x.Channel)),
collection.Indexes.CreateOneAsync(IndexKeys.Ascending(x => x.Created), new CreateIndexOptions { ExpireAfter = TimeSpan.FromDays(365) }));
}
public async Task<List<IHistoryEventEntity>> FindHistoryByChannel(string channelPrefix, int count)
{
var entities =
await Collection.Find(x => x.Channel.StartsWith(channelPrefix)).Limit(count).ToListAsync();
return entities.Select(x => (IHistoryEventEntity)new ParsedHistoryEvent(x, MessagesEN.Texts)).ToList();
}
protected Task On(AppContributorAssigned @event, EnvelopeHeaders headers)
{
return Collection.CreateAsync(headers, x =>
{
var channel = $"Apps.{headers.AggregateId()}.Contributors";
x.Setup<AppContributorAssigned>(headers, channel)
.AddParameter("Contributor", @event.ContributorId)
.AddParameter("Permission", @event.Permission.ToString());
});
}
protected Task On(AppContributorRemoved @event, EnvelopeHeaders headers)
{
return Collection.CreateAsync(headers, x =>
{
var channel = $"Apps.{headers.AggregateId()}.Contributors";
x.Setup<AppContributorRemoved>(headers, channel)
.AddParameter("Contributor", @event.ContributorId);
});
}
public Task On(Envelope<IEvent> @event)
{
return this.DispatchActionAsync(@event.Payload, @event.Headers);
}
}
}

62
src/Squidex.Store.MongoDb/History/ParsedHistoryEvent.cs

@ -0,0 +1,62 @@
// ==========================================================================
// ParsedHistoryEvent.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Generic;
using Squidex.Read.History;
namespace Squidex.Store.MongoDb.History
{
internal sealed class ParsedHistoryEvent : IHistoryEventEntity
{
private readonly MongoHistoryEventEntity inner;
private readonly Lazy<string> message;
public Guid Id
{
get { return inner.Id; }
}
public DateTime Created
{
get { return inner.Created; }
}
public DateTime LastModified
{
get { return inner.LastModified; }
}
public string Channel
{
get { return inner.Channel; }
}
public string Message
{
get { return message.Value; }
}
public ParsedHistoryEvent(MongoHistoryEventEntity inner, IReadOnlyDictionary<string, string> texts)
{
this.inner = inner;
message = new Lazy<string>(() =>
{
var result = texts[inner.Message];
foreach (var kvp in inner.Parameters)
{
result = result.Replace("[" + kvp.Key + "]", kvp.Value);
}
return result;
});
}
}
}

2
src/Squidex.Store.MongoDb/Infrastructure/MongoStreamPositionEntity.cs

@ -18,9 +18,11 @@ namespace Squidex.Store.MongoDb.Infrastructure
[BsonId]
public ObjectId Id { get; set; }
[BsonRequired]
[BsonElement]
public string SubscriptionName { get; set; }
[BsonRequired]
[BsonElement]
public int? Position { get; set; }
}

24
src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs

@ -24,7 +24,7 @@ using Squidex.Store.MongoDb.Utils;
namespace Squidex.Store.MongoDb.Schemas
{
public sealed class MongoSchemaRepository : MongoRepositoryBase<MongoSchemaEntity>, ISchemaRepository, ICatchEventConsumer
public class MongoSchemaRepository : MongoRepositoryBase<MongoSchemaEntity>, ISchemaRepository, ICatchEventConsumer
{
private readonly SchemaJsonSerializer serializer;
private readonly FieldRegistry fieldRegistry;
@ -88,54 +88,54 @@ namespace Squidex.Store.MongoDb.Schemas
return entity?.Id;
}
public Task On(SchemaDeleted @event, EnvelopeHeaders headers)
protected Task On(SchemaDeleted @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(headers, e => e.IsDeleted = true);
return Collection.UpdateAsync(headers, s => s.IsDeleted = true);
}
public Task On(FieldDeleted @event, EnvelopeHeaders headers)
protected Task On(FieldDeleted @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.DeleteField(@event.FieldId));
}
public Task On(FieldDisabled @event, EnvelopeHeaders headers)
protected Task On(FieldDisabled @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.DisableField(@event.FieldId));
}
public Task On(FieldEnabled @event, EnvelopeHeaders headers)
protected Task On(FieldEnabled @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.EnableField(@event.FieldId));
}
public Task On(FieldHidden @event, EnvelopeHeaders headers)
protected Task On(FieldHidden @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.HideField(@event.FieldId));
}
public Task On(FieldShown @event, EnvelopeHeaders headers)
protected Task On(FieldShown @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.ShowField(@event.FieldId));
}
public Task On(FieldUpdated @event, EnvelopeHeaders headers)
protected Task On(FieldUpdated @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.UpdateField(@event.FieldId, @event.Properties));
}
public Task On(SchemaUpdated @event, EnvelopeHeaders headers)
protected Task On(SchemaUpdated @event, EnvelopeHeaders headers)
{
return UpdateSchema(headers, s => s.Update(@event.Properties));
}
public Task On(FieldAdded @event, EnvelopeHeaders headers)
protected Task On(FieldAdded @event, EnvelopeHeaders headers)
{
var field = fieldRegistry.CreateField(@event.FieldId, @event.Name, @event.Properties);
return UpdateSchema(headers, s => s.AddOrUpdateField(field));
}
public Task On(SchemaCreated @event, EnvelopeHeaders headers)
protected Task On(SchemaCreated @event, EnvelopeHeaders headers)
{
var schema = Schema.Create(@event.Name, @event.Properties);

8
src/Squidex.Store.MongoDb/Utils/EntityMapper.cs

@ -19,7 +19,7 @@ namespace Squidex.Store.MongoDb.Utils
{
public static class EntityMapper
{
public static T Create<T>(EnvelopeHeaders headers) where T : IEntity, new()
public static T Create<T>(EnvelopeHeaders headers) where T : MongoEntity, new()
{
var timestamp = headers.Timestamp().ToDateTimeUtc();
@ -49,7 +49,7 @@ namespace Squidex.Store.MongoDb.Utils
return JToken.Parse(json);
}
public static T Update<T>(T entity, EnvelopeHeaders headers) where T : IEntity
public static T Update<T>(T entity, EnvelopeHeaders headers) where T : MongoEntity
{
var timestamp = headers.Timestamp().ToDateTimeUtc();
@ -58,7 +58,7 @@ namespace Squidex.Store.MongoDb.Utils
return entity;
}
public static Task CreateAsync<T>(this IMongoCollection<T> collection, EnvelopeHeaders headers, Action<T> updater) where T : class, IEntity, new()
public static Task CreateAsync<T>(this IMongoCollection<T> collection, EnvelopeHeaders headers, Action<T> updater) where T : MongoEntity, new()
{
var entity = Create<T>(headers);
@ -67,7 +67,7 @@ namespace Squidex.Store.MongoDb.Utils
return collection.InsertOneIfNotExistsAsync(entity);
}
public static async Task UpdateAsync<T>(this IMongoCollection<T> collection, EnvelopeHeaders headers, Action<T> updater) where T : class, IEntity
public static async Task UpdateAsync<T>(this IMongoCollection<T> collection, EnvelopeHeaders headers, Action<T> updater) where T : MongoEntity
{
var entity = await collection.Find(t => t.Id == headers.AggregateId()).FirstOrDefaultAsync();

BIN
src/Squidex/app-libs/icomoon/fonts/icomoon.eot

Binary file not shown.

3
src/Squidex/app-libs/icomoon/fonts/icomoon.svg

@ -12,7 +12,10 @@
<glyph unicode="&#xe90e;" glyph-name="media" horiz-adv-x="1152" d="M1088 832h-64v64c0 35.2-28.8 64-64 64h-896c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h64v-64c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v768c0 35.2-28.8 64-64 64zM128 768v-640h-63.886c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h895.77c0.040-0.034 0.082-0.076 0.116-0.116v-63.884h-768c-35.2 0-64-28.8-64-64v0zM1088 0.116c-0.034-0.040-0.076-0.082-0.116-0.116h-895.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h895.77c0.040-0.034 0.082-0.076 0.116-0.116v-767.768zM960 608c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM1024 64h-768v128l224 384 256-320h64l224 192z" />
<glyph unicode="&#xe925;" glyph-name="content" d="M917.806 602.924c-22.21 30.292-53.174 65.7-87.178 99.704s-69.412 64.964-99.704 87.178c-51.574 37.82-76.592 42.194-90.924 42.194h-368c-44.114 0-80-35.888-80-80v-736c0-44.112 35.886-80 80-80h608c44.112 0 80 35.888 80 80v496c0 14.332-4.372 39.35-42.194 90.924zM785.374 657.374c30.7-30.7 54.8-58.398 72.58-81.374h-153.954v153.946c22.982-17.78 50.678-41.878 81.374-72.572v0zM896 16c0-8.672-7.328-16-16-16h-608c-8.672 0-16 7.328-16 16v736c0 8.672 7.328 16 16 16 0 0 367.956 0.002 368 0v-224c0-17.672 14.324-32 32-32h224v-496zM602.924 917.804c-51.574 37.822-76.592 42.196-90.924 42.196h-368c-44.112 0-80-35.888-80-80v-736c0-38.632 27.528-70.958 64-78.39v814.39c0 8.672 7.328 16 16 16h486.876c-9.646 7.92-19.028 15.26-27.952 21.804z" />
<glyph unicode="&#xe92e;" glyph-name="schemas" d="M1024 640l-512 256-512-256 512-256 512 256zM512 811.030l342.058-171.030-342.058-171.030-342.058 171.030 342.058 171.030zM921.444 499.278l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722zM921.444 307.278l102.556-51.278-512-256-512 256 102.556 51.278 409.444-204.722z" />
<glyph unicode="&#xe941;" glyph-name="lifebuoy" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM320 448c0 106.040 85.96 192 192 192s192-85.96 192-192-85.96-192-192-192-192 85.96-192 192zM925.98 276.524v0l-177.42 73.49c12.518 30.184 19.44 63.276 19.44 97.986s-6.922 67.802-19.44 97.986l177.42 73.49c21.908-52.822 34.020-110.73 34.020-171.476s-12.114-118.654-34.020-171.476v0zM683.478 861.98v0 0l-73.49-177.42c-30.184 12.518-63.276 19.44-97.988 19.44s-67.802-6.922-97.986-19.44l-73.49 177.422c52.822 21.904 110.732 34.018 171.476 34.018 60.746 0 118.654-12.114 171.478-34.020zM98.020 619.476l177.422-73.49c-12.518-30.184-19.442-63.276-19.442-97.986s6.922-67.802 19.44-97.986l-177.42-73.49c-21.906 52.822-34.020 110.73-34.020 171.476s12.114 118.654 34.020 171.476zM340.524 34.020l73.49 177.42c30.184-12.518 63.276-19.44 97.986-19.44s67.802 6.922 97.986 19.44l73.49-177.42c-52.822-21.904-110.73-34.020-171.476-34.020-60.744 0-118.654 12.114-171.476 34.020z" />
<glyph unicode="&#xe94d;" glyph-name="history" horiz-adv-x="1088" d="M640 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM832 512v-128h-256v320h128v-192z" />
<glyph unicode="&#xe994;" glyph-name="settings" d="M933.79 349.75c-53.726 93.054-21.416 212.304 72.152 266.488l-100.626 174.292c-28.75-16.854-62.176-26.518-97.846-26.518-107.536 0-194.708 87.746-194.708 195.99h-201.258c0.266-33.41-8.074-67.282-25.958-98.252-53.724-93.056-173.156-124.702-266.862-70.758l-100.624-174.292c28.97-16.472 54.050-40.588 71.886-71.478 53.638-92.908 21.512-211.92-71.708-266.224l100.626-174.292c28.65 16.696 61.916 26.254 97.4 26.254 107.196 0 194.144-87.192 194.7-194.958h201.254c-0.086 33.074 8.272 66.57 25.966 97.218 53.636 92.906 172.776 124.594 266.414 71.012l100.626 174.29c-28.78 16.466-53.692 40.498-71.434 71.228zM512 240.668c-114.508 0-207.336 92.824-207.336 207.334 0 114.508 92.826 207.334 207.336 207.334 114.508 0 207.332-92.826 207.332-207.334-0.002-114.51-92.824-207.334-207.332-207.334z" />
<glyph unicode="&#xe9a6;" glyph-name="dashboard" d="M512 896c282.77 0 512-229.23 512-512 0-192.792-106.576-360.666-264.008-448h-495.984c-157.432 87.334-264.008 255.208-264.008 448 0 282.77 229.23 512 512 512zM801.914 94.086c77.438 77.44 120.086 180.398 120.086 289.914h-90v64h85.038c-7.014 44.998-21.39 88.146-42.564 128h-106.474v64h64.284c-9.438 11.762-19.552 23.096-30.37 33.914-46.222 46.22-101.54 80.038-161.914 99.798v-69.712h-64v85.040c-20.982 3.268-42.36 4.96-64 4.96s-43.018-1.69-64-4.96v-85.040h-64v69.712c-60.372-19.76-115.692-53.576-161.914-99.798-10.818-10.818-20.932-22.152-30.37-33.914h64.284v-64h-106.476c-21.174-39.854-35.552-83.002-42.564-128h85.040v-64h-90c0-109.516 42.648-212.474 120.086-289.914 10.71-10.71 21.924-20.728 33.56-30.086h192.354l36.572 512h54.856l36.572-512h192.354c11.636 9.358 22.852 19.378 33.56 30.086z" />
<glyph unicode="&#xe9ac;" glyph-name="bin" 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="&#xea5b;" glyph-name="filter" d="M512 960c-282.77 0-512-71.634-512-160v-96l384-384v-320c0-35.346 57.306-64 128-64 70.692 0 128 28.654 128 64v320l384 384v96c0 88.366-229.23 160-512 160zM94.384 821.176c23.944 13.658 57.582 26.62 97.278 37.488 87.944 24.076 201.708 37.336 320.338 37.336 118.628 0 232.394-13.26 320.338-37.336 39.696-10.868 73.334-23.83 97.28-37.488 15.792-9.006 24.324-16.624 28.296-21.176-3.972-4.552-12.506-12.168-28.296-21.176-23.946-13.658-57.584-26.62-97.28-37.488-87.942-24.076-201.708-37.336-320.338-37.336s-232.394 13.26-320.338 37.336c-39.696 10.868-73.334 23.83-97.278 37.488-15.792 9.008-24.324 16.624-28.298 21.176 3.974 4.552 12.506 12.168 28.298 21.176z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
src/Squidex/app-libs/icomoon/fonts/icomoon.ttf

Binary file not shown.

BIN
src/Squidex/app-libs/icomoon/fonts/icomoon.woff

Binary file not shown.

88
src/Squidex/app-libs/icomoon/selection.json

@ -94,6 +94,66 @@
"setId": 2,
"iconIdx": 46
},
{
"icon": {
"paths": [
"M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM320 512c0-106.040 85.96-192 192-192s192 85.96 192 192-85.96 192-192 192-192-85.96-192-192zM925.98 683.476v0l-177.42-73.49c12.518-30.184 19.44-63.276 19.44-97.986s-6.922-67.802-19.44-97.986l177.42-73.49c21.908 52.822 34.020 110.73 34.020 171.476s-12.114 118.654-34.020 171.476v0zM683.478 98.020v0 0l-73.49 177.42c-30.184-12.518-63.276-19.44-97.988-19.44s-67.802 6.922-97.986 19.44l-73.49-177.422c52.822-21.904 110.732-34.018 171.476-34.018 60.746 0 118.654 12.114 171.478 34.020zM98.020 340.524l177.422 73.49c-12.518 30.184-19.442 63.276-19.442 97.986s6.922 67.802 19.44 97.986l-177.42 73.49c-21.906-52.822-34.020-110.73-34.020-171.476s12.114-118.654 34.020-171.476zM340.524 925.98l73.49-177.42c30.184 12.518 63.276 19.44 97.986 19.44s67.802-6.922 97.986-19.44l73.49 177.42c-52.822 21.904-110.73 34.020-171.476 34.020-60.744 0-118.654-12.114-171.476-34.020z"
],
"attrs": [],
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"lifebuoy",
"support",
"help"
],
"defaultCode": 59713,
"grid": 16
},
"attrs": [],
"properties": {
"ligatures": "lifebuoy, support",
"name": "lifebuoy",
"id": 65,
"order": 12,
"prevSize": 32,
"code": 59713
},
"setIdx": 0,
"setId": 2,
"iconIdx": 65
},
{
"icon": {
"paths": [
"M640 64c247.424 0 448 200.576 448 448s-200.576 448-448 448v-96c94.024 0 182.418-36.614 248.902-103.098s103.098-154.878 103.098-248.902c0-94.022-36.614-182.418-103.098-248.902s-154.878-103.098-248.902-103.098c-94.022 0-182.418 36.614-248.902 103.098-51.14 51.138-84.582 115.246-97.306 184.902h186.208l-224 256-224-256h164.57c31.060-217.102 217.738-384 443.43-384zM832 448v128h-256v-320h128v192z"
],
"width": 1088,
"attrs": [],
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"history",
"time",
"archive",
"past"
],
"defaultCode": 59725,
"grid": 16
},
"attrs": [],
"properties": {
"ligatures": "history, time",
"name": "history",
"id": 77,
"order": 11,
"prevSize": 32,
"code": 59725
},
"setIdx": 0,
"setId": 2,
"iconIdx": 77
},
{
"icon": {
"paths": [
@ -191,6 +251,34 @@
"setId": 2,
"iconIdx": 172
},
{
"icon": {
"paths": [
"M512 0c-282.77 0-512 71.634-512 160v96l384 384v320c0 35.346 57.306 64 128 64 70.692 0 128-28.654 128-64v-320l384-384v-96c0-88.366-229.23-160-512-160zM94.384 138.824c23.944-13.658 57.582-26.62 97.278-37.488 87.944-24.076 201.708-37.336 320.338-37.336 118.628 0 232.394 13.26 320.338 37.336 39.696 10.868 73.334 23.83 97.28 37.488 15.792 9.006 24.324 16.624 28.296 21.176-3.972 4.552-12.506 12.168-28.296 21.176-23.946 13.658-57.584 26.62-97.28 37.488-87.942 24.076-201.708 37.336-320.338 37.336s-232.394-13.26-320.338-37.336c-39.696-10.868-73.334-23.83-97.278-37.488-15.792-9.008-24.324-16.624-28.298-21.176 3.974-4.552 12.506-12.168 28.298-21.176z"
],
"attrs": [],
"isMulticolor": false,
"isMulticolor2": false,
"tags": [
"filter",
"funnel"
],
"defaultCode": 59995,
"grid": 16
},
"attrs": [],
"properties": {
"ligatures": "filter, funnel",
"name": "filter",
"id": 347,
"order": 10,
"prevSize": 32,
"code": 59995
},
"setIdx": 0,
"setId": 2,
"iconIdx": 347
},
{
"icon": {
"paths": [

19
src/Squidex/app-libs/icomoon/style.css

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?k706v2');
src: url('fonts/icomoon.eot?k706v2#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?k706v2') format('truetype'),
url('fonts/icomoon.woff?k706v2') format('woff'),
url('fonts/icomoon.svg?k706v2#icomoon') format('svg');
src: url('fonts/icomoon.eot?7p76ib');
src: url('fonts/icomoon.eot?7p76ib#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?7p76ib') format('truetype'),
url('fonts/icomoon.woff?7p76ib') format('woff'),
url('fonts/icomoon.svg?7p76ib#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
@ -33,6 +33,12 @@
.icon-schemas:before {
content: "\e92e";
}
.icon-lifebuoy:before {
content: "\e941";
}
.icon-history:before {
content: "\e94d";
}
.icon-settings:before {
content: "\e994";
}
@ -42,6 +48,9 @@
.icon-bin:before {
content: "\e9ac";
}
.icon-filter:before {
content: "\ea5b";
}
.icon-plus:before {
content: "\e901";
}

Loading…
Cancel
Save