From b2c07da40a0f5908d39fb2962c2540a1ea3adbfc Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 2 Dec 2016 23:41:48 +0100 Subject: [PATCH] Started with message handling --- .../History/IHistoryEventEntity.cs | 17 ++++ .../Repositories/IHistoryEventRepository.cs | 18 ++++ src/Squidex.Read/IEntity.cs | 6 +- .../Apps/MongoAppRepository.cs | 16 ++-- src/Squidex.Store.MongoDb/History/Messages.cs | 17 ++++ .../History/MessagesEN.cs | 30 ++++++ .../History/MongoHistoryEventEntity.cs | 61 ++++++++++++ .../History/MongoHistoryEventRepository.cs | 79 ++++++++++++++++ .../History/ParsedHistoryEvent.cs | 62 ++++++++++++ .../MongoStreamPositionEntity.cs | 2 + .../Schemas/MongoSchemaRepository.cs | 24 ++--- .../Utils/EntityMapper.cs | 8 +- .../app-libs/icomoon/fonts/icomoon.eot | Bin 3028 -> 3680 bytes .../app-libs/icomoon/fonts/icomoon.svg | 3 + .../app-libs/icomoon/fonts/icomoon.ttf | Bin 2864 -> 3516 bytes .../app-libs/icomoon/fonts/icomoon.woff | Bin 2940 -> 3592 bytes src/Squidex/app-libs/icomoon/selection.json | 88 ++++++++++++++++++ src/Squidex/app-libs/icomoon/style.css | 19 +++- 18 files changed, 418 insertions(+), 32 deletions(-) create mode 100644 src/Squidex.Read/History/IHistoryEventEntity.cs create mode 100644 src/Squidex.Read/History/Repositories/IHistoryEventRepository.cs create mode 100644 src/Squidex.Store.MongoDb/History/Messages.cs create mode 100644 src/Squidex.Store.MongoDb/History/MessagesEN.cs create mode 100644 src/Squidex.Store.MongoDb/History/MongoHistoryEventEntity.cs create mode 100644 src/Squidex.Store.MongoDb/History/MongoHistoryEventRepository.cs create mode 100644 src/Squidex.Store.MongoDb/History/ParsedHistoryEvent.cs diff --git a/src/Squidex.Read/History/IHistoryEventEntity.cs b/src/Squidex.Read/History/IHistoryEventEntity.cs new file mode 100644 index 000000000..f1e9f0f85 --- /dev/null +++ b/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; } + } +} diff --git a/src/Squidex.Read/History/Repositories/IHistoryEventRepository.cs b/src/Squidex.Read/History/Repositories/IHistoryEventRepository.cs new file mode 100644 index 000000000..e59b9f5f0 --- /dev/null +++ b/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> FindHistoryByChannel(string channelPrefix, int count); + } +} diff --git a/src/Squidex.Read/IEntity.cs b/src/Squidex.Read/IEntity.cs index 351f99e99..17d62ee2f 100644 --- a/src/Squidex.Read/IEntity.cs +++ b/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; } } } \ No newline at end of file diff --git a/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs b/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs index 10ec12ba8..45594a869 100644 --- a/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs +++ b/src/Squidex.Store.MongoDb/Apps/MongoAppRepository.cs @@ -22,7 +22,7 @@ using Squidex.Infrastructure; namespace Squidex.Store.MongoDb.Apps { - public sealed class MongoAppRepository : MongoRepositoryBase, IAppRepository, ICatchEventConsumer + public class MongoAppRepository : MongoRepositoryBase, 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 => { diff --git a/src/Squidex.Store.MongoDb/History/Messages.cs b/src/Squidex.Store.MongoDb/History/Messages.cs new file mode 100644 index 000000000..9ffd1165a --- /dev/null +++ b/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"; + } +} diff --git a/src/Squidex.Store.MongoDb/History/MessagesEN.cs b/src/Squidex.Store.MongoDb/History/MessagesEN.cs new file mode 100644 index 000000000..0470188dc --- /dev/null +++ b/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 Texts = + new Dictionary + { + { + TypeNameRegistry.GetName(), + "[User] assigned [Contributor] to app with permission [Permission]" + }, + { + TypeNameRegistry.GetName(), + "[User] removed [Contributor] from app" + } + }; + } +} diff --git a/src/Squidex.Store.MongoDb/History/MongoHistoryEventEntity.cs b/src/Squidex.Store.MongoDb/History/MongoHistoryEventEntity.cs new file mode 100644 index 000000000..ecfd33945 --- /dev/null +++ b/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 Parameters { get; set; } + + public MongoHistoryEventEntity() + { + Parameters = new Dictionary(); + } + + public MongoHistoryEventEntity Setup(EnvelopeHeaders headers, string channel) + { + Channel = channel; + + if (headers.Contains(CommonHeaders.User)) + { + AddParameter("User", headers[CommonHeaders.User].ToString()); + } + + Message = TypeNameRegistry.GetName(); + + return this; + } + + public MongoHistoryEventEntity AddParameter(string key, string value) + { + Parameters.Add(key, value); + + return this; + } + } +} diff --git a/src/Squidex.Store.MongoDb/History/MongoHistoryEventRepository.cs b/src/Squidex.Store.MongoDb/History/MongoHistoryEventRepository.cs new file mode 100644 index 000000000..e3cc20a17 --- /dev/null +++ b/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, IHistoryEventRepository, ICatchEventConsumer + { + public MongoHistoryEventRepository(IMongoDatabase database) + : base(database) + { + } + + protected override string CollectionName() + { + return "Projections_History"; + } + + protected override Task SetupCollectionAsync(IMongoCollection 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> 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(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(headers, channel) + .AddParameter("Contributor", @event.ContributorId); + }); + } + + public Task On(Envelope @event) + { + return this.DispatchActionAsync(@event.Payload, @event.Headers); + } + } +} diff --git a/src/Squidex.Store.MongoDb/History/ParsedHistoryEvent.cs b/src/Squidex.Store.MongoDb/History/ParsedHistoryEvent.cs new file mode 100644 index 000000000..8da989b70 --- /dev/null +++ b/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 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 texts) + { + this.inner = inner; + + message = new Lazy(() => + { + var result = texts[inner.Message]; + + foreach (var kvp in inner.Parameters) + { + result = result.Replace("[" + kvp.Key + "]", kvp.Value); + } + + return result; + }); + } + } +} diff --git a/src/Squidex.Store.MongoDb/Infrastructure/MongoStreamPositionEntity.cs b/src/Squidex.Store.MongoDb/Infrastructure/MongoStreamPositionEntity.cs index 6297da0e0..2157f405a 100644 --- a/src/Squidex.Store.MongoDb/Infrastructure/MongoStreamPositionEntity.cs +++ b/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; } } diff --git a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs b/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs index 5e60fb92c..89e06540d 100644 --- a/src/Squidex.Store.MongoDb/Schemas/MongoSchemaRepository.cs +++ b/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, ISchemaRepository, ICatchEventConsumer + public class MongoSchemaRepository : MongoRepositoryBase, 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); diff --git a/src/Squidex.Store.MongoDb/Utils/EntityMapper.cs b/src/Squidex.Store.MongoDb/Utils/EntityMapper.cs index 8539f8029..c22f71fd0 100644 --- a/src/Squidex.Store.MongoDb/Utils/EntityMapper.cs +++ b/src/Squidex.Store.MongoDb/Utils/EntityMapper.cs @@ -19,7 +19,7 @@ namespace Squidex.Store.MongoDb.Utils { public static class EntityMapper { - public static T Create(EnvelopeHeaders headers) where T : IEntity, new() + public static T Create(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 entity, EnvelopeHeaders headers) where T : IEntity + public static T Update(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(this IMongoCollection collection, EnvelopeHeaders headers, Action updater) where T : class, IEntity, new() + public static Task CreateAsync(this IMongoCollection collection, EnvelopeHeaders headers, Action updater) where T : MongoEntity, new() { var entity = Create(headers); @@ -67,7 +67,7 @@ namespace Squidex.Store.MongoDb.Utils return collection.InsertOneIfNotExistsAsync(entity); } - public static async Task UpdateAsync(this IMongoCollection collection, EnvelopeHeaders headers, Action updater) where T : class, IEntity + public static async Task UpdateAsync(this IMongoCollection collection, EnvelopeHeaders headers, Action updater) where T : MongoEntity { var entity = await collection.Find(t => t.Id == headers.AggregateId()).FirstOrDefaultAsync(); diff --git a/src/Squidex/app-libs/icomoon/fonts/icomoon.eot b/src/Squidex/app-libs/icomoon/fonts/icomoon.eot index 2edfdbf3694e16f47f3a72f0fbb2dcdbb71f7590..3f50dc509ecb8e8a11edbfd1c78c2e247d394d1c 100644 GIT binary patch delta 1068 zcmZ`&O-vI}5T5tmwq?7pK@Y4i>h$h{W z7h;su#Gi0OJb57;G=gT2UW^x_i3ihQJS-;@F)=Z1ou!JJNb+W9=bLY4=grJ+yK?o` zqzJH8v22ZSH*#!sIX<7UO#nhD$)TxK`mXiPdjL|8_R3glHjTOp?dPb=#wM?io{qO- z2BHJ-H^)a(!{w8fbpW9q{gH75$~w3N+H+_hAD^0AP;`p9ga>H1PtFXb#OdmbXm6w4 zFqK+JLyHUEBCuxy)2XSEhZp!C0Od~n$gT9u>>M!kK*fsb2gW{Uhe?d?_GcfHwv>io zJ=Vvd90)WR#1IXy5irgemyCPH6XWS_e=%PyA`62JIK)eepIn^$UEYyD$gky>@-=x> zPDvY>m1Kj|nT=Bm3b%2VZgCkaKvCy_=}-g5pao7tH(bG58$~KP-87`cs2UDX5{`rv zS#nyN8hw_aKStEB&mVOYL~QI7u?0v|qt%8uvWQDWTy`O-h9l7$q=l476j2POFtNFm zNGxqm?CZ?ZX5n2rkw}|DudefUJHKA#a8!NmbOnzb3A#G{y@5b){^MaDrXS?`m9qe) zZ0Y`gQut}-L5@QHw=1)s-k*PV-~)X)H;UF#nxO~dk)WeAmZOAJJ7w&sT8;e;P)m$NV=RPay4=J(SeSWO zQ)7Vo1H?Q?DK(yGU8>qeG;CUa&!MJcFG4v+n43D&i}N>- z-vP9wtsuX+gn=0-!@v!61cL$tGxOESDU5bZFV{?7!f5Re(j*3SA2S0R10#dNOU9Rc zFI8Xay`1uL*~>Nm|Nj3E(h3x3zz}Er|5%(w?1$JRv0GxLVku(rKr + + + \ No newline at end of file diff --git a/src/Squidex/app-libs/icomoon/fonts/icomoon.ttf b/src/Squidex/app-libs/icomoon/fonts/icomoon.ttf index 0d67ef815b46a54feac2e3355d5849254764fdc7..54ff058830ed7fd2aec13e2de69e5e6290b3270c 100644 GIT binary patch delta 1062 zcmZ`&OH30{6us}g>1R4PKxwDpW2GRiiKNK10}7-R780yt(FBYYX@h)1_%wkiqDg1v zLSpHn)StMLH)2}EfK6zx8$!a`%0&@RB0fAcIyoh46k`dG5I2pC_q8O%vBJ|xtRYc8 znwUz03*IB%Ht<+twEyub{wF}512?&q9G{rPMDaN=Z`gscZ}+tj-HbgTje{yuWtbg< zJUmsoPIOVP(*1gieny|upXtvxW7%{ziz;;0VIM2Wesyuu4{1aCEWMLnOV^|UDdAkg zs79smS-MR=a49oDR^xzaPy~md2AZJ*E@6%pB6T|4G$4nl67*9NtP9AJ(_yZx@S19U zA)*AmzIr!7#==ezi=R|hm@UYoinv7NB^Q!Pu&%xcWdXUa9$9pzFuXDojn1qL@2shr zmCVOvG@3Lfy}ZcVZ2V$@-CnTO?y4;*sdcscy8QmG^q2iCOxun1J7xxQ(UP%$LilL= zZj4O&k14ei-j{y4YXge?04~f_sDh(d3E7R65NV}?XULs9cUX~F0s;wy7;$; zEKHv~Ila)+rpmIS$gl4gwWXMOfTrkfdz{dkYs*1G3LO$wR4K&z`l%^I>O(AmX}a9R7?_wbSY?Hu`uxNg zD9II`s1Zep5EYA--nPqbPo%TEy1KhF;&ID%L1au6{$^8qG}DT!8$9uhn$b$Ds!BUr{{K?*mw^7C0 zh`%LvVs^`Vgyheb@xDfE36!IQ-EhJg&N(Bnfdky+I5|g_sh3`)8_dh*I2(6?d$Y4; K{?Zu#miz*)0`>3! delta 396 zcmdlZy+N#=fsuiMft#U$ftkU;KUm+0Ux;lrP-G7fCnV=47F>GNf0TiNQ3l9wNlz>; z0MY_L{sJJ)k)BhT78~q+7|372z`!n%k(!volYQC~D0KiRZwa0SZXvCRP+Mh%lT7@-u*Zg}lVv)R|tKzk&P? zpe1bu`NbtbhXMgN&=Cv@49v_|Cmyh4dbws2qqRRsix|*#%nWQmUn#s~e98Ax^`+j+ zDKD43T=W0$|NkJ3Kyd~PamN3T#aYCDh&>X!B~~hyA{GxcgK_dgM)A!%8TYVk=H*CX zQU-++5Hl@^Y>(%+`O3h}0ygeSnsXY60iq`-aGNvoOrF85t}O(T1!4z~90M27Q*w+J dj6sY$nADh}m`*U;G4}w)L1yx7{>6QW5dgo?Wl#VB diff --git a/src/Squidex/app-libs/icomoon/fonts/icomoon.woff b/src/Squidex/app-libs/icomoon/fonts/icomoon.woff index cb3cec212e5ea931aec60128a7d8334ac288e763..be25d55a5d829e92516782fe3ef20324f1eae6dd 100644 GIT binary patch delta 1106 zcmZ`&OK1~O6utMo$!9Wg+Qwu;ZH-N96TuMaB-3guX>?Jk^^>|#v3@eBZ78h<6#tM} ziBLo(f++5ax^YvwP+FDX%AFfga3RGHIJ#6p&?Mg1XjIVQoq6-lJ@3x_y!TzZ(5ju> zJ}>|X^r&u7#JuDIV9`{xD=}ZeHGXi?%mZMK3^xTXJ1@N$GmjC+BwD+FqH%2E^eAy& z0QsCif4W!A9X1aEC>Kc6E#RGS%;bn9u0-pV0`84cCO3Kf6mf59yast{u$Zhk!KoxzQ#|3!LDV?x`Knzo$>h2@~i(@c&YB| zr_T!1yyZv!auH>Nbsv@TFH>RBeYAY9ZUZKIDy6vvov@lJp@*mvD(f&Phg#mXWL0z} z6ilQz2Et8=0JHW@pBWf9GrezF>((avis4%BbX*D3eBtbYhV@@S5w{fJ z*=Y90@0m`cMW<0*Uk1f~c@;Jkb8@tgS^{mf!6!Bm(zVUB@PHpexE6QdeHLMR*lQl) TS0#_MTY9wk%ZAxG`7!`6DJ)?(gQtz{mgu+%*i`VA_Czaq>rAv57iD^=zw?a}x^~7#K5vGA$r{=~4gD z^u%J2*c%|91BwOGb1Kt-VqX{-*d;(XHrV@cMrvXT0|O@yP>mS~^JJg)%m4}k#aw`V z6%gidV)4z$EvW#Cf$T5oHKv|QXtIvg=0=`Vg=A*&MiQ`0vL-h zoX<eoy@~%$MkZ|WFJOre~@ir3<3>uQp5Nvx12+rUxGQPSz))gf0MV1zaGNvoOn$EUGk6%zGOz<_piz@QG74`_=2^-J0BHqk+W-In diff --git a/src/Squidex/app-libs/icomoon/selection.json b/src/Squidex/app-libs/icomoon/selection.json index e291ec861..d1971cff1 100644 --- a/src/Squidex/app-libs/icomoon/selection.json +++ b/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": [ diff --git a/src/Squidex/app-libs/icomoon/style.css b/src/Squidex/app-libs/icomoon/style.css index 0ce3c086c..45040573a 100644 --- a/src/Squidex/app-libs/icomoon/style.css +++ b/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"; }