diff --git a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs index 533c33bf9..28307a0d6 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/News/Models/FeaturesDto.cs @@ -15,7 +15,7 @@ namespace Squidex.Areas.Api.Controllers.News.Models /// The latest features. /// [LocalizedRequired] - public List Features { get; set; } + public List Features { get; } = new List(); /// /// The recent version. diff --git a/backend/src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs b/backend/src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs index 807217759..7cde60e68 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/News/Service/FeaturesService.cs @@ -13,7 +13,7 @@ namespace Squidex.Areas.Api.Controllers.News.Service { public sealed class FeaturesService { - private const int FeatureVersion = 19; + private const int FeatureVersion = 21; private readonly QueryContext flatten = QueryContext.Default.Flatten(); private readonly IContentsClient client; @@ -44,30 +44,38 @@ namespace Squidex.Areas.Api.Controllers.News.Service { var result = new FeaturesDto { - Version = FeatureVersion + Version = version }; if (client != null && version < FeatureVersion) { try { - var query = new ContentQuery + var query = new ContentQuery(); + + if (version == 0) + { + query.Filter = $"data/version/iv eq {FeatureVersion}"; + } + else { - Filter = $"data/version/iv ge {FeatureVersion}" - }; + query.Filter = $"data/version/iv le {FeatureVersion} and data/version/iv gt {version}"; + } var features = await client.GetAsync(query, flatten, ct); - result.Features = features.Items.Select(x => x.Data).ToList(); + result.Features.AddRange(features.Items.Select(x => x.Data).ToList()); + + if (features.Items.Count > 0) + { + result.Version = features.Items.Max(x => x.Version); + } } catch { - result.Features = new List(); } } - result.Features ??= new List(); - return result; } } diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ScriptingCompleterTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ScriptingCompleterTests.cs index 67da1ec29..009ab0703 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ScriptingCompleterTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/ScriptingCompleterTests.cs @@ -190,7 +190,7 @@ namespace Squidex.Domain.Apps.Core.Operations.Scripting AssertAssetTrigger(result); } - private void AssertAssetTrigger(IReadOnlyList result) + private static void AssertAssetTrigger(IReadOnlyList result) { AssertCompletion(result, PresetActor("event.actor"), diff --git a/frontend/src/app/features/apps/pages/news-dialog.component.html b/frontend/src/app/features/apps/pages/news-dialog.component.html index 5b56fbad4..8a34a726e 100644 --- a/frontend/src/app/features/apps/pages/news-dialog.component.html +++ b/frontend/src/app/features/apps/pages/news-dialog.component.html @@ -7,10 +7,12 @@

{{ 'news.headline' | sqxTranslate }}

-
+

{{feature.name}}

+ +
diff --git a/frontend/src/app/features/apps/pages/news-dialog.component.scss b/frontend/src/app/features/apps/pages/news-dialog.component.scss index f7c8d219b..143a37a78 100644 --- a/frontend/src/app/features/apps/pages/news-dialog.component.scss +++ b/frontend/src/app/features/apps/pages/news-dialog.component.scss @@ -12,4 +12,8 @@ p { margin-bottom: 1.5rem; } +} + +hr { + margin: 3rem 7rem; } \ No newline at end of file diff --git a/frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.ts b/frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.ts index 7ed0d3c16..3c8bcb0f5 100644 --- a/frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.ts +++ b/frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.ts @@ -15,7 +15,7 @@ import { AppsState, AssetCompletions, AssetScriptsState, AssetsService, EditAsse templateUrl: './asset-scripts-page.component.html', }) export class AssetScriptsPageComponent extends ResourceOwner implements OnInit { - public assetScript = 'Annotate'; + public assetScript = 'annotate'; public assetCompletions: Observable = EMPTY; public editForm = new EditAssetScriptsForm();