From 4cdab08910777c5c87edc3a306aac4934a80b20c Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Tue, 9 May 2023 09:49:04 +0200 Subject: [PATCH 1/9] Fixes #14102 - NestedPropertyIndexValueFactoryBase ignores compositions (#14115) (#14219) Co-authored-by: Nuklon --- .../PropertyEditors/NestedPropertyIndexValueFactoryBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/NestedPropertyIndexValueFactoryBase.cs b/src/Umbraco.Infrastructure/PropertyEditors/NestedPropertyIndexValueFactoryBase.cs index fa3ae836c1..4eb7051745 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/NestedPropertyIndexValueFactoryBase.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/NestedPropertyIndexValueFactoryBase.cs @@ -38,7 +38,7 @@ internal abstract class NestedPropertyIndexValueFactoryBase var propertyTypeDictionary = contentType - .PropertyGroups + .CompositionPropertyGroups .SelectMany(x => x.PropertyTypes!) .Select(propertyType => { From 5b73fc19eea31681905b1bd86ce72fa4e2be6adb Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 10 May 2023 14:31:40 +0200 Subject: [PATCH 2/9] V10: Fix NoopPublishedValuefallback varation context member not implemented (#14227) * Added missing VariationContextAccessor * Fixed identation --- .../Models/PublishedContent/NoopPublishedValueFallback.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs b/src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs index 1dd2fef124..1164b02753 100644 --- a/src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs +++ b/src/Umbraco.Core/Models/PublishedContent/NoopPublishedValueFallback.cs @@ -7,7 +7,15 @@ namespace Umbraco.Cms.Core.Models.PublishedContent; /// This is for tests etc - does not implement fallback at all. /// public class NoopPublishedValueFallback : IPublishedValueFallback + { + /// + public IVariationContextAccessor VariationContextAccessor + { + get => new ThreadCultureVariationContextAccessor(); + set { } + } + /// public bool TryGetValue(IPublishedProperty property, string? culture, string? segment, Fallback fallback, object? defaultValue, out object? value) { From b0b591821b53870b0a8c28a1c44f1d5241319975 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:55:06 +0200 Subject: [PATCH 3/9] V11: prevent currentuser resetting password without old password (#14189) * Implement check for current user if no old password * Add default implementation to avoid breaking change9 --- .../Controllers/CurrentUserController.cs | 2 +- .../Controllers/MemberController.cs | 2 +- .../Controllers/UsersController.cs | 2 +- .../Security/IPasswordChanger.cs | 7 +++++++ .../Security/PasswordChanger.cs | 19 ++++++++++++++++--- .../Controllers/MemberControllerUnitTests.cs | 6 ++++-- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/CurrentUserController.cs b/src/Umbraco.Web.BackOffice/Controllers/CurrentUserController.cs index fb1666e522..73cd71918d 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/CurrentUserController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/CurrentUserController.cs @@ -278,7 +278,7 @@ public class CurrentUserController : UmbracoAuthorizedJsonController // all current users have access to reset/manually change their password Attempt passwordChangeResult = - await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _backOfficeUserManager); + await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _backOfficeUserManager, currentUser); if (passwordChangeResult.Success) { diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index f06ae05f86..c190891217 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -623,7 +623,7 @@ public class MemberController : ContentControllerBase // Change and persist the password Attempt passwordChangeResult = - await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _memberManager); + await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _memberManager, _backOfficeSecurityAccessor.BackOfficeSecurity?.CurrentUser); if (!passwordChangeResult.Success) { diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs index 02eb9cda8e..3e14154b48 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs @@ -759,7 +759,7 @@ public class UsersController : BackOfficeNotificationsController } Attempt passwordChangeResult = - await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _userManager); + await _passwordChanger.ChangePasswordWithIdentityAsync(changingPasswordModel, _userManager, currentUser); if (passwordChangeResult.Success) { diff --git a/src/Umbraco.Web.BackOffice/Security/IPasswordChanger.cs b/src/Umbraco.Web.BackOffice/Security/IPasswordChanger.cs index 66c69d4d70..3bc5f35abf 100644 --- a/src/Umbraco.Web.BackOffice/Security/IPasswordChanger.cs +++ b/src/Umbraco.Web.BackOffice/Security/IPasswordChanger.cs @@ -1,12 +1,19 @@ using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Security; namespace Umbraco.Cms.Web.Common.Security; public interface IPasswordChanger where TUser : UmbracoIdentityUser { + [Obsolete("Please use method that also takes a nullable IUser, scheduled for removal in v13")] public Task> ChangePasswordWithIdentityAsync( ChangingPasswordModel passwordModel, IUmbracoUserManager userMgr); + + public Task> ChangePasswordWithIdentityAsync( + ChangingPasswordModel passwordModel, + IUmbracoUserManager userMgr, + IUser? currentUser) => ChangePasswordWithIdentityAsync(passwordModel, userMgr); } diff --git a/src/Umbraco.Web.BackOffice/Security/PasswordChanger.cs b/src/Umbraco.Web.BackOffice/Security/PasswordChanger.cs index 25f0548386..8b74f6d2c3 100644 --- a/src/Umbraco.Web.BackOffice/Security/PasswordChanger.cs +++ b/src/Umbraco.Web.BackOffice/Security/PasswordChanger.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Security; using Umbraco.Extensions; @@ -22,16 +23,20 @@ internal class PasswordChanger : IPasswordChanger where TUser : Um /// Logger for this class public PasswordChanger(ILogger> logger) => _logger = logger; + public Task> ChangePasswordWithIdentityAsync(ChangingPasswordModel passwordModel, IUmbracoUserManager userMgr) => ChangePasswordWithIdentityAsync(passwordModel, userMgr, null); + /// /// Changes the password for a user based on the many different rules and config options /// - /// The changing password model - /// The identity manager to use to update the password + /// The changing password model. + /// The identity manager to use to update the password. + /// The user performing the operation. /// Create an adapter to pass through everything - adapting the member into a user for this functionality /// The outcome of the password changed model public async Task> ChangePasswordWithIdentityAsync( ChangingPasswordModel changingPasswordModel, - IUmbracoUserManager userMgr) + IUmbracoUserManager userMgr, + IUser? currentUser) { if (changingPasswordModel == null) { @@ -65,6 +70,14 @@ internal class PasswordChanger : IPasswordChanger where TUser : Um // Are we just changing another user/member's password? if (changingPasswordModel.OldPassword.IsNullOrWhiteSpace()) { + if (changingPasswordModel.Id == currentUser?.Id) + { + return Attempt.Fail(new PasswordChangedModel + { + ChangeError = new ValidationResult("Cannot change the password of current user without the old password", new[] { "value" }), + }); + } + // ok, we should be able to reset it var resetToken = await userMgr.GeneratePasswordResetTokenAsync(identityUser); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs index 83d39a4245..f15234b3e0 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs @@ -359,7 +359,8 @@ public class MemberControllerUnitTests Mock.Get(passwordChanger) .Setup(x => x.ChangePasswordWithIdentityAsync( It.IsAny(), - umbracoMembersUserManager)) + umbracoMembersUserManager, + null)) .ReturnsAsync(() => attempt); } else @@ -368,7 +369,8 @@ public class MemberControllerUnitTests Mock.Get(passwordChanger) .Setup(x => x.ChangePasswordWithIdentityAsync( It.IsAny(), - umbracoMembersUserManager)) + umbracoMembersUserManager, + null)) .ReturnsAsync(() => attempt); } } From 36d72ac85c08fa734c1d8e26df819d82debf26a8 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 11 May 2023 13:50:47 +0200 Subject: [PATCH 4/9] Fallback to detailed if not telemetry level not set (#14134) Co-authored-by: Zeegaan --- .../ViewModels/Installer/InstallViewModel.cs | 2 +- src/Umbraco.Core/Services/MetricsConsentService.cs | 2 +- src/Umbraco.New.Cms.Core/Models/Installer/InstallData.cs | 2 +- .../Umbraco.Core/Telemetry/TelemetryServiceTests.cs | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Cms.ManagementApi/ViewModels/Installer/InstallViewModel.cs b/src/Umbraco.Cms.ManagementApi/ViewModels/Installer/InstallViewModel.cs index e6639206be..1c83375bdc 100644 --- a/src/Umbraco.Cms.ManagementApi/ViewModels/Installer/InstallViewModel.cs +++ b/src/Umbraco.Cms.ManagementApi/ViewModels/Installer/InstallViewModel.cs @@ -13,5 +13,5 @@ public class InstallViewModel public DatabaseInstallViewModel Database { get; set; } = null!; [JsonConverter(typeof(JsonStringEnumConverter))] - public TelemetryLevel TelemetryLevel { get; set; } = TelemetryLevel.Basic; + public TelemetryLevel TelemetryLevel { get; set; } = TelemetryLevel.Detailed; } diff --git a/src/Umbraco.Core/Services/MetricsConsentService.cs b/src/Umbraco.Core/Services/MetricsConsentService.cs index a3140c4f61..be30458af6 100644 --- a/src/Umbraco.Core/Services/MetricsConsentService.cs +++ b/src/Umbraco.Core/Services/MetricsConsentService.cs @@ -60,7 +60,7 @@ public class MetricsConsentService : IMetricsConsentService if (analyticsLevelString is null || Enum.TryParse(analyticsLevelString, out TelemetryLevel analyticsLevel) is false) { - return TelemetryLevel.Basic; + return TelemetryLevel.Detailed; } return analyticsLevel; diff --git a/src/Umbraco.New.Cms.Core/Models/Installer/InstallData.cs b/src/Umbraco.New.Cms.Core/Models/Installer/InstallData.cs index 2283cf2482..77d0c07477 100644 --- a/src/Umbraco.New.Cms.Core/Models/Installer/InstallData.cs +++ b/src/Umbraco.New.Cms.Core/Models/Installer/InstallData.cs @@ -8,5 +8,5 @@ public class InstallData public DatabaseInstallData Database { get; set; } = null!; - public TelemetryLevel TelemetryLevel { get; set; } = TelemetryLevel.Basic; + public TelemetryLevel TelemetryLevel { get; set; } = TelemetryLevel.Detailed; } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs index 83aa368d70..d1a41fd414 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs @@ -84,7 +84,7 @@ public class TelemetryServiceTests }; var manifestParser = CreateManifestParser(manifests); var metricsConsentService = new Mock(); - metricsConsentService.Setup(x => x.GetConsentLevel()).Returns(TelemetryLevel.Basic); + metricsConsentService.Setup(x => x.GetConsentLevel()).Returns(TelemetryLevel.Detailed); var sut = new TelemetryService( manifestParser, version, @@ -119,7 +119,7 @@ public class TelemetryServiceTests }; var manifestParser = CreateManifestParser(manifests); var metricsConsentService = new Mock(); - metricsConsentService.Setup(x => x.GetConsentLevel()).Returns(TelemetryLevel.Basic); + metricsConsentService.Setup(x => x.GetConsentLevel()).Returns(TelemetryLevel.Detailed); var sut = new TelemetryService( manifestParser, version, From e4c03e0d4e965fafac20fd9dc74b35453f0bb97c Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 11 May 2023 13:58:57 +0200 Subject: [PATCH 5/9] V11: Obsolete action to publish (#14208) * Add obsolete message to ActionToPublish * Obsolete handler for ContentSentTOPublishNotifcation --- src/Umbraco.Core/Actions/ActionToPublish.cs | 1 + src/Umbraco.Core/Events/UserNotificationsHandler.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Core/Actions/ActionToPublish.cs b/src/Umbraco.Core/Actions/ActionToPublish.cs index e7af16bc99..25719e30fc 100644 --- a/src/Umbraco.Core/Actions/ActionToPublish.cs +++ b/src/Umbraco.Core/Actions/ActionToPublish.cs @@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Actions; /// /// This action is invoked when children to a document is being sent to published (by an editor without publishrights). /// +[Obsolete("Scheduled for removal in v13")] public class ActionToPublish : IAction { /// diff --git a/src/Umbraco.Core/Events/UserNotificationsHandler.cs b/src/Umbraco.Core/Events/UserNotificationsHandler.cs index 042355630f..4b581788e8 100644 --- a/src/Umbraco.Core/Events/UserNotificationsHandler.cs +++ b/src/Umbraco.Core/Events/UserNotificationsHandler.cs @@ -107,6 +107,7 @@ public sealed class UserNotificationsHandler : _notifier.Notify(_actions.GetAction(), updatedEntities.ToArray()); } + [Obsolete("Scheduled for removal in v13")] public void Handle(ContentSentToPublishNotification notification) => _notifier.Notify(_actions.GetAction(), notification.Entity); From 8d4e55f8bbf5ee7662e23941f58d031a38607504 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 11 May 2023 14:39:21 +0200 Subject: [PATCH 6/9] Enable ForceCreateDatabase for SqlServer (#14234) --- .../Services/SqlServerDatabaseProviderMetadata.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs index edb44700d8..89612b3603 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerDatabaseProviderMetadata.cs @@ -50,7 +50,7 @@ public class SqlServerDatabaseProviderMetadata : IDatabaseProviderMetadata public bool RequiresConnectionTest => true; /// - public bool ForceCreateDatabase => false; + public bool ForceCreateDatabase => true; /// public bool CanRecognizeConnectionString(string? connectionString) From 5df655d5990446b69656ee93283ffd6b1e735980 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 15 May 2023 07:58:43 +0200 Subject: [PATCH 7/9] Unbreak breaking change --- .../CompatibilitySuppressions.xml | 9 +-------- .../BlockGridPropertyValueConverter.cs | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Infrastructure/CompatibilitySuppressions.xml b/src/Umbraco.Infrastructure/CompatibilitySuppressions.xml index 653a936b61..795c678729 100644 --- a/src/Umbraco.Infrastructure/CompatibilitySuppressions.xml +++ b/src/Umbraco.Infrastructure/CompatibilitySuppressions.xml @@ -29,13 +29,6 @@ lib/net7.0/Umbraco.Infrastructure.dll true - - CP0002 - M:Umbraco.Cms.Core.PropertyEditors.ValueConverters.BlockGridPropertyValueConverter.#ctor(Umbraco.Cms.Core.Logging.IProfilingLogger,Umbraco.Cms.Core.PropertyEditors.ValueConverters.BlockEditorConverter,Umbraco.Cms.Core.Serialization.IJsonSerializer) - lib/net7.0/Umbraco.Infrastructure.dll - lib/net7.0/Umbraco.Infrastructure.dll - true - CP0002 M:Umbraco.Cms.Infrastructure.Migrations.IMigrationContext.AddPostMigration``1 @@ -78,4 +71,4 @@ lib/net7.0/Umbraco.Infrastructure.dll true - \ No newline at end of file + diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs index a68eebf0bc..e1c5a2052c 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs @@ -1,7 +1,9 @@ // Copyright (c) Umbraco. // See LICENSE for more details. +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Core.DeliveryApi; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Logging; using Umbraco.Cms.Core.Models.Blocks; using Umbraco.Cms.Core.Models.DeliveryApi; @@ -20,9 +22,20 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters private readonly IJsonSerializer _jsonSerializer; private readonly IApiElementBuilder _apiElementBuilder; + [Obsolete("Please use non-obsolete cconstrutor. This will be removed in Umbraco 14.")] + public BlockGridPropertyValueConverter( + IProfilingLogger proflog, + BlockEditorConverter blockConverter, + IJsonSerializer jsonSerializer) + : this(proflog, blockConverter, jsonSerializer, StaticServiceProvider.Instance.GetRequiredService()) + { + + } + // Niels, Change: I would love if this could be general, so we don't need a specific one for each block property editor.... public BlockGridPropertyValueConverter( - IProfilingLogger proflog, BlockEditorConverter blockConverter, + IProfilingLogger proflog, + BlockEditorConverter blockConverter, IJsonSerializer jsonSerializer, IApiElementBuilder apiElementBuilder) : base(blockConverter) From 401fa7334bf3e524e80b4e4e7a2167a611d51ac7 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 15 May 2023 08:04:16 +0200 Subject: [PATCH 8/9] Fixed: an block grid editor accceptance test on the pipeline for v12 (#14240) * The attribute we asserted on has been changed which failed our test. The test is updated to match with the correct url * Updated so we use encodeURI instead of replacing the values in the path --- .../Content/blockGridEditorAdvanced.spec.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts index 87b19b8776..8db631019b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorAdvanced.spec.ts @@ -44,7 +44,7 @@ test.describe('BlockGridEditorAdvancedContent', () => { await umbracoApi.media.ensureNameNotExists(customViewItemName); const imageData = await umbracoApi.media.createImageWithFile(imageName, umbracoFileValue, imageFileName, imagePath, imageMimeType); - + const customViewData = await umbracoApi.media.createFileWithFile(customViewItemName, customViewFileName, customViewPath, customViewMimeType); const customViewMediaPath = customViewData.mediaLink; @@ -101,7 +101,7 @@ test.describe('BlockGridEditorAdvancedContent', () => { await umbracoUi.navigateToContent(blockGridName); // Assert - // Checks if the block has the correct CustomView + // Checks if the block has the correct CustomView await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[view="' + customViewMediaPath + '"]')).toBeVisible(); // Checks if the custom view updated the block by locating a name in the customView await expect(page.locator('[data-content-element-type-key="' + element['key'] + '"]').locator('[view="' + customViewMediaPath + '"]').locator('[name="BlockGridCustomView"]')).toBeVisible(); @@ -137,7 +137,7 @@ test.describe('BlockGridEditorAdvancedContent', () => { await umbracoApi.content.createDefaultContentWithABlockGridEditor(umbracoApi, element, dataType, null); await umbracoUi.navigateToContent(blockGridName); - + // Assert // Checks if the block has the correct template await expect(page.locator('umb-block-grid-entry', {hasText: elementName}).locator('umb-block-grid-block')).toHaveAttribute('stylesheet', stylesheetDataPath); @@ -345,11 +345,12 @@ test.describe('BlockGridEditorAdvancedContent', () => { // Assert // Checks if the element has the thumbnail - await expect(page.locator('umb-block-card', {hasText: elementName}).locator('.__showcase')).toHaveAttribute('style', 'background-image: url("' + imageDataPath + '?width=400");'); + const updatedImagePath = encodeURIComponent(imageDataPath); + await expect(page.locator('umb-block-card', {hasText: elementName}).locator('.__showcase')).toHaveAttribute('style', 'background-image: url("/umbraco/backoffice/umbracoapi/images/GetBigThumbnail?originalImagePath=' + updatedImagePath + '\");'); // Clean await umbracoApi.documentTypes.ensureNameNotExists(elementTwoName); await umbracoApi.media.ensureNameNotExists(imageName); }); }); -}); \ No newline at end of file +}); From 368e9f2f59bdaea5b6e6279e62568de752cb19b4 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 15 May 2023 08:49:01 +0200 Subject: [PATCH 9/9] Fix delivery API cache level for media picker property editors (#14238) --- .../ValueConverters/MediaPickerValueConverter.cs | 2 +- .../ValueConverters/MediaPickerWithCropsValueConverter.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs b/src/Umbraco.Core/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs index 1d6792f185..30ff7fb779 100644 --- a/src/Umbraco.Core/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs +++ b/src/Umbraco.Core/PropertyEditors/ValueConverters/MediaPickerValueConverter.cs @@ -122,7 +122,7 @@ public class MediaPickerValueConverter : PropertyValueConverterBase, IDeliveryAp return source; } - public PropertyCacheLevel GetDeliveryApiPropertyCacheLevel(IPublishedPropertyType propertyType) => PropertyCacheLevel.Element; + public PropertyCacheLevel GetDeliveryApiPropertyCacheLevel(IPublishedPropertyType propertyType) => PropertyCacheLevel.Elements; public Type GetDeliveryApiPropertyValueType(IPublishedPropertyType propertyType) => typeof(IEnumerable); diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerWithCropsValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerWithCropsValueConverter.cs index ef183089e9..a33bb9870d 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerWithCropsValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MediaPickerWithCropsValueConverter.cs @@ -120,7 +120,7 @@ public class MediaPickerWithCropsValueConverter : PropertyValueConverterBase, ID return isMultiple ? mediaItems : mediaItems.FirstOrDefault(); } - public PropertyCacheLevel GetDeliveryApiPropertyCacheLevel(IPublishedPropertyType propertyType) => PropertyCacheLevel.Element; + public PropertyCacheLevel GetDeliveryApiPropertyCacheLevel(IPublishedPropertyType propertyType) => PropertyCacheLevel.Elements; public Type GetDeliveryApiPropertyValueType(IPublishedPropertyType propertyType) => typeof(IEnumerable);