diff --git a/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs b/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs index 515826041..7faab9e32 100644 --- a/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs +++ b/backend/extensions/Squidex.Extensions/Actions/Webhook/WebhookAction.cs @@ -31,7 +31,7 @@ namespace Squidex.Extensions.Actions.Webhook [DataType(DataType.Text)] public string SharedSecret { get; set; } - [Display(Name = "Payload", Description = "The optional custom request payload.")] + [Display(Name = "Payload (Optional)", Description = "Leave it empty to use the full event as payload.")] [DataType(DataType.MultilineText)] [Formattable] public string Payload { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs index 6a60ab8d6..84d09b2d0 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs @@ -36,7 +36,13 @@ namespace Squidex.Domain.Apps.Core.Schemas public bool AllowDuplicates { get; set; } - public bool ResolveImage { get; set; } + public bool ResolveFirst { get; set; } + + public bool ResolveImage + { + get => ResolveFirst; + set => ResolveFirst = value; + } public ReadOnlyCollection? AllowedExtensions { get; set; } diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs index 7768e9e63..5df556719 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Model/Schemas/SchemaExtensions.cs @@ -108,7 +108,7 @@ namespace Squidex.Domain.Apps.Core.Schemas public static IEnumerable> ResolvingAssets(this Schema schema) { return schema.Fields.OfType>() - .Where(x => x.Properties.ResolveImage); + .Where(x => x.Properties.ResolveFirst); } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs index 0b5f1039d..a5b61e91e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ContentReferencesExtensions.cs @@ -17,40 +17,40 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { public static class ContentReferencesExtensions { - public static HashSet GetReferencedIds(this NamedContentData source, Schema schema) + public static HashSet GetReferencedIds(this NamedContentData source, Schema schema, int referencesPerField = int.MaxValue) { Guard.NotNull(schema); - var extractor = new ReferencesExtractor(new HashSet()); + var extractor = new ReferencesExtractor(new HashSet(), referencesPerField); AddReferencedIds(source, schema.Fields, extractor); return extractor.Result; } - public static void AddReferencedIds(this NamedContentData source, Schema schema, HashSet result) + public static void AddReferencedIds(this NamedContentData source, Schema schema, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(schema); - var extractor = new ReferencesExtractor(result); + var extractor = new ReferencesExtractor(result, referencesPerField); AddReferencedIds(source, schema.Fields, extractor); } - public static void AddReferencedIds(this NamedContentData source, IEnumerable fields, HashSet result) + public static void AddReferencedIds(this NamedContentData source, IEnumerable fields, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(fields); - var extractor = new ReferencesExtractor(result); + var extractor = new ReferencesExtractor(result, referencesPerField); AddReferencedIds(source, fields, extractor); } - public static void AddReferencedIds(this NamedContentData source, IField field, HashSet result) + public static void AddReferencedIds(this NamedContentData source, IField field, HashSet result, int referencesPerField = int.MaxValue) { Guard.NotNull(field); - var extractor = new ReferencesExtractor(result); + var extractor = new ReferencesExtractor(result, referencesPerField); AddReferencedIds(source, field, extractor); } @@ -76,13 +76,13 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds } } - public static HashSet GetReferencedIds(this IField field, IJsonValue? value) + public static HashSet GetReferencedIds(this IField field, IJsonValue? value, int referencesPerField = int.MaxValue) { var result = new HashSet(); if (value != null) { - var extractor = new ReferencesExtractor(result); + var extractor = new ReferencesExtractor(result, referencesPerField); extractor.SetValue(value); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtensions.cs index c4acb33ad..ced99e669 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtensions.cs @@ -13,8 +13,10 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds { public static class ReferencesExtensions { - public static void AddIds(this IJsonValue? value, HashSet result) + public static void AddIds(this IJsonValue? value, HashSet result, int take) { + var added = 0; + if (value is JsonArray array) { foreach (var id in array) @@ -22,6 +24,13 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds if (id.Type == JsonValueType.String && Guid.TryParse(id.ToString(), out var guid)) { result.Add(guid); + + added++; + + if (added >= take) + { + break; + } } } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs index 5a7801685..0ebb11896 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ReferencesExtractor.cs @@ -17,6 +17,7 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds internal sealed class ReferencesExtractor : IFieldVisitor { private readonly HashSet result; + private readonly int take; private IJsonValue? value; public HashSet Result @@ -24,11 +25,13 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds get { return result; } } - public ReferencesExtractor(HashSet result) + public ReferencesExtractor(HashSet result, int take) { Guard.NotNull(result); this.result = result; + + this.take = take; } public void SetValue(IJsonValue? newValue) @@ -59,14 +62,14 @@ namespace Squidex.Domain.Apps.Core.ExtractReferenceIds public None Visit(IField field) { - value.AddIds(result); + value.AddIds(result, take); return None.Value; } public None Visit(IField field) { - value.AddIds(result); + value.AddIds(result, take); return None.Value; } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs index 69ade2a20..2da34658b 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ResolveAssets.cs @@ -82,19 +82,30 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps { foreach (var (partitionKey, partitionValue) in fieldData) { - var referencedImage = + var referencedAsset = field.GetReferencedIds(partitionValue) .Select(x => assets[x]) .SelectMany(x => x) - .FirstOrDefault(x => x.Type == AssetType.Image); + .FirstOrDefault(); - if (referencedImage != null) + if (referencedAsset != null) { - var url = urlGenerator.AssetContent(Guid.Parse(referencedImage.Id.ToString())); + IJsonValue array; - requestCache.AddDependency(referencedImage.Id, referencedImage.Version); + if (referencedAsset.Type == AssetType.Image) + { + var url = urlGenerator.AssetContent(Guid.Parse(referencedAsset.Id.ToString())); - fieldReference.AddJsonValue(partitionKey, JsonValue.Create(url)); + array = JsonValue.Array(url, referencedAsset.FileName); + } + else + { + array = JsonValue.Array(referencedAsset.FileName); + } + + requestCache.AddDependency(referencedAsset.Id, referencedAsset.Version); + + fieldReference.AddJsonValue(partitionKey, array); } } } @@ -118,7 +129,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries.Steps { foreach (var content in contents) { - content.Data.AddReferencedIds(schema.SchemaDef.ResolvingAssets(), ids); + content.Data.AddReferencedIds(schema.SchemaDef.ResolvingAssets(), ids, 1); } } diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs index da58aade8..2102836c8 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppPatternsController.cs @@ -82,7 +82,7 @@ namespace Squidex.Areas.Api.Controllers.Apps } /// - /// Update an existing app pattern. + /// Update an app pattern. /// /// The name of the app. /// The id of the pattern to be updated. @@ -107,7 +107,7 @@ namespace Squidex.Areas.Api.Controllers.Apps } /// - /// Delete an existing app pattern. + /// Delete an app pattern. /// /// The name of the app. /// The id of the pattern to be deleted. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs index 8a3aef0ba..a40cee38e 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs @@ -107,7 +107,7 @@ namespace Squidex.Areas.Api.Controllers.Apps } /// - /// Update an existing app role. + /// Update an app role. /// /// The name of the app. /// The name of the role to be updated. diff --git a/backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs b/backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs index d50a2def7..dda051f83 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs @@ -31,7 +31,7 @@ namespace Squidex.Areas.Api.Controllers.History } /// - /// Get the events from the history. + /// Get historical events. /// /// The name of the app. /// The name of the channel. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs b/backend/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs index fd6c294b6..6771038f2 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Ping/PingController.cs @@ -27,7 +27,7 @@ namespace Squidex.Areas.Api.Controllers.Ping } /// - /// Get general info status of the API. + /// Get API information. /// /// /// 200 => Infos returned. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs b/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs index 5e81463ca..a03cc0f82 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs @@ -46,7 +46,7 @@ namespace Squidex.Areas.Api.Controllers.Rules } /// - /// Get the supported rule actions. + /// Get supported rule actions. /// /// /// 200 => Rule actions returned. @@ -291,7 +291,7 @@ namespace Squidex.Areas.Api.Controllers.Rules } /// - /// Cancels the event and retries. + /// Cancels an event. /// /// The name of the app. /// The event to enqueue. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs index 9a5209a2f..4a918ec92 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/Fields/AssetsFieldPropertiesDto.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; using System.Collections.ObjectModel; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Infrastructure.Reflection; @@ -68,10 +69,20 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models.Fields /// public bool MustBeImage { get; set; } + /// + /// True to resolve first asset in the content list. + /// + public bool ResolveFirst { get; set; } + /// /// True to resolve first image in the content list. /// - public bool ResolveImage { get; set; } + [Obsolete("Use ResolveFirst now")] + public bool ResolveImage + { + get => ResolveFirst; + set => ResolveFirst = value; + } /// /// The allowed file extensions. diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs index 475ebdb02..e11a0cbd7 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs @@ -54,7 +54,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Add a nested schema field. + /// Add a nested field. /// /// The name of the app. /// The name of the schema. @@ -183,7 +183,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Update a nested schema field. + /// Update a nested field. /// /// The name of the app. /// The name of the schema. @@ -237,7 +237,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Lock a nested schema field. + /// Lock a nested field. /// /// The name of the app. /// The name of the schema. @@ -292,7 +292,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Hide a nested schema field. + /// Hide a nested field. /// /// The name of the app. /// The name of the schema. @@ -347,7 +347,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Show a nested schema field. + /// Show a nested field. /// /// The name of the app. /// The name of the schema. @@ -402,7 +402,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Enable a nested schema field. + /// Enable a nested field. /// /// The name of the app. /// The name of the schema. @@ -457,7 +457,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Disable nested a schema field. + /// Disable a nested field. /// /// The name of the app. /// The name of the schema. @@ -510,7 +510,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas } /// - /// Delete a nested schema field. + /// Delete a nested field. /// /// The name of the app. /// The name of the schema. diff --git a/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml b/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml index 01ec2d2b9..d79a549d5 100644 --- a/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml +++ b/backend/src/Squidex/Areas/Api/Views/Shared/Docs.cshtml @@ -14,12 +14,26 @@
- + diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs index b4889febe..fb45e05fa 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs @@ -53,6 +53,25 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds Assert.Equal(new[] { id1, id2 }, ids); } + [Fact] + public void Should_get_limited_ids_from_name_data() + { + var id1 = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + var input = + new NamedContentData() + .AddField("assets", + new ContentFieldData() + .AddJsonValue(JsonValue.Array(id1.ToString(), id2.ToString()))); + + var ids = new HashSet(); + + input.AddReferencedIds(schema, ids, 1); + + Assert.Equal(new[] { id1 }, ids); + } + [Fact] public void Should_cleanup_deleted_ids() { diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs index 92f423cde..1bf78e1a1 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ResolveAssetsTests.cs @@ -43,13 +43,13 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries new Schema(schemaId.Name) .AddAssets(1, "asset1", Partitioning.Invariant, new AssetsFieldProperties { - ResolveImage = true, + ResolveFirst = true, MinItems = 2, MaxItems = 3 }) .AddAssets(2, "asset2", Partitioning.Language, new AssetsFieldProperties { - ResolveImage = true, + ResolveFirst = true, MinItems = 1, MaxItems = 1 }) @@ -76,51 +76,48 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries [Fact] public async Task Should_add_assets_id_and_versions_as_dependency() { - var image1 = CreateAsset(Guid.NewGuid(), 1, AssetType.Image); - var image2 = CreateAsset(Guid.NewGuid(), 2, AssetType.Image); - - var document1 = CreateAsset(Guid.NewGuid(), 3, AssetType.Unknown); - var document2 = CreateAsset(Guid.NewGuid(), 4, AssetType.Unknown); + var document1 = CreateAsset(Guid.NewGuid(), 3, AssetType.Unknown, "Document1.docx"); + var document2 = CreateAsset(Guid.NewGuid(), 4, AssetType.Unknown, "Document2.docx"); var contents = new[] { CreateContent( - new[] { document1.Id, image1.Id }, + new[] { document1.Id }, new[] { document1.Id }), CreateContent( - new[] { document1.Id }, - new[] { document2.Id, image2.Id }) + new[] { document2.Id }, + new[] { document2.Id }), }; - A.CallTo(() => assetQuery.QueryAsync(A.That.Matches(x => !x.ShouldEnrichAsset()), null, A.That.Matches(x => x.Ids.Count == 4))) - .Returns(ResultList.CreateFrom(4, image1, image2, document1, document2)); + A.CallTo(() => assetQuery.QueryAsync(A.That.Matches(x => !x.ShouldEnrichAsset()), null, A.That.Matches(x => x.Ids.Count == 2))) + .Returns(ResultList.CreateFrom(4, document1, document2)); await sut.EnrichAsync(requestContext, contents, schemaProvider); - A.CallTo(() => requestCache.AddDependency(image1.Id, image1.Version)) + A.CallTo(() => requestCache.AddDependency(document1.Id, document1.Version)) .MustHaveHappened(); - A.CallTo(() => requestCache.AddDependency(image2.Id, image2.Version)) + A.CallTo(() => requestCache.AddDependency(document2.Id, document2.Version)) .MustHaveHappened(); } [Fact] public async Task Should_enrich_with_asset_urls() { - var image1 = CreateAsset(Guid.NewGuid(), 1, AssetType.Image); - var image2 = CreateAsset(Guid.NewGuid(), 2, AssetType.Image); + var image1 = CreateAsset(Guid.NewGuid(), 1, AssetType.Image, "Image1.png"); + var image2 = CreateAsset(Guid.NewGuid(), 2, AssetType.Image, "Image2.png"); - var document1 = CreateAsset(Guid.NewGuid(), 3, AssetType.Unknown); - var document2 = CreateAsset(Guid.NewGuid(), 4, AssetType.Unknown); + var document1 = CreateAsset(Guid.NewGuid(), 3, AssetType.Unknown, "Document1.png"); + var document2 = CreateAsset(Guid.NewGuid(), 4, AssetType.Unknown, "Document2.png"); var contents = new[] { CreateContent( - new[] { document1.Id, image1.Id }, - new[] { document1.Id }), + new[] { image1.Id }, + new[] { image2.Id, image1.Id }), CreateContent( new[] { document1.Id }, - new[] { document2.Id, image2.Id }) + new[] { document2.Id, document1.Id }) }; A.CallTo(() => assetQuery.QueryAsync(A.That.Matches(x => !x.ShouldEnrichAsset()), null, A.That.Matches(x => x.Ids.Count == 4))) @@ -132,18 +129,20 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries new NamedContentData() .AddField("asset1", new ContentFieldData() - .AddValue("iv", $"url/to/{image1.Id}")) + .AddValue("iv", JsonValue.Array($"url/to/{image1.Id}", image1.FileName))) .AddField("asset2", - new ContentFieldData()), + new ContentFieldData() + .AddValue("en", JsonValue.Array($"url/to/{image2.Id}", image2.FileName))), contents[0].ReferenceData); Assert.Equal( new NamedContentData() .AddField("asset1", - new ContentFieldData()) + new ContentFieldData() + .AddValue("iv", JsonValue.Array(document1.FileName))) .AddField("asset2", new ContentFieldData() - .AddValue("en", $"url/to/{image2.Id}")), + .AddValue("en", JsonValue.Array(document2.FileName))), contents[1].ReferenceData); } @@ -199,6 +198,25 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries .MustNotHaveHappened(); } + [Fact] + public async Task Should_only_query_first_assets() + { + var id1 = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + var contents = new[] + { + CreateContent(new[] { id1, id2 }, new Guid[0]) + }; + + await sut.EnrichAsync(requestContext, contents, schemaProvider); + + Assert.NotNull(contents[0].ReferenceData); + + A.CallTo(() => assetQuery.QueryAsync(A.That.Matches(x => !x.ShouldEnrichAsset()), null, A.That.Matches(x => x.Ids.Count == 1))) + .MustHaveHappened(); + } + private ContentEntity CreateContent(Guid[] assets1, Guid[] assets2) { return new ContentEntity @@ -215,9 +233,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.Queries }; } - private static IEnrichedAssetEntity CreateAsset(Guid id, int version, AssetType type) + private static IEnrichedAssetEntity CreateAsset(Guid id, int version, AssetType type, string fileName) { - return new AssetEntity { Id = id, Type = type, Version = version }; + return new AssetEntity { Id = id, Type = type, Version = version, FileName = fileName }; } } } diff --git a/frontend/answer.md b/frontend/answer.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/app-config/webpack.config.js b/frontend/app-config/webpack.config.js index ddb4cb0f8..54be7da14 100644 --- a/frontend/app-config/webpack.config.js +++ b/frontend/app-config/webpack.config.js @@ -40,7 +40,7 @@ module.exports = function (env) { const isTests = env && env.target === 'tests'; const isTestCoverage = env && env.coverage; const isAnalyzing = isProduction && env.analyze; - const isAot = isProduction; + const isAot = !isDevServer; const configFile = isTests ? 'tsconfig.spec.json' : 'tsconfig.app.json'; @@ -296,8 +296,8 @@ module.exports = function (env) { new plugins.NgToolsWebpack.AngularCompilerPlugin({ directTemplateLoading: true, entryModule: 'app/app.module#AppModule', - sourceMap: !isProduction, skipCodeGeneration: !isAot, + sourceMap: !isProduction, tsConfigPath: configFile }) ); diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html index 8cb337b24..32da7deb9 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.html @@ -3,14 +3,14 @@
- -
- Show the first referenced image in the content list. + Show the first referenced asset in the content list.
diff --git a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts index befb09cc6..2eb1db758 100644 --- a/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts +++ b/frontend/app/features/schemas/pages/schema/fields/types/assets-ui.component.ts @@ -26,7 +26,7 @@ export class AssetsUIComponent implements OnInit { public properties: AssetsFieldPropertiesDto; public ngOnInit() { - this.editForm.setControl('resolveImage', - new FormControl(this.properties.resolveImage)); + this.editForm.setControl('resolveFirst', + new FormControl(this.properties.resolveFirst)); } } \ No newline at end of file diff --git a/frontend/app/shared/services/schemas.types.ts b/frontend/app/shared/services/schemas.types.ts index 380f1f981..ef5fbbda1 100644 --- a/frontend/app/shared/services/schemas.types.ts +++ b/frontend/app/shared/services/schemas.types.ts @@ -173,8 +173,8 @@ export class AssetsFieldPropertiesDto extends FieldPropertiesDto { public readonly fieldType = 'Assets'; public readonly allowDuplicates?: boolean; - public readonly resolveImage: boolean; public readonly allowedExtensions?: ReadonlyArray; + public readonly resolveFirst: boolean; public readonly aspectHeight?: number; public readonly aspectWidth?: number; public readonly maxHeight?: number; diff --git a/frontend/app/shared/state/contents.forms.spec.ts b/frontend/app/shared/state/contents.forms.spec.ts index b0a653a6d..ce3b7c725 100644 --- a/frontend/app/shared/state/contents.forms.spec.ts +++ b/frontend/app/shared/state/contents.forms.spec.ts @@ -460,18 +460,32 @@ describe('GetContentValue', () => { const fieldLocalized = createField({ properties: createProperties('Number') }); const fieldAssets = createField({ properties: createProperties('Assets') }); - it('should resolve image url field from references value', () => { + it('should resolve image url and filename from referenced asset', () => { const content: any = { referenceData: { field1: { - en: '13' + en: ['url/to/13', 'file13'] } } }; const result = getContentValue(content, language, fieldAssets); - expect(result).toEqual({ value: '13', formatted: new HtmlValue('') }); + expect(result).toEqual({ value: ['url/to/13', 'file13'], formatted: new HtmlValue(' file13') }); + }); + + it('should resolve filename from referenced asset', () => { + const content: any = { + referenceData: { + field1: { + en: ['file13'] + } + } + }; + + const result = getContentValue(content, language, fieldAssets); + + expect(result).toEqual({ value: ['file13'], formatted: 'file13' }); }); it('should not image url if not found', () => { diff --git a/frontend/app/shared/state/contents.forms.ts b/frontend/app/shared/state/contents.forms.ts index e668e109f..6f9c801d8 100644 --- a/frontend/app/shared/state/contents.forms.ts +++ b/frontend/app/shared/state/contents.forms.ts @@ -83,15 +83,19 @@ export function getContentValue(content: ContentDto, language: LanguageDto, fiel if (Types.isObject(fieldValue)) { value = fieldValue[language.iso2Code]; - } else if (Types.isString(fieldValue)) { + } else { value = fieldValue; } let formatted: FieldValue = value!; if (value) { - if (Types.isString(value) && isAssets) { - formatted = new HtmlValue(``); + if (isAssets && Types.isArray(value)) { + if (value.length === 2) { + formatted = new HtmlValue(` ${value[1]}`); + } else if (value.length === 1) { + formatted = value[0]; + } } } else { value = formatted = '- No Value -'; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b49832bf2..b134d232a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.900.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.3.tgz", - "integrity": "sha512-VLAWtAXpOzOoYUJrN6sT90UdIdvrVIipkzGz7nfI1kscDvxUFwVZnsNNHtFinaY2SfZAunHhYQOA/B9FJ8WPdQ==", + "version": "0.900.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.900.5.tgz", + "integrity": "sha512-BdmvD58DnAAf6/o/fRzU2l+2g4IwuIJf8x/rd9AGWd7fHrcwgJDhB9rYetB7JqYR8uOWk+AFElDpvNOj8YUy0w==", "dev": true, "requires": { "loader-utils": "1.2.3", @@ -49,6 +49,12 @@ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, "typescript": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", @@ -76,9 +82,9 @@ } }, "@angular-devkit/core": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.3.tgz", - "integrity": "sha512-3+abmv9K9d+BVgUAolYgoOqlGAA2Jb1pWo2biapSDG6KjUZHUCJdnsKigLtLorCdv0SrjTp56FFplkcqKsFQgA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-9.0.5.tgz", + "integrity": "sha512-9TPQPzfSRbV5wVEnfo1d1CS+oVXROfE7VnBRuRMilFnNhuc29wX3zvBQRTreDVyxJetLBEb9sRlcKYGaJzpKPw==", "dev": true, "requires": { "ajv": "6.10.2", @@ -148,33 +154,33 @@ } }, "@angular/animations": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.5.tgz", - "integrity": "sha512-WGs4Jxw5sr8GCpxMcwEVuZnDIkdNp9qtmuI2j13v/XAaMjvJ7jssCj9+JG5uI8joCi7PFVAWokPT1DdPwWb13Q==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-9.0.6.tgz", + "integrity": "sha512-LNtzUrrjqLTlZyhuAEV0sdEV0yi52Ih/p+ozCr/ivhTSSemcPbniTBbJlFZO4NJ2BuS2iEXkXwZs3mm8Fvx5Sg==" }, "@angular/cdk": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.1.tgz", - "integrity": "sha512-yzssAqbllGYgX+WeSYLjmEWtXVG5UPZwA0+dPlh+g85nG7b70DVRVYBi8PJySydsfPX/JMherFUU9h0QOWhhZw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-9.1.2.tgz", + "integrity": "sha512-x5niyE0iYrbVtLYjJFw2MoS+OoSbJn6y/G2pNScviDwyjBBgqRh4YgUox2kMhdPumkvuh+eA6blZoE9qpvSo2w==", "requires": { "parse5": "^5.0.0" } }, "@angular/common": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.5.tgz", - "integrity": "sha512-AwZKYK5M/3762woK+3290JnBdlBvZXqxX5vVze6wk23IiBlwIV+l79+Lyfjo/4s031kibq47taaZdC7qkkBkNA==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-9.0.6.tgz", + "integrity": "sha512-z+c+zmoZTOQ2fT2sFQpHhpUbIYtjerxYmdOVpukprZCuv9WT2SGJfu4QVGSkeqejYnMp6VtXMdQ1CeAQojj0sw==" }, "@angular/compiler": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.5.tgz", - "integrity": "sha512-TeyhRGefTOtA9N3udMrvheafoXcz/dvTTdZLcieeZQxm1SSeaQDUQ/rUH6QTOiHVNMtjOCrZ9J5rk1A4mPYuag==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.6.tgz", + "integrity": "sha512-jGTGNs8l3zwTnVEQH2v3HwWVvpz0bQY7B6rPkfHNP2bVwrhz7L6fYyJY1HtWM0S95b09NuSwianhabnEzQeTfQ==", "dev": true }, "@angular/compiler-cli": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.5.tgz", - "integrity": "sha512-lFlasm8UBApTq4/MkxnYrRAMfpOvvg3YYBEMibuEGlaJjW/Xd1JcisUuFiooCxCIKF5phyORHmxjywGPhHqQgQ==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-9.0.6.tgz", + "integrity": "sha512-chzlImvinNigQ9JzehC7BRxct62OGkkru6jIMg3J2gr1r+sQlOn2ybvADloYkKnEP5hu2Izr2aSmEfMm4xobvg==", "dev": true, "requires": { "canonical-path": "1.0.0", @@ -200,38 +206,38 @@ } }, "@angular/core": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.5.tgz", - "integrity": "sha512-7VznrYjaAIzeq/zQ7v6tbeoOI7JJKgChKwG7s8jRoEpENu+w2pRlRdyQul88iJLsXgObR+/TfBNm/K+G4cqAFw==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.6.tgz", + "integrity": "sha512-egpVGqqI+L1QQFn9ziHIElXb0bCzY1l8vzyQGfm2KnxHpmx2TJp2uaaHh5LRcqYR7TLeGMpqmzhRxir6Up7AAQ==" }, "@angular/forms": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.5.tgz", - "integrity": "sha512-579PXAfT92J4mghjWKiZ3Zj3xee4h3RP70YHSlsfbi94MONvryWDrnXxvUZ0zJJCVnEJQ7x+nGEp3wwWqR12Jw==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-9.0.6.tgz", + "integrity": "sha512-mxUEqQny3scxQM/21QLKgtq5EcOm1Tn5cU3rStY1L8J6Mg+Rd2Rz4SY0WXQpaRKPj+WNd+PDgdGiRs3cAjfLFQ==" }, "@angular/platform-browser": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.5.tgz", - "integrity": "sha512-24QGcQXthYXB/wT8okJjxqss/JOk4A6O1/Fmva79k0AvwtYkl2tikcyEc5T3xZtjoi8g32AN9nbZAobtkxlqTA==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-9.0.6.tgz", + "integrity": "sha512-CA7dW+j1mVh3OUo3C2vIn05NxNgrDPK4vpfRIwBIn1gErpnIXCa2vgnRzn3H9zKizKt0iuwSIukEnWG280Q0xg==" }, "@angular/platform-browser-dynamic": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.5.tgz", - "integrity": "sha512-NRfsAwbgxOvEcpqlERDAG0wap5xJa0wKwnudTCnyvf4B0D6kLkT1Idjqv22NDW5rfM2oDWaZ/qpgpDnAo6/ZBQ==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-9.0.6.tgz", + "integrity": "sha512-Z0/qHciqbR+c2fwGxrkr77tQkEKhZpAPljGva/VNoS3Ms1OikqZB9Ev7xmZOM9656khPBU38m3aLsTXAAnQ4YA==" }, "@angular/platform-server": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.0.5.tgz", - "integrity": "sha512-5iEugPj0oZgw6JHS5s8m4WejCnEoNeWgttzsCQuyCaVmIOQGCbTdqSsxD+AgBO7A5lrzxYQOgil/XCM/up5Smw==", + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-9.0.6.tgz", + "integrity": "sha512-v+as/mgdKTJXj/+FU7C57Jsc3P/yzJ64XPOu4N8DDh0TRZrEOunXSqH97Wyn9z7dIe4YdRR2MU9CZkiGvoeKnw==", "requires": { "domino": "^2.1.2", "xhr2": "^0.1.4" } }, "@angular/router": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.5.tgz", - "integrity": "sha512-Sz3DQUxlzAk9aZ9eVtZRh6xF5SMg/Gb3rc5I7dL1M+mycSNoFJ4HPTXleZkKM69mMkKQ5fEtza4x26MSlF+O9w==" + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-9.0.6.tgz", + "integrity": "sha512-Ki1uk3jWPsoFh27SnyXatPSFK3ghF25pjiwWw9/inPvlS/HshSWgS2FbYf49LD5xVFF3Ni2Z5GRKxSEqxL8vQw==" }, "@babel/code-frame": { "version": "7.8.3", @@ -409,12 +415,12 @@ "dev": true }, "@ngtools/webpack": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.3.tgz", - "integrity": "sha512-pMIXfq1IJLbvwmkPonGs7nrpuBCXrlZTf9A4OYsMBZcfU8JMn0pRdx7G2+bC9Q/f+uSw2uvPSv76xJXLBOntmA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.5.tgz", + "integrity": "sha512-xe0rGpme04MNRK/PpPOx8cza9k8F/XuAOmxC3Tk4dIgigqIzYsP6v6N/At8vPRDrf88X4ZyR94lL5RrUYf/KNQ==", "dev": true, "requires": { - "@angular-devkit/core": "9.0.3", + "@angular-devkit/core": "9.0.5", "enhanced-resolve": "4.1.1", "rxjs": "6.5.3", "webpack-sources": "1.4.3" @@ -507,9 +513,9 @@ "dev": true }, "@types/marked": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.2.tgz", - "integrity": "sha512-A3EDyNaq6OCcpaOia2HQ/tu2QYt8DKuj4ExP21VU3cU3HTo2FLslvbqa2T1vux910RHvuSVqpwKnnykSFcRWOA==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.7.3.tgz", + "integrity": "sha512-WXdEKuT3azHxLTThd5dwnpLt2Q9QiC8iKj09KZRtVqro3pX8hhY+GbD8FZOae6SBBEJ22yKJn3c7ejL0aucAcA==", "dev": true }, "@types/mersenne-twister": { @@ -810,9 +816,9 @@ } }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true }, "after": { @@ -1760,14 +1766,14 @@ } }, "browserslist": { - "version": "4.8.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", - "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", + "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001027", - "electron-to-chromium": "^1.3.349", - "node-releases": "^1.1.49" + "caniuse-lite": "^1.0.30001030", + "electron-to-chromium": "^1.3.363", + "node-releases": "^1.1.50" } }, "buffer": { @@ -2013,9 +2019,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001028", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", - "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "version": "1.0.30001033", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001033.tgz", + "integrity": "sha512-8Ibzxee6ibc5q88cM1usPsMpJOG5CTq0s/dKOmlekPbDGKt+UrnOOTPSjQz3kVo6yL7N4SB5xd+FGLHQmbzh6A==", "dev": true }, "canonical-path": { @@ -3561,9 +3567,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.355", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.355.tgz", - "integrity": "sha512-zKO/wS+2ChI/jz9WAo647xSW8t2RmgRLFdbUb/77cORkUTargO+SCj4ctTHjBn2VeNFrsLgDT7IuDVrd3F8mLQ==", + "version": "1.3.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.375.tgz", + "integrity": "sha512-zmaFnYVBtfpF8bGRYxgPeVAlXB7N3On8rjBE2ROc6wOpTPpzRWaiHo6KkbJMvlH07CH33uks/TEb6kuMMn8q6A==", "dev": true }, "elliptic": { @@ -7245,9 +7251,9 @@ } }, "marked": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.0.tgz", + "integrity": "sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ==" }, "md5.js": { "version": "1.3.5", @@ -7783,9 +7789,9 @@ } }, "node-releases": { - "version": "1.1.49", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.49.tgz", - "integrity": "sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg==", + "version": "1.1.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.51.tgz", + "integrity": "sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw==", "dev": true, "requires": { "semver": "^6.3.0" @@ -11171,9 +11177,9 @@ "dev": true }, "slugify": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.6.tgz", - "integrity": "sha512-wA9XS475ZmGNlEnYYLPReSfuz/c3VQsEMoU43mi6OnKMCdbnFXd4/Yg7J0lBv8jkPolacMpOrWEaoYxuE1+hoQ==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.0.tgz", + "integrity": "sha512-FtLNsMGBSRB/0JOE2A0fxlqjI6fJsgHGS13iTuVT28kViI4JjUiNqp/vyis0ZXYcMnpR3fzGNkv+6vRlI2GwdQ==" }, "snapdragon": { "version": "0.8.2", @@ -12469,9 +12475,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tslint": { "version": "6.0.0", @@ -12605,9 +12611,9 @@ } }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "dev": true }, "uc.micro": { @@ -13682,9 +13688,9 @@ } }, "webpack": { - "version": "4.41.6", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", - "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -13713,15 +13719,15 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14024,13 +14030,13 @@ } }, "webpack-bundle-analyzer": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", - "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz", + "integrity": "sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-walk": "^6.1.1", + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", "bfj": "^6.1.1", "chalk": "^2.4.1", "commander": "^2.18.0", @@ -14045,9 +14051,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "commander": { diff --git a/frontend/package.json b/frontend/package.json index 728902d2e..546f1ac9f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,15 +16,15 @@ "postinstall": "ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points" }, "dependencies": { - "@angular/animations": "9.0.5", - "@angular/cdk": "9.1.1", - "@angular/common": "9.0.5", - "@angular/core": "9.0.5", - "@angular/forms": "9.0.5", - "@angular/platform-browser": "9.0.5", - "@angular/platform-browser-dynamic": "9.0.5", - "@angular/platform-server": "9.0.5", - "@angular/router": "9.0.5", + "@angular/animations": "9.0.6", + "@angular/cdk": "9.1.2", + "@angular/common": "9.0.6", + "@angular/core": "9.0.6", + "@angular/forms": "9.0.6", + "@angular/platform-browser": "9.0.6", + "@angular/platform-browser-dynamic": "9.0.6", + "@angular/platform-server": "9.0.6", + "@angular/router": "9.0.6", "angular-mentions": "^1.1.3", "angular2-chartjs": "0.5.1", "babel-polyfill": "6.26.0", @@ -34,7 +34,7 @@ "graphiql": "0.17.5", "graphql": "14.6.0", "image-focus": "^1.1.0", - "marked": "0.7.0", + "marked": "0.8.0", "mersenne-twister": "1.1.0", "moment": "2.24.0", "mousetrap": "1.6.5", @@ -45,26 +45,26 @@ "react": "16.10.2", "react-dom": "16.10.2", "rxjs": "6.5.4", - "slugify": "1.3.6", - "tslib": "1.10.0", + "slugify": "1.4.0", + "tslib": "1.11.1", "zone.js": "0.10.2" }, "devDependencies": { - "@angular-devkit/build-optimizer": "^0.900.3", - "@angular/compiler": "9.0.5", - "@angular/compiler-cli": "9.0.5", - "@ngtools/webpack": "9.0.3", + "@angular-devkit/build-optimizer": "0.900.5", + "@angular/compiler": "9.0.6", + "@angular/compiler-cli": "9.0.6", + "@ngtools/webpack": "9.0.5", "@types/core-js": "2.5.3", - "@types/jasmine": "3.5.5", - "@types/marked": "0.7.2", + "@types/jasmine": "3.5.9", + "@types/marked": "0.7.3", "@types/mersenne-twister": "1.1.2", "@types/mousetrap": "1.6", "@types/node": "13.7.4", "@types/react": "16.9.21", "@types/react-dom": "16.9.5", "@types/tinymce": "^4.5.24", - "browserslist": "4.8.7", - "caniuse-lite": "1.0.30001028", + "browserslist": "4.9.1", + "caniuse-lite": "1.0.30001033", "circular-dependency-plugin": "5.2.0", "codelyzer": "5.2.1", "css-loader": "3.4.2", @@ -108,10 +108,10 @@ "tslint-immutable": "6.0.1", "tslint-webpack-plugin": "2.1.0", "typemoq": "2.1.0", - "typescript": "3.7.5", + "typescript": "3.8.3", "underscore": "1.9.2", - "webpack": "4.41.6", - "webpack-bundle-analyzer": "^3.6.0", + "webpack": "4.42.0", + "webpack-bundle-analyzer": "3.6.1", "webpack-cli": "3.3.11", "webpack-dev-server": "3.10.3" } diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 10c3a0e44..38c1498cd 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -28,6 +28,7 @@ }, }, "angularCompilerOptions": { + "disableTypeScriptVersionCheck": true, "fullTemplateTypeCheck": true, "strictInjectionParameters": true, "strictTemplate": true