From 4ae3bb3835b59ae0a06c0ca2248be82cf9573ad6 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:30:43 +0200 Subject: [PATCH 01/15] AppSettings: Improves the templates so they reflect the latest recommended settings (#20148) hides obsolete appsettings from the template and renames `TimeOutInMinutes` to `TimeOut` and updates its format --- .../appsettings.Development.template.json | 6 +----- src/Umbraco.Web.UI/appsettings.template.json | 14 +++----------- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI/appsettings.Development.template.json b/src/Umbraco.Web.UI/appsettings.Development.template.json index b2bde5bf2d..93768f2d42 100644 --- a/src/Umbraco.Web.UI/appsettings.Development.template.json +++ b/src/Umbraco.Web.UI/appsettings.Development.template.json @@ -1,5 +1,5 @@ { - "$schema" : "./appsettings-schema.json", + "$schema": "./appsettings-schema.json", "Serilog": { "MinimumLevel": { "Default": "Information", @@ -37,10 +37,6 @@ }, "Hosting": { "Debug": true - }, - "RuntimeMinification": { - "useInMemoryCache": true, - "cacheBuster": "Timestamp" } } } diff --git a/src/Umbraco.Web.UI/appsettings.template.json b/src/Umbraco.Web.UI/appsettings.template.json index 35a41bcedb..efd66d250d 100644 --- a/src/Umbraco.Web.UI/appsettings.template.json +++ b/src/Umbraco.Web.UI/appsettings.template.json @@ -18,13 +18,12 @@ "Content": { "Notifications": { "Email": "your@email.here" - }, - "MacroErrors": "Throw" + } }, "Global": { "DefaultUILanguage": "en-us", "HideTopLevelNodeFromPath": true, - "TimeOutInMinutes": 20, + "TimeOut": "00:20:00", "UseHttps": false }, "Hosting": { @@ -33,14 +32,10 @@ "RequestHandler": { "ConvertUrlsToAscii": "try" }, - "RuntimeMinification": { - "dataFolder": "umbraco/Data/TEMP/Smidge", - "version": "637642136775050602" - }, "Security": { "KeepUserLoggedIn": false, "UsernameIsEmail": true, - "HideDisabledUsersInBackoffice": false, + "HideDisabledUsersInBackOffice": false, "AllowedUserNameCharacters": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-'._@+\\", "UserPassword": { "RequiredLength": 10, @@ -59,9 +54,6 @@ "MaxFailedAccessAttemptsBeforeLockout": 5 } }, - "Tours": { - "EnableTours": true - }, "ModelsBuilder": { "ModelsMode": "InMemoryAuto" } From ef1aaf8bcea3fb8144c2b82959678fa401b1ea58 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 16 Sep 2025 11:33:40 +0200 Subject: [PATCH 02/15] Cherry-pick #20142 for V16 (#20147) * Support querystring and anchor for local links in Delivery API output (#20142) * Support querystring and anchor for local links in Delivery API output * Add default implementation for backwards compat * Add default implementation for backwards compat (also on the interface) * Fix default implementation * Add extra tests proving that querystring/postfix can be handled for local links in both legacy and current format. --- .../Models/DeliveryApi/ApiContentRoute.cs | 2 + .../Models/DeliveryApi/IApiContentRoute.cs | 5 ++ .../DeliveryApi/ApiRichTextMarkupParser.cs | 2 +- .../DeliveryApi/ApiRichTextParserBase.cs | 7 +- .../DeliveryApi/OpenApiContractTest.cs | 4 ++ .../DeliveryApi/RichTextParserTests.cs | 68 ++++++++++++++++++- .../ApiRichTextMarkupParserTests.cs | 39 +++++++++++ 7 files changed, 121 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Models/DeliveryApi/ApiContentRoute.cs b/src/Umbraco.Core/Models/DeliveryApi/ApiContentRoute.cs index 45fcaaba4b..f5d56fbf2e 100644 --- a/src/Umbraco.Core/Models/DeliveryApi/ApiContentRoute.cs +++ b/src/Umbraco.Core/Models/DeliveryApi/ApiContentRoute.cs @@ -10,5 +10,7 @@ public sealed class ApiContentRoute : IApiContentRoute public string Path { get; } + public string? QueryString { get; set; } + public IApiContentStartItem StartItem { get; } } diff --git a/src/Umbraco.Core/Models/DeliveryApi/IApiContentRoute.cs b/src/Umbraco.Core/Models/DeliveryApi/IApiContentRoute.cs index 1cc2b36b9d..cfc0b2984a 100644 --- a/src/Umbraco.Core/Models/DeliveryApi/IApiContentRoute.cs +++ b/src/Umbraco.Core/Models/DeliveryApi/IApiContentRoute.cs @@ -4,5 +4,10 @@ public interface IApiContentRoute { string Path { get; } + public string? QueryString + { + get => null; set { } + } + IApiContentStartItem StartItem { get; } } diff --git a/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParser.cs b/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParser.cs index 42418146db..3712a4b6c5 100644 --- a/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParser.cs +++ b/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParser.cs @@ -60,7 +60,7 @@ internal sealed class ApiRichTextMarkupParser : ApiRichTextParserBase, IApiRichT link.GetAttributeValue("type", "unknown"), route => { - link.SetAttributeValue("href", route.Path); + link.SetAttributeValue("href", $"{route.Path}{route.QueryString}"); link.SetAttributeValue("data-start-item-path", route.StartItem.Path); link.SetAttributeValue("data-start-item-id", route.StartItem.Id.ToString("D")); link.Attributes["type"]?.Remove(); diff --git a/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextParserBase.cs b/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextParserBase.cs index 5ba7b37171..d1cf1b5b3a 100644 --- a/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextParserBase.cs +++ b/src/Umbraco.Infrastructure/DeliveryApi/ApiRichTextParserBase.cs @@ -4,6 +4,7 @@ using Umbraco.Cms.Core.DeliveryApi; using Umbraco.Cms.Core.Models.DeliveryApi; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.DeliveryApi; @@ -58,6 +59,7 @@ internal abstract partial class ApiRichTextParserBase : null; if (route != null) { + route.QueryString = match.Groups["query"].Value.NullOrWhiteSpaceAsNull(); handleContentRoute(route); return ReplaceStatus.Success; } @@ -105,6 +107,7 @@ internal abstract partial class ApiRichTextParserBase : null; if (route != null) { + route.QueryString = match.Groups["query"].Value.NullOrWhiteSpaceAsNull(); handleContentRoute(route); return ReplaceStatus.Success; } @@ -140,10 +143,10 @@ internal abstract partial class ApiRichTextParserBase handleMediaUrl(_apiMediaUrlProvider.GetUrl(media)); } - [GeneratedRegex("{localLink:(?umb:.+)}")] + [GeneratedRegex("{localLink:(?umb:.+)}(?[^\"]*)")] private static partial Regex LegacyLocalLinkRegex(); - [GeneratedRegex("{localLink:(?.+)}")] + [GeneratedRegex("{localLink:(?.+)}(?[^\"]*)")] private static partial Regex LocalLinkRegex(); private enum ReplaceStatus diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/DeliveryApi/OpenApiContractTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/DeliveryApi/OpenApiContractTest.cs index da1c8aa88e..3514f32d2b 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/DeliveryApi/OpenApiContractTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/DeliveryApi/OpenApiContractTest.cs @@ -1320,6 +1320,10 @@ internal sealed class OpenApiContractTest : UmbracoTestServerTestBase "path": { "type": "string" }, + "queryString": { + "type": "string", + "nullable": true + }, "startItem": { "oneOf": [ { diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/DeliveryApi/RichTextParserTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/DeliveryApi/RichTextParserTests.cs index f113c9a998..2acab6cace 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/DeliveryApi/RichTextParserTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/DeliveryApi/RichTextParserTests.cs @@ -10,6 +10,7 @@ using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.PropertyEditors.ValueConverters; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Infrastructure.DeliveryApi; +using Umbraco.Extensions; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.DeliveryApi; @@ -127,12 +128,15 @@ public class RichTextParserTests : PropertyValueConverterTests Assert.AreEqual("the original something", span.Attributes.First().Value); } - [Test] - public void ParseElement_CanParseContentLink() + [TestCase(null)] + [TestCase("")] + [TestCase("#some-anchor")] + [TestCase("?something=true")] + public void ParseElement_CanParseContentLink(string? postfix) { var parser = CreateRichTextElementParser(); - var element = parser.Parse($"

", RichTextBlockModel.Empty) as RichTextRootElement; + var element = parser.Parse($"

", RichTextBlockModel.Empty) as RichTextRootElement; Assert.IsNotNull(element); var link = element.Elements.OfType().Single().Elements.Single() as RichTextGenericElement; Assert.IsNotNull(link); @@ -142,6 +146,7 @@ public class RichTextParserTests : PropertyValueConverterTests var route = link.Attributes.First().Value as IApiContentRoute; Assert.IsNotNull(route); Assert.AreEqual("/some-content-path", route.Path); + Assert.AreEqual(postfix.NullOrWhiteSpaceAsNull(), route.QueryString); Assert.AreEqual(_contentRootKey, route.StartItem.Id); Assert.AreEqual("the-root-path", route.StartItem.Path); } @@ -176,6 +181,22 @@ public class RichTextParserTests : PropertyValueConverterTests Assert.AreEqual("https://some.where/else/", link.Attributes.First().Value); } + [TestCase("#some-anchor")] + [TestCase("?something=true")] + public void ParseElement_CanHandleNonLocalLink_WithPostfix(string postfix) + { + var parser = CreateRichTextElementParser(); + + var element = parser.Parse($"

", RichTextBlockModel.Empty) as RichTextRootElement; + Assert.IsNotNull(element); + var link = element.Elements.OfType().Single().Elements.Single() as RichTextGenericElement; + Assert.IsNotNull(link); + Assert.AreEqual("a", link.Tag); + Assert.AreEqual(1, link.Attributes.Count); + Assert.AreEqual("href", link.Attributes.First().Key); + Assert.AreEqual($"https://some.where/else/{postfix}", link.Attributes.First().Value); + } + [Test] public void ParseElement_LinkTextIsWrappedInTextElement() { @@ -459,12 +480,51 @@ public class RichTextParserTests : PropertyValueConverterTests { var parser = CreateRichTextMarkupParser(); + var result = parser.Parse($"

"); + Assert.IsTrue(result.Contains("href=\"/some-content-path\"")); + Assert.IsTrue(result.Contains("data-start-item-path=\"the-root-path\"")); + Assert.IsTrue(result.Contains($"data-start-item-id=\"{_contentRootKey:D}\"")); + } + + [Test] + public void ParseMarkup_CanParseLegacyContentLink() + { + var parser = CreateRichTextMarkupParser(); + var result = parser.Parse($"

"); Assert.IsTrue(result.Contains("href=\"/some-content-path\"")); Assert.IsTrue(result.Contains("data-start-item-path=\"the-root-path\"")); Assert.IsTrue(result.Contains($"data-start-item-id=\"{_contentRootKey:D}\"")); } + [TestCase("#some-anchor")] + [TestCase("?something=true")] + [TestCase("#!some-hashbang")] + [TestCase("?something=true#some-anchor")] + public void ParseMarkup_CanParseContentLink_WithPostfix(string postfix) + { + var parser = CreateRichTextMarkupParser(); + + var result = parser.Parse($"

"); + Assert.IsTrue(result.Contains($"href=\"/some-content-path{postfix}\"")); + Assert.IsTrue(result.Contains("data-start-item-path=\"the-root-path\"")); + Assert.IsTrue(result.Contains($"data-start-item-id=\"{_contentRootKey:D}\"")); + } + + [TestCase("#some-anchor")] + [TestCase("?something=true")] + [TestCase("#!some-hashbang")] + [TestCase("?something=true#some-anchor")] + public void ParseMarkup_CanParseLegacyContentLink_WithPostfix(string postfix) + { + var parser = CreateRichTextMarkupParser(); + + var result = parser.Parse($"

"); + Assert.IsTrue(result.Contains($"href=\"/some-content-path{postfix}\"")); + Assert.IsTrue(result.Contains("data-start-item-path=\"the-root-path\"")); + Assert.IsTrue(result.Contains($"data-start-item-id=\"{_contentRootKey:D}\"")); + } + [Test] public void ParseMarkup_CanParseMediaLink() { @@ -485,6 +545,8 @@ public class RichTextParserTests : PropertyValueConverterTests } [TestCase("

")] + [TestCase("

")] + [TestCase("

")] [TestCase("

")] public void ParseMarkup_CanHandleNonLocalReferences(string html) { diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParserTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParserTests.cs index 04c6df0882..0ab8eb48cd 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParserTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/DeliveryApi/ApiRichTextMarkupParserTests.cs @@ -79,6 +79,45 @@ public class ApiRichTextMarkupParserTests Assert.AreEqual(expectedOutput, parsedHtml); } + [TestCase("#some-anchor")] + [TestCase("?something=true")] + [TestCase("#!some-hashbang")] + [TestCase("?something=true#some-anchor")] + public void Can_Parse_LocalLinks_With_Postfix(string postfix) + { + var key1 = Guid.Parse("eed5fc6b-96fd-45a5-a0f1-b1adfb483c2f"); + var data1 = new MockData() + .WithKey(key1) + .WithRoutePath($"/self/{postfix}") + .WithRouteStartPath("self"); + + var key2 = Guid.Parse("cc143afe-4cbf-46e5-b399-c9f451384373"); + var data2 = new MockData() + .WithKey(key2) + .WithRoutePath($"/other/{postfix}") + .WithRouteStartPath("other"); + + var mockData = new Dictionary + { + { key1, data1 }, + { key2, data2 }, + }; + + var parser = BuildDefaultSut(mockData); + + var html = + $@"

Rich text outside of the blocks with a link to itself

+

and to the other page

"; + + var expectedOutput = + $@"

Rich text outside of the blocks with a link to itself

+

and to the other page

"; + + var parsedHtml = parser.Parse(html); + + Assert.AreEqual(expectedOutput, parsedHtml); + } + [Test] public void Can_Parse_Inline_LocalImages() { From 5fd01e000c2dc5fdd466193b239644d33c0ebe78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 16 Sep 2025 12:07:54 +0200 Subject: [PATCH 03/15] Property Value Preset builder caller args (#20111) * update types for callArgs * note for Engage * implement callArgs type updates * tests * implement callArgs for Value Preset Builder * updated fallback and console.log feedback * change to warn * remove unused import * JS docs * TODO * lint fix --- .../block/context/block-manager.context.ts | 6 +++- .../content-detail-workspace-base.ts | 13 +++++-- ...ty-value-preset-builder.controller.test.ts | 25 +++++++++++--- ...roperty-value-preset-builder.controller.ts | 34 ++++++++++++++++++- ...-preset-variant-builder.controller.test.ts | 25 +++++++++++--- ...value-preset-variant-builder.controller.ts | 2 ++ .../property/property-value-preset/types.ts | 12 ++++++- .../extensions/italic/italic.tiptap-api.ts | 1 - 8 files changed, 102 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts index a54d1190c4..ca4387dc9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block/context/block-manager.context.ts @@ -414,7 +414,11 @@ export abstract class UmbBlockManagerContext< if (segments) { controller.setSegments(segments); } - const values = await controller.create(valueDefinitions); + const values = await controller.create(valueDefinitions, { + entityType: 'block', + entityUnique: key, + entityTypeUnique: contentTypeKey, + }); // Set culture and segment for all values: diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts index 7d4dd3a84f..c224375f7d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content/workspace/content-detail-workspace-base.ts @@ -382,8 +382,12 @@ export abstract class UmbContentDetailWorkspaceContextBase< } protected override async _scaffoldProcessData(data: DetailModelType): Promise { + const contentTypeUnique: string | undefined = (data as any)[this.#contentTypePropertyName].unique; + if (!contentTypeUnique) { + throw new Error(`Could not find content type unique on property '${this.#contentTypePropertyName}'`); + } // Load the content type structure, usually this comes from the data, but in this case we are making the data, and we need this to be able to complete the data. [NL] - await this.structure.loadType((data as any)[this.#contentTypePropertyName].unique); + await this.structure.loadType(contentTypeUnique); /** * TODO: Should we also set Preset Values when loading Content, because maybe content contains uncreated Cultures or Segments. @@ -393,6 +397,7 @@ export abstract class UmbContentDetailWorkspaceContextBase< const cultures = this.#languages.getValue().map((x) => x.unique); if (this.structure.variesBySegment) { + // TODO: v.17 Engage please note we have not implemented support for segments yet. [NL] console.warn('Segments are not yet implemented for preset'); } // TODO: Add Segments for Presets: @@ -432,7 +437,11 @@ export abstract class UmbContentDetailWorkspaceContextBase< controller.setSegments(segments); } - const presetValues = await controller.create(valueDefinitions); + const presetValues = await controller.create(valueDefinitions, { + entityType: this.getEntityType(), + entityUnique: data.unique, + entityTypeUnique: contentTypeUnique, + }); // Don't just set the values, as we could have some already populated from a blueprint. // If we have a value from both a blueprint and a preset, use the latter as priority. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts index 55a2744785..ed9a344d17 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.test.ts @@ -72,7 +72,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('first'); @@ -120,7 +123,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('first_second'); @@ -168,7 +174,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('second_first'); @@ -233,7 +242,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); expect(result.length).to.be.equal(2); expect(result[0]?.alias).to.be.equal('test'); @@ -310,7 +322,10 @@ describe('UmbPropertyValuePresetBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityUnique: 'test-unique', + entityType: 'test', + }); // Test that only the right presets are used: expect(result.length).to.be.equal(3); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts index 778a921acf..e73b840640 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-builder.controller.ts @@ -5,6 +5,7 @@ import type { UmbPropertyTypePresetWithSchemaAliasModel, UmbPropertyValuePreset, UmbPropertyValuePresetApiCallArgs, + UmbPropertyValuePresetApiCallArgsEntityBase, } from './types.js'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; @@ -15,14 +16,37 @@ const EMPTY_CALL_ARGS = Object.freeze({}); export class UmbPropertyValuePresetBuilderController< ReturnType = UmbPropertyValueData | UmbPropertyValueDataPotentiallyWithEditorAlias, > extends UmbControllerBase { + #baseCreateArgs?: UmbPropertyValuePresetApiCallArgsEntityBase; + /** * Clones the property data. * @param {UmbPropertyValueDataPotentiallyWithEditorAlias} propertyTypes - Data about the properties to make a preset for. + * @param createArgs * @returns {Promise} - A promise that resolves to the cloned property data. */ async create( propertyTypes: Array, + // TODO: Remove Option argument and Partial<> in v.17.0 [NL] + createArgs?: Partial, ): Promise> { + // + // TODO: Clean up warnings in v.17.0 [NL] + this.#baseCreateArgs = { + entityType: + createArgs?.entityType ?? + 'needs to be parsed to the UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', + entityUnique: + createArgs?.entityUnique ?? + 'needs to be parsed to the UmbPropertyValuePresetBuilderController, this is not present because of a custom legacy implementation', + entityTypeUnique: createArgs?.entityTypeUnique, + }; + + if (!createArgs?.entityUnique || !createArgs?.entityType) { + console.warn( + `entityUnique or entityType was not provided for UmbPropertyValuePresetBuilderController.create in the second argument. This will be required in v.17.0 and must be provided when calling create().`, + ); + } + const result = await Promise.all(propertyTypes.map(this.#createPropertyPreset)); //Merge all the values into a single array: @@ -87,9 +111,17 @@ export class UmbPropertyValuePresetBuilderController< protected async _generatePropertyValue( apis: Array, propertyType: UmbPropertyTypePresetModel | UmbPropertyTypePresetWithSchemaAliasModel, - callArgs: UmbPropertyValuePresetApiCallArgs, + incomingCallArgs: Partial, ): Promise { let value: unknown = undefined; + + const callArgs: UmbPropertyValuePresetApiCallArgs = { + ...this.#baseCreateArgs!, + alias: propertyType.alias, + propertyEditorUiAlias: propertyType.propertyEditorUiAlias, + propertyEditorSchemaAlias: (propertyType as UmbPropertyTypePresetWithSchemaAliasModel).propertyEditorSchemaAlias, + ...incomingCallArgs, + }; // Important to use a inline for loop, to secure that each entry is processed(asynchronously) in order for (const api of apis) { if (!api.processValue) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts index 74f04d849e..dda4302a4c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.test.ts @@ -63,7 +63,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(2); expect(result[0]?.value).to.be.equal('value for culture cultureA'); @@ -86,7 +89,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { ]; try { - await ctrl.create(propertyTypes); + await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect.fail('Expected to fail'); } catch (e) {} }); @@ -105,7 +111,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(3); expect(result[0]?.value).to.be.equal('value for culture invariant'); @@ -132,7 +141,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(1); expect(result[0]?.value).to.be.equal('value for culture invariant'); @@ -155,7 +167,10 @@ describe('UmbPropertyValuePresetVariantBuilderController', () => { }, ]; - const result = await ctrl.create(propertyTypes); + const result = await ctrl.create(propertyTypes, { + entityType: 'test', + entityUnique: 'some-unique', + }); expect(result.length).to.be.equal(6); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts index ab5a4aa358..80370c44ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/property-value-preset-variant-builder.controller.ts @@ -14,6 +14,8 @@ export class UmbPropertyValuePresetVariantBuilderController extends UmbPropertyV // Always declare the default segment (null) #segments: Array = [null]; + // TODO: We properly need to break this, as Engage needs to control which Segments are available for each culture, maybe investigate the option to go about a new option to just parse options.? Break in v.17.0 [NL] + setCultures(cultures: Array): void { this.#cultures = cultures; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts index de87eed766..c749e53612 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property-value-preset/types.ts @@ -33,7 +33,17 @@ export interface UmbPropertyTypePresetModelTypeModel { variesByCulture?: boolean; variesBySegment?: boolean; } -export interface UmbPropertyValuePresetApiCallArgs { + +export interface UmbPropertyValuePresetApiCallArgsEntityBase { + entityType: string; + entityUnique: string; + entityTypeUnique?: string; +} + +export interface UmbPropertyValuePresetApiCallArgs extends UmbPropertyValuePresetApiCallArgsEntityBase { + alias: string; + propertyEditorUiAlias: string; + propertyEditorSchemaAlias?: string; variantId?: UmbVariantId; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts index 49a3077adc..29300a4ee5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/extensions/italic/italic.tiptap-api.ts @@ -4,4 +4,3 @@ import { Italic } from '@umbraco-cms/backoffice/external/tiptap'; export default class UmbTiptapItalicExtensionApi extends UmbTiptapExtensionApiBase { getTiptapExtensions = () => [Italic]; } - From f6d0667e9152f5d57dc9d0375052211634857b2f Mon Sep 17 00:00:00 2001 From: Nicklas Kramer Date: Tue, 16 Sep 2025 13:40:48 +0200 Subject: [PATCH 04/15] V16 - Renaming signs to flags (#20109) * Renaming the providers, collection builder and model * Renaming the items using signs * Renaming in controllers * Renaming mapping flags * Renaming sign tests to flags * Changing the test files names from signs to flags * Updated a couple more references. --------- Co-authored-by: Andy Butland --- .../ContentCollectionControllerBase.cs | 10 +- .../Tree/AncestorsDataTypeTreeController.cs | 6 +- .../Tree/ChildrenDataTypeTreeController.cs | 6 +- .../Tree/DataTypeTreeControllerBase.cs | 8 +- .../Tree/RootDataTypeTreeController.cs | 6 +- .../Tree/SiblingsDataTypeTreeController.cs | 6 +- .../Tree/AncestorsDictionaryTreeController.cs | 6 +- .../Tree/ChildrenDictionaryTreeController.cs | 6 +- .../Tree/DictionaryTreeControllerBase.cs | 8 +- .../Tree/RootDictionaryTreeController.cs | 6 +- .../ByKeyDocumentCollectionController.cs | 8 +- .../DocumentCollectionControllerBase.cs | 6 +- .../Item/ItemDocumentItemController.cs | 2 - .../Tree/AncestorsDocumentTreeController.cs | 6 +- .../Tree/ChildrenDocumentTreeController.cs | 6 +- .../Tree/DocumentTreeControllerBase.cs | 8 +- .../Tree/RootDocumentTreeController.cs | 6 +- .../Tree/SiblingsDocumentTreeController.cs | 6 +- ...ncestorsDocumentBlueprintTreeController.cs | 6 +- ...ChildrenDocumentBlueprintTreeController.cs | 6 +- .../DocumentBlueprintTreeControllerBase.cs | 8 +- .../RootDocumentBlueprintTreeController.cs | 6 +- ...SiblingsDocumentBlueprintTreeController.cs | 6 +- .../AncestorsDocumentTypeTreeController.cs | 6 +- .../ChildrenDocumentTypeTreeController.cs | 6 +- .../Tree/DocumentTypeTreeControllerBase.cs | 8 +- .../Tree/RootDocumentTypeTreeController.cs | 6 +- .../SiblingsDocumentTypeTreeController.cs | 6 +- .../ByKeyMediaCollectionController.cs | 8 +- .../MediaCollectionControllerBase.cs | 6 +- .../Media/Item/ItemMediaItemController.cs | 18 +- .../Tree/AncestorsMediaTreeController.cs | 6 +- .../Media/Tree/ChildrenMediaTreeController.cs | 6 +- .../Media/Tree/MediaTreeControllerBase.cs | 8 +- .../Media/Tree/RootMediaTreeController.cs | 6 +- .../Media/Tree/SiblingsMediaTreeController.cs | 6 +- .../Tree/AncestorsMediaTypeTreeController.cs | 6 +- .../Tree/ChildrenMediaTypeTreeController.cs | 6 +- .../Tree/MediaTypeTreeControllerBase.cs | 8 +- .../Tree/RootMediaTypeTreeController.cs | 6 +- .../Tree/SiblingsMediaTypeTreeController.cs | 6 +- .../Tree/MemberGroupTreeControllerBase.cs | 6 +- .../Tree/RootMemberGroupTreeController.cs | 6 +- .../Tree/MemberTypeTreeControllerBase.cs | 8 +- .../Tree/RootMemberTypeTreeController.cs | 6 +- .../Tree/AncestorsTemplateTreeController.cs | 6 +- .../Tree/ChildrenTemplateTreeController.cs | 6 +- .../Tree/RootTemplateTreeController.cs | 6 +- .../Tree/SiblingsTemplateTreeController.cs | 6 +- .../Tree/TemplateTreeControllerBase.cs | 6 +- .../Tree/EntityTreeControllerBase.cs | 24 +- .../Tree/FolderTreeControllerBase.cs | 8 +- .../Tree/NamedEntityTreeControllerBase.cs | 6 +- .../Tree/UserStartNodeTreeControllerBase.cs | 8 +- .../UmbracoBuilder.Collections.cs | 14 +- .../ContentCollectionPresentationFactory.cs | 18 +- .../Factories/DocumentPresentationFactory.cs | 28 +- .../Mapping/Document/DocumentMapDefinition.cs | 8 +- .../DocumentType/DocumentTypeMapDefinition.cs | 2 +- .../Mapping/Item/ItemTypeMapDefinition.cs | 20 +- .../Mapping/Media/MediaMapDefinition.cs | 4 +- .../Mapping/Member/MemberMapDefinition.cs | 2 +- src/Umbraco.Cms.Api.Management/OpenApi.json | 373 ++++++++++++------ .../Services/Flags/FlagProviderCollection.cs | 18 + .../Flags/FlagProviderCollectionBuilder.cs | 12 + .../HasCollectionFlagProvider.cs} | 18 +- .../HasPendingChangesFlagProvider.cs} | 18 +- .../HasScheduleFlagProvider.cs} | 26 +- .../Services/Flags/IFlagProvider.cs | 23 ++ .../IsProtectedFlagProvider.cs} | 18 +- .../Services/Signs/ISignProvider.cs | 23 -- .../Services/Signs/SignProviderCollection.cs | 18 - .../Signs/SignProviderCollectionBuilder.cs | 12 - .../Content/ContentResponseModelBase.cs | 16 +- .../DocumentCollectionResponseModel.cs | 2 +- .../DocumentVariantItemResponseModel.cs | 16 +- .../Document/DocumentVariantResponseModel.cs | 16 +- .../ViewModels/{SignModel.cs => FlagModel.cs} | 2 +- .../ViewModels/{IHasSigns.cs => IHasFlags.cs} | 16 +- .../ViewModels/Item/ItemResponseModelBase.cs | 16 +- .../Tree/EntityTreeItemResponseModel.cs | 16 +- src/Umbraco.Core/Constants-Conventions.cs | 6 +- .../Flags/HasCollectionFlagProviderTests.cs | 196 +++++++++ .../HasPendingChangesFlagProviderTests.cs | 83 ++++ .../HasScheduleFlagProviderTests.cs} | 72 ++-- .../Flags/IsProtectedFlagProviderTests.cs | 92 +++++ .../Signs/HasCollectionSignProviderTests.cs | 196 --------- .../HasPendingChangesSignProviderTests.cs | 86 ---- .../Signs/IsProtectedSignProviderTests.cs | 92 ----- 89 files changed, 1036 insertions(+), 920 deletions(-) create mode 100644 src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollection.cs create mode 100644 src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollectionBuilder.cs rename src/Umbraco.Cms.Api.Management/Services/{Signs/HasCollectionSignProvider.cs => Flags/HasCollectionFlagProvider.cs} (79%) rename src/Umbraco.Cms.Api.Management/Services/{Signs/HasPendingChangesSignProvider.cs => Flags/HasPendingChangesFlagProvider.cs} (69%) rename src/Umbraco.Cms.Api.Management/Services/{Signs/HasScheduleSignProvider.cs => Flags/HasScheduleFlagProvider.cs} (86%) create mode 100644 src/Umbraco.Cms.Api.Management/Services/Flags/IFlagProvider.cs rename src/Umbraco.Cms.Api.Management/Services/{Signs/IsProtectedSignProvider.cs => Flags/IsProtectedFlagProvider.cs} (52%) delete mode 100644 src/Umbraco.Cms.Api.Management/Services/Signs/ISignProvider.cs delete mode 100644 src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollection.cs delete mode 100644 src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollectionBuilder.cs rename src/Umbraco.Cms.Api.Management/ViewModels/{SignModel.cs => FlagModel.cs} (81%) rename src/Umbraco.Cms.Api.Management/ViewModels/{IHasSigns.cs => IHasFlags.cs} (58%) create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProviderTests.cs create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProviderTests.cs rename tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/{Signs/HasScheduleSignProviderTests.cs => Flags/HasScheduleFlagProviderTests.cs} (75%) create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProviderTests.cs delete mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProviderTests.cs delete mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProviderTests.cs delete mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProviderTests.cs diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentCollectionControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentCollectionControllerBase.cs index e41f16cee6..d3a4123923 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentCollectionControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Content/ContentCollectionControllerBase.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Mapping; @@ -21,17 +21,17 @@ public abstract class ContentCollectionControllerBase()) + : this(mapper, StaticServiceProvider.Instance.GetRequiredService()) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/AncestorsDataTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/AncestorsDataTypeTreeController.cs index b3a103a01a..15a1c749f5 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/AncestorsDataTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/AncestorsDataTypeTreeController.cs @@ -2,7 +2,7 @@ using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -18,8 +18,8 @@ public class AncestorsDataTypeTreeController : DataTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public AncestorsDataTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IDataTypeService dataTypeService) - : base(entityService, signProviders, dataTypeService) + public AncestorsDataTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDataTypeService dataTypeService) + : base(entityService, flagProviders, dataTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/ChildrenDataTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/ChildrenDataTypeTreeController.cs index 7c801530ac..6b9e0611aa 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/ChildrenDataTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/ChildrenDataTypeTreeController.cs @@ -5,7 +5,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; namespace Umbraco.Cms.Api.Management.Controllers.DataType.Tree; @@ -19,8 +19,8 @@ public class ChildrenDataTypeTreeController : DataTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public ChildrenDataTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IDataTypeService dataTypeService) - : base(entityService, signProviders, dataTypeService) + public ChildrenDataTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDataTypeService dataTypeService) + : base(entityService, flagProviders, dataTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/DataTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/DataTypeTreeControllerBase.cs index f0dbb8a8ec..e3bcf686b4 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/DataTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/DataTypeTreeControllerBase.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -26,13 +26,13 @@ public class DataTypeTreeControllerBase : FolderTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), dataTypeService) { } - public DataTypeTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IDataTypeService dataTypeService) - : base(entityService, signProviders) => + public DataTypeTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IDataTypeService dataTypeService) + : base(entityService, flagProviders) => _dataTypeService = dataTypeService; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.DataType; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/RootDataTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/RootDataTypeTreeController.cs index fa1b5c7bfb..d4b5e5ef87 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/RootDataTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/RootDataTypeTreeController.cs @@ -5,7 +5,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; namespace Umbraco.Cms.Api.Management.Controllers.DataType.Tree; @@ -19,8 +19,8 @@ public class RootDataTypeTreeController : DataTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootDataTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IDataTypeService dataTypeService) - : base(entityService, signProviders, dataTypeService) + public RootDataTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDataTypeService dataTypeService) + : base(entityService, flagProviders, dataTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/SiblingsDataTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/SiblingsDataTypeTreeController.cs index fcc496e71d..8cd7577a96 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/SiblingsDataTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DataType/Tree/SiblingsDataTypeTreeController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -17,8 +17,8 @@ public class SiblingsDataTypeTreeController : DataTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public SiblingsDataTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IDataTypeService dataTypeService) - : base(entityService, signProviders, dataTypeService) + public SiblingsDataTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDataTypeService dataTypeService) + : base(entityService, flagProviders, dataTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/AncestorsDictionaryTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/AncestorsDictionaryTreeController.cs index f7c94de4db..49806ed810 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/AncestorsDictionaryTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/AncestorsDictionaryTreeController.cs @@ -2,7 +2,7 @@ using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -18,8 +18,8 @@ public class AncestorsDictionaryTreeController : DictionaryTreeControllerBase } [ActivatorUtilitiesConstructor] - public AncestorsDictionaryTreeController(IEntityService entityService, SignProviderCollection signProviders, IDictionaryItemService dictionaryItemService) - : base(entityService, signProviders, dictionaryItemService) + public AncestorsDictionaryTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDictionaryItemService dictionaryItemService) + : base(entityService, flagProviders, dictionaryItemService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/ChildrenDictionaryTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/ChildrenDictionaryTreeController.cs index 39c135be2b..9db33dca66 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/ChildrenDictionaryTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/ChildrenDictionaryTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -20,8 +20,8 @@ public class ChildrenDictionaryTreeController : DictionaryTreeControllerBase } [ActivatorUtilitiesConstructor] - public ChildrenDictionaryTreeController(IEntityService entityService, SignProviderCollection signProviders, IDictionaryItemService dictionaryItemService) - : base(entityService, signProviders, dictionaryItemService) + public ChildrenDictionaryTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDictionaryItemService dictionaryItemService) + : base(entityService, flagProviders, dictionaryItemService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/DictionaryTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/DictionaryTreeControllerBase.cs index 6533370245..ce48279d7d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/DictionaryTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/DictionaryTreeControllerBase.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; @@ -25,13 +25,13 @@ public class DictionaryTreeControllerBase : NamedEntityTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), dictionaryItemService) { } - public DictionaryTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IDictionaryItemService dictionaryItemService) - : base(entityService, signProviders) => + public DictionaryTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IDictionaryItemService dictionaryItemService) + : base(entityService, flagProviders) => DictionaryItemService = dictionaryItemService; // dictionary items do not currently have a known UmbracoObjectType, so we'll settle with Unknown for now diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/RootDictionaryTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/RootDictionaryTreeController.cs index 7bac1e66a8..e7b79b2fe2 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/RootDictionaryTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Dictionary/Tree/RootDictionaryTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class RootDictionaryTreeController : DictionaryTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootDictionaryTreeController(IEntityService entityService, SignProviderCollection signProviders, IDictionaryItemService dictionaryItemService) - : base(entityService, signProviders, dictionaryItemService) + public RootDictionaryTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDictionaryItemService dictionaryItemService) + : base(entityService, flagProviders, dictionaryItemService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/ByKeyDocumentCollectionController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/ByKeyDocumentCollectionController.cs index 83ef32972c..612322ef3d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/ByKeyDocumentCollectionController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/ByKeyDocumentCollectionController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -29,8 +29,8 @@ public class ByKeyDocumentCollectionController : DocumentCollectionControllerBas IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IUmbracoMapper mapper, IDocumentCollectionPresentationFactory documentCollectionPresentationFactory, - SignProviderCollection signProviders) - : base(mapper, signProviders) + FlagProviderCollection flagProviders) + : base(mapper, flagProviders) { _contentListViewService = contentListViewService; _backOfficeSecurityAccessor = backOfficeSecurityAccessor; @@ -48,7 +48,7 @@ public class ByKeyDocumentCollectionController : DocumentCollectionControllerBas backOfficeSecurityAccessor, mapper, documentCollectionPresentationFactory, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService()) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/DocumentCollectionControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/DocumentCollectionControllerBase.cs index 8de4daa401..86b79abe7d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/DocumentCollectionControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Collection/DocumentCollectionControllerBase.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Controllers.Content; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Document; using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; using Umbraco.Cms.Core; @@ -18,8 +18,8 @@ namespace Umbraco.Cms.Api.Management.Controllers.Document.Collection; [Authorize(Policy = AuthorizationPolicies.TreeAccessDocuments)] public abstract class DocumentCollectionControllerBase : ContentCollectionControllerBase { - protected DocumentCollectionControllerBase(IUmbracoMapper mapper, SignProviderCollection signProviders) - : base(mapper, signProviders) + protected DocumentCollectionControllerBase(IUmbracoMapper mapper, FlagProviderCollection flagProviders) + : base(mapper, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/ItemDocumentItemController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/ItemDocumentItemController.cs index d65183c824..fbe4e2f7d9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/ItemDocumentItemController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Item/ItemDocumentItemController.cs @@ -3,9 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; using Umbraco.Cms.Api.Management.ViewModels.Document.Item; -using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Services; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/AncestorsDocumentTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/AncestorsDocumentTreeController.cs index 5e3c347d00..1d0ab51402 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/AncestorsDocumentTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/AncestorsDocumentTreeController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -38,7 +38,7 @@ public class AncestorsDocumentTreeController : DocumentTreeControllerBase [ActivatorUtilitiesConstructor] public AncestorsDocumentTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, IPublicAccessService publicAccessService, @@ -47,7 +47,7 @@ public class AncestorsDocumentTreeController : DocumentTreeControllerBase IDocumentPresentationFactory documentPresentationFactory) : base( entityService, - signProviders, + flagProviders, userStartNodeEntitiesService, dataTypeService, publicAccessService, diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/ChildrenDocumentTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/ChildrenDocumentTreeController.cs index 76bcb70deb..c124929ff1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/ChildrenDocumentTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/ChildrenDocumentTreeController.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -39,7 +39,7 @@ public class ChildrenDocumentTreeController : DocumentTreeControllerBase [ActivatorUtilitiesConstructor] public ChildrenDocumentTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, IPublicAccessService publicAccessService, @@ -48,7 +48,7 @@ public class ChildrenDocumentTreeController : DocumentTreeControllerBase IDocumentPresentationFactory documentPresentationFactory) : base( entityService, - signProviders, + flagProviders, userStartNodeEntitiesService, dataTypeService, publicAccessService, diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/DocumentTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/DocumentTreeControllerBase.cs index a2015d7c76..11e205c39f 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/DocumentTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/DocumentTreeControllerBase.cs @@ -5,7 +5,7 @@ using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Routing; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; @@ -40,7 +40,7 @@ public abstract class DocumentTreeControllerBase : UserStartNodeTreeControllerBa IDocumentPresentationFactory documentPresentationFactory) : this( entityService, - StaticServiceProvider.Instance.GetRequiredService(), + StaticServiceProvider.Instance.GetRequiredService(), userStartNodeEntitiesService, dataTypeService, publicAccessService, @@ -53,14 +53,14 @@ public abstract class DocumentTreeControllerBase : UserStartNodeTreeControllerBa [ActivatorUtilitiesConstructor] protected DocumentTreeControllerBase( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, IPublicAccessService publicAccessService, AppCaches appCaches, IBackOfficeSecurityAccessor backofficeSecurityAccessor, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders, userStartNodeEntitiesService, dataTypeService) + : base(entityService, flagProviders, userStartNodeEntitiesService, dataTypeService) { _publicAccessService = publicAccessService; _appCaches = appCaches; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/RootDocumentTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/RootDocumentTreeController.cs index 822679e581..42a9734a23 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/RootDocumentTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/RootDocumentTreeController.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -39,7 +39,7 @@ public class RootDocumentTreeController : DocumentTreeControllerBase [ActivatorUtilitiesConstructor] public RootDocumentTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, IPublicAccessService publicAccessService, @@ -48,7 +48,7 @@ public class RootDocumentTreeController : DocumentTreeControllerBase IDocumentPresentationFactory documentPresentationFactory) : base( entityService, - signProviders, + flagProviders, userStartNodeEntitiesService, dataTypeService, publicAccessService, diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/SiblingsDocumentTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/SiblingsDocumentTreeController.cs index d9e591b664..088e778aea 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/SiblingsDocumentTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/SiblingsDocumentTreeController.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -39,7 +39,7 @@ public class SiblingsDocumentTreeController : DocumentTreeControllerBase [ActivatorUtilitiesConstructor] public SiblingsDocumentTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, IPublicAccessService publicAccessService, @@ -48,7 +48,7 @@ public class SiblingsDocumentTreeController : DocumentTreeControllerBase IDocumentPresentationFactory documentPresentationFactory) : base( entityService, - signProviders, + flagProviders, userStartNodeEntitiesService, dataTypeService, publicAccessService, diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/AncestorsDocumentBlueprintTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/AncestorsDocumentBlueprintTreeController.cs index c3d155e54c..060efbdc7d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/AncestorsDocumentBlueprintTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/AncestorsDocumentBlueprintTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class AncestorsDocumentBlueprintTreeController : DocumentBlueprintTreeCon } [ActivatorUtilitiesConstructor] - public AncestorsDocumentBlueprintTreeController(IEntityService entityService, SignProviderCollection signProviders, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders, documentPresentationFactory) + public AncestorsDocumentBlueprintTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDocumentPresentationFactory documentPresentationFactory) + : base(entityService, flagProviders, documentPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/ChildrenDocumentBlueprintTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/ChildrenDocumentBlueprintTreeController.cs index 7f2f3ea226..eea5bbf488 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/ChildrenDocumentBlueprintTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/ChildrenDocumentBlueprintTreeController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -20,8 +20,8 @@ public class ChildrenDocumentBlueprintTreeController : DocumentBlueprintTreeCont } [ActivatorUtilitiesConstructor] - public ChildrenDocumentBlueprintTreeController(IEntityService entityService, SignProviderCollection signProviders, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders, documentPresentationFactory) + public ChildrenDocumentBlueprintTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDocumentPresentationFactory documentPresentationFactory) + : base(entityService, flagProviders, documentPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/DocumentBlueprintTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/DocumentBlueprintTreeControllerBase.cs index 3a02abb6f0..ad6330498e 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/DocumentBlueprintTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/DocumentBlueprintTreeControllerBase.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -26,13 +26,13 @@ public class DocumentBlueprintTreeControllerBase : FolderTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), documentPresentationFactory) { } - public DocumentBlueprintTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders) + public DocumentBlueprintTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IDocumentPresentationFactory documentPresentationFactory) + : base(entityService, flagProviders) => _documentPresentationFactory = documentPresentationFactory; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.DocumentBlueprint; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/RootDocumentBlueprintTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/RootDocumentBlueprintTreeController.cs index b2a8bfa9cf..ee533399f0 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/RootDocumentBlueprintTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/RootDocumentBlueprintTreeController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -20,8 +20,8 @@ public class RootDocumentBlueprintTreeController : DocumentBlueprintTreeControll } [ActivatorUtilitiesConstructor] - public RootDocumentBlueprintTreeController(IEntityService entityService, SignProviderCollection signProviders, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders, documentPresentationFactory) + public RootDocumentBlueprintTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDocumentPresentationFactory documentPresentationFactory) + : base(entityService, flagProviders, documentPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/SiblingsDocumentBlueprintTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/SiblingsDocumentBlueprintTreeController.cs index c6592c5dda..43feb758c8 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/SiblingsDocumentBlueprintTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentBlueprint/Tree/SiblingsDocumentBlueprintTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -18,8 +18,8 @@ public class SiblingsDocumentBlueprintTreeController : DocumentBlueprintTreeCont } [ActivatorUtilitiesConstructor] - public SiblingsDocumentBlueprintTreeController(IEntityService entityService, SignProviderCollection signProviders, IDocumentPresentationFactory documentPresentationFactory) - : base(entityService, signProviders, documentPresentationFactory) + public SiblingsDocumentBlueprintTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IDocumentPresentationFactory documentPresentationFactory) + : base(entityService, flagProviders, documentPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/AncestorsDocumentTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/AncestorsDocumentTypeTreeController.cs index 02bb34403f..5d3598fa50 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/AncestorsDocumentTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/AncestorsDocumentTypeTreeController.cs @@ -2,7 +2,7 @@ using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -18,8 +18,8 @@ public class AncestorsDocumentTypeTreeController : DocumentTypeTreeControllerBas } [ActivatorUtilitiesConstructor] - public AncestorsDocumentTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IContentTypeService contentTypeService) - : base(entityService, signProviders, contentTypeService) + public AncestorsDocumentTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IContentTypeService contentTypeService) + : base(entityService, flagProviders, contentTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/ChildrenDocumentTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/ChildrenDocumentTypeTreeController.cs index 9127a359d3..950f5c73d2 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/ChildrenDocumentTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/ChildrenDocumentTypeTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class ChildrenDocumentTypeTreeController : DocumentTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public ChildrenDocumentTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IContentTypeService contentTypeService) - : base(entityService, signProviders, contentTypeService) + public ChildrenDocumentTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IContentTypeService contentTypeService) + : base(entityService, flagProviders, contentTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/DocumentTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/DocumentTypeTreeControllerBase.cs index a76fd49ee8..58d826ffe4 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/DocumentTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/DocumentTypeTreeControllerBase.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -25,13 +25,13 @@ public class DocumentTypeTreeControllerBase : FolderTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), contentTypeService) { } - public DocumentTypeTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IContentTypeService contentTypeService) - : base(entityService, signProviders) => + public DocumentTypeTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IContentTypeService contentTypeService) + : base(entityService, flagProviders) => _contentTypeService = contentTypeService; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.DocumentType; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/RootDocumentTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/RootDocumentTypeTreeController.cs index b581b7bbb4..d8a0e7c3d1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/RootDocumentTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/RootDocumentTypeTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class RootDocumentTypeTreeController : DocumentTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootDocumentTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IContentTypeService contentTypeService) - : base(entityService, signProviders, contentTypeService) + public RootDocumentTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IContentTypeService contentTypeService) + : base(entityService, flagProviders, contentTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/SiblingsDocumentTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/SiblingsDocumentTypeTreeController.cs index 3ecce3e383..0a930e434e 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/SiblingsDocumentTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/DocumentType/Tree/SiblingsDocumentTypeTreeController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -17,8 +17,8 @@ public class SiblingsDocumentTypeTreeController : DocumentTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public SiblingsDocumentTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IContentTypeService contentTypeService) - : base(entityService, signProviders, contentTypeService) + public SiblingsDocumentTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IContentTypeService contentTypeService) + : base(entityService, flagProviders, contentTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/ByKeyMediaCollectionController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/ByKeyMediaCollectionController.cs index 7029e9311d..acb8d075ff 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/ByKeyMediaCollectionController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/ByKeyMediaCollectionController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Media.Collection; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -29,8 +29,8 @@ public class ByKeyMediaCollectionController : MediaCollectionControllerBase IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IUmbracoMapper mapper, IMediaCollectionPresentationFactory mediaCollectionPresentationFactory, - SignProviderCollection signProviders) - : base(mapper, signProviders) + FlagProviderCollection flagProviders) + : base(mapper, flagProviders) { _mediaListViewService = mediaListViewService; _backOfficeSecurityAccessor = backOfficeSecurityAccessor; @@ -48,7 +48,7 @@ public class ByKeyMediaCollectionController : MediaCollectionControllerBase backOfficeSecurityAccessor, mapper, mediaCollectionPresentationFactory, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService()) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/MediaCollectionControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/MediaCollectionControllerBase.cs index 875c65c7ac..44510a5451 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/MediaCollectionControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Collection/MediaCollectionControllerBase.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Content; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; using Umbraco.Cms.Api.Management.ViewModels.Media; using Umbraco.Cms.Api.Management.ViewModels.Media.Collection; @@ -21,8 +21,8 @@ namespace Umbraco.Cms.Api.Management.Controllers.Media.Collection; [Authorize(Policy = AuthorizationPolicies.SectionAccessMedia)] public abstract class MediaCollectionControllerBase : ContentCollectionControllerBase { - protected MediaCollectionControllerBase(IUmbracoMapper mapper, SignProviderCollection signProviders) - : base(mapper, signProviders) + protected MediaCollectionControllerBase(IUmbracoMapper mapper, FlagProviderCollection flagProviders) + : base(mapper, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/ItemMediaItemController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/ItemMediaItemController.cs index bd8684e7a0..056377a015 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/ItemMediaItemController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Item/ItemMediaItemController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Factories; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Document.Item; using Umbraco.Cms.Api.Management.ViewModels.Media.Item; using Umbraco.Cms.Core.DependencyInjection; @@ -19,22 +19,22 @@ public class ItemMediaItemController : MediaItemControllerBase { private readonly IEntityService _entityService; private readonly IMediaPresentationFactory _mediaPresentationFactory; - private readonly SignProviderCollection _signProviders; + private readonly FlagProviderCollection _flagProviders; [ActivatorUtilitiesConstructor] public ItemMediaItemController( IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory, - SignProviderCollection signProvider) + FlagProviderCollection flagProviders) { _entityService = entityService; _mediaPresentationFactory = mediaPresentationFactory; - _signProviders = signProvider; + _flagProviders = flagProviders; } [Obsolete("Please use the constructor with all parameters. Scheduled for removal in Umbraco 18")] public ItemMediaItemController(IEntityService entityService, IMediaPresentationFactory mediaPresentationFactory) - : this(entityService, mediaPresentationFactory, StaticServiceProvider.Instance.GetRequiredService()) + : this(entityService, mediaPresentationFactory, StaticServiceProvider.Instance.GetRequiredService()) { } @@ -55,16 +55,16 @@ public class ItemMediaItemController : MediaItemControllerBase .OfType(); IEnumerable responseModels = media.Select(_mediaPresentationFactory.CreateItemResponseModel); - await PopulateSigns(responseModels); + await PopulateFlags(responseModels); return Ok(responseModels); } - private async Task PopulateSigns(IEnumerable itemViewModels) + private async Task PopulateFlags(IEnumerable itemViewModels) { - foreach (ISignProvider signProvider in _signProviders.Where(x => x.CanProvideSigns())) + foreach (IFlagProvider signProvider in _flagProviders.Where(x => x.CanProvideFlags())) { - await signProvider.PopulateSignsAsync(itemViewModels); + await signProvider.PopulateFlagsAsync(itemViewModels); } } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/AncestorsMediaTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/AncestorsMediaTreeController.cs index bf5bade404..80c38d7bd7 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/AncestorsMediaTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/AncestorsMediaTreeController.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -30,13 +30,13 @@ public class AncestorsMediaTreeController : MediaTreeControllerBase [ActivatorUtilitiesConstructor] public AncestorsMediaTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, AppCaches appCaches, IBackOfficeSecurityAccessor backofficeSecurityAccessor, IMediaPresentationFactory mediaPresentationFactory) - : base(entityService, signProviders, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory) + : base(entityService, flagProviders, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/ChildrenMediaTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/ChildrenMediaTreeController.cs index c61de0a65b..d6e243d2c3 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/ChildrenMediaTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/ChildrenMediaTreeController.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; @@ -31,13 +31,13 @@ public class ChildrenMediaTreeController : MediaTreeControllerBase [ActivatorUtilitiesConstructor] public ChildrenMediaTreeController( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService, AppCaches appCaches, IBackOfficeSecurityAccessor backofficeSecurityAccessor, IMediaPresentationFactory mediaPresentationFactory) - : base(entityService, signProviders, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory) + : base(entityService, flagProviders, userStartNodeEntitiesService, dataTypeService, appCaches, backofficeSecurityAccessor, mediaPresentationFactory) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/MediaTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/MediaTreeControllerBase.cs index f3283466c4..4990c1aaff 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/MediaTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Media/Tree/MediaTreeControllerBase.cs @@ -5,7 +5,7 @@ using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.Routing; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; @@ -37,7 +37,7 @@ public class MediaTreeControllerBase : UserStartNodeTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), userStartNodeEntitiesService, dataTypeService, appCaches, @@ -49,13 +49,13 @@ public class MediaTreeControllerBase : UserStartNodeTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), mediaTypeService) { } - public MediaTypeTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IMediaTypeService mediaTypeService) - : base(entityService, signProviders) => + public MediaTypeTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IMediaTypeService mediaTypeService) + : base(entityService, flagProviders) => _mediaTypeService = mediaTypeService; protected override UmbracoObjectTypes ItemObjectType => UmbracoObjectTypes.MediaType; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/RootMediaTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/RootMediaTypeTreeController.cs index 3def7719cf..f8b78a6f40 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/RootMediaTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/RootMediaTypeTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class RootMediaTypeTreeController : MediaTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootMediaTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IMediaTypeService mediaTypeService) - : base(entityService, signProviders, mediaTypeService) + public RootMediaTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IMediaTypeService mediaTypeService) + : base(entityService, flagProviders, mediaTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/SiblingsMediaTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/SiblingsMediaTypeTreeController.cs index 5e873fb9cc..61686ee5cb 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/SiblingsMediaTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MediaType/Tree/SiblingsMediaTypeTreeController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -17,8 +17,8 @@ public class SiblingsMediaTypeTreeController : MediaTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public SiblingsMediaTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IMediaTypeService mediaTypeService) - : base(entityService, signProviders, mediaTypeService) + public SiblingsMediaTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IMediaTypeService mediaTypeService) + : base(entityService, flagProviders, mediaTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberGroup/Tree/MemberGroupTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberGroup/Tree/MemberGroupTreeControllerBase.cs index 90ef8d12d9..f227ab2b5a 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberGroup/Tree/MemberGroupTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberGroup/Tree/MemberGroupTreeControllerBase.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; @@ -22,8 +22,8 @@ public class MemberGroupTreeControllerBase : NamedEntityTreeControllerBase(), + StaticServiceProvider.Instance.GetRequiredService(), memberTypeService) { } - public MemberTypeTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders, IMemberTypeService memberTypeService) - : base(entityService, signProviders) => + public MemberTypeTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders, IMemberTypeService memberTypeService) + : base(entityService, flagProviders) => _memberTypeService = memberTypeService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs index 4ce9248ecc..2b4e89e175 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/RootMemberTypeTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class RootMemberTypeTreeController : MemberTypeTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootMemberTypeTreeController(IEntityService entityService, SignProviderCollection signProviders, IMemberTypeService memberTypeService) - : base(entityService, signProviders, memberTypeService) + public RootMemberTypeTreeController(IEntityService entityService, FlagProviderCollection flagProviders, IMemberTypeService memberTypeService) + : base(entityService, flagProviders, memberTypeService) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/AncestorsTemplateTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/AncestorsTemplateTreeController.cs index 943aeba37f..ea1e5fd6ff 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/AncestorsTemplateTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/AncestorsTemplateTreeController.cs @@ -2,7 +2,7 @@ using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -18,8 +18,8 @@ public class AncestorsTemplateTreeController : TemplateTreeControllerBase } [ActivatorUtilitiesConstructor] - public AncestorsTemplateTreeController(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) + public AncestorsTemplateTreeController(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/ChildrenTemplateTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/ChildrenTemplateTreeController.cs index 030be7d062..3a98881af9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/ChildrenTemplateTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/ChildrenTemplateTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class ChildrenTemplateTreeController : TemplateTreeControllerBase } [ActivatorUtilitiesConstructor] - public ChildrenTemplateTreeController(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) + public ChildrenTemplateTreeController(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/RootTemplateTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/RootTemplateTreeController.cs index 871fdcf368..4118cd261a 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/RootTemplateTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/RootTemplateTreeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -19,8 +19,8 @@ public class RootTemplateTreeController : TemplateTreeControllerBase } [ActivatorUtilitiesConstructor] - public RootTemplateTreeController(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) + public RootTemplateTreeController(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/SiblingsTemplateTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/SiblingsTemplateTreeController.cs index 542014c042..336f94997a 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/SiblingsTemplateTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/SiblingsTemplateTreeController.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Services; @@ -17,8 +17,8 @@ public class SiblingsTemplateTreeController : TemplateTreeControllerBase } [ActivatorUtilitiesConstructor] - public SiblingsTemplateTreeController(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) + public SiblingsTemplateTreeController(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/TemplateTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/TemplateTreeControllerBase.cs index aa65c4f7a5..385189aa69 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/TemplateTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Template/Tree/TemplateTreeControllerBase.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; @@ -22,8 +22,8 @@ public class TemplateTreeControllerBase : NamedEntityTreeControllerBase : ManagementApiControllerBase where TItem : EntityTreeItemResponseModel, new() { - private readonly SignProviderCollection _signProviders; + private readonly FlagProviderCollection _flagProviders; [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] protected EntityTreeControllerBase(IEntityService entityService) : this( entityService, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService()) { } - protected EntityTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders) + protected EntityTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders) { EntityService = entityService; - _signProviders = signProviders; + _flagProviders = flagProviders; } protected IEntityService EntityService { get; } @@ -44,7 +44,7 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB TItem[] treeItemViewModels = MapTreeItemViewModels(null, rootEntities); - await PopulateSigns(treeItemViewModels); + await PopulateFlags(treeItemViewModels); PagedViewModel result = PagedViewModel(treeItemViewModels, totalItems); @@ -57,7 +57,7 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB TItem[] treeItemViewModels = MapTreeItemViewModels(parentId, children); - await PopulateSigns(treeItemViewModels); + await PopulateFlags(treeItemViewModels); PagedViewModel result = PagedViewModel(treeItemViewModels, totalItems); @@ -77,7 +77,7 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB TItem[] treeItemViewModels = MapTreeItemViewModels(parentKey, siblings); - await PopulateSigns(treeItemViewModels); + await PopulateFlags(treeItemViewModels); SubsetViewModel result = SubsetViewModel(treeItemViewModels, totalBefore, totalAfter); @@ -107,7 +107,7 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB }) .ToArray(); - await PopulateSigns(treeItemViewModels); + await PopulateFlags(treeItemViewModels); return Ok(treeItemViewModels); } @@ -168,11 +168,11 @@ public abstract class EntityTreeControllerBase : ManagementApiControllerB protected virtual TItem[] MapTreeItemViewModels(Guid? parentKey, IEntitySlim[] entities) => entities.Select(entity => MapTreeItemViewModel(parentKey, entity)).ToArray(); - protected virtual async Task PopulateSigns(TItem[] treeItemViewModels) + protected virtual async Task PopulateFlags(TItem[] treeItemViewModels) { - foreach (ISignProvider signProvider in _signProviders.Where(x => x.CanProvideSigns())) + foreach (IFlagProvider signProvider in _flagProviders.Where(x => x.CanProvideFlags())) { - await signProvider.PopulateSignsAsync(treeItemViewModels); + await signProvider.PopulateFlagsAsync(treeItemViewModels); } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs index 6dfb8738ed..9d8d3e732c 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FolderTreeControllerBase.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -35,12 +35,12 @@ public abstract class FolderTreeControllerBase : NamedEntityTreeControlle protected FolderTreeControllerBase(IEntityService entityService) : this( entityService, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService()) { } - protected FolderTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) => + protected FolderTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) => _folderObjectTypeId = FolderObjectType.GetGuid(); protected abstract UmbracoObjectTypes FolderObjectType { get; } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/NamedEntityTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/NamedEntityTreeControllerBase.cs index be1fc3c6ce..b97f7bd930 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/NamedEntityTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/NamedEntityTreeControllerBase.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Services; @@ -14,8 +14,8 @@ public abstract class NamedEntityTreeControllerBase : EntityTreeControlle { } - protected NamedEntityTreeControllerBase(IEntityService entityService, SignProviderCollection signProviders) - : base(entityService, signProviders) + protected NamedEntityTreeControllerBase(IEntityService entityService, FlagProviderCollection flagProviders) + : base(entityService, flagProviders) { } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/UserStartNodeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/UserStartNodeTreeControllerBase.cs index a6d3ba5ff5..75d2d7e421 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/UserStartNodeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/UserStartNodeTreeControllerBase.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Models.Entities; using Umbraco.Cms.Api.Management.Services.Entities; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DependencyInjection; @@ -29,7 +29,7 @@ public abstract class UserStartNodeTreeControllerBase : EntityTreeControl IDataTypeService dataTypeService) : this( entityService, - StaticServiceProvider.Instance.GetRequiredService(), + StaticServiceProvider.Instance.GetRequiredService(), userStartNodeEntitiesService, dataTypeService) { @@ -37,10 +37,10 @@ public abstract class UserStartNodeTreeControllerBase : EntityTreeControl protected UserStartNodeTreeControllerBase( IEntityService entityService, - SignProviderCollection signProviders, + FlagProviderCollection flagProviders, IUserStartNodeEntitiesService userStartNodeEntitiesService, IDataTypeService dataTypeService) - : base(entityService, signProviders) + : base(entityService, flagProviders) { _userStartNodeEntitiesService = userStartNodeEntitiesService; _dataTypeService = dataTypeService; diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs index e93fb98dfc..cd86b2a95f 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.Collections.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Core.DependencyInjection; namespace Umbraco.Extensions @@ -11,17 +11,17 @@ namespace Umbraco.Extensions internal static void AddCollectionBuilders(this IUmbracoBuilder builder) { builder.SignProviders() - .Append() - .Append() - .Append() - .Append(); + .Append() + .Append() + .Append() + .Append(); } /// /// Gets the sign providers collection builder. /// /// The builder. - public static SignProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder) - => builder.WithCollectionBuilder(); + public static FlagProviderCollectionBuilder SignProviders(this IUmbracoBuilder builder) + => builder.WithCollectionBuilder(); } } diff --git a/src/Umbraco.Cms.Api.Management/Factories/ContentCollectionPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/ContentCollectionPresentationFactory.cs index f151d6337b..72d81b1116 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/ContentCollectionPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/ContentCollectionPresentationFactory.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.DependencyInjection; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Mapping; @@ -16,23 +16,23 @@ public abstract class ContentCollectionPresentationFactory()) + StaticServiceProvider.Instance.GetRequiredService()) { } protected ContentCollectionPresentationFactory( IUmbracoMapper mapper, - SignProviderCollection signProviderCollection) + FlagProviderCollection flagProviderCollection) { _mapper = mapper; - _signProviderCollection = signProviderCollection; + _flagProviderCollection = flagProviderCollection; } public async Task> CreateCollectionModelAsync(ListViewPagedModel contentCollection) @@ -55,18 +55,18 @@ public abstract class ContentCollectionPresentationFactory contentCollection, List collectionResponseModels) => Task.CompletedTask; - private async Task PopulateSigns(IEnumerable models) + private async Task PopulateFlags(IEnumerable models) { - foreach (ISignProvider signProvider in _signProviderCollection.Where(x => x.CanProvideSigns())) + foreach (IFlagProvider signProvider in _flagProviderCollection.Where(x => x.CanProvideFlags())) { - await signProvider.PopulateSignsAsync(models); + await signProvider.PopulateFlagsAsync(models); } } } diff --git a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs index 37c127a240..7931e5e35e 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Mapping.Content; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels; using Umbraco.Cms.Api.Management.ViewModels.Document; using Umbraco.Cms.Api.Management.ViewModels.Document.Item; @@ -26,7 +26,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory private readonly IPublicAccessService _publicAccessService; private readonly TimeProvider _timeProvider; private readonly IIdKeyMap _idKeyMap; - private readonly SignProviderCollection _signProviderCollection; + private readonly FlagProviderCollection _flagProviderCollection; [Obsolete("Please use the controller with all parameters. Scheduled for removal in Umbraco 18")] public DocumentPresentationFactory( @@ -43,7 +43,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory publicAccessService, timeProvider, idKeyMap, - StaticServiceProvider.Instance.GetRequiredService()) + StaticServiceProvider.Instance.GetRequiredService()) { } @@ -54,7 +54,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory IPublicAccessService publicAccessService, TimeProvider timeProvider, IIdKeyMap idKeyMap, - SignProviderCollection signProviderCollection) + FlagProviderCollection flagProviderCollection) { _umbracoMapper = umbracoMapper; _documentUrlFactory = documentUrlFactory; @@ -62,7 +62,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory _publicAccessService = publicAccessService; _timeProvider = timeProvider; _idKeyMap = idKeyMap; - _signProviderCollection = signProviderCollection; + _flagProviderCollection = flagProviderCollection; } [Obsolete("Schedule for removal in v17")] @@ -130,7 +130,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory responseModel.Variants = CreateVariantsItemResponseModels(entity); - PopulateSignsOnDocuments(responseModel); + PopulateFlagsOnDocuments(responseModel); return responseModel; } @@ -159,7 +159,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory Culture = null, }; - PopulateSignsOnVariants(model); + PopulateFlagsOnVariants(model); yield return model; yield break; } @@ -173,7 +173,7 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory State = DocumentVariantStateHelper.GetState(entity, cultureNamePair.Key) }; - PopulateSignsOnVariants(model); + PopulateFlagsOnVariants(model); yield return model; } } @@ -290,19 +290,19 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory return Attempt.SucceedWithStatus(ContentPublishingOperationStatus.Success, model); } - private void PopulateSignsOnDocuments(DocumentItemResponseModel model) + private void PopulateFlagsOnDocuments(DocumentItemResponseModel model) { - foreach (ISignProvider signProvider in _signProviderCollection.Where(x => x.CanProvideSigns())) + foreach (IFlagProvider signProvider in _flagProviderCollection.Where(x => x.CanProvideFlags())) { - signProvider.PopulateSignsAsync([model]).GetAwaiter().GetResult(); + signProvider.PopulateFlagsAsync([model]).GetAwaiter().GetResult(); } } - private void PopulateSignsOnVariants(DocumentVariantItemResponseModel model) + private void PopulateFlagsOnVariants(DocumentVariantItemResponseModel model) { - foreach (ISignProvider signProvider in _signProviderCollection.Where(x => x.CanProvideSigns())) + foreach (IFlagProvider signProvider in _flagProviderCollection.Where(x => x.CanProvideFlags())) { - signProvider.PopulateSignsAsync([model]).GetAwaiter().GetResult(); + signProvider.PopulateFlagsAsync([model]).GetAwaiter().GetResult(); } } } diff --git a/src/Umbraco.Cms.Api.Management/Mapping/Document/DocumentMapDefinition.cs b/src/Umbraco.Cms.Api.Management/Mapping/Document/DocumentMapDefinition.cs index fa703c134d..6fe2fbff55 100644 --- a/src/Umbraco.Cms.Api.Management/Mapping/Document/DocumentMapDefinition.cs +++ b/src/Umbraco.Cms.Api.Management/Mapping/Document/DocumentMapDefinition.cs @@ -44,7 +44,7 @@ public class DocumentMapDefinition : ContentMapDefinition(Map); } - // Umbraco.Code.MapAll -Urls -Template -Signs + // Umbraco.Code.MapAll -Urls -Template -Flags private void Map(IContent source, DocumentResponseModel target, MapperContext context) { target.Id = source.Key; @@ -62,7 +62,7 @@ public class DocumentMapDefinition : ContentMapDefinition((_, _) => new MediaCollectionResponseModel(), Map); } - // Umbraco.Code.MapAll -Urls -Signs + // Umbraco.Code.MapAll -Urls -Flags private void Map(IMedia source, MediaResponseModel target, MapperContext context) { target.Id = source.Key; @@ -50,7 +50,7 @@ public class MediaMapDefinition : ContentMapDefinition mapper.Define((_, _) => new MemberResponseModel(), Map); - // Umbraco.Code.MapAll -IsTwoFactorEnabled -Groups -Kind -Signs + // Umbraco.Code.MapAll -IsTwoFactorEnabled -Groups -Kind -Flags private void Map(IMember source, MemberResponseModel target, MapperContext context) { target.Id = source.Key; diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index b0c205c82b..e0dff28806 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -7883,6 +7883,85 @@ ] } }, + "/umbraco/management/api/v1/document/{id}/available-segment-options": { + "get": { + "tags": [ + "Document" + ], + "operationId": "GetDocumentByIdAvailableSegmentOptions", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "skip", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 0 + } + }, + { + "name": "take", + "in": "query", + "schema": { + "type": "integer", + "format": "int32", + "default": 100 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/PagedSegmentResponseModel" + } + ] + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/ProblemDetails" + } + ] + } + } + } + }, + "401": { + "description": "The resource is protected and requires an authentication token" + }, + "403": { + "description": "The authenticated user does not have access to this resource" + } + }, + "deprecated": true, + "security": [ + { + "Backoffice-User": [ ] + } + ] + } + }, "/umbraco/management/api/v1/document/{id}/copy": { "post": { "tags": [ @@ -37128,10 +37207,10 @@ "DataTypeItemResponseModel": { "required": [ "editorAlias", + "flags", "id", "isDeletable", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -37139,12 +37218,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37271,12 +37350,12 @@ }, "DataTypeTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "id", "isDeletable", "isFolder", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -37295,12 +37374,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37528,9 +37607,9 @@ }, "DictionaryItemItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -37538,12 +37617,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37662,9 +37741,9 @@ "DocumentBlueprintItemResponseModel": { "required": [ "documentType", + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -37672,12 +37751,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37698,8 +37777,8 @@ "DocumentBlueprintResponseModel": { "required": [ "documentType", + "flags", "id", - "signs", "values", "variants" ], @@ -37729,12 +37808,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37751,11 +37830,11 @@ }, "DocumentBlueprintTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "id", "isFolder", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -37774,12 +37853,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37805,10 +37884,10 @@ "required": [ "ancestors", "documentType", + "flags", "id", "isProtected", "isTrashed", - "signs", "sortOrder", "values", "variants" @@ -37839,12 +37918,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -37914,11 +37993,11 @@ "DocumentItemResponseModel": { "required": [ "documentType", + "flags", "hasChildren", "id", "isProtected", "isTrashed", - "signs", "variants" ], "type": "object", @@ -37927,12 +38006,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -38172,9 +38251,9 @@ "DocumentResponseModel": { "required": [ "documentType", + "flags", "id", "isTrashed", - "signs", "urls", "values", "variants" @@ -38205,12 +38284,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -38252,12 +38331,12 @@ "ancestors", "createDate", "documentType", + "flags", "hasChildren", "id", "isProtected", "isTrashed", "noAccess", - "signs", "variants" ], "type": "object", @@ -38277,12 +38356,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -38332,9 +38411,9 @@ }, "DocumentTypeBlueprintItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -38342,12 +38421,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -38512,10 +38591,10 @@ }, "DocumentTypeItemResponseModel": { "required": [ + "flags", "id", "isElement", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -38523,12 +38602,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -38901,13 +38980,13 @@ }, "DocumentTypeTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "icon", "id", "isElement", "isFolder", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -38926,12 +39005,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -39047,6 +39126,8 @@ }, "DocumentVariantItemResponseModel": { "required": [ + "flags", + "id", "name", "state" ], @@ -39059,6 +39140,21 @@ "type": "string", "nullable": true }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "flags": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/FlagModel" + } + ] + } + }, "state": { "$ref": "#/components/schemas/DocumentVariantStateModel" } @@ -39089,6 +39185,8 @@ "DocumentVariantResponseModel": { "required": [ "createDate", + "flags", + "id", "name", "state", "updateDate" @@ -39132,6 +39230,21 @@ "type": "string", "format": "date-time", "nullable": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "flags": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/FlagModel" + } + ] + } } }, "additionalProperties": false @@ -39202,8 +39315,8 @@ "DocumentVersionResponseModel": { "required": [ "documentType", + "flags", "id", - "signs", "values", "variants" ], @@ -39233,12 +39346,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -39563,6 +39676,18 @@ }, "additionalProperties": false }, + "FlagModel": { + "required": [ + "alias" + ], + "type": "object", + "properties": { + "alias": { + "type": "string" + } + }, + "additionalProperties": false + }, "FolderResponseModel": { "required": [ "id", @@ -40256,9 +40381,9 @@ }, "MediaCollectionResponseModel": { "required": [ + "flags", "id", "mediaType", - "signs", "sortOrder", "values", "variants" @@ -40289,12 +40414,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -40335,11 +40460,11 @@ }, "MediaItemResponseModel": { "required": [ + "flags", "hasChildren", "id", "isTrashed", "mediaType", - "signs", "variants" ], "type": "object", @@ -40348,12 +40473,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -40478,10 +40603,10 @@ }, "MediaResponseModel": { "required": [ + "flags", "id", "isTrashed", "mediaType", - "signs", "urls", "values", "variants" @@ -40512,12 +40637,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -40549,12 +40674,12 @@ "MediaTreeItemResponseModel": { "required": [ "createDate", + "flags", "hasChildren", "id", "isTrashed", "mediaType", "noAccess", - "signs", "variants" ], "type": "object", @@ -40574,12 +40699,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -40730,9 +40855,9 @@ }, "MediaTypeItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -40740,12 +40865,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41062,13 +41187,13 @@ }, "MediaTypeTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "icon", "id", "isDeletable", "isFolder", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -41087,12 +41212,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41264,9 +41389,9 @@ }, "MemberGroupItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -41274,12 +41399,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41309,10 +41434,10 @@ }, "MemberItemResponseModel": { "required": [ + "flags", "id", "kind", "memberType", - "signs", "variants" ], "type": "object", @@ -41321,12 +41446,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41400,6 +41525,7 @@ "required": [ "email", "failedPasswordAttempts", + "flags", "groups", "id", "isApproved", @@ -41407,7 +41533,6 @@ "isTwoFactorEnabled", "kind", "memberType", - "signs", "username", "values", "variants" @@ -41438,12 +41563,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41589,9 +41714,9 @@ }, "MemberTypeItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -41599,12 +41724,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -41909,11 +42034,11 @@ }, "MemberTypeTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "icon", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -41932,12 +42057,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -42201,10 +42326,10 @@ }, "NamedEntityTreeItemResponseModel": { "required": [ + "flags", "hasChildren", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -42223,12 +42348,12 @@ ], "nullable": true }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -44294,9 +44419,9 @@ "PublishedDocumentResponseModel": { "required": [ "documentType", + "flags", "id", "isTrashed", - "signs", "urls", "values", "variants" @@ -44327,12 +44452,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -44524,10 +44649,10 @@ }, "RelationTypeItemResponseModel": { "required": [ + "flags", "id", "isDeletable", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -44535,12 +44660,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -44927,6 +45052,14 @@ }, "alias": { "type": "string" + }, + "cultures": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "deprecated": true } }, "additionalProperties": false @@ -45039,18 +45172,6 @@ }, "additionalProperties": false }, - "SignModel": { - "required": [ - "alias" - ], - "type": "object", - "properties": { - "alias": { - "type": "string" - } - }, - "additionalProperties": false - }, "SortingRequestModel": { "required": [ "sorting" @@ -45471,9 +45592,9 @@ "TemplateItemResponseModel": { "required": [ "alias", + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -45481,12 +45602,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -47471,9 +47592,9 @@ }, "UserGroupItemResponseModel": { "required": [ + "flags", "id", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -47481,12 +47602,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -47642,10 +47763,10 @@ "UserItemResponseModel": { "required": [ "avatarUrls", + "flags", "id", "kind", - "name", - "signs" + "name" ], "type": "object", "properties": { @@ -47653,12 +47774,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } @@ -48097,9 +48218,9 @@ "required": [ "enabled", "events", + "flags", "id", "name", - "signs", "types", "url" ], @@ -48109,12 +48230,12 @@ "type": "string", "format": "uuid" }, - "signs": { + "flags": { "type": "array", "items": { "oneOf": [ { - "$ref": "#/components/schemas/SignModel" + "$ref": "#/components/schemas/FlagModel" } ] } diff --git a/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollection.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollection.cs new file mode 100644 index 0000000000..5c50f8bba6 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollection.cs @@ -0,0 +1,18 @@ +using Umbraco.Cms.Core.Composing; + +namespace Umbraco.Cms.Api.Management.Services.Flags; + +/// +/// Defines an ordered collection of . +/// +public class FlagProviderCollection : BuilderCollectionBase +{ + /// + /// Initializes a new instance of the class. + /// + /// The collection items. + public FlagProviderCollection(Func> items) + : base(items) + { + } +} diff --git a/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollectionBuilder.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollectionBuilder.cs new file mode 100644 index 0000000000..47fc609dc2 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/FlagProviderCollectionBuilder.cs @@ -0,0 +1,12 @@ +using Umbraco.Cms.Core.Composing; + +namespace Umbraco.Cms.Api.Management.Services.Flags; + +/// +/// Builds an ordered collection of . +/// +public class FlagProviderCollectionBuilder : OrderedCollectionBuilderBase +{ + /// + protected override FlagProviderCollectionBuilder This => this; +} diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProvider.cs similarity index 79% rename from src/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProvider.cs rename to src/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProvider.cs index 41f7ebe066..0f5d989f19 100644 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProvider.cs +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProvider.cs @@ -6,18 +6,18 @@ using Umbraco.Cms.Api.Management.ViewModels.Media.Item; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core; -namespace Umbraco.Cms.Api.Management.Services.Signs; +namespace Umbraco.Cms.Api.Management.Services.Flags; /// -/// Implements a that provides signs for entities that have a collection. +/// Implements a that provides flags for entities that have a collection. /// -public class HasCollectionSignProvider : ISignProvider +public class HasCollectionFlagProvider : IFlagProvider { - private const string Alias = Constants.Conventions.Signs.Prefix + "HasCollection"; + private const string Alias = Constants.Conventions.Flags.Prefix + "HasCollection"; /// - public bool CanProvideSigns() - where TItem : IHasSigns => + public bool CanProvideFlags() + where TItem : IHasFlags => typeof(TItem) == typeof(DocumentTreeItemResponseModel) || typeof(TItem) == typeof(DocumentCollectionResponseModel) || typeof(TItem) == typeof(DocumentItemResponseModel) || @@ -26,14 +26,14 @@ public class HasCollectionSignProvider : ISignProvider typeof(TItem) == typeof(MediaItemResponseModel); /// - public Task PopulateSignsAsync(IEnumerable itemViewModels) - where TItem : IHasSigns + public Task PopulateFlagsAsync(IEnumerable itemViewModels) + where TItem : IHasFlags { foreach (TItem item in itemViewModels) { if (HasCollection(item)) { - item.AddSign(Alias); + item.AddFlag(Alias); } } diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProvider.cs similarity index 69% rename from src/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProvider.cs rename to src/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProvider.cs index e7563aa310..0a8be1d75c 100644 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProvider.cs +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProvider.cs @@ -2,31 +2,31 @@ using Umbraco.Cms.Api.Management.ViewModels.Document; using Umbraco.Cms.Core; -namespace Umbraco.Cms.Api.Management.Services.Signs; +namespace Umbraco.Cms.Api.Management.Services.Flags; /// -/// Implements a that provides signs for documents that have pending changes. +/// Implements a that provides flags for documents that have pending changes. /// -public class HasPendingChangesSignProvider : ISignProvider +public class HasPendingChangesFlagProvider : IFlagProvider { - private const string Alias = Constants.Conventions.Signs.Prefix + "PendingChanges"; + private const string Alias = Constants.Conventions.Flags.Prefix + "PendingChanges"; /// - public bool CanProvideSigns() - where TItem : IHasSigns => + public bool CanProvideFlags() + where TItem : IHasFlags => typeof(TItem) == typeof(DocumentVariantItemResponseModel) || typeof(TItem) == typeof(DocumentVariantResponseModel); /// - public Task PopulateSignsAsync(IEnumerable items) - where TItem : IHasSigns + public Task PopulateFlagsAsync(IEnumerable items) + where TItem : IHasFlags { foreach (TItem item in items) { if (HasPendingChanges(item)) { - item.AddSign(Alias); + item.AddFlag(Alias); } } diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProvider.cs similarity index 86% rename from src/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProvider.cs rename to src/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProvider.cs index e9f949a57a..8aa071faaf 100644 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProvider.cs +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProvider.cs @@ -8,14 +8,14 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Constants = Umbraco.Cms.Core.Constants; -namespace Umbraco.Cms.Api.Management.Services.Signs; +namespace Umbraco.Cms.Api.Management.Services.Flags; /// -/// Implements a that provides signs for documents that are scheduled for publication. +/// Implements a that provides flags for documents that are scheduled for publication. /// -internal class HasScheduleSignProvider : ISignProvider +internal class HasScheduleFlagProvider : IFlagProvider { - private const string Alias = Constants.Conventions.Signs.Prefix + "ScheduledForPublish"; + private const string Alias = Constants.Conventions.Flags.Prefix + "ScheduledForPublish"; private readonly IContentService _contentService; private readonly IIdKeyMap _keyMap; @@ -23,22 +23,22 @@ internal class HasScheduleSignProvider : ISignProvider /// /// Initializes a new instance of the class. /// - public HasScheduleSignProvider(IContentService contentService, IIdKeyMap keyMap) + public HasScheduleFlagProvider(IContentService contentService, IIdKeyMap keyMap) { _contentService = contentService; _keyMap = keyMap; } /// - public bool CanProvideSigns() - where TItem : IHasSigns => + public bool CanProvideFlags() + where TItem : IHasFlags => typeof(TItem) == typeof(DocumentTreeItemResponseModel) || typeof(TItem) == typeof(DocumentCollectionResponseModel) || typeof(TItem) == typeof(DocumentItemResponseModel); /// - public Task PopulateSignsAsync(IEnumerable items) - where TItem : IHasSigns + public Task PopulateFlagsAsync(IEnumerable items) + where TItem : IHasFlags { IDictionary> schedules = _contentService.GetContentSchedulesByIds(items.Select(x => x.Id).ToArray()); foreach (TItem item in items) @@ -80,7 +80,7 @@ internal class HasScheduleSignProvider : ISignProvider if (variantsArray.Length == 1) { DocumentVariantItemResponseModel variant = variantsArray[0]; - variant.AddSign(Alias); + variant.AddFlag(Alias); return variantsArray; } @@ -91,7 +91,7 @@ internal class HasScheduleSignProvider : ISignProvider if (isScheduled) { - variant.AddSign(Alias); + variant.AddFlag(Alias); } } @@ -105,7 +105,7 @@ internal class HasScheduleSignProvider : ISignProvider if (variantsArray.Length == 1) { DocumentVariantResponseModel variant = variantsArray[0]; - variant.AddSign(Alias); + variant.AddFlag(Alias); return variantsArray; } @@ -116,7 +116,7 @@ internal class HasScheduleSignProvider : ISignProvider if (isScheduled) { - variant.AddSign(Alias); + variant.AddFlag(Alias); } } diff --git a/src/Umbraco.Cms.Api.Management/Services/Flags/IFlagProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/IFlagProvider.cs new file mode 100644 index 0000000000..48c78a7c8f --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/IFlagProvider.cs @@ -0,0 +1,23 @@ +using Umbraco.Cms.Api.Management.ViewModels; + +namespace Umbraco.Cms.Api.Management.Services.Flags; + +/// +/// Defines operation for the provision of presentation flags for item, tree and collection nodes. +/// +public interface IFlagProvider +{ + /// + /// Gets a value indicating whether this provider can provide flags for the specified item type. + /// + /// Type of view model supporting flags. + bool CanProvideFlags() + where TItem : IHasFlags; + + /// + /// Populates the provided item view models with flags. + /// + /// Type of item view model supporting flags. + Task PopulateFlagsAsync(IEnumerable items) + where TItem : IHasFlags; +} diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProvider.cs similarity index 52% rename from src/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProvider.cs rename to src/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProvider.cs index acd375ca9e..f92b20aa30 100644 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProvider.cs +++ b/src/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProvider.cs @@ -1,29 +1,29 @@ using Umbraco.Cms.Api.Management.ViewModels; using Umbraco.Cms.Core; -namespace Umbraco.Cms.Api.Management.Services.Signs; +namespace Umbraco.Cms.Api.Management.Services.Flags; /// -/// Implements a that provides signs for documents that are protected. +/// Implements a that provides flags for documents that are protected. /// -internal class IsProtectedSignProvider : ISignProvider +internal class IsProtectedFlagProvider : IFlagProvider { - private const string Alias = Constants.Conventions.Signs.Prefix + "IsProtected"; + private const string Alias = Constants.Conventions.Flags.Prefix + "IsProtected"; /// > - public bool CanProvideSigns() - where TItem : IHasSigns => + public bool CanProvideFlags() + where TItem : IHasFlags => typeof(IIsProtected).IsAssignableFrom(typeof(TItem)); /// > - public Task PopulateSignsAsync(IEnumerable itemViewModels) - where TItem : IHasSigns + public Task PopulateFlagsAsync(IEnumerable itemViewModels) + where TItem : IHasFlags { foreach (TItem item in itemViewModels) { if (item is IIsProtected { IsProtected: true }) { - item.AddSign(Alias); + item.AddFlag(Alias); } } diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/ISignProvider.cs b/src/Umbraco.Cms.Api.Management/Services/Signs/ISignProvider.cs deleted file mode 100644 index e47a128e74..0000000000 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/ISignProvider.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Umbraco.Cms.Api.Management.ViewModels; - -namespace Umbraco.Cms.Api.Management.Services.Signs; - -/// -/// Defines operation for the provision of presentation signs for item, tree and collection nodes. -/// -public interface ISignProvider -{ - /// - /// Gets a value indicating whether this provider can provide signs for the specified item type. - /// - /// Type of view model supporting signs. - bool CanProvideSigns() - where TItem : IHasSigns; - - /// - /// Populates the provided item view models with signs. - /// - /// Type of item view model supporting signs. - Task PopulateSignsAsync(IEnumerable items) - where TItem : IHasSigns; -} diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollection.cs b/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollection.cs deleted file mode 100644 index 81c50aafd5..0000000000 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollection.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Umbraco.Cms.Core.Composing; - -namespace Umbraco.Cms.Api.Management.Services.Signs; - -/// -/// Defines an ordered collection of . -/// -public class SignProviderCollection : BuilderCollectionBase -{ - /// - /// Initializes a new instance of the class. - /// - /// The collection items. - public SignProviderCollection(Func> items) - : base(items) - { - } -} diff --git a/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollectionBuilder.cs b/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollectionBuilder.cs deleted file mode 100644 index a07d67634f..0000000000 --- a/src/Umbraco.Cms.Api.Management/Services/Signs/SignProviderCollectionBuilder.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Umbraco.Cms.Core.Composing; - -namespace Umbraco.Cms.Api.Management.Services.Signs; - -/// -/// Builds an ordered collection of . -/// -public class SignProviderCollectionBuilder : OrderedCollectionBuilderBase -{ - /// - protected override SignProviderCollectionBuilder This => this; -} diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentResponseModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentResponseModelBase.cs index 11f7599252..9bb65254ae 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentResponseModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Content/ContentResponseModelBase.cs @@ -3,25 +3,25 @@ using Umbraco.Cms.Core.Models.ContentEditing; namespace Umbraco.Cms.Api.Management.ViewModels.Content; public abstract class ContentResponseModelBase - : ContentModelBase, IHasSigns + : ContentModelBase, IHasFlags where TValueResponseModelBase : ValueModelBase where TVariantResponseModel : VariantResponseModelBase { - private readonly List _signs = []; + private readonly List _flags = []; public Guid Id { get; set; } - public IEnumerable Signs + public IEnumerable Flags { - get => _signs.AsEnumerable(); + get => _flags.AsEnumerable(); set { - _signs.Clear(); - _signs.AddRange(value); + _flags.Clear(); + _flags.AddRange(value); } } - public void AddSign(string alias) => _signs.Add(new SignModel { Alias = alias }); + public void AddFlag(string alias) => _flags.Add(new FlagModel { Alias = alias }); - public void RemoveSign(string alias) => _signs.RemoveAll(x => x.Alias == alias); + public void RemoveFlag(string alias) => _flags.RemoveAll(x => x.Alias == alias); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Collection/DocumentCollectionResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Collection/DocumentCollectionResponseModel.cs index 107ec0c891..d31de2e2d0 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Collection/DocumentCollectionResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Collection/DocumentCollectionResponseModel.cs @@ -3,7 +3,7 @@ using Umbraco.Cms.Api.Management.ViewModels.DocumentType; namespace Umbraco.Cms.Api.Management.ViewModels.Document.Collection; -public class DocumentCollectionResponseModel : ContentCollectionResponseModelBase, IHasSigns, IIsProtected +public class DocumentCollectionResponseModel : ContentCollectionResponseModelBase, IHasFlags, IIsProtected { public DocumentTypeCollectionReferenceResponseModel DocumentType { get; set; } = new(); diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantItemResponseModel.cs index 3e4d8913f8..108bc7090e 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantItemResponseModel.cs @@ -2,25 +2,25 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Document; -public class DocumentVariantItemResponseModel : VariantItemResponseModelBase, IHasSigns +public class DocumentVariantItemResponseModel : VariantItemResponseModelBase, IHasFlags { - private readonly List _signs = []; + private readonly List _flags = []; public Guid Id { get; } - public IEnumerable Signs + public IEnumerable Flags { - get => _signs.AsEnumerable(); + get => _flags.AsEnumerable(); set { - _signs.Clear(); - _signs.AddRange(value); + _flags.Clear(); + _flags.AddRange(value); } } - public void AddSign(string alias) => _signs.Add(new SignModel { Alias = alias }); + public void AddFlag(string alias) => _flags.Add(new FlagModel { Alias = alias }); - public void RemoveSign(string alias) => _signs.RemoveAll(x => x.Alias == alias); + public void RemoveFlag(string alias) => _flags.RemoveAll(x => x.Alias == alias); public required DocumentVariantState State { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantResponseModel.cs index cfa3ef5809..a58b3cf9bd 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/DocumentVariantResponseModel.cs @@ -2,7 +2,7 @@ using Umbraco.Cms.Api.Management.ViewModels.Content; namespace Umbraco.Cms.Api.Management.ViewModels.Document; -public class DocumentVariantResponseModel : VariantResponseModelBase, IHasSigns +public class DocumentVariantResponseModel : VariantResponseModelBase, IHasFlags { public DocumentVariantState State { get; set; } @@ -12,21 +12,21 @@ public class DocumentVariantResponseModel : VariantResponseModelBase, IHasSigns public DateTimeOffset? ScheduledUnpublishDate { get; set; } - private readonly List _signs = []; + private readonly List _flags = []; public Guid Id { get; } - public IEnumerable Signs + public IEnumerable Flags { - get => _signs.AsEnumerable(); + get => _flags.AsEnumerable(); set { - _signs.Clear(); - _signs.AddRange(value); + _flags.Clear(); + _flags.AddRange(value); } } - public void AddSign(string alias) => _signs.Add(new SignModel { Alias = alias }); + public void AddFlag(string alias) => _flags.Add(new FlagModel { Alias = alias }); - public void RemoveSign(string alias) => _signs.RemoveAll(x => x.Alias == alias); + public void RemoveFlag(string alias) => _flags.RemoveAll(x => x.Alias == alias); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/SignModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/FlagModel.cs similarity index 81% rename from src/Umbraco.Cms.Api.Management/ViewModels/SignModel.cs rename to src/Umbraco.Cms.Api.Management/ViewModels/FlagModel.cs index 0cfec8e36f..5eaacb5e0c 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/SignModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/FlagModel.cs @@ -1,6 +1,6 @@ namespace Umbraco.Cms.Api.Management.ViewModels; -public class SignModel +public class FlagModel { public required string Alias { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/IHasSigns.cs b/src/Umbraco.Cms.Api.Management/ViewModels/IHasFlags.cs similarity index 58% rename from src/Umbraco.Cms.Api.Management/ViewModels/IHasSigns.cs rename to src/Umbraco.Cms.Api.Management/ViewModels/IHasFlags.cs index 23aafd1e2b..3a622572aa 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/IHasSigns.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/IHasFlags.cs @@ -1,10 +1,10 @@ namespace Umbraco.Cms.Api.Management.ViewModels; /// -/// Marker interface that indicates the type has support for backoffice signs (presented as icons +/// Marker interface that indicates the type has support for backoffice flags (presented as icons /// overlaying the main icon for the entity). /// -public interface IHasSigns +public interface IHasFlags { /// /// Gets the unique identifier for the entity. @@ -12,19 +12,19 @@ public interface IHasSigns Guid Id { get; } /// - /// Gets the collection of signs for the entity. + /// Gets the collection of flag for the entity. /// - IEnumerable Signs { get; } + IEnumerable Flags { get; } /// - /// Adds a sign to the entity with the specified alias. + /// Adds a flag to the entity with the specified alias. /// /// - void AddSign(string alias); + void AddFlag(string alias); /// - /// Removes a sign from the entity with the specified alias. + /// Removes a flag from the entity with the specified alias. /// /// - void RemoveSign(string alias); + void RemoveFlag(string alias); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Item/ItemResponseModelBase.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Item/ItemResponseModelBase.cs index bccb7fc1e6..6bd1062859 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Item/ItemResponseModelBase.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Item/ItemResponseModelBase.cs @@ -1,22 +1,22 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Item; -public abstract class ItemResponseModelBase : IHasSigns +public abstract class ItemResponseModelBase : IHasFlags { - private readonly List _signs = []; + private readonly List _flags = []; public Guid Id { get; set; } - public IEnumerable Signs + public IEnumerable Flags { - get => _signs.AsEnumerable(); + get => _flags.AsEnumerable(); set { - _signs.Clear(); - _signs.AddRange(value); + _flags.Clear(); + _flags.AddRange(value); } } - public void AddSign(string alias) => _signs.Add(new SignModel { Alias = alias }); + public void AddFlag(string alias) => _flags.Add(new FlagModel { Alias = alias }); - public void RemoveSign(string alias) => _signs.RemoveAll(x => x.Alias == alias); + public void RemoveFlag(string alias) => _flags.RemoveAll(x => x.Alias == alias); } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/EntityTreeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/EntityTreeItemResponseModel.cs index 64c08420d8..b54eda0c67 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/EntityTreeItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/EntityTreeItemResponseModel.cs @@ -1,24 +1,24 @@ namespace Umbraco.Cms.Api.Management.ViewModels.Tree; -public class EntityTreeItemResponseModel : TreeItemPresentationModel, IHasSigns +public class EntityTreeItemResponseModel : TreeItemPresentationModel, IHasFlags { - private readonly List _signs = []; + private readonly List _flags = []; public Guid Id { get; set; } public ReferenceByIdModel? Parent { get; set; } - public IEnumerable Signs + public IEnumerable Flags { - get => _signs.AsEnumerable(); + get => _flags.AsEnumerable(); set { - _signs.Clear(); - _signs.AddRange(value); + _flags.Clear(); + _flags.AddRange(value); } } - public void AddSign(string alias) => _signs.Add(new SignModel { Alias = alias }); + public void AddFlag(string alias) => _flags.Add(new FlagModel { Alias = alias }); - public void RemoveSign(string alias) => _signs.RemoveAll(x => x.Alias == alias); + public void RemoveFlag(string alias) => _flags.RemoveAll(x => x.Alias == alias); } diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index fd57fef49a..2d21c544e5 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -305,12 +305,12 @@ public static partial class Constants } /// - /// Constants for relating to view model signs. + /// Constants for relating to view model flags. /// - public static class Signs + public static class Flags { /// - /// Prefix for all sign aliases. + /// Prefix for all flag aliases. /// public const string Prefix = "Umb."; } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProviderTests.cs new file mode 100644 index 0000000000..5310bff33c --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasCollectionFlagProviderTests.cs @@ -0,0 +1,196 @@ +using NUnit.Framework; +using Umbraco.Cms.Api.Management.Services.Flags; +using Umbraco.Cms.Api.Management.ViewModels; +using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; +using Umbraco.Cms.Api.Management.ViewModels.Document.Item; +using Umbraco.Cms.Api.Management.ViewModels.DocumentType; +using Umbraco.Cms.Api.Management.ViewModels.Media.Collection; +using Umbraco.Cms.Api.Management.ViewModels.Media.Item; +using Umbraco.Cms.Api.Management.ViewModels.MediaType; +using Umbraco.Cms.Api.Management.ViewModels.Tree; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Flags; + +[TestFixture] +internal class HasCollectionFlagProviderTests +{ + [Test] + public void HasCollectionFlagProvider_Can_Provide_Document_Tree_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasCollectionFlagProvider_Can_Provide_Document_Collection_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasCollectionFlagProvider_Can_Provide_Document_Item_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasCollectionFlagProvider_Can_Provide_Media_Tree_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasCollectionFlagProvider_Can_Provide_Media_Collection_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasCollectionFlagProvider_Can_Provide_Media_Item_Flags() + { + var sut = new HasCollectionFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Document_Tree_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), DocumentType = new DocumentTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Document_Collection_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), DocumentType = new DocumentTypeCollectionReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Document_Item_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), DocumentType = new DocumentTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Media_Tree_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), MediaType = new MediaTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Media_Collection_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), MediaType = new MediaTypeCollectionReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } + + [Test] + public async Task HasCollectionFlagProvider_Should_Populate_Media_Item_Flags() + { + var sut = new HasCollectionFlagProvider(); + + var viewModels = new List + { + new() + { + Id = Guid.NewGuid(), MediaType = new MediaTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, + }, + new() { Id = Guid.NewGuid() }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Flags.Count(), 0); + + var flagModel = viewModels[0].Flags.First(); + Assert.AreEqual("Umb.HasCollection", flagModel.Alias); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProviderTests.cs new file mode 100644 index 0000000000..480da73b95 --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasPendingChangesFlagProviderTests.cs @@ -0,0 +1,83 @@ +using NUnit.Framework; +using Umbraco.Cms.Api.Management.Services.Flags; +using Umbraco.Cms.Api.Management.ViewModels.Document; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Flags; + +[TestFixture] +internal class HasPendingChangesFlagProviderTests +{ + [Test] + public void HasPendingChangesFlagProvider_Can_Provide_Variant_Item_Flags() + { + var sut = new HasPendingChangesFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void HasPendingChangesFlagProvider_Can_Provide_Variant_Flags() + { + var sut = new HasPendingChangesFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public async Task HasPendingChangesFlagProvider_Should_Populate_Variant_Item_Flags() + { + var sut = new HasPendingChangesFlagProvider(); + + var variants = new List + { + new() + { + State = DocumentVariantState.PublishedPendingChanges, + Culture = null, + Name = "Test", + }, + new() + { + State = DocumentVariantState.Published, + Culture = null, + Name = "Test2", + }, + }; + + await sut.PopulateFlagsAsync(variants); + + Assert.AreEqual(variants[0].Flags.Count(), 1); + Assert.AreEqual(variants[1].Flags.Count(), 0); + + var flagModel = variants[0].Flags.First(); + Assert.AreEqual("Umb.PendingChanges", flagModel.Alias); + } + + [Test] + public async Task HasPendingChangesFlagProvider_Should_Populate_Variant_Flags() + { + var sut = new HasPendingChangesFlagProvider(); + + var variants = new List + { + new() + { + State = DocumentVariantState.PublishedPendingChanges, + Culture = null, + Name = "Test", + }, + new() + { + State = DocumentVariantState.Published, + Culture = null, + Name = "Test2", + }, + }; + + await sut.PopulateFlagsAsync(variants); + + Assert.AreEqual(variants[0].Flags.Count(), 1); + Assert.AreEqual(variants[1].Flags.Count(), 0); + + var flagModel = variants[0].Flags.First(); + Assert.AreEqual("Umb.PendingChanges", flagModel.Alias); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProviderTests.cs similarity index 75% rename from tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProviderTests.cs rename to tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProviderTests.cs index 7292b3a9ae..9cfaa22c8c 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasScheduleSignProviderTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/HasScheduleFlagProviderTests.cs @@ -1,6 +1,6 @@ using Moq; using NUnit.Framework; -using Umbraco.Cms.Api.Management.Services.Signs; +using Umbraco.Cms.Api.Management.Services.Flags; using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Document; using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; @@ -11,43 +11,43 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Services; -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Signs; +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Flags; [TestFixture] -internal class HasScheduleSignProviderTests +internal class HasScheduleFlagProviderTests { [Test] - public void HasScheduleSignProvider_Can_Provide_Document_Tree_Signs() + public void HasScheduleFlagProvider_Can_Provide_Document_Tree_Flags() { var contentServiceMock = new Mock(); var idKeyMapMock = new Mock(); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); - Assert.IsTrue(sut.CanProvideSigns()); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); + Assert.IsTrue(sut.CanProvideFlags()); } [Test] - public void HasScheduleSignProvider_Can_Provide_Document_Collection_Signs() + public void HasScheduleFlagProvider_Can_Provide_Document_Collection_Flags() { var contentServiceMock = new Mock(); var idKeyMapMock = new Mock(); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); - Assert.IsTrue(sut.CanProvideSigns()); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); + Assert.IsTrue(sut.CanProvideFlags()); } [Test] - public void HasScheduleSignProvider_Can_Provide_Document_Item_Signs() + public void HasScheduleFlagProvider_Can_Provide_Document_Item_Flags() { var contentServiceMock = new Mock(); var idKeyMapMock = new Mock(); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); - Assert.IsTrue(sut.CanProvideSigns()); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); + Assert.IsTrue(sut.CanProvideFlags()); } [Test] - public async Task HasScheduleSignProvider_Should_Populate_Document_Tree_Signs() + public async Task HasScheduleFlagProvider_Should_Populate_Document_Tree_Flags() { var entities = new List { @@ -67,7 +67,7 @@ internal class HasScheduleSignProviderTests .Returns(CreateContentSchedules()); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); var variant1 = new DocumentVariantItemResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "en-EN" }; var variant2 = new DocumentVariantItemResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "da-DA" }; @@ -78,18 +78,18 @@ internal class HasScheduleSignProviderTests new() { Id = entities[0].Key, Variants = [variant1, variant2] }, new() { Id = entities[1].Key, Variants = [variant3] }, }; - await sut.PopulateSignsAsync(viewModels); + await sut.PopulateFlagsAsync(viewModels); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Signs.Count(), 0); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Variants.First().Signs.Count(), 1); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Flags.Count(), 0); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Variants.First().Flags.Count(), 1); - var signModel = viewModels[0].Variants.First().Signs.First(); - Assert.AreEqual("Umb.ScheduledForPublish", signModel.Alias); + var flagModel = viewModels[0].Variants.First().Flags.First(); + Assert.AreEqual("Umb.ScheduledForPublish", flagModel.Alias); } [Test] - public async Task HasScheduleSignProvider_Should_Populate_Document_Collection_Signs() + public async Task HasScheduleFlagProvider_Should_Populate_Document_Collection_Flags() { var entities = new List { @@ -108,7 +108,7 @@ internal class HasScheduleSignProviderTests .Setup(x => x.GetContentSchedulesByIds(keys)) .Returns(CreateContentSchedules()); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); var variant1 = new DocumentVariantResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "en-EN" }; var variant2 = new DocumentVariantResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "da-DA" }; @@ -119,18 +119,18 @@ internal class HasScheduleSignProviderTests new() { Id = entities[0].Key, Variants = [variant1, variant2] }, new() { Id = entities[1].Key, Variants = [variant3] }, }; - await sut.PopulateSignsAsync(viewModels); + await sut.PopulateFlagsAsync(viewModels); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Signs.Count(), 0); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Variants.First().Signs.Count(), 1); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Flags.Count(), 0); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Variants.First().Flags.Count(), 1); - var signModel = viewModels[0].Variants.First().Signs.First(); - Assert.AreEqual("Umb.ScheduledForPublish", signModel.Alias); + var flagModel = viewModels[0].Variants.First().Flags.First(); + Assert.AreEqual("Umb.ScheduledForPublish", flagModel.Alias); } [Test] - public async Task HasScheduleSignProvider_Should_Populate_Document_Item_Signs() + public async Task HasScheduleFlagProvider_Should_Populate_Document_Item_Flags() { var entities = new List { @@ -149,7 +149,7 @@ internal class HasScheduleSignProviderTests .Setup(x => x.GetContentSchedulesByIds(keys)) .Returns(CreateContentSchedules()); - var sut = new HasScheduleSignProvider(contentServiceMock.Object, idKeyMapMock.Object); + var sut = new HasScheduleFlagProvider(contentServiceMock.Object, idKeyMapMock.Object); var variant1 = new DocumentVariantItemResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "en-EN" }; var variant2 = new DocumentVariantItemResponseModel() { State = DocumentVariantState.Published, Name = "Test1", Culture = "da-DA" }; @@ -160,14 +160,14 @@ internal class HasScheduleSignProviderTests new() { Id = entities[0].Key, Variants = [variant1, variant2] }, new() { Id = entities[1].Key, Variants = [variant3] }, }; - await sut.PopulateSignsAsync(viewModels); + await sut.PopulateFlagsAsync(viewModels); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Signs.Count(), 0); - Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Variants.First().Signs.Count(), 1); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "da-DA").Flags.Count(), 0); + Assert.AreEqual(viewModels[0].Variants.FirstOrDefault(x => x.Culture == "en-EN").Flags.Count(), 1); + Assert.AreEqual(viewModels[1].Variants.First().Flags.Count(), 1); - var signModel = viewModels[0].Variants.First().Signs.First(); - Assert.AreEqual("Umb.ScheduledForPublish", signModel.Alias); + var flagModel = viewModels[0].Variants.First().Flags.First(); + Assert.AreEqual("Umb.ScheduledForPublish", flagModel.Alias); } private Dictionary> CreateContentSchedules() diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProviderTests.cs new file mode 100644 index 0000000000..7c6f588d7d --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Flags/IsProtectedFlagProviderTests.cs @@ -0,0 +1,92 @@ +using NUnit.Framework; +using Umbraco.Cms.Api.Management.Services.Flags; +using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; +using Umbraco.Cms.Api.Management.ViewModels.Document.Item; +using Umbraco.Cms.Api.Management.ViewModels.Tree; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Flags; + +[TestFixture] +internal class IsProtectedFlagProviderTests +{ + [Test] + public void IsProtectedFlagProvider_Can_Provide_Tree_Flags() + { + var sut = new IsProtectedFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void IsProtectedFlagProvider_Can_Provide_Collection_Flags() + { + var sut = new IsProtectedFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public void IsProtectedFlagProvider_Can_Provide_Plain_Flags() + { + var sut = new IsProtectedFlagProvider(); + Assert.IsTrue(sut.CanProvideFlags()); + } + + [Test] + public async Task IsProtectedFlagProvider_Should_Populate_Tree_Flags() + { + var sut = new IsProtectedFlagProvider(); + + var viewModels = new List + { + new(), + new() { IsProtected = true }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 0); + Assert.AreEqual(viewModels[1].Flags.Count(), 1); + + var flagModel = viewModels[1].Flags.First(); + Assert.AreEqual("Umb.IsProtected", flagModel.Alias); + } + + [Test] + public async Task IsProtectedFlagProvider_Should_Populate_Collection_Flags() + { + var sut = new IsProtectedFlagProvider(); + + var viewModels = new List + { + new(), + new() { IsProtected = true }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 0); + Assert.AreEqual(viewModels[1].Flags.Count(), 1); + + var flagModel = viewModels[1].Flags.First(); + Assert.AreEqual("Umb.IsProtected", flagModel.Alias); + } + + [Test] + public async Task IsProtectedFlagProvider_Should_Populate_Plain_Flags() + { + var sut = new IsProtectedFlagProvider(); + + var viewModels = new List + { + new(), + new() { IsProtected = true }, + }; + + await sut.PopulateFlagsAsync(viewModels); + + Assert.AreEqual(viewModels[0].Flags.Count(), 0); + Assert.AreEqual(viewModels[1].Flags.Count(), 1); + + var flagModel = viewModels[1].Flags.First(); + Assert.AreEqual("Umb.IsProtected", flagModel.Alias); + } +} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProviderTests.cs deleted file mode 100644 index 8c9a4cb3e3..0000000000 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasCollectionSignProviderTests.cs +++ /dev/null @@ -1,196 +0,0 @@ -using NUnit.Framework; -using Umbraco.Cms.Api.Management.Services.Signs; -using Umbraco.Cms.Api.Management.ViewModels; -using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; -using Umbraco.Cms.Api.Management.ViewModels.Document.Item; -using Umbraco.Cms.Api.Management.ViewModels.DocumentType; -using Umbraco.Cms.Api.Management.ViewModels.Media.Collection; -using Umbraco.Cms.Api.Management.ViewModels.Media.Item; -using Umbraco.Cms.Api.Management.ViewModels.MediaType; -using Umbraco.Cms.Api.Management.ViewModels.Tree; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Signs; - -[TestFixture] -internal class HasCollectionSignProviderTests -{ - [Test] - public void HasCollectionSignProvider_Can_Provide_Document_Tree_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasCollectionSignProvider_Can_Provide_Document_Collection_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasCollectionSignProvider_Can_Provide_Document_Item_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasCollectionSignProvider_Can_Provide_Media_Tree_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasCollectionSignProvider_Can_Provide_Media_Collection_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasCollectionSignProvider_Can_Provide_Media_Item_Signs() - { - var sut = new HasCollectionSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Document_Tree_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), DocumentType = new DocumentTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Document_Collection_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), DocumentType = new DocumentTypeCollectionReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Document_Item_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), DocumentType = new DocumentTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Media_Tree_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), MediaType = new MediaTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Media_Collection_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), MediaType = new MediaTypeCollectionReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } - - [Test] - public async Task HasCollectionSignProvider_Should_Populate_Media_Item_Signs() - { - var sut = new HasCollectionSignProvider(); - - var viewModels = new List - { - new() - { - Id = Guid.NewGuid(), MediaType = new MediaTypeReferenceResponseModel() { Collection = new ReferenceByIdModel(Guid.NewGuid()) }, - }, - new() { Id = Guid.NewGuid() }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 1); - Assert.AreEqual(viewModels[1].Signs.Count(), 0); - - var signModel = viewModels[0].Signs.First(); - Assert.AreEqual("Umb.HasCollection", signModel.Alias); - } -} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProviderTests.cs deleted file mode 100644 index 58dcb07c32..0000000000 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/HasPendingChangesSignProviderTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -using NUnit.Framework; -using Umbraco.Cms.Api.Management.Services.Signs; -using Umbraco.Cms.Api.Management.ViewModels.Document; -using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; -using Umbraco.Cms.Api.Management.ViewModels.Document.Item; -using Umbraco.Cms.Api.Management.ViewModels.Tree; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Signs; - -[TestFixture] -internal class HasPendingChangesSignProviderTests -{ - [Test] - public void HasPendingChangesSignProvider_Can_Provide_Variant_Item_Signs() - { - var sut = new HasPendingChangesSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void HasPendingChangesSignProvider_Can_Provide_Variant_Signs() - { - var sut = new HasPendingChangesSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public async Task HasPendingChangesSignProvider_Should_Populate_Variant_Item_Signs() - { - var sut = new HasPendingChangesSignProvider(); - - var variants = new List - { - new() - { - State = DocumentVariantState.PublishedPendingChanges, - Culture = null, - Name = "Test", - }, - new() - { - State = DocumentVariantState.Published, - Culture = null, - Name = "Test2", - }, - }; - - await sut.PopulateSignsAsync(variants); - - Assert.AreEqual(variants[0].Signs.Count(), 1); - Assert.AreEqual(variants[1].Signs.Count(), 0); - - var signModel = variants[0].Signs.First(); - Assert.AreEqual("Umb.PendingChanges", signModel.Alias); - } - - [Test] - public async Task HasPendingChangesSignProvider_Should_Populate_Variant_Signs() - { - var sut = new HasPendingChangesSignProvider(); - - var variants = new List - { - new() - { - State = DocumentVariantState.PublishedPendingChanges, - Culture = null, - Name = "Test", - }, - new() - { - State = DocumentVariantState.Published, - Culture = null, - Name = "Test2", - }, - }; - - await sut.PopulateSignsAsync(variants); - - Assert.AreEqual(variants[0].Signs.Count(), 1); - Assert.AreEqual(variants[1].Signs.Count(), 0); - - var signModel = variants[0].Signs.First(); - Assert.AreEqual("Umb.PendingChanges", signModel.Alias); - } -} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProviderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProviderTests.cs deleted file mode 100644 index c15fec787c..0000000000 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Cms.Api.Management/Services/Signs/IsProtectedSignProviderTests.cs +++ /dev/null @@ -1,92 +0,0 @@ -using NUnit.Framework; -using Umbraco.Cms.Api.Management.Services.Signs; -using Umbraco.Cms.Api.Management.ViewModels.Document.Collection; -using Umbraco.Cms.Api.Management.ViewModels.Document.Item; -using Umbraco.Cms.Api.Management.ViewModels.Tree; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Cms.Api.Management.Services.Signs; - -[TestFixture] -internal class IsProtectedSignProviderTests -{ - [Test] - public void IsProtectedSignProvider_Can_Provide_Tree_Signs() - { - var sut = new IsProtectedSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void IsProtectedSignProvider_Can_Provide_Collection_Signs() - { - var sut = new IsProtectedSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public void IsProtectedSignProvider_Can_Provide_Plain_Signs() - { - var sut = new IsProtectedSignProvider(); - Assert.IsTrue(sut.CanProvideSigns()); - } - - [Test] - public async Task IsProtectedSignProvider_Should_Populate_Tree_Signs() - { - var sut = new IsProtectedSignProvider(); - - var viewModels = new List - { - new(), - new() { IsProtected = true }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 0); - Assert.AreEqual(viewModels[1].Signs.Count(), 1); - - var signModel = viewModels[1].Signs.First(); - Assert.AreEqual("Umb.IsProtected", signModel.Alias); - } - - [Test] - public async Task IsProtectedSignProvider_Should_Populate_Collection_Signs() - { - var sut = new IsProtectedSignProvider(); - - var viewModels = new List - { - new(), - new() { IsProtected = true }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 0); - Assert.AreEqual(viewModels[1].Signs.Count(), 1); - - var signModel = viewModels[1].Signs.First(); - Assert.AreEqual("Umb.IsProtected", signModel.Alias); - } - - [Test] - public async Task IsProtectedSignProvider_Should_Populate_Plain_Signs() - { - var sut = new IsProtectedSignProvider(); - - var viewModels = new List - { - new(), - new() { IsProtected = true }, - }; - - await sut.PopulateSignsAsync(viewModels); - - Assert.AreEqual(viewModels[0].Signs.Count(), 0); - Assert.AreEqual(viewModels[1].Signs.Count(), 1); - - var signModel = viewModels[1].Signs.First(); - Assert.AreEqual("Umb.IsProtected", signModel.Alias); - } -} From 8cc1d4bcae86bc8320a30a1da0547c3af2fd492b Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 16 Sep 2025 13:58:08 +0200 Subject: [PATCH 05/15] Avoid throwing an exception on getting references when migrating content with changed data types (16) (#20155) * Avoid throwing an exception on getting references when migrating content with changed data types. * Reintroduced generic catch to avoid functional breakage --------- Co-authored-by: kjac --- .../BlockEditorPropertyValueEditor.cs | 78 ++++++++++++++----- .../BlockGridPropertyEditorBase.cs | 2 +- .../BlockListPropertyEditorBase.cs | 2 +- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/BlockEditorPropertyValueEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/BlockEditorPropertyValueEditor.cs index 21359ec1c0..10c752088b 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/BlockEditorPropertyValueEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/BlockEditorPropertyValueEditor.cs @@ -2,7 +2,11 @@ // See LICENSE for more details. using System.Diagnostics.CodeAnalysis; +using System.Text.Json; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Blocks; @@ -21,6 +25,36 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal where TValue : BlockValue, new() where TLayout : class, IBlockLayoutItem, new() { + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] + protected BlockEditorPropertyValueEditor( + PropertyEditorCollection propertyEditors, + DataValueReferenceFactoryCollection dataValueReferenceFactories, + IDataTypeConfigurationCache dataTypeConfigurationCache, + IShortStringHelper shortStringHelper, + IJsonSerializer jsonSerializer, + BlockEditorVarianceHandler blockEditorVarianceHandler, + ILanguageService languageService, + IIOHelper ioHelper, + DataEditorAttribute attribute) + : this( + propertyEditors, + dataValueReferenceFactories, + dataTypeConfigurationCache, + shortStringHelper, + jsonSerializer, + blockEditorVarianceHandler, + languageService, + ioHelper, + attribute, + StaticServiceProvider.Instance.GetRequiredService()) + { + } + /// /// Initializes a new instance of the class. /// @@ -33,9 +67,13 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal BlockEditorVarianceHandler blockEditorVarianceHandler, ILanguageService languageService, IIOHelper ioHelper, - DataEditorAttribute attribute) - : base(propertyEditors, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, dataValueReferenceFactories, blockEditorVarianceHandler, languageService, ioHelper, attribute) => + DataEditorAttribute attribute, + ILogger logger) + : base(propertyEditors, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, dataValueReferenceFactories, blockEditorVarianceHandler, languageService, ioHelper, attribute) + { JsonSerializer = jsonSerializer; + _logger = logger; + } /// /// Gets the . @@ -63,7 +101,7 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal private TValue? ParseBlockValue(object? value) { var rawJson = value == null ? string.Empty : value is string str ? str : value.ToString(); - return BlockEditorValues.DeserializeAndClean(rawJson)?.BlockValue; + return SafeParseBlockEditorData(rawJson)?.BlockValue; } /// @@ -71,16 +109,7 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal { var val = property.GetValue(culture, segment); - BlockEditorData? blockEditorData; - try - { - blockEditorData = BlockEditorValues.DeserializeAndClean(val); - } - catch - { - // if this occurs it means the data is invalid, shouldn't happen but has happened if we change the data format. - return string.Empty; - } + BlockEditorData? blockEditorData = SafeParseBlockEditorData(val); if (blockEditorData == null) { @@ -103,8 +132,8 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal // For most of the properties this is fine, but for properties which contain other state it might be critical (e.g. file upload field). // So, we must run MapBlockValueFromEditor even if editorValue is null or string.IsNullOrWhiteSpace(editorValue.Value.ToString()) is true. - BlockEditorData? currentBlockEditorData = GetBlockEditorData(currentValue); - BlockEditorData? blockEditorData = GetBlockEditorData(editorValue.Value); + BlockEditorData? currentBlockEditorData = SafeParseBlockEditorData(currentValue); + BlockEditorData? blockEditorData = SafeParseBlockEditorData(editorValue.Value); // We can skip MapBlockValueFromEditor if both editorValue and currentValue values are empty. if (IsBlockEditorDataEmpty(currentBlockEditorData) && IsBlockEditorDataEmpty(blockEditorData)) @@ -122,19 +151,30 @@ public abstract class BlockEditorPropertyValueEditor : BlockVal return JsonSerializer.Serialize(blockEditorData.BlockValue); } - private BlockEditorData? GetBlockEditorData(object? value) + private static bool IsBlockEditorDataEmpty([NotNullWhen(false)] BlockEditorData? editorData) + => editorData is null || editorData.BlockValue.ContentData.Count == 0; + + // We don't throw on error here because we want to be able to parse what we can, even if some of the data is invalid. In cases where migrating + // from nested content to blocks, we don't want to trigger a fatal error for retrieving references, as this isn't vital to the operation. + // See: https://github.com/umbraco/Umbraco-CMS/issues/19784 and Umbraco support cases. + private BlockEditorData? SafeParseBlockEditorData(object? value) { try { return BlockEditorValues.DeserializeAndClean(value); } + catch (JsonException ex) + { + _logger.LogWarning( + "Could not deserialize the provided property value into a block editor value: {PropertyValue}. Error: {ErrorMessage}.", + value, + ex.Message); + return null; + } catch { // If this occurs it means the data is invalid. It shouldn't happen could if we change the data format. return null; } } - - private static bool IsBlockEditorDataEmpty([NotNullWhen(false)] BlockEditorData? editorData) - => editorData is null || editorData.BlockValue.ContentData.Count == 0; } diff --git a/src/Umbraco.Infrastructure/PropertyEditors/BlockGridPropertyEditorBase.cs b/src/Umbraco.Infrastructure/PropertyEditors/BlockGridPropertyEditorBase.cs index 0f0a48e992..19e518cdcb 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/BlockGridPropertyEditorBase.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/BlockGridPropertyEditorBase.cs @@ -56,7 +56,7 @@ public abstract class BlockGridPropertyEditorBase : DataEditor BlockEditorVarianceHandler blockEditorVarianceHandler, ILanguageService languageService, IIOHelper ioHelper) - : base(propertyEditors, dataValueReferenceFactories, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, blockEditorVarianceHandler, languageService, ioHelper, attribute) + : base(propertyEditors, dataValueReferenceFactories, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, blockEditorVarianceHandler, languageService, ioHelper, attribute, logger) { BlockEditorValues = new BlockEditorValues(new BlockGridEditorDataConverter(jsonSerializer), elementTypeCache, logger); Validators.Add(new BlockEditorValidator(propertyValidationService, BlockEditorValues, elementTypeCache)); diff --git a/src/Umbraco.Infrastructure/PropertyEditors/BlockListPropertyEditorBase.cs b/src/Umbraco.Infrastructure/PropertyEditors/BlockListPropertyEditorBase.cs index 9deb400923..322d2927fb 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/BlockListPropertyEditorBase.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/BlockListPropertyEditorBase.cs @@ -69,7 +69,7 @@ public abstract class BlockListPropertyEditorBase : DataEditor BlockEditorVarianceHandler blockEditorVarianceHandler, ILanguageService languageService, IIOHelper ioHelper) - : base(propertyEditors, dataValueReferenceFactories, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, blockEditorVarianceHandler, languageService, ioHelper, attribute) + : base(propertyEditors, dataValueReferenceFactories, dataTypeConfigurationCache, shortStringHelper, jsonSerializer, blockEditorVarianceHandler, languageService, ioHelper, attribute, logger) { BlockEditorValues = new BlockEditorValues(blockEditorDataConverter, elementTypeCache, logger); Validators.Add(new BlockEditorValidator(propertyValidationService, BlockEditorValues, elementTypeCache)); From 4e300490b22540d109f261587eecb5fcc7dc5a29 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 16 Sep 2025 18:11:06 +0200 Subject: [PATCH 06/15] Generated Partial Views: Improves the generated code slightly for a better developer experience (#20151) improves the partials to remove an extra semicolon, store a value, and replace an obsoleted key --- src/Umbraco.Core/EmbeddedResources/BlockGrid/default.cshtml | 5 ++--- src/Umbraco.Web.UI/Views/Partials/blockgrid/default.cshtml | 5 ++--- src/Umbraco.Web.UI/Views/Partials/blocklist/default.cshtml | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/BlockGrid/default.cshtml b/src/Umbraco.Core/EmbeddedResources/BlockGrid/default.cshtml index 4065bfdd03..2a298ddaf5 100644 --- a/src/Umbraco.Core/EmbeddedResources/BlockGrid/default.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/BlockGrid/default.cshtml @@ -2,10 +2,9 @@ @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @{ if (Model?.Any() != true) { return; } + var gridColumns = Model.GridColumns?.ToString() ?? "12"; } -
+
@await Html.GetBlockGridItemsHtmlAsync(Model)
diff --git a/src/Umbraco.Web.UI/Views/Partials/blockgrid/default.cshtml b/src/Umbraco.Web.UI/Views/Partials/blockgrid/default.cshtml index e25839ebb1..db6a793a91 100644 --- a/src/Umbraco.Web.UI/Views/Partials/blockgrid/default.cshtml +++ b/src/Umbraco.Web.UI/Views/Partials/blockgrid/default.cshtml @@ -2,10 +2,9 @@ @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @{ if (Model?.Any() != true) { return; } + var gridColumns = Model.GridColumns?.ToString() ?? "12"; } -
+
@await Html.GetBlockGridItemsHtmlAsync(Model)
diff --git a/src/Umbraco.Web.UI/Views/Partials/blocklist/default.cshtml b/src/Umbraco.Web.UI/Views/Partials/blocklist/default.cshtml index accca2ef37..a79ea11547 100644 --- a/src/Umbraco.Web.UI/Views/Partials/blocklist/default.cshtml +++ b/src/Umbraco.Web.UI/Views/Partials/blocklist/default.cshtml @@ -5,7 +5,7 @@
@foreach (var block in Model) { - if (block?.ContentUdi == null) { continue; } + if (block?.ContentKey == null) { continue; } var data = block.Content; @await Html.PartialAsync("blocklist/Components/" + data.ContentType.Alias, block) From aba82dd5228ef83778adf343eab9feb8916577a2 Mon Sep 17 00:00:00 2001 From: Markus Johansson Date: Tue, 16 Sep 2025 22:11:35 +0200 Subject: [PATCH 07/15] #19736 adjust drag placeholder for document picker (#19737) --- .../entity-item-ref.element.ts | 38 +++++++++++++++++++ .../input-document/input-document.element.ts | 3 -- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-item/entity-item-ref/entity-item-ref.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-item/entity-item-ref/entity-item-ref.element.ts index 17d1721051..5ffb94a697 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-item/entity-item-ref/entity-item-ref.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-item/entity-item-ref/entity-item-ref.element.ts @@ -6,6 +6,7 @@ import { UMB_MARK_ATTRIBUTE_NAME } from '@umbraco-cms/backoffice/const'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbRoutePathAddendumContext } from '@umbraco-cms/backoffice/router'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; +import { UUIBlinkAnimationValue } from '@umbraco-cms/backoffice/external/uui'; import './default-item-ref.element.js'; import { UmbDeselectedEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event'; @@ -196,6 +197,43 @@ export class UmbEntityItemRefElement extends UmbLitElement { display: block; position: relative; } + + :host::after { + content: ''; + position: absolute; + z-index: 1; + pointer-events: none; + inset: 0; + border: 1px solid transparent; + border-radius: var(--uui-border-radius); + + transition: border-color 240ms ease-in; + } + + :host([drag-placeholder]) { + --uui-color-focus:transparent; + } + + :host([drag-placeholder])::after { + display: block; + border-width: 2px; + border-color: var(--uui-color-interactive-emphasis); + animation: ${UUIBlinkAnimationValue}; + } + :host([drag-placeholder])::before { + content: ''; + position: absolute; + pointer-events: none; + inset: 0; + border-radius: var(--uui-border-radius); + background-color: var(--uui-color-interactive-emphasis); + opacity: 0.12; + } + :host([drag-placeholder]) > * { + transition: opacity 50ms 16ms; + opacity: 0; + } + `, ]; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts index 3767445c56..52406deee8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/components/input-document/input-document.element.ts @@ -221,9 +221,6 @@ export class UmbInputDocumentElement extends UmbFormControlMixin Date: Wed, 17 Sep 2025 06:51:10 +0200 Subject: [PATCH 08/15] Make notification service able to handle segmented content (#20160) --- .../Services/NotificationService.cs | 81 +++++++++---------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Core/Services/NotificationService.cs b/src/Umbraco.Core/Services/NotificationService.cs index 24dbb0089a..3d5673fd7a 100644 --- a/src/Umbraco.Core/Services/NotificationService.cs +++ b/src/Umbraco.Core/Services/NotificationService.cs @@ -374,47 +374,7 @@ public class NotificationService : INotificationService // build summary var summary = new StringBuilder(); - if (content.ContentType.VariesByNothing()) - { - if (!_contentSettings.Notifications.DisableHtmlEmail) - { - // create the HTML summary for invariant content - - // list all of the property values like we used to - summary.Append(""); - foreach (IProperty p in content.Properties) - { - // TODO: doesn't take into account variants - var newText = p.GetValue() != null ? p.GetValue()?.ToString() : string.Empty; - var oldText = newText; - - // check if something was changed and display the changes otherwise display the fields - if (oldDoc?.Properties.Contains(p.PropertyType.Alias) ?? false) - { - IProperty? oldProperty = oldDoc.Properties[p.PropertyType.Alias]; - oldText = oldProperty?.GetValue() != null ? oldProperty.GetValue()?.ToString() : string.Empty; - - // replace HTML with char equivalent - ReplaceHtmlSymbols(ref oldText); - ReplaceHtmlSymbols(ref newText); - } - - // show the values - summary.Append(""); - summary.Append( - ""); - summary.Append(""); - summary.Append(""); - } - - summary.Append("
"); - summary.Append(p.PropertyType.Name); - summary.Append(""); - summary.Append(newText); - summary.Append("
"); - } - } - else if (content.ContentType.VariesByCulture()) + if (content.ContentType.VariesByCulture()) { // it's variant, so detect what cultures have changed if (!_contentSettings.Notifications.DisableHtmlEmail) @@ -454,8 +414,43 @@ public class NotificationService : INotificationService } else { - // not supported yet... - throw new NotSupportedException(); + if (!_contentSettings.Notifications.DisableHtmlEmail) + { + // create the HTML summary for invariant content + + // list all of the property values like we used to + summary.Append(""); + foreach (IProperty p in content.Properties) + { + // TODO: doesn't take into account variants + var newText = p.GetValue() != null ? p.GetValue()?.ToString() : string.Empty; + var oldText = newText; + + // check if something was changed and display the changes otherwise display the fields + if (oldDoc?.Properties.Contains(p.PropertyType.Alias) ?? false) + { + IProperty? oldProperty = oldDoc.Properties[p.PropertyType.Alias]; + oldText = oldProperty?.GetValue() != null ? oldProperty.GetValue()?.ToString() : string.Empty; + + // replace HTML with char equivalent + ReplaceHtmlSymbols(ref oldText); + ReplaceHtmlSymbols(ref newText); + } + + // show the values + summary.Append(""); + summary.Append( + ""); + summary.Append(""); + summary.Append(""); + } + + summary.Append("
"); + summary.Append(p.PropertyType.Name); + summary.Append(""); + summary.Append(newText); + summary.Append("
"); + } } var protocol = _globalSettings.UseHttps ? "https" : "http"; From de8545456daed05fdd19ef80ccf5bdf53f21df81 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Wed, 17 Sep 2025 09:38:12 +0200 Subject: [PATCH 09/15] Improvement - Content type filters : Add Validation for allowed children and root (#19903) * Validate content type filter restrictions when creating content at root. * Validate content type filter restrictions when creating content as child. * Update tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEditingServiceTests.Create.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../ContentBlueprintEditingService.cs | 6 +- .../Services/ContentEditingService.cs | 7 +- .../Services/ContentEditingServiceBase.cs | 53 +++++++-- .../ContentEditingServiceWithSortingBase.cs | 7 +- .../Services/MediaEditingService.cs | 7 +- .../Services/MemberContentEditingService.cs | 8 +- .../ContentEditingServiceTests.Create.cs | 111 +++++++++++++++++- 7 files changed, 176 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentBlueprintEditingService.cs b/src/Umbraco.Core/Services/ContentBlueprintEditingService.cs index d2e68ad327..f40aafc301 100644 --- a/src/Umbraco.Core/Services/ContentBlueprintEditingService.cs +++ b/src/Umbraco.Core/Services/ContentBlueprintEditingService.cs @@ -7,6 +7,7 @@ using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; namespace Umbraco.Cms.Core.Services; @@ -27,8 +28,9 @@ internal sealed class ContentBlueprintEditingService IContentValidationService validationService, IContentBlueprintContainerService containerService, IOptionsMonitor optionsMonitor, - IRelationService relationService) - : base(contentService, contentTypeService, propertyEditorCollection, dataTypeService, logger, scopeProvider, userIdKeyResolver, validationService, optionsMonitor, relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) + : base(contentService, contentTypeService, propertyEditorCollection, dataTypeService, logger, scopeProvider, userIdKeyResolver, validationService, optionsMonitor, relationService, contentTypeFilters) => _containerService = containerService; public Task GetAsync(Guid key) diff --git a/src/Umbraco.Core/Services/ContentEditingService.cs b/src/Umbraco.Core/Services/ContentEditingService.cs index bd32e3d04a..00b3dddd25 100644 --- a/src/Umbraco.Core/Services/ContentEditingService.cs +++ b/src/Umbraco.Core/Services/ContentEditingService.cs @@ -6,6 +6,7 @@ using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Extensions; @@ -36,7 +37,8 @@ internal sealed class ContentEditingService ILocalizationService localizationService, ILanguageService languageService, IOptionsMonitor optionsMonitor, - IRelationService relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) : base( contentService, contentTypeService, @@ -48,7 +50,8 @@ internal sealed class ContentEditingService contentValidationService, treeEntitySortingService, optionsMonitor, - relationService) + relationService, + contentTypeFilters) { _propertyEditorCollection = propertyEditorCollection; _templateService = templateService; diff --git a/src/Umbraco.Core/Services/ContentEditingServiceBase.cs b/src/Umbraco.Core/Services/ContentEditingServiceBase.cs index 2f746d9a6f..edfde776e2 100644 --- a/src/Umbraco.Core/Services/ContentEditingServiceBase.cs +++ b/src/Umbraco.Core/Services/ContentEditingServiceBase.cs @@ -6,6 +6,7 @@ using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Editors; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Extensions; @@ -23,6 +24,7 @@ internal abstract class ContentEditingServiceBase _validationService; private readonly IRelationService _relationService; + private readonly ContentTypeFilterCollection _contentTypeFilters; protected ContentEditingServiceBase( TContentService contentService, @@ -34,7 +36,8 @@ internal abstract class ContentEditingServiceBase validationService, IOptionsMonitor optionsMonitor, - IRelationService relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) { _propertyEditorCollection = propertyEditorCollection; _dataTypeService = dataTypeService; @@ -51,6 +54,7 @@ internal abstract class ContentEditingServiceBase TryGetAndValidateParentIdAsync(Guid? parentKey, TContentType contentType) + protected virtual async Task<(int? ParentId, ContentEditingOperationStatus OperationStatus)> TryGetAndValidateParentIdAsync(Guid? parentKey, TContentType contentType) { TContent? parent = parentKey.HasValue ? ContentService.GetById(parentKey.Value) @@ -381,32 +385,63 @@ internal abstract class ContentEditingServiceBase((null, ContentEditingOperationStatus.ParentNotFound)); + return (null, ContentEditingOperationStatus.ParentNotFound); } - if (parent == null && contentType.AllowedAsRoot == false) + if (parent == null && + (contentType.AllowedAsRoot == false || + + // We could have a content type filter registered that prevents the content from being created at the root level, + // even if it's allowed in the content type definition. + await IsAllowedAtRootByContentTypeFilters(contentType) == false)) { - return Task.FromResult<(int?, ContentEditingOperationStatus)>((null, ContentEditingOperationStatus.NotAllowed)); + return (null, ContentEditingOperationStatus.NotAllowed); } if (parent != null) { if (parent.Trashed) { - return Task.FromResult<(int?, ContentEditingOperationStatus)>((null, ContentEditingOperationStatus.InTrash)); + return (null, ContentEditingOperationStatus.InTrash); } TContentType? parentContentType = ContentTypeService.Get(parent.ContentType.Key); Guid[] allowedContentTypeKeys = parentContentType?.AllowedContentTypes?.Select(c => c.Key).ToArray() ?? Array.Empty(); - if (allowedContentTypeKeys.Contains(contentType.Key) == false) + if (allowedContentTypeKeys.Contains(contentType.Key) == false || + + // We could have a content type filter registered that prevents the content from being created as a child, + // even if it's allowed in the content type definition. + await IsAllowedAsChildByContentTypeFilters(contentType, parentContentType!.Key, parent.Key) == false) { - return Task.FromResult<(int?, ContentEditingOperationStatus)>((null, ContentEditingOperationStatus.NotAllowed)); + return (null, ContentEditingOperationStatus.NotAllowed); } } - return Task.FromResult<(int?, ContentEditingOperationStatus)>((parent?.Id ?? Constants.System.Root, ContentEditingOperationStatus.Success)); + return (parent?.Id ?? Constants.System.Root, ContentEditingOperationStatus.Success); + } + + private async Task IsAllowedAtRootByContentTypeFilters(TContentType contentType) + { + IEnumerable filteredContentTypes = [contentType]; + foreach (IContentTypeFilter filter in _contentTypeFilters) + { + filteredContentTypes = await filter.FilterAllowedAtRootAsync(filteredContentTypes); + } + + return filteredContentTypes.Any(); + } + + private async Task IsAllowedAsChildByContentTypeFilters(TContentType contentType, Guid parentContentTypeKey, Guid parentKey) + { + IEnumerable filteredContentTypes = [new ContentTypeSort(contentType.Key, contentType.SortOrder, contentType.Alias)]; + foreach (IContentTypeFilter filter in _contentTypeFilters) + { + filteredContentTypes = await filter.FilterAllowedChildrenAsync(filteredContentTypes, parentContentTypeKey, parentKey); + } + + return filteredContentTypes.Any(); } private void UpdateNames(ContentEditingModelBase contentEditingModelBase, TContent content, TContentType contentType) diff --git a/src/Umbraco.Core/Services/ContentEditingServiceWithSortingBase.cs b/src/Umbraco.Core/Services/ContentEditingServiceWithSortingBase.cs index 530f56e19c..56dcba4613 100644 --- a/src/Umbraco.Core/Services/ContentEditingServiceWithSortingBase.cs +++ b/src/Umbraco.Core/Services/ContentEditingServiceWithSortingBase.cs @@ -5,6 +5,7 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; namespace Umbraco.Cms.Core.Services; @@ -30,7 +31,8 @@ internal abstract class ContentEditingServiceWithSortingBase validationService, ITreeEntitySortingService treeEntitySortingService, IOptionsMonitor optionsMonitor, - IRelationService relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) : base( contentService, contentTypeService, @@ -41,7 +43,8 @@ internal abstract class ContentEditingServiceWithSortingBase optionsMonitor, - IRelationService relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) : base( contentService, contentTypeService, @@ -37,7 +39,8 @@ internal sealed class MediaEditingService mediaValidationService, treeEntitySortingService, optionsMonitor, - relationService) + relationService, + contentTypeFilters) => _logger = logger; public Task GetAsync(Guid key) diff --git a/src/Umbraco.Core/Services/MemberContentEditingService.cs b/src/Umbraco.Core/Services/MemberContentEditingService.cs index 720ad80d62..8ec58ae343 100644 --- a/src/Umbraco.Core/Services/MemberContentEditingService.cs +++ b/src/Umbraco.Core/Services/MemberContentEditingService.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Extensions; @@ -7,6 +7,7 @@ using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; namespace Umbraco.Cms.Core.Services; @@ -28,8 +29,9 @@ internal sealed class MemberContentEditingService IMemberValidationService memberValidationService, IUserService userService, IOptionsMonitor optionsMonitor, - IRelationService relationService) - : base(contentService, contentTypeService, propertyEditorCollection, dataTypeService, logger, scopeProvider, userIdKeyResolver, memberValidationService, optionsMonitor, relationService) + IRelationService relationService, + ContentTypeFilterCollection contentTypeFilters) + : base(contentService, contentTypeService, propertyEditorCollection, dataTypeService, logger, scopeProvider, userIdKeyResolver, memberValidationService, optionsMonitor, relationService, contentTypeFilters) { _logger = logger; _userService = userService; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEditingServiceTests.Create.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEditingServiceTests.Create.cs index 7d0a12110a..a341c371ea 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEditingServiceTests.Create.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEditingServiceTests.Create.cs @@ -1,12 +1,14 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.PropertyEditors; +using Umbraco.Cms.Core.Services.Filters; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Integration.Attributes; namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services; @@ -15,6 +17,58 @@ public partial class ContentEditingServiceTests [TestCase(true)] [TestCase(false)] public async Task Can_Create_At_Root(bool allowedAtRoot) + => await Test_Can_Create_At_Root(allowedAtRoot, allowedAtRoot); + + [Test] + [ConfigureBuilder(ActionName = nameof(ConfigureContentTypeFilterToAllowTextPageAtRoot))] + public async Task Can_Create_At_Root_With_Content_Type_Filter() => + + // Verifies that when allowed at root, the content can be created if not filtered out by a content type filter. + await Test_Can_Create_At_Root(true, true); + + [Test] + [ConfigureBuilder(ActionName = nameof(ConfigureContentTypeFilterToDisallowTextPageAtRoot))] + public async Task Cannot_Create_At_Root_With_Content_Type_Filter() => + + // Verifies that when allowed at root, the content cannot be created if filtered out by a content type filter. + await Test_Can_Create_At_Root(true, false); + + public static void ConfigureContentTypeFilterToAllowTextPageAtRoot(IUmbracoBuilder builder) + => builder.ContentTypeFilters() + .Append(); + + public static void ConfigureContentTypeFilterToDisallowTextPageAtRoot(IUmbracoBuilder builder) + => builder.ContentTypeFilters() + .Append(); + + private class ContentTypeFilterForAllowedTextPageAtRoot : ContentTypeFilterForTextPageAtRoot + { + public ContentTypeFilterForAllowedTextPageAtRoot() + : base(true) + { + } + } + + private class ContentTypeFilterForDisallowedTextPageAtRoot : ContentTypeFilterForTextPageAtRoot + { + public ContentTypeFilterForDisallowedTextPageAtRoot() + : base(false) + { + } + } + + private abstract class ContentTypeFilterForTextPageAtRoot : IContentTypeFilter + { + private readonly bool _allowed; + + protected ContentTypeFilterForTextPageAtRoot(bool allowed) => _allowed = allowed; + + public Task> FilterAllowedAtRootAsync(IEnumerable contentTypes) + where TItem : IContentTypeComposition + => Task.FromResult(contentTypes.Where(x => (_allowed && x.Alias == "textPage") || (!_allowed && x.Alias != "textPage"))); + } + + private async Task Test_Can_Create_At_Root(bool allowedAtRoot, bool expectSuccess) { var template = TemplateBuilder.CreateTextPageTemplate(); await TemplateService.CreateAsync(template, Constants.Security.SuperUserKey); @@ -41,7 +95,7 @@ public partial class ContentEditingServiceTests var result = await ContentEditingService.CreateAsync(createModel, Constants.Security.SuperUserKey); - if (allowedAtRoot) + if (expectSuccess) { Assert.IsTrue(result.Success); Assert.AreEqual(ContentEditingOperationStatus.Success, result.Status); @@ -72,6 +126,57 @@ public partial class ContentEditingServiceTests [TestCase(true)] [TestCase(false)] public async Task Can_Create_As_Child(bool allowedAsChild) + => await Test_Can_Create_As_Child(allowedAsChild, allowedAsChild); + + [Test] + [ConfigureBuilder(ActionName = nameof(ConfigureContentTypeFilterToAllowTextPageAsChild))] + public async Task Can_Create_As_Child_With_Content_Type_Filter() => + + // Verifies that when allowed as a child, the content can be created if not filtered out by a content type filter. + await Test_Can_Create_As_Child(true, true); + + [Test] + [ConfigureBuilder(ActionName = nameof(ConfigureContentTypeFilterToDisallowTextPageAsChild))] + public async Task Cannot_Create_As_Child_With_Content_Type_Filter() => + + // Verifies that when allowed as a child, the content cannot be created if filtered out by a content type filter. + await Test_Can_Create_As_Child(true, false); + + public static void ConfigureContentTypeFilterToAllowTextPageAsChild(IUmbracoBuilder builder) + => builder.ContentTypeFilters() + .Append(); + + public static void ConfigureContentTypeFilterToDisallowTextPageAsChild(IUmbracoBuilder builder) + => builder.ContentTypeFilters() + .Append(); + + private class ContentTypeFilterForAllowedTextPageAsChild : ContentTypeFilterForTextPageAsChild + { + public ContentTypeFilterForAllowedTextPageAsChild() + : base(true) + { + } + } + + private class ContentTypeFilterForDisallowedTextPageAsChild : ContentTypeFilterForTextPageAsChild + { + public ContentTypeFilterForDisallowedTextPageAsChild() + : base(false) + { + } + } + + private abstract class ContentTypeFilterForTextPageAsChild : IContentTypeFilter + { + private readonly bool _allowed; + + protected ContentTypeFilterForTextPageAsChild(bool allowed) => _allowed = allowed; + + public Task> FilterAllowedChildrenAsync(IEnumerable contentTypes, Guid parentContentTypeKey, Guid? parentContentKey) + => Task.FromResult(contentTypes.Where(x => (_allowed && x.Alias == "textPage") || (!_allowed && x.Alias != "textPage"))); + } + + private async Task Test_Can_Create_As_Child(bool allowedAsChild, bool expectSuccess) { var template = TemplateBuilder.CreateTextPageTemplate(); await TemplateService.CreateAsync(template, Constants.Security.SuperUserKey); @@ -121,7 +226,7 @@ public partial class ContentEditingServiceTests var result = await ContentEditingService.CreateAsync(createModel, Constants.Security.SuperUserKey); - if (allowedAsChild) + if (expectSuccess) { Assert.IsTrue(result.Success); Assert.AreEqual(ContentEditingOperationStatus.Success, result.Status); From 04cf97bd902d66fa02a3158f3974d1753c6122a4 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Wed, 17 Sep 2025 08:50:04 +0100 Subject: [PATCH 10/15] Member workspace: Fix for loading inside modal (#20163) * Member workspace (in modal) fix Fixes #20085. * Updated with member workspace constants --- .../member/item/member-item-ref.element.ts | 1 + .../src/packages/members/member/paths.ts | 5 ++++- .../member/member-workspace-editor.element.ts | 21 ++++++++++++++----- .../member/member-workspace.context-token.ts | 3 ++- .../member/member-workspace.context.ts | 14 ++++++------- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/item/member-item-ref.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/item/member-item-ref.element.ts index e28ad24ee8..6688389987 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/item/member-item-ref.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/item/member-item-ref.element.ts @@ -48,6 +48,7 @@ export class UmbMemberItemRefElement extends UmbLitElement { ]); new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) + .addUniquePaths(['unique']) .onSetup(() => { return { data: { entityType: UMB_MEMBER_ENTITY_TYPE, preset: {} } }; }) diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/paths.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/paths.ts index 5d5f51d8f8..b1a05d2a60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/paths.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/paths.ts @@ -17,4 +17,7 @@ export const UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ memberTypeUnique: string; }>('create/:memberTypeUnique', UMB_MEMBER_WORKSPACE_PATH); -export const UMB_EDIT_MEMBER_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>('edit/:unique'); +export const UMB_EDIT_MEMBER_WORKSPACE_PATH_PATTERN = new UmbPathPattern<{ unique: string }>( + 'edit/:unique', + UMB_MEMBER_WORKSPACE_PATH, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts index 7e57d2b287..8b487213ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace-editor.element.ts @@ -14,6 +14,8 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { #workspaceContext?: typeof UMB_MEMBER_WORKSPACE_CONTEXT.TYPE; + #workspaceRoute?: string; + @state() private _isForbidden = false; @@ -34,7 +36,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { // TODO: the variantOptions observable is like too broad as this will be triggered then there is any change in the variant options, we need to only update routes when there is a relevant change to them. [NL] this.observe( this.#workspaceContext?.variantOptions, - (variants) => this._generateRoutes(variants ?? []), + (variants) => this.#generateRoutes(variants ?? []), '_observeVariants', ); } @@ -47,7 +49,7 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { ); } - private async _generateRoutes(variants: Array) { + #generateRoutes(variants: Array) { // Generate split view routes for all available routes const routes: Array = []; @@ -81,11 +83,19 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { }); if (routes.length !== 0) { - // Using first single view as the default route for now (hence the math below): routes.push({ path: '', pathMatch: 'full', - redirectTo: routes[variants.length * variants.length]?.path, + //redirectTo: routes[variants.length * variants.length]?.path, + resolve: async () => { + if (!this.#workspaceContext) { + throw new Error('Workspace context is not available when resolving the default route.'); + } + + // Using first single view as the default route for now (hence the math below): + const path = routes[variants.length * variants.length]?.path; + history.replaceState({}, '', `${this.#workspaceRoute}/${path}`); + }, }); } @@ -98,7 +108,8 @@ export class UmbMemberWorkspaceEditorElement extends UmbLitElement { } private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { - this.#workspaceContext?.splitView.setWorkspaceRoute(e.target.absoluteRouterPath); + this.#workspaceRoute = e.target.absoluteRouterPath; + this.#workspaceContext?.splitView.setWorkspaceRoute(this.#workspaceRoute); }; override render() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context-token.ts index bd93f9946f..e2d14f6fe7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context-token.ts @@ -1,3 +1,4 @@ +import { UMB_MEMBER_ENTITY_TYPE } from '../../entity.js'; import type { UmbMemberWorkspaceContext } from './member-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbSubmittableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; @@ -8,5 +9,5 @@ export const UMB_MEMBER_WORKSPACE_CONTEXT = new UmbContextToken< >( 'UmbWorkspaceContext', undefined, - (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === 'member', + (context): context is UmbMemberWorkspaceContext => context.getEntityType?.() === UMB_MEMBER_ENTITY_TYPE, ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts index 1ea4c9e97d..94cf5e3744 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/member/member-workspace.context.ts @@ -3,12 +3,12 @@ import type { UmbMemberDetailModel, UmbMemberVariantModel } from '../../types.js import { UmbMemberPropertyDatasetContext } from '../../property-dataset-context/member-property-dataset.context.js'; import { UMB_MEMBER_ENTITY_TYPE, UMB_MEMBER_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_MEMBER_DETAIL_REPOSITORY_ALIAS } from '../../repository/detail/manifests.js'; +import { UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN, UMB_EDIT_MEMBER_WORKSPACE_PATH_PATTERN } from '../../paths.js'; import { UMB_MEMBER_WORKSPACE_ALIAS, UMB_MEMBER_WORKSPACE_VIEW_MEMBER_ALIAS, UMB_MEMBER_DETAIL_MODEL_VARIANT_SCAFFOLD, } from './constants.js'; -import { UmbMemberWorkspaceEditorElement } from './member-workspace-editor.element.js'; import { UmbMemberTypeDetailRepository, type UmbMemberTypeDetailModel } from '@umbraco-cms/backoffice/member-type'; import { UmbWorkspaceIsNewRedirectController, @@ -65,8 +65,8 @@ export class UmbMemberWorkspaceContext this.routes.setRoutes([ { - path: 'create/:memberTypeUnique', - component: () => new UmbMemberWorkspaceEditorElement(), + path: UMB_CREATE_MEMBER_WORKSPACE_PATH_PATTERN.toString(), + component: () => import('./member-workspace-editor.element.js'), setup: async (_component, info) => { const memberTypeUnique = info.match.params.memberTypeUnique; await this.create(memberTypeUnique); @@ -79,12 +79,12 @@ export class UmbMemberWorkspaceContext }, }, { - path: 'edit/:unique', - component: () => new UmbMemberWorkspaceEditorElement(), - setup: (_component, info) => { + path: UMB_EDIT_MEMBER_WORKSPACE_PATH_PATTERN.toString(), + component: () => import('./member-workspace-editor.element.js'), + setup: async (_component, info) => { this.removeUmbControllerByAlias(UmbWorkspaceIsNewRedirectControllerAlias); const unique = info.match.params.unique; - this.load(unique); + await this.load(unique); }, }, ]); From b8b72dd9d3b44b7dbbe675c05293e0cba6a22429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 17 Sep 2025 10:01:54 +0200 Subject: [PATCH 11/15] Content Type Designer: Fix to prevent dragging inherited properties (#20136) do not drag inherited properties --- .../content-type-design-editor-properties.element.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts index cbfedf1878..720ff8432b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/content/content-type/workspace/views/design/content-type-design-editor-properties.element.ts @@ -33,7 +33,7 @@ const SORTER_CONFIG: UmbSorterConfig { this._sortModeActive = isSorting; - if (isSorting) { - //this.#sorter.enable(); - } else { - //this.#sorter.disable(); - } }, '_observeIsSorting', ); From cc6ce1e80fe083172a055b789941c0c4eabb444c Mon Sep 17 00:00:00 2001 From: Laura Neto <12862535+lauraneto@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:06:42 +0200 Subject: [PATCH 12/15] Mark `MemberService.GetMembersByPropertyValue()` methods as obsolete (#20092) --- src/Umbraco.Core/Services/IMemberService.cs | 24 ++++++++++++++ src/Umbraco.Core/Services/MemberService.cs | 35 +++++---------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Core/Services/IMemberService.cs b/src/Umbraco.Core/Services/IMemberService.cs index c44095a40f..1620e538e9 100644 --- a/src/Umbraco.Core/Services/IMemberService.cs +++ b/src/Umbraco.Core/Services/IMemberService.cs @@ -385,6 +385,12 @@ public interface IMemberService : IMembershipMemberService, IContentServiceBase< /// /// /// + /// + /// Instead of using this method, which queries the database directly, we advise using search (Examine). + /// You can configure an `IValueSetValidator` to ensure all the properties you need are indexed. + /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] IEnumerable? GetMembersByPropertyValue( string propertyTypeAlias, string value, @@ -402,6 +408,12 @@ public interface IMemberService : IMembershipMemberService, IContentServiceBase< /// /// /// + /// + /// Instead of using this method, which queries the database directly, we advise using search (Examine). + /// You can configure an `IValueSetValidator` to ensure all the properties you need are indexed. + /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, int value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact); /// @@ -412,6 +424,12 @@ public interface IMemberService : IMembershipMemberService, IContentServiceBase< /// /// /// + /// + /// Instead of using this method, which queries the database directly, we advise using search (Examine). + /// You can configure an `IValueSetValidator` to ensure all the properties you need are indexed. + /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, bool value); /// @@ -426,6 +444,12 @@ public interface IMemberService : IMembershipMemberService, IContentServiceBase< /// /// /// + /// + /// Instead of using this method, which queries the database directly, we advise using search (Examine). + /// You can configure an `IValueSetValidator` to ensure all the properties you need are indexed. + /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, DateTime value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact); /// diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index e88881be42..dbf3929ddf 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -612,13 +612,8 @@ namespace Umbraco.Cms.Core.Services return _memberRepository.GetPage(query, pageIndex, pageSize, out totalRecords, null, Ordering.By("LoginName")); } - /// - /// Gets a list of Members based on a property search - /// - /// Alias of the PropertyType to search for - /// Value to match - /// The type of match to make as . Default is - /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] public IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, string value, StringPropertyMatchType matchType = StringPropertyMatchType.Exact) { using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); @@ -646,13 +641,8 @@ namespace Umbraco.Cms.Core.Services return _memberRepository.Get(query); } - /// - /// Gets a list of Members based on a property search - /// - /// Alias of the PropertyType to search for - /// Value to match - /// The type of match to make as . Default is - /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] public IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, int value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact) { using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); @@ -683,12 +673,8 @@ namespace Umbraco.Cms.Core.Services return _memberRepository.Get(query); } - /// - /// Gets a list of Members based on a property search - /// - /// Alias of the PropertyType to search for - /// Value to match - /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] public IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, bool value) { using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); @@ -698,13 +684,8 @@ namespace Umbraco.Cms.Core.Services return _memberRepository.Get(query); } - /// - /// Gets a list of Members based on a property search - /// - /// Alias of the PropertyType to search for - /// Value to match - /// The type of match to make as . Default is - /// + /// + [Obsolete("Please use Search (Examine) instead, scheduled for removal in Umbraco 18.")] public IEnumerable? GetMembersByPropertyValue(string propertyTypeAlias, DateTime value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact) { using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); From 311776a0a9f4eadb6d685763638648d71df8f9b0 Mon Sep 17 00:00:00 2001 From: BerglindV Date: Wed, 17 Sep 2025 11:33:53 +0200 Subject: [PATCH 13/15] Release Notes: Improved readability for Accessibility tag in the Update release.yml (#20135) * Update release.yml * Update release.yml * Update release.yml * Update release.yml --- .github/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index ca58694c60..58dfd83e43 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -7,7 +7,7 @@ changelog: - duplicate - wontfix categories: - - title: 🙌 Notable Changes + - title: 🙌 Notable Changes labels: - category/notable - title: 💥 Breaking Changes @@ -23,7 +23,7 @@ changelog: - title: 📦 Dependencies labels: - dependencies - - title: 🌈 A11Y + - title: 🌈 Accessibility Improvements labels: - accessibility - category/accessibility From 7483f2019171dd4537f95369a5637950ccb0ed1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=BCger?= <93977820+OskarKruger@users.noreply.github.com> Date: Wed, 17 Sep 2025 14:35:51 +0200 Subject: [PATCH 14/15] Misleading profile button label (#20161) * Add Accessibility for RTE input fields * fix indentation * update method with singular fetch * Update misleading profile button label and localizations * Revert "update method with singular fetch" This reverts commit 5360df95bbd1f79b65aa5e40e68b3b835c02ef57. * Update methodname * Revert XML changes and simplify localization keys * Restores "openCloseBackofficeProfileOptions" localization key --------- Co-authored-by: Oskar kruger Co-authored-by: leekelleher --- src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/bs.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/cs.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/cy.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/da.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/de.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/fr.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/hr.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/it.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/nl.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/pt.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/sv.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/tr.ts | 1 + src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts | 1 + .../user/current-user/current-user-header-app.element.ts | 2 +- 16 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts index 79ebd41641..d0f41288ba 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/ar.ts @@ -2109,6 +2109,7 @@ export default { openBackofficeSearch: 'فتح بحث المكتب الخلفي', openCloseBackofficeHelp: 'فتح/إغلاق مساعدة المكتب الخلفي', openCloseBackofficeProfileOptions: 'فتح/إغلاق خيارات ملفك الشخصي', + profileOptions: 'خيارات الملف الشخصي', assignDomainDescription: 'إعداد الثقافة وأسماء النطاقات لـ %0%', createDescription: 'إنشاء عقدة جديدة تحت %0%', protectDescription: 'إعداد قيود الوصول على %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/bs.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/bs.ts index e98ad51e08..d182337d23 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/bs.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/bs.ts @@ -1993,6 +1993,7 @@ export default { openBackofficeSearch: 'Otvorite backoffice pretragu', openCloseBackofficeHelp: 'Otvori/Zatvori pomoć za backoffice', openCloseBackofficeProfileOptions: 'Opcije otvaranja/zatvaranja profila', + profileOptions: 'Opcije profila', assignDomainDescription: 'Postavite kulturu i imena hostova za %0%', createDescription: 'Kreirajte novi čvor ispod %0%', protectDescription: 'Postavite ograničenja pristupa uključena %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/cs.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/cs.ts index 63712f2dbc..594b299354 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/cs.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/cs.ts @@ -1814,6 +1814,7 @@ export default { openBackofficeSearch: 'Otevřít hledání v backoffice', openCloseBackofficeHelp: 'Otevřít/zavřít nápovědu backoffice', openCloseBackofficeProfileOptions: 'Otevřít/zavřít možnosti vašeho profilu', + profileOptions: 'Opcije profila', openContextMenu: 'Otevřít kontextové menu pro', currentLanguage: 'Aktuální jazyk', switchLanguage: 'Přepnout jazyk na', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/cy.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/cy.ts index 479a00f044..ac62461746 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/cy.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/cy.ts @@ -2172,6 +2172,7 @@ export default { openBackofficeSearch: 'Agor chwiliad swyddfa gefn', openCloseBackofficeHelp: 'Agor/Cau cymorth swyddfa gefn', openCloseBackofficeProfileOptions: 'Agor/Cau eich opsiynau proffil', + profileOptions: 'Opsiynau proffil', assignDomainDescription: 'Sefydli Diwylliannau ac Enwau Gwesteia am %0%', createDescription: 'Creu nod newydd o dan %0%', protectDescription: 'Sefydli Mynediad Cyhoeddus ar %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/da.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/da.ts index 999d49a324..95be59b6f8 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/da.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/da.ts @@ -2311,6 +2311,7 @@ export default { openBackofficeSearch: 'Åben backoffice søgning', openCloseBackofficeHelp: 'Åben/Luk backoffice hjælp', openCloseBackofficeProfileOptions: 'Åben/Luk dine profil indstillinger', + profileOptions: 'Profil indstillinger', assignDomainDescription: 'Tilføj domæne på %0%', createDescription: 'Opret ny node under %0%', protectDescription: 'Opsæt offentlig adgang på %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/de.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/de.ts index c449621f60..dd5792e263 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/de.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/de.ts @@ -1976,6 +1976,7 @@ export default { openBackofficeSearch: 'Back-Office Suche öffnen', openCloseBackofficeHelp: 'Back-Office Hilfe öffnen / schliessen', openCloseBackofficeProfileOptions: 'Ihre Profil-Einstellungen öffnen / schliessen', + profileOptions: 'Profil-Einstellungen', }, logViewer: { selectAllLogLevelFilters: 'Wählen Sie Alle', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 1c06cc6307..29fa449f1f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2369,6 +2369,7 @@ export default { openBackofficeSearch: 'Open backoffice search', openCloseBackofficeHelp: 'Open/Close backoffice help', openCloseBackofficeProfileOptions: 'Open/Close your profile options', + profileOptions: 'Profile options', assignDomainDescription: 'Setup Culture and Hostnames for %0%', createDescription: 'Create new node under %0%', protectDescription: 'Setup access restrictions on %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/fr.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/fr.ts index f612acf93f..dcbc5655b7 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/fr.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/fr.ts @@ -1862,6 +1862,7 @@ export default { openBackofficeSearch: 'Ouvrir la recherche backoffice', openCloseBackofficeHelp: "Ouvrir/Fermer l'aide backoffice", openCloseBackofficeProfileOptions: 'Ouvrir/Fermer vos options de profil', + profileOptions: 'Options de profil', openContextMenu: 'Ouvrir le menu de contexte pour', currentLanguage: 'Langue actuelle', switchLanguage: 'Changer la langue vers', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/hr.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/hr.ts index ea4c60b539..13c42aaaac 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/hr.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/hr.ts @@ -2054,6 +2054,7 @@ export default { openBackofficeSearch: 'Otvorite backoffice pretragu', openCloseBackofficeHelp: 'Otvori/Zatvori pomoć za backoffice', openCloseBackofficeProfileOptions: 'Opcije otvaranja/zatvaranja profila', + profileOptions: 'Opcije profila', assignDomainDescription: 'Postavite kulturu i imena hostova za %0%', createDescription: 'Kreirajte novi čvor ispod %0%', protectDescription: 'Postavite ograničenja pristupa uključena %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/it.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/it.ts index c9d9c34d03..ac59d1457f 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/it.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/it.ts @@ -2064,6 +2064,7 @@ export default { openBackofficeSearch: 'Apri la ricerca nel backoffice', openCloseBackofficeHelp: "Apri/chiudi l'aiuto del backoffice", openCloseBackofficeProfileOptions: 'Apri/chiudi le opzioni del tuo profilo', + profileOptions: 'Opzioni del profilo', assignDomainDescription: 'Imposta le Culture e gli Hostnames per %0%', createDescription: 'Crea nuovo nodo sotto %0%', protectDescription: 'Imposta le restrizioni di accesso per %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/nl.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/nl.ts index bc0cc2aeee..0566edcaf4 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/nl.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/nl.ts @@ -1935,6 +1935,7 @@ export default { openBackofficeSearch: 'Backoffice zoeken openen', openCloseBackofficeHelp: 'Backoffice help openen/sluiten', openCloseBackofficeProfileOptions: 'Jouw profiel opties openen/sluiten', + profileOptions: 'Profiel opties', assignDomainDescription: 'Cultuur en Hostnamen instellen voor %0%', createDescription: 'Nieuwe node aanmaken onder %0%', protectDescription: 'Openbare toegang instellen op %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/pt.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/pt.ts index 7f702cd4a9..cd63947ae4 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/pt.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/pt.ts @@ -2368,6 +2368,7 @@ export default { openBackofficeSearch: 'Abrir pesquisa do backoffice', openCloseBackofficeHelp: 'Abrir/Fechar ajuda do backoffice', openCloseBackofficeProfileOptions: 'Abrir/Fechar as opções do seu perfil', + profileOptions: 'Opções perfil', assignDomainDescription: 'Configurar Cultura e Domínios para %0%', createDescription: 'Criar novo nó em %0%', protectDescription: 'Configurar restrições de acesso em %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/sv.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/sv.ts index 95ff3be286..86a9f82544 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/sv.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/sv.ts @@ -279,6 +279,7 @@ export default { openBackofficeSearch: 'Öppna sökfunktion (backoffice)', openCloseBackofficeHelp: 'Öppna/stäng hjälpfunktion', openCloseBackofficeProfileOptions: 'Öppna/stäng personliga inställningar', + profileOptions: 'Personliga inställningar', assignDomainDescription: 'Redigera språk och värdnamn för %0%', createDescription: 'Skapa en ny nod under %0%', protectDescription: 'Ändra behörigheter för %0%', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/tr.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/tr.ts index 11aadf8807..8db426f2a6 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/tr.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/tr.ts @@ -1817,6 +1817,7 @@ export default { openBackofficeSearch: 'Arka ofis aramasını aç', openCloseBackofficeHelp: 'Backoffice yardımını Aç / Kapat', openCloseBackofficeProfileOptions: 'Profil seçeneklerinizi açın / kapatın', + profileOptions: 'Profil seçenekleri', assignDomainDescription: '%0% için Kurulum Kültürü ve Ana Bilgisayar Adları', createDescription: '%0% altında yeni düğüm oluştur', protectDescription: '%0% üzerinde genel erişim kurun', diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts index a5e256b7d1..1058aa0909 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts @@ -2371,6 +2371,7 @@ export default { openBackofficeSearch: 'Mở tìm kiếm backoffice', openCloseBackofficeHelp: 'Mở/Đóng trợ giúp backoffice', openCloseBackofficeProfileOptions: 'Mở/Đóng tùy chọn hồ sơ của bạn', + profileOptions: 'Tùy chọn hồ sơ', assignDomainDescription: 'Thiết lập Ngôn ngữ và Tên miền cho %0%', createDescription: 'Tạo nút mới dưới %0%', protectDescription: 'Thiết lập hạn chế truy cập trên %0%', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts index 1c4fa8e499..3e35f55e27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/current-user-header-app.element.ts @@ -42,7 +42,7 @@ export class UmbCurrentUserHeaderAppElement extends UmbHeaderAppButtonElement { Date: Wed, 17 Sep 2025 14:36:16 +0200 Subject: [PATCH 15/15] Add Accessibility for TipTap RTE input fields (#20157) * Add Accessibility for RTE input fields * add localization key for EN * Adds `aria-required` attribute --------- Co-authored-by: Oskar kruger Co-authored-by: leekelleher --- src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 1 + .../tiptap/components/input-tiptap/input-tiptap.element.ts | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 29fa449f1f..c867b43bc1 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2774,6 +2774,7 @@ export default { wordWrapConfigDescription: 'Enable word wrapping in the code editor.', }, rte: { + label: 'Rich Text Editor', config_blocks: 'Available Blocks', config_blocks_description: 'Define the available blocks.', config_ignoreUserStartNodes: 'Ignore User Start Nodes', diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts index 03ef568b09..2e898bf7e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiptap/components/input-tiptap/input-tiptap.element.ts @@ -173,7 +173,12 @@ export class UmbInputTiptapElement extends UmbFormControlMixin