From 8088b726b43d37a638f58641e8dc4a0077fa1b12 Mon Sep 17 00:00:00 2001 From: Erik-Jan Westendorp Date: Wed, 6 Dec 2023 14:08:40 +0100 Subject: [PATCH 01/32] localize webhook edit view --- .../EmbeddedResources/Lang/en.xml | 8 +++++++ .../EmbeddedResources/Lang/en_us.xml | 8 +++++++ .../src/views/webhooks/edit.controller.js | 8 ++++++- .../src/views/webhooks/edit.html | 24 +++++++++---------- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 4421e7d2f5..8977859d3d 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -2011,6 +2011,14 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Types Webhook key Retry count + The url to call when the webhook is triggered. + The events for which the webhook should be triggered. + Only trigger the webhook for a specific content type. + Is the webhook enabled? + Custom headers to include in the webhook request. + Content Type + Headers + Please select an event first. Add language diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 2697098a71..955d66095c 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -2032,6 +2032,14 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Types Webhook key Retry count + The url to call when the webhook is triggered. + The events for which the webhook should be triggered. + Only trigger the webhook for a specific content type. + Is the webhook enabled? + Custom headers to include in the webhook request. + Content Type + Headers + Please select an event first. Add language diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js index 3a545de2e7..4a12d5254d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js @@ -33,12 +33,18 @@ "treeHeaders_webhooks", "webhooks_addWebhook", "defaultdialogs_confirmSure", - "defaultdialogs_editWebhook" + "defaultdialogs_editWebhook", + "webhooks_selectEventFirst", + "general_name", + "general_value" ]).then(function (values) { vm.labels.webhooks = values[0]; vm.labels.addWebhook = values[1]; vm.labels.areYouSure = values[2]; vm.labels.editWebhook = values[3]; + vm.labels.selectEventFirst = values[4]; + vm.labels.headerName = values[5]; + vm.labels.headerValue = values[6]; if ($routeParams.create) { vm.isNew = true; diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html index 66f93c244e..f64ef5d69b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html @@ -26,8 +26,8 @@ @@ -45,8 +45,8 @@ @@ -70,8 +70,8 @@ Add - Please select an event first. + {{vm.labels.selectEventFirst}} - + @@ -108,16 +108,16 @@
- - + + From b0b98865c689a5a5333f657092139a88be5986bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Kottal?= Date: Fri, 19 Jan 2024 13:21:17 +0100 Subject: [PATCH 02/32] Fix RTE block rendering failing (#15583) Adds optional class attribute to regex responsible for parsing RTE values to block models --- .../PropertyEditors/ValueConverters/RichTextParsingRegexes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RichTextParsingRegexes.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RichTextParsingRegexes.cs index c7fa4e4592..75851ee856 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RichTextParsingRegexes.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RichTextParsingRegexes.cs @@ -4,6 +4,6 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters; internal static partial class RichTextParsingRegexes { - [GeneratedRegex(".[^\"]*)\"><\\/umb-rte-block(?:-inline)?>")] + [GeneratedRegex(".[^\"]*)\"><\\/umb-rte-block(?:-inline)?>")] public static partial Regex BlockRegex(); } From 4bc36a7eb8f151cd806da77ee24a43e86e84f71d Mon Sep 17 00:00:00 2001 From: LFLaverty Date: Fri, 19 Jan 2024 09:53:36 +0000 Subject: [PATCH 03/32] Updates to the new media article link --- .../Configuration/DeliveryApiConfiguration.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Umbraco.Cms.Api.Delivery/Configuration/DeliveryApiConfiguration.cs b/src/Umbraco.Cms.Api.Delivery/Configuration/DeliveryApiConfiguration.cs index 83a2d1e9d9..57830f016f 100644 --- a/src/Umbraco.Cms.Api.Delivery/Configuration/DeliveryApiConfiguration.cs +++ b/src/Umbraco.Cms.Api.Delivery/Configuration/DeliveryApiConfiguration.cs @@ -8,6 +8,5 @@ internal static class DeliveryApiConfiguration internal const string ApiDocumentationContentArticleLink = "https://docs.umbraco.com/umbraco-cms/reference/content-delivery-api"; - // TODO: update this when the Media article is out - internal const string ApiDocumentationMediaArticleLink = "https://docs.umbraco.com/umbraco-cms/reference/content-delivery-api"; + internal const string ApiDocumentationMediaArticleLink = "https://docs.umbraco.com/umbraco-cms/reference/content-delivery-api/media-delivery-api"; } From f5096ba8f3a6be64c6b380354c4dd851959a7cca Mon Sep 17 00:00:00 2001 From: Ambert van Unen Date: Sat, 20 Jan 2024 01:33:11 +0100 Subject: [PATCH 04/32] Now properly checks the lockedoutdate (#14908) * Now properly checks the lockedoutdate * Also fix Test (failed constructor) * Processed feedback * Added obsolete constructor --------- Co-authored-by: Ambert van Unen --- .../Security/IdentityMapDefinition.cs | 37 +++++++++++++++---- .../Security/MemberManagerTests.cs | 1 + 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs index cf6f08c65b..9e9a85811b 100644 --- a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs @@ -18,6 +18,7 @@ public class IdentityMapDefinition : IMapDefinition { private readonly AppCaches _appCaches; private readonly IEntityService _entityService; + private readonly SecuritySettings _securitySettings; private readonly GlobalSettings _globalSettings; private readonly ILocalizedTextService _textService; private readonly ITwoFactorLoginService _twoFactorLoginService; @@ -26,16 +27,35 @@ public class IdentityMapDefinition : IMapDefinition ILocalizedTextService textService, IEntityService entityService, IOptions globalSettings, + IOptions securitySettings, AppCaches appCaches, ITwoFactorLoginService twoFactorLoginService) { _textService = textService; _entityService = entityService; _globalSettings = globalSettings.Value; + _securitySettings = securitySettings.Value; _appCaches = appCaches; _twoFactorLoginService = twoFactorLoginService; } + [Obsolete("Use constructor that also takes an IOptions. Scheduled for removal in V14")] + public IdentityMapDefinition( + ILocalizedTextService textService, + IEntityService entityService, + IOptions globalSettings, + AppCaches appCaches, + ITwoFactorLoginService twoFactorLoginService) + : this( + textService, + entityService, + globalSettings, + StaticServiceProvider.Instance.GetRequiredService>(), + appCaches, + twoFactorLoginService) + { + } + [Obsolete("Use constructor that also takes an ITwoFactorLoginService. Scheduled for removal in V12")] public IdentityMapDefinition( ILocalizedTextService textService, @@ -43,11 +63,12 @@ public class IdentityMapDefinition : IMapDefinition IOptions globalSettings, AppCaches appCaches) : this( - textService, - entityService, - globalSettings, - appCaches, - StaticServiceProvider.Instance.GetRequiredService()) + textService, + entityService, + globalSettings, + StaticServiceProvider.Instance.GetRequiredService>(), + appCaches, + StaticServiceProvider.Instance.GetRequiredService()) { } @@ -107,7 +128,8 @@ public class IdentityMapDefinition : IMapDefinition source.GetUserCulture(_textService, _globalSettings).ToString(); // project CultureInfo to string target.IsApproved = source.IsApproved; target.SecurityStamp = source.SecurityStamp; - target.LockoutEnd = source.IsLockedOut ? DateTime.MaxValue.ToUniversalTime() : (DateTime?)null; + DateTime? lockedOutUntil = source.LastLockoutDate?.AddMinutes(_securitySettings.UserDefaultLockoutTimeInMinutes); + target.LockoutEnd = source.IsLockedOut ? (lockedOutUntil ?? DateTime.MaxValue).ToUniversalTime() : null; } // Umbraco.Code.MapAll -Id -LockoutEnabled -PhoneNumber -PhoneNumberConfirmed -ConcurrencyStamp -NormalizedEmail -NormalizedUserName -Roles @@ -124,7 +146,8 @@ public class IdentityMapDefinition : IMapDefinition target.PasswordConfig = source.PasswordConfiguration; target.IsApproved = source.IsApproved; target.SecurityStamp = source.SecurityStamp; - target.LockoutEnd = source.IsLockedOut ? DateTime.MaxValue.ToUniversalTime() : (DateTime?)null; + DateTime? lockedOutUntil = source.LastLockoutDate?.AddMinutes(_securitySettings.UserDefaultLockoutTimeInMinutes); + target.LockoutEnd = source.IsLockedOut ? (lockedOutUntil ?? DateTime.MaxValue).ToUniversalTime() : null; target.Comments = source.Comments; target.LastLockoutDateUtc = source.LastLockoutDate == DateTime.MinValue ? null diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs index 10d4510902..a8923f06cf 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberManagerTests.cs @@ -43,6 +43,7 @@ public class MemberManagerTests Mock.Of(), Mock.Of(), new TestOptionsSnapshot(new GlobalSettings()), + new TestOptionsSnapshot(new SecuritySettings()), AppCaches.Disabled, Mock.Of()) }; From dd3ab3a0dc9b5998b01ebc7e2183b57d71da8a76 Mon Sep 17 00:00:00 2001 From: Liam Laverty Date: Mon, 22 Jan 2024 01:57:58 +0000 Subject: [PATCH 05/32] Temp/15591 serilog string conventions (#15592) * Updaets `MigrationPlanExecutor.cs` to use serilog convention for strings * Updaets `ExamineManagementController.cs` to use serilog convention for strings * Updaets `HelpController.cs` to use serilog convention for strings * Updaets `PreviewAuthenticationMiddleware.cs` to use serilog convention for strings --- src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs | 2 +- .../Controllers/ExamineManagementController.cs | 2 +- src/Umbraco.Web.BackOffice/Controllers/HelpController.cs | 2 +- .../Middleware/PreviewAuthenticationMiddleware.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs index faea87bd68..77677b0bfc 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs @@ -127,7 +127,7 @@ public class MigrationPlanExecutor : IMigrationPlanExecutor continue; } - _logger.LogInformation($"PostMigration: {migrationContextPostMigration.FullName}."); + _logger.LogInformation("PostMigration: {migrationContextFullName}.", migrationContextPostMigration.FullName); MigrationBase postMigration = _migrationBuilder.Build(migrationContextPostMigration, executedMigrationContext); postMigration.Run(); diff --git a/src/Umbraco.Web.BackOffice/Controllers/ExamineManagementController.cs b/src/Umbraco.Web.BackOffice/Controllers/ExamineManagementController.cs index d41ccf684e..21cb7fdcd9 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ExamineManagementController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ExamineManagementController.cs @@ -306,7 +306,7 @@ public class ExamineManagementController : UmbracoAuthorizedJsonController indexer.IndexOperationComplete -= Indexer_IndexOperationComplete; } - _logger.LogInformation($"Rebuilding index '{indexer?.Name}' done."); + _logger.LogInformation("Rebuilding index '{indexerName}' done.", indexer?.Name); var cacheKey = "temp_indexing_op_" + indexer?.Name; _runtimeCache.Clear(cacheKey); diff --git a/src/Umbraco.Web.BackOffice/Controllers/HelpController.cs b/src/Umbraco.Web.BackOffice/Controllers/HelpController.cs index 65662d8ca5..da3ac9013f 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/HelpController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/HelpController.cs @@ -66,7 +66,7 @@ public class HelpController : UmbracoAuthorizedJsonController } catch (HttpRequestException rex) { - _logger.LogInformation($"Check your network connection, exception: {rex.Message}"); + _logger.LogInformation("Check your network connection, exception: {message}", rex.Message); } return new List(); diff --git a/src/Umbraco.Web.Common/Middleware/PreviewAuthenticationMiddleware.cs b/src/Umbraco.Web.Common/Middleware/PreviewAuthenticationMiddleware.cs index 0748f5cbb4..5bd16867ca 100644 --- a/src/Umbraco.Web.Common/Middleware/PreviewAuthenticationMiddleware.cs +++ b/src/Umbraco.Web.Common/Middleware/PreviewAuthenticationMiddleware.cs @@ -75,7 +75,7 @@ public class PreviewAuthenticationMiddleware : IMiddleware catch (Exception ex) { // log any errors and continue the request without preview - _logger.LogError($"Unable to perform preview authentication: {ex.Message}"); + _logger.LogError("Unable to perform preview authentication: {message}", ex.Message); } finally { From e04c4a89adcbe73d35290a993713a5faf4dc55ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:59:49 +0100 Subject: [PATCH 06/32] Bump vite from 4.5.1 to 4.5.2 in /src/Umbraco.Web.UI.Login (#15616) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.1 to 4.5.2. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v4.5.2/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.5.2/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/Umbraco.Web.UI.Login/package-lock.json | 8 ++++---- src/Umbraco.Web.UI.Login/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Login/package-lock.json b/src/Umbraco.Web.UI.Login/package-lock.json index ab4dc63af0..d55fc9cfdb 100644 --- a/src/Umbraco.Web.UI.Login/package-lock.json +++ b/src/Umbraco.Web.UI.Login/package-lock.json @@ -14,7 +14,7 @@ "@umbraco-ui/uui": "1.5.0", "@umbraco-ui/uui-css": "1.5.0", "typescript": "^5.2.2", - "vite": "^4.5.1" + "vite": "^4.5.2" }, "engines": { "node": ">=20.8", @@ -2642,9 +2642,9 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "dependencies": { "esbuild": "^0.18.10", diff --git a/src/Umbraco.Web.UI.Login/package.json b/src/Umbraco.Web.UI.Login/package.json index c89dcc38a2..e1e1e3fd97 100644 --- a/src/Umbraco.Web.UI.Login/package.json +++ b/src/Umbraco.Web.UI.Login/package.json @@ -20,7 +20,7 @@ "@umbraco-ui/uui": "1.5.0", "@umbraco-ui/uui-css": "1.5.0", "typescript": "^5.2.2", - "vite": "^4.5.1" + "vite": "^4.5.2" }, "msw": { "workerDirectory": "public" From f1db40392f32a92a8e5ae5194beffbe68d85b6d6 Mon Sep 17 00:00:00 2001 From: MrJackWilson Date: Fri, 26 Jan 2024 21:09:56 +0000 Subject: [PATCH 07/32] Fix for issue 15598 (#15617) * Make GetIndexValues virtual * First try get values as JSON. If empty, try as CSV. --- .../JsonPropertyIndexValueFactoryBase.cs | 2 +- .../TagPropertyIndexValueFactory.cs | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs b/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs index 973ee3d40c..ee1f637909 100644 --- a/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs +++ b/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs @@ -40,7 +40,7 @@ public abstract class JsonPropertyIndexValueFactoryBase : IProperty } - public IEnumerable>> GetIndexValues( + public virtual IEnumerable>> GetIndexValues( IProperty property, string? culture, string? segment, diff --git a/src/Umbraco.Core/PropertyEditors/TagPropertyIndexValueFactory.cs b/src/Umbraco.Core/PropertyEditors/TagPropertyIndexValueFactory.cs index f858b6801a..2b09659091 100644 --- a/src/Umbraco.Core/PropertyEditors/TagPropertyIndexValueFactory.cs +++ b/src/Umbraco.Core/PropertyEditors/TagPropertyIndexValueFactory.cs @@ -1,20 +1,26 @@ +using System.Text.Json; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Web.Common.DependencyInjection; +using Umbraco.Extensions; namespace Umbraco.Cms.Core.PropertyEditors; public class TagPropertyIndexValueFactory : JsonPropertyIndexValueFactoryBase, ITagPropertyIndexValueFactory { + private IndexingSettings _indexingSettings; + public TagPropertyIndexValueFactory( IJsonSerializer jsonSerializer, IOptionsMonitor indexingSettings) : base(jsonSerializer, indexingSettings) { ForceExplicitlyIndexEachNestedProperty = true; + _indexingSettings = indexingSettings.CurrentValue; + indexingSettings.OnChange(newValue => _indexingSettings = newValue); } [Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 14.")] @@ -45,4 +51,40 @@ public class TagPropertyIndexValueFactory : JsonPropertyIndexValueFactoryBase>(property.Alias, deserializedPropertyValue); } + + public override IEnumerable>> GetIndexValues( + IProperty property, + string? culture, + string? segment, + bool published, + IEnumerable availableCultures, + IDictionary contentTypeDictionary) + { + IEnumerable>> jsonValues = base.GetIndexValues(property, culture, segment, published, availableCultures, contentTypeDictionary); + if (jsonValues?.Any() is true) + { + return jsonValues; + } + + var result = new List>>(); + + var propertyValue = property.GetValue(culture, segment, published); + + // If there is a value, it's a string and it's not empty/white space + if (propertyValue is string rawValue && !string.IsNullOrWhiteSpace(rawValue)) + { + var values = rawValue.Split(',', StringSplitOptions.RemoveEmptyEntries); + + result.AddRange(Handle(values, property, culture, segment, published, availableCultures, contentTypeDictionary)); + } + + IEnumerable>> summary = HandleResume(result, property, culture, segment, published); + if (_indexingSettings.ExplicitlyIndexEachNestedProperty || ForceExplicitlyIndexEachNestedProperty) + { + result.AddRange(summary); + return result; + } + + return summary; + } } From 62bc748a87bbf15e662a167d3b8507bdb2850302 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Thu, 14 Dec 2023 00:26:23 +0100 Subject: [PATCH 08/32] Map webhook id property --- src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs b/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs index a7564fb6ac..c96096b7d0 100644 --- a/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs +++ b/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Mapping; +using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Webhooks; using Umbraco.Cms.Web.Common.Models; @@ -21,6 +21,7 @@ public class WebhookMapDefinition : IMapDefinition target.Events = source.Events.Select(x => x.Alias).ToArray(); target.Url = source.Url; target.Enabled = source.Enabled; + target.Id = source.Id; target.Key = source.Key ?? Guid.NewGuid(); target.Headers = source.Headers; } From 860acd7ba18f0d8f8015932bb5c676c0341ec480 Mon Sep 17 00:00:00 2001 From: Nikolaj Brask-Nielsen Date: Sun, 28 Jan 2024 10:40:24 +0100 Subject: [PATCH 09/32] feat: Make JSON tag value fallback (#14856) * feat: Make JSON tag value fallback * feat: Make fix more concise * feat: Add try catch --- .../tags/umbtagseditor.directive.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js index 7ae96e0cd5..f902944607 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js @@ -165,10 +165,17 @@ function configureViewModel(isInitLoad) { if (vm.value) { if (Utilities.isString(vm.value) && vm.value.length > 0) { - if (vm.config.storageType === "Json") { - //json storage - vm.viewModel = JSON.parse(vm.value); + if (vm.config.storageType === "Json" && vm.value.detectIsJson()) { + try { + //json storage + vm.viewModel = JSON.parse(vm.value); + } + catch (e) { + // Invaild JSON we'll just leave it + console.error("Invalid JSON in tag editor value", vm.value); + } + //if this is the first load, we are just re-formatting the underlying model to be consistent //we don't want to notify the component parent of any changes, that will occur if the user actually //changes a value. If we notify at this point it will signal a form dirty change which we don't want. @@ -177,7 +184,11 @@ } } else { - //csv storage + // csv storage + + // Or fallback if not valid json + // This can happen if you switch a tag editor from csv to json, and the value is still returned as a csv string. + // The value will be saved as a json string on the next save or publish. // split the csv string, and remove any duplicate values let tempArray = vm.value.split(',').map(function (v) { From 7256d497615a207cfefd41e07211591568b4a9ac Mon Sep 17 00:00:00 2001 From: Erik-Jan Westendorp Date: Tue, 30 Jan 2024 02:52:50 +0100 Subject: [PATCH 10/32] Use constants for all webhook event aliases (#15492) * Use constants for all webhook event aliases * Fix --- src/Umbraco.Core/Constants-WebhookEvents.cs | 310 ++++++++++++++++++ .../DocumentTypeChangedWebhookEvent.cs | 2 +- .../DocumentTypeDeletedWebhookEvent.cs | 2 +- .../DocumentTypeMovedWebhookEvent.cs | 2 +- .../DocumentTypeSavedWebhookEvent.cs | 2 +- .../MediaTypeChangedWebhookEvent.cs | 2 +- .../MediaTypeDeletedWebhookEvent.cs | 4 +- .../ContentType/MediaTypeMovedWebhookEvent.cs | 4 +- .../ContentType/MediaTypeSavedWebhookEvent.cs | 4 +- .../MemberTypeChangedWebhookEvent.cs | 2 +- .../MemberTypeDeletedWebhookEvent.cs | 4 +- .../MemberTypeMovedWebhookEvent.cs | 4 +- .../MemberTypeSavedWebhookEvent.cs | 4 +- .../DataType/DataTypeDeletedWebhookEvent.cs | 2 +- .../DataType/DataTypeMovedWebhookEvent.cs | 4 +- .../DataType/DataTypeSavedWebhookEvent.cs | 4 +- .../DictionaryItemDeletedWebhookEvent.cs | 2 +- .../DictionaryItemSavedWebhookEvent.cs | 2 +- .../Domain/DomainDeletedWebhookEvent.cs | 2 +- .../Events/Domain/DomainSavedWebhookEvent.cs | 2 +- .../File/PartialViewDeletedWebhookEvent.cs | 2 +- .../File/PartialViewSavedWebhookEvent.cs | 2 +- .../Events/File/ScriptDeletedWebhookEvent.cs | 2 +- .../Events/File/ScriptSavedWebhookEvent.cs | 2 +- .../File/StylesheetDeletedWebhookEvent.cs | 2 +- .../File/StylesheetSavedWebhookEvent.cs | 2 +- .../File/TemplateDeletedWebhookEvent.cs | 2 +- .../Events/File/TemplateSavedWebhookEvent.cs | 2 +- .../HealthCheckCompletedWebhookEvent.cs | 2 +- .../Language/LanguageDeletedWebhookEvent.cs | 2 +- .../Language/LanguageSavedWebhookEvent.cs | 2 +- .../MediaEmptiedRecycleBinWebhookEvent.cs | 2 +- .../MediaMovedToRecycleBinWebhookEvent.cs | 2 +- .../Events/Media/MediaMovedWebhookEvent.cs | 2 +- .../Member/AssignedMemberRolesWebhookEvent.cs | 2 +- .../Member/ExportedMemberWebhookEvent.cs | 4 +- .../Member/MemberDeletedWebhookEvent.cs | 4 +- .../Member/MemberGroupDeletedWebhookEvent.cs | 2 +- .../Member/MemberGroupSavedWebhookEvent.cs | 4 +- .../Events/Member/MemberSavedWebhookEvent.cs | 4 +- .../Member/RemovedMemberRolesWebhookEvent.cs | 4 +- .../Package/ImportedPackageWebhookEvent.cs | 2 +- .../PublicAccessEntryDeletedWebhookEvent.cs | 2 +- .../PublicAccessEntrySavedWebhookEvent.cs | 2 +- .../Relation/RelationDeletedWebhookEvent.cs | 2 +- .../Relation/RelationSavedWebhookEvent.cs | 2 +- .../RelationTypeDeletedWebhookEvent.cs | 2 +- .../RelationTypeSavedWebhookEvent.cs | 2 +- ...ssignedUserGroupPermissionsWebhookEvent.cs | 2 +- .../Events/User/UserDeletedWebhookEvent.cs | 4 +- ...UserForgotPasswordRequestedWebhookEvent.cs | 4 +- .../User/UserGroupDeletedWebhookEvent.cs | 4 +- .../Events/User/UserGroupSavedWebhookEvent.cs | 4 +- .../Events/User/UserLockedWebhookEvent.cs | 4 +- .../User/UserLoginFailedWebhookEvent.cs | 4 +- ...erLoginRequiresVerificationWebhookEvent.cs | 4 +- .../User/UserLoginSuccessWebhookEvent.cs | 4 +- .../User/UserLogoutSuccessWebhookEvent.cs | 4 +- .../User/UserPasswordChangedWebhookEvent.cs | 4 +- .../User/UserPasswordResetWebhookEvent.cs | 4 +- .../Events/User/UserSavedWebhookEvent.cs | 4 +- .../UserTwoFactorRequestedWebhookEvent.cs | 4 +- .../Events/User/UserUnlockedWebhookEvent.cs | 4 +- 63 files changed, 399 insertions(+), 89 deletions(-) diff --git a/src/Umbraco.Core/Constants-WebhookEvents.cs b/src/Umbraco.Core/Constants-WebhookEvents.cs index 28c4a42dd2..6c8e012bf8 100644 --- a/src/Umbraco.Core/Constants-WebhookEvents.cs +++ b/src/Umbraco.Core/Constants-WebhookEvents.cs @@ -93,6 +93,316 @@ public static partial class Constants /// Webhook event alias for media save. /// public const string MediaSave = "Umbraco.MediaSave"; + + /// + /// Webhook event alias for document type changed. + /// + public const string DocumentTypeChanged = "documentTypeChanged"; + + /// + /// Webhook event alias for document type deleted. + /// + public const string DocumentTypeDeleted = "documentTypeDeleted"; + + /// + /// Webhook event alias for document type moved. + /// + public const string DocumentTypeMoved = "documentTypeMoved"; + + /// + /// Webhook event alias for document type saved. + /// + public const string DocumentTypeSaved = "documentTypeSaved"; + + /// + /// Webhook event alias for media type changed. + /// + public const string MediaTypeChanged = "mediaTypeChanged"; + + /// + /// Webhook event alias for media type deleted. + /// + public const string MediaTypeDeleted = "mediaTypeDeleted"; + + /// + /// Webhook event alias for media type moved. + /// + public const string MediaTypeMoved = "mediaTypeMoved"; + + /// + /// Webhook event alias for media type saved. + /// + public const string MediaTypeSaved = "mediaTypeSaved"; + + /// + /// Webhook event alias for member type changed. + /// + public const string MemberTypeChanged = "memberTypeChanged"; + + /// + /// Webhook event alias for member type deleted. + /// + public const string MemberTypeDeleted = "memberTypeDeleted"; + + /// + /// Webhook event alias for member type moved. + /// + public const string MemberTypeMoved = "memberTypeMoved"; + + /// + /// Webhook event alias for member type saved. + /// + public const string MemberTypeSaved = "memberTypeSaved"; + + /// + /// Webhook event alias for data type deleted. + /// + public const string DataTypeDeleted = "dataTypeDeleted"; + + /// + /// Webhook event alias for data type moved. + /// + public const string DataTypeMoved = "dataTypeMoved"; + + /// + /// Webhook event alias for data type saved. + /// + public const string DataTypeSaved = "dataTypeSaved"; + + /// + /// Webhook event alias for dictionary item deleted. + /// + public const string DictionaryItemDeleted = "dictionaryItemDeleted"; + + /// + /// Webhook event alias for dictionary item saved. + /// + public const string DictionaryItemSaved = "dictionaryItemSaved"; + + /// + /// Webhook event alias for domain deleted. + /// + public const string DomainDeleted = "domainDeleted"; + + /// + /// Webhook event alias for domain saved. + /// + public const string DomainSaved = "domainSaved"; + + /// + /// Webhook event alias for partial view deleted. + /// + public const string PartialViewDeleted = "partialViewDeleted"; + + /// + /// Webhook event alias for partial view saved. + /// + public const string PartialViewSaved = "partialViewSaved"; + + /// + /// Webhook event alias for script deleted. + /// + public const string ScriptDeleted = "scriptDeleted"; + + /// + /// Webhook event alias for script saved. + /// + public const string ScriptSaved = "scriptSaved"; + + /// + /// Webhook event alias for stylesheet deleted. + /// + public const string StylesheetDeleted = "stylesheetDeleted"; + + /// + /// Webhook event alias for stylesheet saved. + /// + public const string StylesheetSaved = "stylesheetSaved"; + + /// + /// Webhook event alias for template deleted. + /// + public const string TemplateDeleted = "templateDeleted"; + + /// + /// Webhook event alias for template saved. + /// + public const string TemplateSaved = "templateSaved"; + + /// + /// Webhook event alias for health check completed. + /// + public const string HealthCheckCompleted = "healthCheckCompleted"; + + /// + /// Webhook event alias for language deleted. + /// + public const string LanguageDeleted = "languageDeleted"; + + /// + /// Webhook event alias for language saved. + /// + public const string LanguageSaved = "languageSaved"; + + /// + /// Webhook event alias for media emptied recycle bin. + /// + public const string MediaEmptiedRecycleBin = "mediaEmptiedRecycleBin"; + + /// + /// Webhook event alias for media moved to recycle bin. + /// + public const string MediaMovedToRecycleBin = "mediaMovedToRecycleBin"; + + /// + /// Webhook event alias for media moved. + /// + public const string MediaMoved = "mediaMoved"; + + /// + /// Webhook event alias for assigned member roles. + /// + public const string AssignedMemberRoles = "assignedMemberRoles"; + + /// + /// Webhook event alias for exported member. + /// + public const string ExportedMember = "exportedMember"; + + /// + /// Webhook event alias for member deleted. + /// + public const string MemberDeleted = "memberDeleted"; + + /// + /// Webhook event alias for member group deleted. + /// + public const string MemberGroupDeleted = "memberGroupDeleted"; + + /// + /// Webhook event alias for member group saved. + /// + public const string MemberGroupSaved = "memberGroupSaved"; + + /// + /// Webhook event alias for member saved. + /// + public const string MemberSaved = "memberSaved"; + + /// + /// Webhook event alias for removed member roles. + /// + public const string RemovedMemberRoles = "removedMemberRoles"; + + /// + /// Webhook event alias for package imported. + /// + public const string PackageImported = "packageImported"; + + /// + /// Webhook event alias for public access entry deleted. + /// + public const string PublicAccessEntryDeleted = "publicAccessEntryDeleted"; + + /// + /// Webhook event alias for public access entry saved. + /// + public const string PublicAccessEntrySaved = "publicAccessEntrySaved"; + + /// + /// Webhook event alias for relation deleted. + /// + public const string RelationDeleted = "relationDeleted"; + + /// + /// Webhook event alias for relation saved. + /// + public const string RelationSaved = "relationSaved"; + + /// + /// Webhook event alias for relation type deleted. + /// + public const string RelationTypeDeleted = "relationTypeDeleted"; + + /// + /// Webhook event alias for relation type saved. + /// + public const string RelationTypeSaved = "relationTypeSaved"; + + /// + /// Webhook event alias for assigned user group permissions; + /// + public const string AssignedUserGroupPermissions = "assignedUserGroupPermissions"; + + /// + /// Webhook event alias for user deleted. + /// + public const string UserDeleted = "userDeleted"; + + /// + /// Webhook event alias for user forgot password requested. + /// + public const string UserForgotPasswordRequested = "userForgotPasswordRequested"; + + /// + /// Webhook event alias for user group deleted. + /// + public const string UserGroupDeleted = "UserGroupDeleted"; + + /// + /// Webhook event alias for user group saved. + /// + public const string UserGroupSaved = "userGroupSaved"; + + /// + /// Webhook event alias for user locked. + /// + public const string UserLocked = "userLocked"; + + /// + /// Webhook event alias for user login failed. + /// + public const string UserLoginFailed = "userLoginFailed"; + + /// + /// Webhook event alias for user login requires verification. + /// + public const string UserLoginRequiresVerification = "userLoginRequiresVerification"; + + /// + /// Webhook event alias for user login success. + /// + public const string UserLoginSuccess = "userLoginSuccess"; + + /// + /// Webhook event alias for user logout success. + /// + public const string UserLogoutSuccess = "userLogoutSuccess"; + + /// + /// Webhook event alias for user password changed. + /// + public const string UserPasswordChanged = "userPasswordChanged"; + + /// + /// Webhook event alias for user password reset. + /// + public const string UserPasswordReset = "userPasswordReset"; + + /// + /// Webhook event alias for user saved. + /// + public const string UserSaved = "userSaved"; + + /// + /// Webhook event alias for user two factor requested. + /// + public const string UserTwoFactorRequested = "userTwoFactorRequested"; + + /// + /// Webhook event alias for user unlocked. + /// + public const string UserUnlocked = "userUnlocked"; } public static class Types diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeChangedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeChangedWebhookEvent.cs index e325030cc6..85df46b803 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeChangedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeChangedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DocumentTypeChangedWebhookEvent : WebhookEventBase "documentTypeChanged"; + public override string Alias => Constants.WebhookEvents.Aliases.DocumentTypeChanged; public override object? ConvertNotificationToRequestPayload(ContentTypeChangedNotification notification) => notification.Changes; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeDeletedWebhookEvent.cs index 4919e5a255..f6cd195003 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DocumentTypeDeletedWebhookEvent : WebhookEventBase "documentTypeDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.DocumentTypeDeleted; public override object? ConvertNotificationToRequestPayload(ContentTypeDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeMovedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeMovedWebhookEvent.cs index d1688f133c..11df70f4e2 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeMovedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeMovedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DocumentTypeMovedWebhookEvent : WebhookEventBase "documentTypeMoved"; + public override string Alias => Constants.WebhookEvents.Aliases.DocumentTypeMoved; public override object? ConvertNotificationToRequestPayload(ContentTypeMovedNotification notification) => notification.MoveInfoCollection; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeSavedWebhookEvent.cs index 90a7beafd9..2ff0a6bf4d 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/DocumentTypeSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DocumentTypeSavedWebhookEvent : WebhookEventBase "documentTypeSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.DocumentTypeSaved; public override object? ConvertNotificationToRequestPayload(ContentTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeChangedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeChangedWebhookEvent.cs index cbe5aeba90..d314c73337 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeChangedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeChangedWebhookEvent.cs @@ -18,7 +18,7 @@ public class MediaTypeChangedWebhookEvent : WebhookEventBase "mediaTypeChanged"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaTypeChanged; public override object? ConvertNotificationToRequestPayload(MediaTypeChangedNotification notification) => notification.Changes; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeDeletedWebhookEvent.cs index e025bfa80d..1b4e226354 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeDeletedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MediaTypeDeletedWebhookEvent : WebhookEventBase "mediaTypeDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaTypeDeleted; public override object? ConvertNotificationToRequestPayload(MediaTypeDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeMovedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeMovedWebhookEvent.cs index 9d59d0eb44..91d89596f0 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeMovedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeMovedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MediaTypeMovedWebhookEvent : WebhookEventBase "mediaTypeMoved"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaTypeMoved; public override object? ConvertNotificationToRequestPayload(MediaTypeMovedNotification notification) => notification.MoveInfoCollection; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeSavedWebhookEvent.cs index 4ef48fde91..160c13359a 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MediaTypeSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MediaTypeSavedWebhookEvent : WebhookEventBase "mediaTypeSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaTypeSaved; public override object? ConvertNotificationToRequestPayload(MediaTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeChangedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeChangedWebhookEvent.cs index 380bdd59bb..be3c7f9553 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeChangedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeChangedWebhookEvent.cs @@ -18,7 +18,7 @@ public class MemberTypeChangedWebhookEvent : WebhookEventBase "memberTypeChanged"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberTypeChanged; public override object? ConvertNotificationToRequestPayload(MemberTypeChangedNotification notification) => notification.Changes; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeDeletedWebhookEvent.cs index 35289588af..e72fe65abb 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeDeletedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberTypeDeletedWebhookEvent : WebhookEventBase "memberTypeDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberTypeDeleted; public override object? ConvertNotificationToRequestPayload(MemberTypeDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeMovedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeMovedWebhookEvent.cs index 42c38d644b..65e77e8237 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeMovedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeMovedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberTypeMovedWebhookEvent : WebhookEventBase "memberTypeMoved"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberTypeMoved; public override object? ConvertNotificationToRequestPayload(MemberTypeMovedNotification notification) => notification.MoveInfoCollection; diff --git a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeSavedWebhookEvent.cs index 81f024c1df..a0a5853b69 100644 --- a/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/ContentType/MemberTypeSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberTypeSavedWebhookEvent : WebhookEventBase "memberTypeSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberTypeSaved; public override object? ConvertNotificationToRequestPayload(MemberTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeDeletedWebhookEvent.cs index fe419ba744..f7f1f4634a 100644 --- a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DataTypeDeletedWebhookEvent : WebhookEventBase "dataTypeDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.DataTypeDeleted; public override object? ConvertNotificationToRequestPayload(DataTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeMovedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeMovedWebhookEvent.cs index 280be11751..6211218c91 100644 --- a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeMovedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeMovedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class DataTypeMovedWebhookEvent : WebhookEventBase "dataTypeMoved"; + public override string Alias => Constants.WebhookEvents.Aliases.DataTypeMoved; public override object? ConvertNotificationToRequestPayload(DataTypeMovedNotification notification) => notification.MoveInfoCollection; diff --git a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeSavedWebhookEvent.cs index 70cb70f573..552f129c83 100644 --- a/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/DataType/DataTypeSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class DataTypeSavedWebhookEvent : WebhookEventBase "dataTypeSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.DataTypeSaved; public override object? ConvertNotificationToRequestPayload(DataTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemDeletedWebhookEvent.cs index 0a415563c5..b429f81451 100644 --- a/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DictionaryItemDeletedWebhookEvent : WebhookEventBase "dictionaryItemDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.DictionaryItemDeleted; public override object? ConvertNotificationToRequestPayload(DictionaryItemDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemSavedWebhookEvent.cs index f08569b39e..499b67e86f 100644 --- a/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Dictionary/DictionaryItemSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DictionaryItemSavedWebhookEvent : WebhookEventBase "dictionaryItemSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.DictionaryItemSaved; public override object? ConvertNotificationToRequestPayload(DictionaryItemSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Domain/DomainDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Domain/DomainDeletedWebhookEvent.cs index 884dff5705..0b66feca26 100644 --- a/src/Umbraco.Core/Webhooks/Events/Domain/DomainDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Domain/DomainDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DomainDeletedWebhookEvent : WebhookEventBase "domainDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.DomainDeleted; public override object? ConvertNotificationToRequestPayload(DomainDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Domain/DomainSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Domain/DomainSavedWebhookEvent.cs index 841bc9a55d..1fff4a0a0b 100644 --- a/src/Umbraco.Core/Webhooks/Events/Domain/DomainSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Domain/DomainSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class DomainSavedWebhookEvent : WebhookEventBase { } - public override string Alias => "domainSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.DomainSaved; public override object? ConvertNotificationToRequestPayload(DomainSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/PartialViewDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/PartialViewDeletedWebhookEvent.cs index c6058a63a8..c3df46defa 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/PartialViewDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/PartialViewDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class PartialViewDeletedWebhookEvent : WebhookEventBase "partialViewDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.PartialViewDeleted; public override object? ConvertNotificationToRequestPayload(PartialViewDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/PartialViewSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/PartialViewSavedWebhookEvent.cs index 342e95bc20..79f4162b11 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/PartialViewSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/PartialViewSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class PartialViewSavedWebhookEvent : WebhookEventBase "partialViewSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.PartialViewSaved; public override object? ConvertNotificationToRequestPayload(PartialViewSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/ScriptDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/ScriptDeletedWebhookEvent.cs index b8fb9f4ced..b9da98eb3a 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/ScriptDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/ScriptDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class ScriptDeletedWebhookEvent : WebhookEventBase "scriptDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.ScriptDeleted; public override object? ConvertNotificationToRequestPayload(ScriptDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/ScriptSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/ScriptSavedWebhookEvent.cs index 3e070f9790..addb6c54ff 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/ScriptSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/ScriptSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class ScriptSavedWebhookEvent : WebhookEventBase "scriptSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.ScriptSaved; public override object? ConvertNotificationToRequestPayload(ScriptDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/StylesheetDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/StylesheetDeletedWebhookEvent.cs index 0996d92b00..a9b7fed6e6 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/StylesheetDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/StylesheetDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class StylesheetDeletedWebhookEvent : WebhookEventBase "stylesheetDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.StylesheetDeleted; public override object? ConvertNotificationToRequestPayload(StylesheetDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/StylesheetSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/StylesheetSavedWebhookEvent.cs index f2f05bc557..f71fd1b0f7 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/StylesheetSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/StylesheetSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class StylesheetSavedWebhookEvent : WebhookEventBase "stylesheetSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.StylesheetSaved; public override object? ConvertNotificationToRequestPayload(StylesheetSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/TemplateDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/TemplateDeletedWebhookEvent.cs index 67274b7e6c..b0777bb1c5 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/TemplateDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/TemplateDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class TemplateDeletedWebhookEvent : WebhookEventBase "templateDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.TemplateDeleted; public override object? ConvertNotificationToRequestPayload(TemplateDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/File/TemplateSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/File/TemplateSavedWebhookEvent.cs index d45ddbf9ca..96cb3c63ae 100644 --- a/src/Umbraco.Core/Webhooks/Events/File/TemplateSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/File/TemplateSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class TemplateSavedWebhookEvent : WebhookEventBase "templateSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.TemplateSaved; public override object? ConvertNotificationToRequestPayload(TemplateSavedNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/HealthCheck/HealthCheckCompletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/HealthCheck/HealthCheckCompletedWebhookEvent.cs index 5fd2ab413b..b38cb8d22b 100644 --- a/src/Umbraco.Core/Webhooks/Events/HealthCheck/HealthCheckCompletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/HealthCheck/HealthCheckCompletedWebhookEvent.cs @@ -13,7 +13,7 @@ public class HealthCheckCompletedWebhookEvent : WebhookEventBase "healthCheckCompleted"; + public override string Alias => Constants.WebhookEvents.Aliases.HealthCheckCompleted; public override object? ConvertNotificationToRequestPayload(HealthCheckCompletedNotification notification) => notification.HealthCheckResults; } diff --git a/src/Umbraco.Core/Webhooks/Events/Language/LanguageDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Language/LanguageDeletedWebhookEvent.cs index bdb2f63f6d..9a1266c2dd 100644 --- a/src/Umbraco.Core/Webhooks/Events/Language/LanguageDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Language/LanguageDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class LanguageDeletedWebhookEvent : WebhookEventBase "languageDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.LanguageDeleted; public override object? ConvertNotificationToRequestPayload(LanguageDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Language/LanguageSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Language/LanguageSavedWebhookEvent.cs index 43ce2a183d..c3363cc3f3 100644 --- a/src/Umbraco.Core/Webhooks/Events/Language/LanguageSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Language/LanguageSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class LanguageSavedWebhookEvent : WebhookEventBase "languageSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.LanguageSaved; public override object? ConvertNotificationToRequestPayload(LanguageSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Media/MediaEmptiedRecycleBinWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Media/MediaEmptiedRecycleBinWebhookEvent.cs index 91b51dea34..22e930ea2e 100644 --- a/src/Umbraco.Core/Webhooks/Events/Media/MediaEmptiedRecycleBinWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Media/MediaEmptiedRecycleBinWebhookEvent.cs @@ -23,7 +23,7 @@ public class MediaEmptiedRecycleBinWebhookEvent : WebhookEventContentBase "mediaEmptiedRecycleBin"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaEmptiedRecycleBin; protected override IEnumerable GetEntitiesFromNotification(MediaEmptiedRecycleBinNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedToRecycleBinWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedToRecycleBinWebhookEvent.cs index e9411a56f4..f136fc7d8c 100644 --- a/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedToRecycleBinWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedToRecycleBinWebhookEvent.cs @@ -23,7 +23,7 @@ public class MediaMovedToRecycleBinWebhookEvent : WebhookEventContentBase "mediaMovedToRecycleBin"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaMovedToRecycleBin; protected override IEnumerable GetEntitiesFromNotification(MediaMovedToRecycleBinNotification notification) => notification.MoveInfoCollection.Select(x => x.Entity); diff --git a/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedWebhookEvent.cs index 7c405baf84..89759a9a56 100644 --- a/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Media/MediaMovedWebhookEvent.cs @@ -23,7 +23,7 @@ public class MediaMovedWebhookEvent : WebhookEventContentBase "mediaMoved"; + public override string Alias => Constants.WebhookEvents.Aliases.MediaMoved; protected override IEnumerable GetEntitiesFromNotification(MediaMovedNotification notification) => notification.MoveInfoCollection.Select(x => x.Entity); diff --git a/src/Umbraco.Core/Webhooks/Events/Member/AssignedMemberRolesWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/AssignedMemberRolesWebhookEvent.cs index 002aebbc1b..2ba8234229 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/AssignedMemberRolesWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/AssignedMemberRolesWebhookEvent.cs @@ -18,5 +18,5 @@ public class AssignedMemberRolesWebhookEvent : WebhookEventBase "assignedMemberRoles"; + public override string Alias => Constants.WebhookEvents.Aliases.AssignedMemberRoles; } diff --git a/src/Umbraco.Core/Webhooks/Events/Member/ExportedMemberWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/ExportedMemberWebhookEvent.cs index 0ab92a015e..b406bef856 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/ExportedMemberWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/ExportedMemberWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class ExportedMemberWebhookEvent : WebhookEventBase "exportedMember"; + public override string Alias => Constants.WebhookEvents.Aliases.ExportedMember; public override object? ConvertNotificationToRequestPayload(ExportedMemberNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/Member/MemberDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/MemberDeletedWebhookEvent.cs index 06d05514c0..f0664ed888 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/MemberDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/MemberDeletedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberDeletedWebhookEvent : WebhookEventBase "memberDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberDeleted; public override object? ConvertNotificationToRequestPayload(MemberDeletedNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupDeletedWebhookEvent.cs index bcbefd0b2c..764223c5b4 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class MemberGroupDeletedWebhookEvent : WebhookEventBase "memberGroupDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberGroupDeleted; public override object? ConvertNotificationToRequestPayload(MemberGroupDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupSavedWebhookEvent.cs index 2759764f10..5aa2a3e6b1 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/MemberGroupSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberGroupSavedWebhookEvent : WebhookEventBase "memberGroupSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberGroupSaved; public override object? ConvertNotificationToRequestPayload(MemberGroupSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Member/MemberSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/MemberSavedWebhookEvent.cs index 044386eb1a..7661052f52 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/MemberSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/MemberSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class MemberSavedWebhookEvent : WebhookEventBase { } - public override string Alias => "memberSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.MemberSaved; public override object? ConvertNotificationToRequestPayload(MemberSavedNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/Member/RemovedMemberRolesWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Member/RemovedMemberRolesWebhookEvent.cs index 873918ec8a..4db26f01a9 100644 --- a/src/Umbraco.Core/Webhooks/Events/Member/RemovedMemberRolesWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Member/RemovedMemberRolesWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class RemovedMemberRolesWebhookEvent : WebhookEventBase "removedMemberRoles"; + public override string Alias => Constants.WebhookEvents.Aliases.RemovedMemberRoles; } diff --git a/src/Umbraco.Core/Webhooks/Events/Package/ImportedPackageWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Package/ImportedPackageWebhookEvent.cs index b099469910..95e32b0fc1 100644 --- a/src/Umbraco.Core/Webhooks/Events/Package/ImportedPackageWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Package/ImportedPackageWebhookEvent.cs @@ -18,5 +18,5 @@ public class ImportedPackageWebhookEvent : WebhookEventBase "packageImported"; + public override string Alias => Constants.WebhookEvents.Aliases.PackageImported; } diff --git a/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntryDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntryDeletedWebhookEvent.cs index f71fddb63b..52d9b5357a 100644 --- a/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntryDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntryDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class PublicAccessEntryDeletedWebhookEvent : WebhookEventBase "publicAccessEntryDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.PublicAccessEntryDeleted; public override object? ConvertNotificationToRequestPayload(PublicAccessEntryDeletedNotification notification) => notification.DeletedEntities; } diff --git a/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntrySavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntrySavedWebhookEvent.cs index 814f33059b..afa5282a4b 100644 --- a/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntrySavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/PublicAccess/PublicAccessEntrySavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class PublicAccessEntrySavedWebhookEvent : WebhookEventBase "publicAccessEntrySaved"; + public override string Alias => Constants.WebhookEvents.Aliases.PublicAccessEntrySaved; public override object? ConvertNotificationToRequestPayload(PublicAccessEntrySavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Relation/RelationDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Relation/RelationDeletedWebhookEvent.cs index 08b9106c5d..6497226363 100644 --- a/src/Umbraco.Core/Webhooks/Events/Relation/RelationDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Relation/RelationDeletedWebhookEvent.cs @@ -18,7 +18,7 @@ public class RelationDeletedWebhookEvent : WebhookEventBase "relationDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.RelationDeleted; public override object? ConvertNotificationToRequestPayload(RelationDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/Relation/RelationSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/Relation/RelationSavedWebhookEvent.cs index 7a28a16615..4f29987d7e 100644 --- a/src/Umbraco.Core/Webhooks/Events/Relation/RelationSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/Relation/RelationSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class RelationSavedWebhookEvent : WebhookEventBase "relationSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.RelationSaved; public override object? ConvertNotificationToRequestPayload(RelationSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeDeletedWebhookEvent.cs index b50e146552..264f69f33e 100644 --- a/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeDeletedWebhookEvent.cs @@ -19,7 +19,7 @@ public class RelationTypeDeletedWebhookEvent : WebhookEventBase "relationTypeDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.RelationTypeDeleted; public override object? ConvertNotificationToRequestPayload(RelationTypeDeletedNotification notification) => notification.DeletedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeSavedWebhookEvent.cs index b665b2479a..50ec1b8110 100644 --- a/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/RelationType/RelationTypeSavedWebhookEvent.cs @@ -18,7 +18,7 @@ public class RelationTypeSavedWebhookEvent : WebhookEventBase "relationTypeSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.RelationTypeSaved; public override object? ConvertNotificationToRequestPayload(RelationTypeSavedNotification notification) => notification.SavedEntities; diff --git a/src/Umbraco.Core/Webhooks/Events/User/AssignedUserGroupPermissionsWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/AssignedUserGroupPermissionsWebhookEvent.cs index 1d07e54337..50a0e73f25 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/AssignedUserGroupPermissionsWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/AssignedUserGroupPermissionsWebhookEvent.cs @@ -18,7 +18,7 @@ public class AssignedUserGroupPermissionsWebhookEvent : WebhookEventBase "assignedUserGroupPermissions"; + public override string Alias => Constants.WebhookEvents.Aliases.AssignedUserGroupPermissions; public override object? ConvertNotificationToRequestPayload(AssignedUserGroupPermissionsNotification notification) => notification.EntityPermissions; diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserDeletedWebhookEvent.cs index 944d5d1cde..71276773a3 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserDeletedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class UserDeletedWebhookEvent : WebhookEventBase { } - public override string Alias => "userDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.UserDeleted; public override object? ConvertNotificationToRequestPayload(UserDeletedNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserForgotPasswordRequestedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserForgotPasswordRequestedWebhookEvent.cs index cfe388c97c..d8c098087d 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserForgotPasswordRequestedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserForgotPasswordRequestedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,6 +18,6 @@ public class UserForgotPasswordRequestedWebhookEvent : WebhookEventBase "userForgotPasswordRequested"; + public override string Alias => Constants.WebhookEvents.Aliases.UserForgotPasswordRequested; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserGroupDeletedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserGroupDeletedWebhookEvent.cs index cb34e859ff..be298d279d 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserGroupDeletedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserGroupDeletedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class UserGroupDeletedWebhookEvent : WebhookEventBase "userGroupDeleted"; + public override string Alias => Constants.WebhookEvents.Aliases.UserGroupDeleted; public override object? ConvertNotificationToRequestPayload(UserGroupDeletedNotification notification) => notification.DeletedEntities; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserGroupSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserGroupSavedWebhookEvent.cs index c4d48c3565..aef2985851 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserGroupSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserGroupSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class UserGroupSavedWebhookEvent : WebhookEventBase "userGroupSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.UserGroupSaved; public override object? ConvertNotificationToRequestPayload(UserGroupSavedNotification notification) => notification.SavedEntities; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserLockedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserLockedWebhookEvent.cs index f7afabb55f..7d43390d72 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserLockedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserLockedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserLockedWebhookEvent : WebhookEventBase { } - public override string Alias => "userLocked"; + public override string Alias => Constants.WebhookEvents.Aliases.UserLocked; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserLoginFailedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserLoginFailedWebhookEvent.cs index 85a7c41a93..0f4e8aab34 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserLoginFailedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserLoginFailedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserLoginFailedWebhookEvent : WebhookEventBase "userLoginFailed"; + public override string Alias => Constants.WebhookEvents.Aliases.UserLoginFailed; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserLoginRequiresVerificationWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserLoginRequiresVerificationWebhookEvent.cs index 7cc2773dbc..f30c924640 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserLoginRequiresVerificationWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserLoginRequiresVerificationWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,6 +18,6 @@ public class UserLoginRequiresVerificationWebhookEvent : WebhookEventBase "userLoginRequiresVerification"; + public override string Alias => Constants.WebhookEvents.Aliases.UserLoginRequiresVerification; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserLoginSuccessWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserLoginSuccessWebhookEvent.cs index 651362cd42..8703628723 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserLoginSuccessWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserLoginSuccessWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserLoginSuccessWebhookEvent : WebhookEventBase "userLoginSuccess"; + public override string Alias => Constants.WebhookEvents.Aliases.UserLoginSuccess; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserLogoutSuccessWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserLogoutSuccessWebhookEvent.cs index 93b10e3810..a2232c17c0 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserLogoutSuccessWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserLogoutSuccessWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserLogoutSuccessWebhookEvent : WebhookEventBase "userLogoutSuccess"; + public override string Alias => Constants.WebhookEvents.Aliases.UserLogoutSuccess; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserPasswordChangedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserPasswordChangedWebhookEvent.cs index 77d5dd0375..43fceaf1bb 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserPasswordChangedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserPasswordChangedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,6 +18,6 @@ public class UserPasswordChangedWebhookEvent : WebhookEventBase "userPasswordChanged"; + public override string Alias => Constants.WebhookEvents.Aliases.UserPasswordChanged; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserPasswordResetWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserPasswordResetWebhookEvent.cs index ee642bd434..f292d34a4e 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserPasswordResetWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserPasswordResetWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserPasswordResetWebhookEvent : WebhookEventBase "userPasswordReset"; + public override string Alias => Constants.WebhookEvents.Aliases.UserPasswordReset; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserSavedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserSavedWebhookEvent.cs index a13ef13884..9038350fb5 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserSavedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserSavedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,7 +18,7 @@ public class UserSavedWebhookEvent : WebhookEventBase { } - public override string Alias => "userSaved"; + public override string Alias => Constants.WebhookEvents.Aliases.UserSaved; public override object? ConvertNotificationToRequestPayload(UserSavedNotification notification) { diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserTwoFactorRequestedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserTwoFactorRequestedWebhookEvent.cs index 706fa0fbf4..0169485921 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserTwoFactorRequestedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserTwoFactorRequestedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,6 +18,6 @@ public class UserTwoFactorRequestedWebhookEvent : WebhookEventBase "userTwoFactorRequested"; + public override string Alias => Constants.WebhookEvents.Aliases.UserTwoFactorRequested; } diff --git a/src/Umbraco.Core/Webhooks/Events/User/UserUnlockedWebhookEvent.cs b/src/Umbraco.Core/Webhooks/Events/User/UserUnlockedWebhookEvent.cs index 1d54188521..7c52e959d4 100644 --- a/src/Umbraco.Core/Webhooks/Events/User/UserUnlockedWebhookEvent.cs +++ b/src/Umbraco.Core/Webhooks/Events/User/UserUnlockedWebhookEvent.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Services; @@ -18,5 +18,5 @@ public class UserUnlockedWebhookEvent : WebhookEventBase "userUnlocked"; + public override string Alias => Constants.WebhookEvents.Aliases.UserUnlocked; } From 2d2d17d928045fd39c2d0d650d4be9c62419c783 Mon Sep 17 00:00:00 2001 From: Rachel Drake Date: Mon, 22 Jan 2024 16:06:57 +0000 Subject: [PATCH 11/32] Fixing #14088. Match content finder functionality in the url provider for umbracoUrlAlias. --- src/Umbraco.Core/Routing/AliasUrlProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Routing/AliasUrlProvider.cs b/src/Umbraco.Core/Routing/AliasUrlProvider.cs index d47680905a..65d9387e2e 100644 --- a/src/Umbraco.Core/Routing/AliasUrlProvider.cs +++ b/src/Umbraco.Core/Routing/AliasUrlProvider.cs @@ -144,7 +144,7 @@ public class AliasUrlProvider : IUrlProvider foreach (var alias in aliases.Distinct()) { var path = "/" + alias; - var uri = new Uri(CombinePaths(domainUri.Uri.GetLeftPart(UriPartial.Path), path)); + var uri = new Uri(CombinePaths(domainUri.Uri.GetLeftPart(UriPartial.Authority), path)); yield return UrlInfo.Url( _uriUtility.UriFromUmbraco(uri, _requestConfig).ToString(), domainUri.Culture); From f9bdbb05396286f138f1c771c494095020e44c1f Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 30 Jan 2024 13:43:44 +0100 Subject: [PATCH 12/32] Media picker crop image size (#15574) * Remove empty comment * Formatting * Return full size for image crop like Image Cropper does --- .../mediaentryeditor.controller.js | 7 ++- .../mediaentryeditor/mediaentryeditor.html | 47 ++++++------------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.controller.js index e777e91e29..05be10c5d0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.controller.js @@ -62,7 +62,7 @@ angular.module("umbraco") entityResource.getById(vm.mediaEntry.mediaKey, "Media").then(function (mediaEntity) { vm.media = mediaEntity; - vm.imageSrc = mediaHelper.resolveFileFromEntity(mediaEntity, true); + vm.imageSrc = mediaHelper.resolveFileFromEntity(mediaEntity, false); vm.fileSrc = mediaHelper.resolveFileFromEntity(mediaEntity, false); vm.fileExtension = mediaHelper.getFileExtension(vm.fileSrc); vm.loading = false; @@ -103,7 +103,6 @@ angular.module("umbraco") // un-select crop: vm.currentCrop = null; - // updateMedia(); } @@ -123,13 +122,13 @@ angular.module("umbraco") } function focalPointChanged(left, top) { - //update the model focalpoint value + // update the model focalpoint value vm.mediaEntry.focalPoint = { left: left, top: top }; - //set form to dirty to track changes + // set form to dirty to track changes setDirty(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.html index 45a463f8bf..11ffef6200 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.html @@ -1,7 +1,4 @@ -
+
+ hide-description="true">
- This item is in the Recycle Bin + This item is in the Recycle Bin
@@ -27,8 +21,7 @@ @@ -36,16 +29,14 @@ ng-repeat="crop in vm.mediaEntry.crops track by crop.alias" class="btn-reset umb-outline" ng-class="{'--is-active':vm.currentCrop.alias === crop.alias, '--is-defined':!!vm.currentCrop.coordinates}" - ng-click="vm.selectCrop(crop)" - > + ng-click="vm.selectCrop(crop)"> + max-size="75"> {{crop.label}} @@ -60,8 +51,7 @@ alias="{{vm.currentCrop.alias}}" force-update="{{vm.forceUpdateCrop}}" center="vm.mediaEntry.focalPoint" - src="vm.imageSrc" - > + src="vm.imageSrc">
@@ -129,8 +112,7 @@ shortcut="esc" button-style="link" label="{{vm.closeLabel}}" - type="button" - > + type="button"> + type="button"> From 836d45e5c5c5abb5abc9ba1b903ca85241a679b4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:36:37 +0100 Subject: [PATCH 13/32] Login assets should be built independently of the Backoffice (#15668) * picked from v14/dev to distinguish between Belle and Login so the correct assets are being built when you run Umbraco.Web.UI * syntax --- .../Umbraco.Cms.StaticAssets.csproj | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj index d2db9b11eb..f973b22fc6 100644 --- a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj +++ b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj @@ -12,34 +12,56 @@ - $(ProjectDir)wwwroot\umbraco + $(ProjectDir)wwwroot\umbraco + $(BasePath)\lib + $(BasePath)\login - + + + + + + - - - + + + + + + + + + + + - + - + + + + + + + + From 0e1ca76d6e5b50d83a9b76779c11e0bd9ae3f6ca Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 2 Feb 2024 10:17:40 +0100 Subject: [PATCH 14/32] Remove Linux only Docker build for E2E tests (#14042) * Remove Linux only Docker build for E2E tests * Fix cmsVersion variable * Remove custom build number step (already done by Nerdbank.GitVersioning) * Add and use global.json to configure .NET SDK version * Only publish tests build output * Only include unit tests and integration build output (without reference assemblies) * Added "pr: none" to nightly trigger (#15044) * Only run SQL Server Acceptance Tests on release builds or when parameter is set * Use SQLite in-memory database and configure database optimizations (#15461) * Disable content version cleanup and server election * Reference Umbraco.Tests.AcceptanceTest.UmbracoProject instead of copying files * Suspend/disable scheduled publishing * Ensure all Playwright results are copied to the artifact staging directory * Update E2E SQL Server job and also run on Linux * Fix building acceptance test project * Fix building acceptance test project (suing PrivateAssets) * Explicitly disable building project references in E2E tests and use pre-built output * Include obj folder of acceptance test project in build artifacts * Download build artifacts * Re-add PrivateAssets * Revert to copying C# files to E2E application * Disable Integrated Security for SQL Server on Linux * Update SQL Server on Linux connection string * Disable encryption on SQL Server for Linux * Update SQL Server on Linux steps * Add Database to SQL Server connection string on Linux * Update Integration Tests and use SQL Server 2022 Docker image --------- Co-authored-by: Bjarke Berg --- .artifactignore | 4 +- build/azure-pipelines.yml | 483 ++++++++++++------ global.json | 5 +- .../SQLiteMemoryComposer.cs | 42 ++ .../SqlServerDelayedDurabilityComposer.cs | 44 ++ .../SuspendScheduledPublishingComposer.cs | 13 + ...Tests.AcceptanceTest.UmbracoProject.csproj | 10 + .../misc/Directory.Build.props | 7 - .../misc/nuget.config | 8 - .../misc/umbraco-linux.docker | 51 -- umbraco.sln | 12 +- 11 files changed, 437 insertions(+), 242 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SQLiteMemoryComposer.cs create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SqlServerDelayedDurabilityComposer.cs create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SuspendScheduledPublishingComposer.cs create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/Umbraco.Tests.AcceptanceTest.UmbracoProject.csproj delete mode 100644 tests/Umbraco.Tests.AcceptanceTest/misc/Directory.Build.props delete mode 100644 tests/Umbraco.Tests.AcceptanceTest/misc/nuget.config delete mode 100644 tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker diff --git a/.artifactignore b/.artifactignore index a287e295ae..ac78eeca46 100644 --- a/.artifactignore +++ b/.artifactignore @@ -1,3 +1,3 @@ **/* -!**/bin/** -!**/obj/** +!tests/Umbraco.Tests.Integration/bin/** +!tests/Umbraco.Tests.UnitTests/bin/** diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 0cacf10718..3d2b10e614 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -5,6 +5,10 @@ parameters: displayName: Run SQL Server Integration Tests type: boolean default: false + - name: sqlServerAcceptanceTests + displayName: Run SQL Server Acceptance Tests + type: boolean + default: false - name: myGetDeploy displayName: Deploy to MyGet type: boolean @@ -34,11 +38,11 @@ parameters: type: string default: ' ' - name: nonWindowsIntegrationNonReleaseTestFilter - displayName: TestFilter used for non-release type builds on non windows agents + displayName: TestFilter used for non-release type builds on non Windows agents type: string default: '--filter TestCategory!=LongRunning&TestCategory!=NonCritical' - name: nonWindowsIntegrationReleaseTestFilter - displayName: TestFilter used for release type builds on non windows agents + displayName: TestFilter used for release type builds on non Windows agents type: string default: ' ' - name: isNightly @@ -47,9 +51,7 @@ parameters: default: false variables: - nodeVersion: 20 - dotnetVersion: 8.x - dotnetIncludePreviewVersions: true + nodeVersion: 20.10.x solution: umbraco.sln buildConfiguration: Release UMBRACO__CMS__GLOBAL__ID: 00000000-0000-0000-0000-000000000042 @@ -108,11 +110,9 @@ stages: verbose: false customCommand: run build - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - performMultiLevelLookup: true - includePreviewVersions: $(dotnetIncludePreviewVersions) + useGlobalJson: true - task: DotNetCoreCLI@2 displayName: Run dotnet restore inputs: @@ -256,16 +256,14 @@ stages: artifact: build_output path: $(Build.SourcesDirectory) - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - performMultiLevelLookup: true - includePreviewVersions: $(dotnetIncludePreviewVersions) + useGlobalJson: true - task: DotNetCoreCLI@2 displayName: Run dotnet test inputs: command: test - projects: '**/*.Tests.UnitTests.csproj' + projects: 'tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj' arguments: '--configuration $(buildConfiguration) --no-build' testRunTitle: Unit Tests - $(Agent.OS) @@ -288,46 +286,36 @@ stages: vmImage: 'macOS-latest' pool: vmImage: $(vmImage) + variables: + Tests__Database__DatabaseType: 'Sqlite' steps: + # Setup test environment - task: DownloadPipelineArtifact@2 displayName: Download build artifacts inputs: artifact: build_output path: $(Build.SourcesDirectory) + - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - performMultiLevelLookup: true - includePreviewVersions: $(dotnetIncludePreviewVersions) + useGlobalJson: true + + # Test - task: DotNetCoreCLI@2 - displayName: Run dotnet test Windows - condition: eq(variables['Agent.OS'],'Windows_NT') + displayName: Run dotnet test inputs: command: test - projects: '**/*.Tests.Integration.csproj' + projects: 'tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj' testRunTitle: Integration Tests SQLite - $(Agent.OS) - ${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: + ${{ if and(eq(variables['Agent.OS'],'Windows_NT'), or(variables.releaseTestFilter, parameters.forceReleaseTestFilter)) }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}' - ${{ else }}: - arguments: '--configuration $(buildConfiguration) ${{parameters.integrationNonReleaseTestFilter}}' - env: - Tests__Database__DatabaseType: 'Sqlite' - Umbraco__CMS__Global__MainDomLock: 'FileSystemMainDomLock' - - task: DotNetCoreCLI@2 - displayName: Run dotnet test Non Windows - condition: ne(variables['Agent.OS'],'Windows_NT') - inputs: - command: test - projects: '**/*.Tests.Integration.csproj' - testRunTitle: Integration Tests SQLite - $(Agent.OS) - ${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: + ${{ elseif eq(variables['Agent.OS'],'Windows_NT') }}: + arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationNonReleaseTestFilter}}' + ${{ elseif or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}' ${{ else }}: - arguments: '--configuration $(buildConfiguration) ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}' - env: - Tests__Database__DatabaseType: 'Sqlite' - Umbraco__CMS__Global__MainDomLock: 'FileSystemMainDomLock' + arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}' # Integration Tests (SQL Server) - job: @@ -338,208 +326,363 @@ stages: matrix: Windows: vmImage: 'windows-latest' - testDb: LocalDb - connectionString: N/A + Tests__Database__DatabaseType: LocalDb + Tests__Database__SQLServerMasterConnectionString: N/A Linux: vmImage: 'ubuntu-latest' - testDb: SqlServer - connectionString: 'Server=localhost,1433;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=true' + SA_PASSWORD: UmbracoIntegration123! + Tests__Database__DatabaseType: SqlServer + Tests__Database__SQLServerMasterConnectionString: 'Server=(local);User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True' pool: vmImage: $(vmImage) - variables: - SA_PASSWORD: UmbracoIntegration123! steps: + # Setup test environment - task: DownloadPipelineArtifact@2 displayName: Download build artifacts inputs: artifact: build_output path: $(Build.SourcesDirectory) + - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - includePreviewVersions: $(dotnetIncludePreviewVersions) - - powershell: sqllocaldb start mssqllocaldb - displayName: Start localdb (Windows only) - condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) - - powershell: docker run --name mssql -d -p 1433:1433 -e ACCEPT_EULA=Y -e SA_PASSWORD=$(SA_PASSWORD) -e MSSQL_PID=Developer mcr.microsoft.com/mssql/server:2019-latest - displayName: Start SQL Server (Linux only) + useGlobalJson: true + + # Start SQL Server + - powershell: docker run --name mssql -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$(SA_PASSWORD)" mcr.microsoft.com/mssql/server:2022-latest + displayName: Start SQL Server Docker image (Linux) condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: SqlLocalDB start MSSQLLocalDB + displayName: Start SQL Server LocalDB (Windows) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + + # Test - task: DotNetCoreCLI@2 - displayName: Run dotnet test Windows - condition: eq(variables['Agent.OS'],'Windows_NT') + displayName: Run dotnet test inputs: command: test - projects: '**/*.Tests.Integration.csproj' + projects: 'tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj' testRunTitle: Integration Tests SQL Server - $(Agent.OS) - ${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: + ${{ if and(eq(variables['Agent.OS'],'Windows_NT'), or(variables.releaseTestFilter, parameters.forceReleaseTestFilter)) }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}' - ${{ else }}: + ${{ elseif eq(variables['Agent.OS'],'Windows_NT') }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationNonReleaseTestFilter}}' - env: - Tests__Database__DatabaseType: $(testDb) - Tests__Database__SQLServerMasterConnectionString: $(connectionString) - Umbraco__CMS__Global__MainDomLock: 'SqlMainDomLock' - - task: DotNetCoreCLI@2 - displayName: Run dotnet test NonWindows - condition: ne(variables['Agent.OS'],'Windows_NT') - inputs: - command: test - projects: '**/*.Tests.Integration.csproj' - testRunTitle: Integration Tests SQL Server - $(Agent.OS) - ${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: + ${{ elseif or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}' ${{ else }}: arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}' - env: - Tests__Database__DatabaseType: $(testDb) - Tests__Database__SQLServerMasterConnectionString: $(connectionString) - Umbraco__CMS__Global__MainDomLock: 'SqlMainDomLock' + + # Stop SQL Server + - pwsh: docker stop mssql + displayName: Stop SQL Server Docker image (Linux) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: SqlLocalDB stop MSSQLLocalDB + displayName: Stop SQL Server LocalDB (Windows) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) - stage: E2E - variables: - npm_config_cache: $(Pipeline.Workspace)/.npm_e2e displayName: E2E Tests dependsOn: Build + variables: + npm_config_cache: $(Pipeline.Workspace)/.npm_e2e + # Enable console logging in Release mode + SERILOG__WRITETO__0__NAME: Async + SERILOG__WRITETO__0__ARGS__CONFIGURE__0__NAME: Console + # Set unattended install settings + UMBRACO__CMS__UNATTENDED__INSTALLUNATTENDED: true + UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERNAME: Playwright Test + UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD: UmbracoAcceptance123! + UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL: playwright@umbraco.com + # Custom Umbraco settings + UMBRACO__CMS__CONTENT__CONTENTVERSIONCLEANUPPOLICY__ENABLECLEANUP: false + UMBRACO__CMS__GLOBAL__DISABLEELECTIONFORSINGLESERVER: true + UMBRACO__CMS__GLOBAL__INSTALLMISSINGDATABASE: true + UMBRACO__CMS__GLOBAL__ID: 00000000-0000-0000-0000-000000000042 + UMBRACO__CMS__GLOBAL__VERSIONCHECKPERIOD: 0 + UMBRACO__CMS__GLOBAL__USEHTTPS: true + UMBRACO__CMS__HEALTHCHECKS__NOTIFICATION__ENABLED: false + UMBRACO__CMS__KEEPALIVE__DISABLEKEEPALIVETASK: true + UMBRACO__CMS__WEBROUTING__UMBRACOAPPLICATIONURL: https://localhost:44331/ + ASPNETCORE_URLS: https://localhost:44331 jobs: # E2E Tests - job: - displayName: E2E Tests - timeoutInMinutes: 120 + displayName: E2E Tests (SQLite) variables: - Umbraco__CMS__Unattended__UnattendedUserName: Playwright Test - Umbraco__CMS__Unattended__UnattendedUserPassword: UmbracoAcceptance123! - Umbraco__CMS__Unattended__UnattendedUserEmail: playwright@umbraco.com - ASPNETCORE_URLS: https://localhost:8443 + # Connection string + CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=Umbraco;Mode=Memory;Cache=Shared;Foreign Keys=True;Pooling=True + CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.Sqlite strategy: matrix: Linux: vmImage: 'ubuntu-latest' - dockerfile: umbraco-linux.docker - dockerImageName: umbraco-linux Windows: vmImage: 'windows-latest' - DOTNET_GENERATE_ASPNET_CERTIFICATE: true # Automatically generate HTTPS development certificate on Windows - # Enable console logging in Release mode - Serilog__WriteTo__0__Name: Async - Serilog__WriteTo__0__Args__configure__0__Name: Console - # Set unattended install settings - Umbraco__CMS__Unattended__InstallUnattended: true - Umbraco__CMS__Global__InstallMissingDatabase: true - UmbracoDatabaseServer: (LocalDB)\MSSQLLocalDB - UmbracoDatabaseName: AcceptanceTestDB - ConnectionStrings__umbracoDbDSN: Server=$(UmbracoDatabaseServer);Database=$(UmbracoDatabaseName);Integrated Security=true; - # Custom Umbraco settings - Umbraco__CMS__Global__VersionCheckPeriod: 0 - Umbraco__CMS__Global__UseHttps: true - Umbraco__CMS__HealthChecks__Notification__Enabled: false - Umbraco__CMS__KeepAlive__DisableKeepAliveTask: true pool: vmImage: $(vmImage) steps: + # Setup test environment - task: DownloadPipelineArtifact@2 - displayName: Download nupkg + displayName: Download NuGet artifacts inputs: artifact: nupkg - path: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/misc/nupkg + path: $(Agent.BuildDirectory)/app/nupkg + - task: NodeTool@0 displayName: Use Node.js $(nodeVersion) retryCountOnTaskFailure: 3 inputs: versionSpec: $(nodeVersion) - - task: Cache@2 - displayName: Cache node_modules - inputs: - key: '"npm_e2e" | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json' - restoreKeys: | - "npm_e2e" | "$(Agent.OS)" - "npm_e2e" - path: $(npm_config_cache) - - pwsh: | - New-Item -Path "." -Name ".env" -ItemType "file" -Value "UMBRACO_USER_LOGIN=$(Umbraco__CMS__Unattended__UnattendedUserEmail) - UMBRACO_USER_PASSWORD=$(Umbraco__CMS__Unattended__UnattendedUserPassword) - URL=$(ASPNETCORE_URLS)" - displayName: Generate .env - workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/ - - script: npm ci --no-fund --no-audit --prefer-offline - workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/ - displayName: Run npm ci - - pwsh: sqllocaldb start mssqllocaldb - displayName: Start localdb (Windows only) - condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) - - pwsh: Invoke-Sqlcmd -Query "CREATE DATABASE $env:UmbracoDatabaseName" -ServerInstance $env:UmbracoDatabaseServer - displayName: Create database (Windows only) - condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - performMultiLevelLookup: true - includePreviewVersions: $(dotnetIncludePreviewVersions) + useGlobalJson: true + - pwsh: | - $sha = 'g$(Build.SourceVersion)'.substring(0, 8) - docker build -t $(dockerImageName):$sha -f $(dockerfile) . - mkdir -p $(Build.ArtifactStagingDirectory)/docker-images - docker save -o $(Build.ArtifactStagingDirectory)/docker-images/$(dockerImageName).$sha.tar $(dockerImageName):$sha - dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p $(Umbraco__CMS__Unattended__UnattendedUserPassword) - docker run --name $(dockerImageName) -dp 8080:5000 -dp 8443:5001 -e UMBRACO__CMS__GLOBAL__ID=$(UMBRACO__CMS__GLOBAL__ID) -e ASPNETCORE_Kestrel__Certificates__Default__Password="$(Umbraco__CMS__Unattended__UnattendedUserPassword)" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v ${HOME}/.aspnet/https:/https/ $(dockerImageName):$sha - docker ps - condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) - displayName: Build and run container (Linux only) - workingDirectory: tests/Umbraco.Tests.AcceptanceTest/misc + "UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL) + UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD) + URL=$(ASPNETCORE_URLS)" | Out-File .env + displayName: Generate .env + workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest + + # Cache and restore NPM packages + - task: Cache@2 + displayName: Cache NPM packages + inputs: + key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json' + restoreKeys: | + npm_e2e | "$(Agent.OS)" + npm_e2e + path: $(npm_config_cache) + + - script: npm ci --no-fund --no-audit --prefer-offline + workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest + displayName: Restore NPM packages + + # Build application - pwsh: | - dotnet new --install ./nupkg/Umbraco.Templates.*.nupkg - dotnet new umbraco --name AcceptanceTestProject --no-restore --output . - dotnet restore --configfile ./nuget.config - dotnet build --configuration $(buildConfiguration) --no-restore + $cmsVersion = "$(Build.BuildNumber)" -replace "\+",".g" + dotnet new nugetconfig + dotnet nuget add source ./nupkg --name Local + dotnet new install Umbraco.Templates::$cmsVersion + dotnet new umbraco --name UmbracoProject --version $cmsVersion --exclude-gitignore --no-restore --no-update-check + dotnet restore UmbracoProject + cp $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/*.cs UmbracoProject + dotnet build UmbracoProject --configuration $(buildConfiguration) --no-restore dotnet dev-certs https - $process = Start-Process -FilePath "dotnet" -ArgumentList "run --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log + displayName: Build application + workingDirectory: $(Agent.BuildDirectory)/app + + # Run application + - bash: | + nohup dotnet run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 & + echo "##vso[task.setvariable variable=AcceptanceTestProcessId]$!" + displayName: Run application (Linux) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + workingDirectory: $(Agent.BuildDirectory)/app + + - pwsh: | + $process = Start-Process dotnet "run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -NoNewWindow -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log Write-Host "##vso[task.setvariable variable=AcceptanceTestProcessId]$($process.Id)" + displayName: Run application (Windows) condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) - displayName: Build and run app (Windows only) - workingDirectory: tests/Umbraco.Tests.AcceptanceTest/misc + workingDirectory: $(Agent.BuildDirectory)/app + + # Wait for application to start responding to requests - pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS) - displayName: Wait for app + displayName: Wait for application workingDirectory: tests/Umbraco.Tests.AcceptanceTest + + # Install Playwright and dependencies - pwsh: npx playwright install --with-deps displayName: Install Playwright workingDirectory: tests/Umbraco.Tests.AcceptanceTest + + # Test - pwsh: npm run test --ignore-certificate-errors - displayName: Run Playwright (Desktop) + displayName: Run Playwright tests continueOnError: true workingDirectory: tests/Umbraco.Tests.AcceptanceTest env: CI: true CommitId: $(Build.SourceVersion) AgentOs: $(Agent.OS) + + # Stop application + - bash: kill -15 $(AcceptanceTestProcessId) + displayName: Stop application (Linux) + condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: Stop-Process -Id $(AcceptanceTestProcessId) + displayName: Stop application (Windows) + condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Windows_NT')) + + # Copy artifacts - pwsh: | - docker logs $(dockerImageName) > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 - docker stop $(dockerImageName) - condition: eq(variables['Agent.OS'], 'Linux') - displayName: Stop app (Linux only) - - pwsh: Stop-Process $env:AcceptanceTestProcessId - condition: eq(variables['Agent.OS'], 'Windows_NT') - displayName: Stop app (Windows only) - - task: PowerShell@2 - displayName: Check if artifacts folder exists - inputs: - targetType: inline - script: | - $MyVariable = Test-Path -Path $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/results - Write-Host "##vso[task.setvariable variable=resultFolderExists;]$MyVariable" - - task: CopyFiles@2 - displayName: Prepare artifacts - condition: eq(variables.resultFolderExists, 'True') - inputs: - sourceFolder: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/results/ - targetFolder: $(Build.ArtifactStagingDirectory)/playwright + if (Test-Path tests/Umbraco.Tests.AcceptanceTest/results/*) { + Copy-Item tests/Umbraco.Tests.AcceptanceTest/results $(Build.ArtifactStagingDirectory) -Recurse + } + displayName: Copy Playwright results + condition: succeededOrFailed() + + # Publish - task: PublishPipelineArtifact@1 - condition: always() displayName: Publish test artifacts + condition: succeededOrFailed() inputs: targetPath: $(Build.ArtifactStagingDirectory) - artifact: 'E2E artifacts - $(Agent.OS) - Attempt #$(System.JobAttempt)' + artifact: 'Acceptance Tests - $(Agent.JobName) - Attempt #$(System.JobAttempt)' + - job: + displayName: E2E Tests (SQL Server) + condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerAcceptanceTests}}) + variables: + # Connection string + CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True + CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.SqlClient + strategy: + matrix: + Linux: + vmImage: 'ubuntu-latest' + SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD) + CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True' + Windows: + vmImage: 'windows-latest' + pool: + vmImage: $(vmImage) + steps: + # Setup test environment + - task: DownloadPipelineArtifact@2 + displayName: Download NuGet artifacts + inputs: + artifact: nupkg + path: $(Agent.BuildDirectory)/app/nupkg + + - task: NodeTool@0 + displayName: Use Node.js $(nodeVersion) + inputs: + versionSpec: $(nodeVersion) + + - task: UseDotNet@2 + displayName: Use .NET SDK from global.json + inputs: + useGlobalJson: true + + - pwsh: | + "UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL) + UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD) + URL=$(ASPNETCORE_URLS)" | Out-File .env + displayName: Generate .env + workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest + + # Cache and restore NPM packages + - task: Cache@2 + displayName: Cache NPM packages + inputs: + key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json' + restoreKeys: | + npm_e2e | "$(Agent.OS)" + npm_e2e + path: $(npm_config_cache) + + - script: npm ci --no-fund --no-audit --prefer-offline + workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest + displayName: Restore NPM packages + + # Build application + - pwsh: | + $cmsVersion = "$(Build.BuildNumber)" -replace "\+",".g" + dotnet new nugetconfig + dotnet nuget add source ./nupkg --name Local + dotnet new install Umbraco.Templates::$cmsVersion + dotnet new umbraco --name UmbracoProject --version $cmsVersion --exclude-gitignore --no-restore --no-update-check + dotnet restore UmbracoProject + cp $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/*.cs UmbracoProject + dotnet build UmbracoProject --configuration $(buildConfiguration) --no-restore + dotnet dev-certs https + displayName: Build application + workingDirectory: $(Agent.BuildDirectory)/app + + # Start SQL Server + - powershell: docker run --name mssql -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$(SA_PASSWORD)" mcr.microsoft.com/mssql/server:2022-latest + displayName: Start SQL Server Docker image (Linux) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: SqlLocalDB start MSSQLLocalDB + displayName: Start SQL Server LocalDB (Windows) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + + # Run application + - bash: | + nohup dotnet run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 & + echo "##vso[task.setvariable variable=AcceptanceTestProcessId]$!" + displayName: Run application (Linux) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + workingDirectory: $(Agent.BuildDirectory)/app + + - pwsh: | + $process = Start-Process dotnet "run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -NoNewWindow -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log + Write-Host "##vso[task.setvariable variable=AcceptanceTestProcessId]$($process.Id)" + displayName: Run application (Windows) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + workingDirectory: $(Agent.BuildDirectory)/app + + # Wait for application to start responding to requests + - pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS) + displayName: Wait for application + workingDirectory: tests/Umbraco.Tests.AcceptanceTest + + # Install Playwright and dependencies + - pwsh: npx playwright install --with-deps + displayName: Install Playwright + workingDirectory: tests/Umbraco.Tests.AcceptanceTest + + # Test + - pwsh: npm run test --ignore-certificate-errors + displayName: Run Playwright tests + continueOnError: true + workingDirectory: tests/Umbraco.Tests.AcceptanceTest + env: + CI: true + CommitId: $(Build.SourceVersion) + AgentOs: $(Agent.OS) + + # Stop application + - bash: kill -15 $(AcceptanceTestProcessId) + displayName: Stop application (Linux) + condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: Stop-Process -Id $(AcceptanceTestProcessId) + displayName: Stop application (Windows) + condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Windows_NT')) + + # Stop SQL Server + - pwsh: docker stop mssql + displayName: Stop SQL Server Docker image (Linux) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) + + - pwsh: SqlLocalDB stop MSSQLLocalDB + displayName: Stop SQL Server LocalDB (Windows) + condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) + + # Copy artifacts + - pwsh: | + if (Test-Path tests/Umbraco.Tests.AcceptanceTest/results/*) { + Copy-Item tests/Umbraco.Tests.AcceptanceTest/results $(Build.ArtifactStagingDirectory) -Recurse + } + displayName: Copy Playwright results + condition: succeededOrFailed() + + # Publish + - task: PublishPipelineArtifact@1 + displayName: Publish test artifacts + condition: succeededOrFailed() + inputs: + targetPath: $(Build.ArtifactStagingDirectory) + artifact: 'Acceptance Tests - $(Agent.JobName) - Attempt #$(System.JobAttempt)' ############################################### ## Release @@ -599,7 +742,7 @@ stages: pool: vmImage: 'windows-latest' # Apparently AzureFileCopy is windows only :( variables: - umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ] + umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ] displayName: Upload API Documention dependsOn: - Build diff --git a/global.json b/global.json index 36394634bd..391ba3c2a3 100644 --- a/global.json +++ b/global.json @@ -1,7 +1,6 @@ { "sdk": { - "version": "8.0.0", - "rollForward": "latestFeature", - "allowPrerelease": false + "version": "8.0.100", + "rollForward": "latestFeature" } } diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SQLiteMemoryComposer.cs b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SQLiteMemoryComposer.cs new file mode 100644 index 0000000000..63f330a564 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SQLiteMemoryComposer.cs @@ -0,0 +1,42 @@ +using Microsoft.Data.Sqlite; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Extensions; + +namespace UmbracoProject; + +/// +/// Ensures a SQLite in-memory database is persisted for the whole application duration. +/// +public sealed class SQLiteMemoryComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) + { + var connectionString = builder.Config.GetUmbracoConnectionString(out var providerName); + if (!string.IsNullOrEmpty(connectionString) && + Constants.ProviderNames.SQLLite.InvariantEquals(providerName) && + connectionString.InvariantContains("Mode=Memory")) + { + // Open new SQLite connection to ensure in-memory database is persisted for the whole application duration + var connection = new SqliteConnection(connectionString); + connection.Open(); + + // And ensure connection is kept open (by keeping a reference) and gets gracefully closed/disposed when application stops + builder.Services.AddHostedService(_ => new SQLiteMemoryHostedService(connection)); + } + } + + private sealed class SQLiteMemoryHostedService : IHostedService, IAsyncDisposable + { + private readonly SqliteConnection _connection; + + public SQLiteMemoryHostedService(SqliteConnection connection) => _connection = connection; + + public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; + + public async Task StopAsync(CancellationToken cancellationToken) => await _connection.CloseAsync(); + + public async ValueTask DisposeAsync() => await _connection.DisposeAsync(); + } +} diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SqlServerDelayedDurabilityComposer.cs b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SqlServerDelayedDurabilityComposer.cs new file mode 100644 index 0000000000..956a101fbc --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SqlServerDelayedDurabilityComposer.cs @@ -0,0 +1,44 @@ +using Microsoft.Data.SqlClient; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Notifications; +using Umbraco.Extensions; + +namespace UmbracoProject; + +/// +/// Disable waiting on log IO to finish when commiting a transaction (we can tolerate some data loss) on SQL Server. +/// +public sealed class SqlServerDelayedDurabilityComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) + { + var connectionString = builder.Config.GetUmbracoConnectionString(out var providerName); + if (!string.IsNullOrEmpty(connectionString) && + Constants.ProviderNames.SQLServer.InvariantEquals(providerName)) + { + builder.AddNotificationAsyncHandler(); + } + } + + private sealed class SqlServerDelayedDurabilityInstallNotification : INotificationAsyncHandler + { + private readonly IOptions _connectionStrings; + + public SqlServerDelayedDurabilityInstallNotification(IOptions connectionStrings) => _connectionStrings = connectionStrings; + + public async Task HandleAsync(UnattendedInstallNotification notification, CancellationToken cancellationToken) + { + using var connection = new SqlConnection(_connectionStrings.Value.ConnectionString); + await connection.OpenAsync(cancellationToken); + + // Disable waiting on log IO to finish when commiting a transaction (we can tolerate some data loss) + var command = new SqlCommand("ALTER DATABASE CURRENT SET DELAYED_DURABILITY = FORCED;", connection); + await command.ExecuteNonQueryAsync(cancellationToken); + } + } +} diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SuspendScheduledPublishingComposer.cs b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SuspendScheduledPublishingComposer.cs new file mode 100644 index 0000000000..ba9c220740 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/SuspendScheduledPublishingComposer.cs @@ -0,0 +1,13 @@ +using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Infrastructure; + +namespace UmbracoProject; + +/// +/// Suspends/disables scheduled publishing, because that takes an eager write lock every minute, resulting in flaky test runs on SQLite. +/// +public sealed class SuspendScheduledPublishingComposer : IComposer +{ + public void Compose(IUmbracoBuilder builder) => Suspendable.ScheduledPublishing.Suspend(); +} diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/Umbraco.Tests.AcceptanceTest.UmbracoProject.csproj b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/Umbraco.Tests.AcceptanceTest.UmbracoProject.csproj new file mode 100644 index 0000000000..ac71f98e29 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/Umbraco.Tests.AcceptanceTest.UmbracoProject.csproj @@ -0,0 +1,10 @@ + + + + Library + UmbracoProject + + + + + diff --git a/tests/Umbraco.Tests.AcceptanceTest/misc/Directory.Build.props b/tests/Umbraco.Tests.AcceptanceTest/misc/Directory.Build.props deleted file mode 100644 index 33a5cccb0b..0000000000 --- a/tests/Umbraco.Tests.AcceptanceTest/misc/Directory.Build.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/misc/nuget.config b/tests/Umbraco.Tests.AcceptanceTest/misc/nuget.config deleted file mode 100644 index 08b6b81193..0000000000 --- a/tests/Umbraco.Tests.AcceptanceTest/misc/nuget.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker b/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker deleted file mode 100644 index fda51841a6..0000000000 --- a/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker +++ /dev/null @@ -1,51 +0,0 @@ -############################################ -## Build -############################################ - -FROM mcr.microsoft.com/dotnet/nightly/sdk:8.0.100-rc.1-jammy AS build - -COPY nuget.config . - -COPY nuget.config . - -WORKDIR /nupkg -COPY nupkg . - -WORKDIR /build -RUN dotnet new --install /nupkg/Umbraco.Templates.*.nupkg -RUN dotnet new umbraco --name AcceptanceTestProject --no-restore --output . -RUN dotnet restore --configfile /nuget.config -RUN dotnet build --configuration Release --no-restore -RUN dotnet publish --configuration Release --no-build --output /dist - -############################################ -## Run -############################################ - -FROM mcr.microsoft.com/dotnet/nightly/aspnet:8.0.0-rc.1-jammy AS run - -WORKDIR /app -COPY --from=build dist . - -# Enable console logging in Release mode -ENV Serilog__WriteTo__0__Name=Async -ENV Serilog__WriteTo__0__Args__configure__0__Name=Console - -# Set unattended install settings -ENV ConnectionStrings__umbracoDbDSN_ProviderName="Microsoft.Data.Sqlite" -ENV ConnectionStrings__umbracoDbDSN="Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True" -ENV Umbraco__CMS__Unattended__InstallUnattended="true" -ENV Umbraco__CMS__Unattended__UnattendedUserName="Playwright Test" -ENV Umbraco__CMS__Unattended__UnattendedUserEmail="playwright@umbraco.com" -ENV Umbraco__CMS__Unattended__UnattendedUserPassword="UmbracoAcceptance123!" - -# Custom Umbraco settings -ENV Umbraco__CMS__Global__VersionCheckPeriod="0" -ENV Umbraco__CMS__Global__UseHttps="true" -ENV Umbraco__CMS__HealthChecks__Notification__Enabled="false" -ENV Umbraco__CMS__KeepAlive__DisableKeepAliveTask="true" - -# Set application URL -ENV ASPNETCORE_URLS="http://0.0.0.0:5000;https://0.0.0.0:5001" - -CMD dotnet AcceptanceTestProject.dll diff --git a/umbraco.sln b/umbraco.sln index 517b3959e9..3742753fe9 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -133,14 +133,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution global.json = global.json icon.png = icon.png LICENSE.md = LICENSE.md - umbraco.sln.DotSettings = umbraco.sln.DotSettings nuget.config = nuget.config + umbraco.sln.DotSettings = umbraco.sln.DotSettings version.json = version.json EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{20CE9C97-9314-4A19-BCF1-D12CF49B7205}" ProjectSection(SolutionItems) = preProject build\azure-pipelines.yml = build\azure-pipelines.yml + build\nightly-build-trigger.yml = build\nightly-build-trigger.yml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "csharp-docs", "csharp-docs", "{F2BF84D9-0A14-40AF-A0F3-B9BBBBC16A44}" @@ -184,6 +185,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Persistence.EFC EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Persistence.EFCore.SqlServer", "src\Umbraco.Cms.Persistence.EFCore.SqlServer\Umbraco.Cms.Persistence.EFCore.SqlServer.csproj", "{9276C3F0-0DC9-46C9-BF32-9EE79D92AE02}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Tests.AcceptanceTest.UmbracoProject", "tests\Umbraco.Tests.AcceptanceTest.UmbracoProject\Umbraco.Tests.AcceptanceTest.UmbracoProject.csproj", "{A13FF0A0-69FA-468A-9F79-565401D5C341}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -357,6 +360,12 @@ Global {9276C3F0-0DC9-46C9-BF32-9EE79D92AE02}.Release|Any CPU.Build.0 = Release|Any CPU {9276C3F0-0DC9-46C9-BF32-9EE79D92AE02}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU {9276C3F0-0DC9-46C9-BF32-9EE79D92AE02}.SkipTests|Any CPU.Build.0 = Debug|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.Release|Any CPU.Build.0 = Release|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU + {A13FF0A0-69FA-468A-9F79-565401D5C341}.SkipTests|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -375,6 +384,7 @@ Global {2B47AD9F-FFF1-448A-88F1-D4F568811738} = {F2BF84D9-0A14-40AF-A0F3-B9BBBBC16A44} {25AECCB5-B187-4406-844B-91B8FF0FCB37} = {2B47AD9F-FFF1-448A-88F1-D4F568811738} {EA628ABD-624E-4AF3-B548-6710D4D66531} = {2B47AD9F-FFF1-448A-88F1-D4F568811738} + {A13FF0A0-69FA-468A-9F79-565401D5C341} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7A0F2E34-D2AF-4DAB-86A0-7D7764B3D0EC} From ec26e5eabf9e25795a3627fd34bdfb61442dfb39 Mon Sep 17 00:00:00 2001 From: Ethan Nagano Date: Thu, 1 Feb 2024 21:54:13 -0800 Subject: [PATCH 15/32] Update nouislider options for image cropper. Previous slider min and max values caused home and end keys to behave incorrectly. Min is now 0 to reflect 0% zoom and max is now 100 to reflect max zoom. Additionally, adjusted step to 0.01 to avoid slow adjustments when using arrow keys or page up / page down keys. Issue: #15578 --- .../components/imaging/umbimagecrop.directive.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js index 1f5d506bdd..cba21d2eb5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js @@ -50,19 +50,11 @@ angular.module("umbraco.directives") scope.sliderOptions = { "start": scope.dimensions.scale.current, - "step": 0.001, + "step": 0.01, "tooltips": [false], - "format": { - to: function (value) { - return parseFloat(parseFloat(value).toFixed(3)); - }, - from: function (value) { - return parseFloat(parseFloat(value).toFixed(3)); - } - }, "range": { - "min": scope.dimensions.scale.min, - "max": scope.dimensions.scale.max + "min": 0, + "max": 100 } }; From 3ce438399af2db8a245a653da96f46d94fa8a539 Mon Sep 17 00:00:00 2001 From: Matthew-Wise <6782865+Matthew-Wise@users.noreply.github.com> Date: Mon, 5 Feb 2024 07:03:42 +0000 Subject: [PATCH 16/32] Fix UriUtilityCore's handling of anchors and querystrings, also optimized with Span (#15678) --- src/Umbraco.Core/UriUtilityCore.cs | 30 +++++++++-------- .../CoreThings/UriUtilityCoreTests.cs | 33 +++++++++++++++++++ 2 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UriUtilityCoreTests.cs diff --git a/src/Umbraco.Core/UriUtilityCore.cs b/src/Umbraco.Core/UriUtilityCore.cs index e85e49df54..67e978b8d5 100644 --- a/src/Umbraco.Core/UriUtilityCore.cs +++ b/src/Umbraco.Core/UriUtilityCore.cs @@ -4,8 +4,6 @@ namespace Umbraco.Cms.Core; public static class UriUtilityCore { - #region Uri string utilities - public static bool HasScheme(string uri) => uri.IndexOf("://", StringComparison.InvariantCulture) > 0; public static string StartWithScheme(string uri) => StartWithScheme(uri, null); @@ -15,16 +13,15 @@ public static class UriUtilityCore public static string EndPathWithSlash(string uri) { - var pos1 = Math.Max(0, uri.IndexOf('?')); - var pos2 = Math.Max(0, uri.IndexOf('#')); - var pos = Math.Min(pos1, pos2); + ReadOnlySpan uriSpan = uri.AsSpan(); + var pos = IndexOfPathEnd(uriSpan); - var path = pos > 0 ? uri.Substring(0, pos) : uri; + var path = (pos > 0 ? uriSpan[..pos] : uriSpan).ToString(); path = path.EnsureEndsWith('/'); if (pos > 0) { - path += uri.Substring(pos); + return string.Concat(path, uriSpan[pos..]); } return path; @@ -32,20 +29,27 @@ public static class UriUtilityCore public static string TrimPathEndSlash(string uri) { - var pos1 = Math.Max(0, uri.IndexOf('?')); - var pos2 = Math.Max(0, uri.IndexOf('#')); - var pos = Math.Min(pos1, pos2); + ReadOnlySpan uriSpan = uri.AsSpan(); + var pos = IndexOfPathEnd(uriSpan); - var path = pos > 0 ? uri[..pos] : uri; + var path = (pos > 0 ? uriSpan[..pos] : uriSpan).ToString(); path = path.TrimEnd(Constants.CharArrays.ForwardSlash); if (pos > 0) { - path += uri.Substring(pos); + return string.Concat(path, uriSpan[pos..]); } return path; } - #endregion + private static int IndexOfPathEnd(ReadOnlySpan uri) + { + var pos1 = Math.Max(0, uri.IndexOf('?')); + var pos2 = Math.Max(0, uri.IndexOf('#')); + return pos1 == 0 && pos2 == 0 ? 0 + : pos1 == 0 ? pos2 + : pos2 == 0 ? pos1 + : Math.Min(pos1, pos2); + } } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UriUtilityCoreTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UriUtilityCoreTests.cs new file mode 100644 index 0000000000..6045336477 --- /dev/null +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UriUtilityCoreTests.cs @@ -0,0 +1,33 @@ +using NUnit.Framework; +using Umbraco.Cms.Core; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.CoreThings; + +[TestFixture] +public class UriUtilityCoreTests +{ + [TestCase("/en", "/en")] + [TestCase("/en#anchor", "/en#anchor")] + [TestCase("/en/", "/en")] + [TestCase("/en/#anchor", "/en#anchor")] + [TestCase("/en/?abc=123", "/en?abc=123")] + [TestCase("/en/#abc?abc=123", "/en#abc?abc=123")] + public void TrimPathEndSlash(string uri, string expected) + { + var result = UriUtilityCore.TrimPathEndSlash(uri); + Assert.AreEqual(expected, result); + } + + + [TestCase("/en/", "/en/")] + [TestCase("/en#anchor", "/en/#anchor")] + [TestCase("/en", "/en/")] + [TestCase("/en/#anchor", "/en/#anchor")] + [TestCase("/en?abc=123", "/en/?abc=123")] + [TestCase("/en#abc?abc=123", "/en/#abc?abc=123")] + public void EndPathWithSlash(string uri, string expected) + { + var result = UriUtilityCore.EndPathWithSlash(uri); + Assert.AreEqual(expected, result); + } +} From 5d0486fddc3801de3680a66dce777f59768393fa Mon Sep 17 00:00:00 2001 From: Mehmet <36473707+ustadstar@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:50:16 +0100 Subject: [PATCH 17/32] Add missing list view usages to data type references (#14485) (#14617) * Add missing list view usages to data type references (#14485) * Added default implementation #14617 --- .../ContentEditing/DataTypeReferences.cs | 11 +++ .../Repositories/IDataTypeRepository.cs | 9 +++ src/Umbraco.Core/Services/DataTypeService.cs | 6 ++ src/Umbraco.Core/Services/IDataTypeService.cs | 1 + .../Implement/DataTypeRepository.cs | 81 +++++++++++++++++++ .../Controllers/DataTypeController.cs | 34 +++++++- .../views/dataTypes/views/datatype.info.html | 8 +- 7 files changed, 145 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentEditing/DataTypeReferences.cs b/src/Umbraco.Core/Models/ContentEditing/DataTypeReferences.cs index 47711fc0a3..3d6f0fabce 100644 --- a/src/Umbraco.Core/Models/ContentEditing/DataTypeReferences.cs +++ b/src/Umbraco.Core/Models/ContentEditing/DataTypeReferences.cs @@ -1,4 +1,5 @@ using System.Runtime.Serialization; +using System.Xml.Linq; namespace Umbraco.Cms.Core.Models.ContentEditing; @@ -20,6 +21,9 @@ public class DataTypeReferences [DataMember(Name = "properties")] public object? Properties { get; set; } + [DataMember(Name = "listViews")] + public object? ListViews { get; set; } + [DataContract(Name = "property", Namespace = "")] public class PropertyTypeReferences { @@ -29,5 +33,12 @@ public class DataTypeReferences [DataMember(Name = "alias")] public string? Alias { get; set; } } + + [DataContract(Name = "listView", Namespace = "")] + public class ListViewReferences + { + [DataMember(Name = "name")] + public string? Name { get; set; } + } } } diff --git a/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs index 060d2f2e1d..4da8fa2a3a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs @@ -14,4 +14,13 @@ public interface IDataTypeRepository : IReadWriteQueryRepository /// /// IReadOnlyDictionary> FindUsages(int id); + + /// + /// Returns a dictionary of content type s and the data type (List view) aliases that use a + /// + /// + /// + /// + + IReadOnlyDictionary> FindListViewUsages(int id) => throw new NotImplementedException(); } diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index 857ecdc347..32ba152e28 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -612,6 +612,12 @@ namespace Umbraco.Cms.Core.Services.Implement return _dataTypeRepository.FindUsages(id); } + public IReadOnlyDictionary> GetListViewReferences(int id) + { + using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); + return _dataTypeRepository.FindListViewUsages(id); + } + private void Audit(AuditType type, int userId, int objectId) { _auditRepository.Save(new AuditItem(objectId, type, userId, ObjectTypes.GetName(UmbracoObjectTypes.DataType))); diff --git a/src/Umbraco.Core/Services/IDataTypeService.cs b/src/Umbraco.Core/Services/IDataTypeService.cs index 035c7e8a7b..20e065b7e0 100644 --- a/src/Umbraco.Core/Services/IDataTypeService.cs +++ b/src/Umbraco.Core/Services/IDataTypeService.cs @@ -14,6 +14,7 @@ public interface IDataTypeService : IService /// /// IReadOnlyDictionary> GetReferences(int id); + IReadOnlyDictionary> GetListViewReferences(int id) => throw new NotImplementedException(); Attempt?> CreateContainer(int parentId, Guid key, string name, int userId = Constants.Security.SuperUserId); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs index 9f9d685552..f71d8cce43 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs @@ -1,5 +1,6 @@ using System.Data; using System.Globalization; +using System.Xml.Linq; using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Cms.Core; @@ -10,6 +11,7 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.PropertyEditors; +using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Infrastructure.Persistence.Dtos; @@ -17,6 +19,7 @@ using Umbraco.Cms.Infrastructure.Persistence.Factories; using Umbraco.Cms.Infrastructure.Persistence.Querying; using Umbraco.Cms.Infrastructure.Scoping; using Umbraco.Extensions; +using static Umbraco.Cms.Core.Constants.SqlTemplates; using static Umbraco.Cms.Core.Persistence.SqlExtensionsStatics; namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement; @@ -124,6 +127,84 @@ internal class DataTypeRepository : EntityRepositoryBase, IDataT x => (IEnumerable)x.PropertyTypes.Select(p => p.Alias).ToList()); } + public IReadOnlyDictionary> FindListViewUsages(int id) + { + var usages = new Dictionary>(); + + if (id == default) + { + return usages; + } + + IDataType? dataType = Get(id); + + if (dataType != null && dataType.EditorAlias.Equals(Constants.PropertyEditors.Aliases.ListView)) + { + // Get All contentTypes where isContainer (list view enabled) is set to true + Sql sql = Sql() + .Select(ct => ct.Select(node => node.NodeDto)) + .From() + .InnerJoin().On(n => n.NodeId, ct => ct.NodeId) + .Where(ct => ct.IsContainer == true); + + List ctds = Database.Fetch(sql); + + // If there are not any ContentTypes with a ListView return. + if (!ctds.Any()) + { + return usages; + } + + // First check if it is a custom list view + ContentTypeDto? customListView = ctds.Where(x => (Constants.Conventions.DataTypes.ListViewPrefix + x.Alias).Equals(dataType.Name)).FirstOrDefault(); + + if (customListView != null) + { + // Add usages as customListView + usages.Add( + new GuidUdi(ObjectTypes.GetUdiType(customListView.NodeDto.NodeObjectType!.Value), customListView.NodeDto.UniqueId), + new List { dataType.Name! }); + } + else + { + // It is not a custom ListView, so check the default ones. + foreach (ContentTypeDto contentWithListView in ctds) + { + var customListViewName = Constants.Conventions.DataTypes.ListViewPrefix + contentWithListView.Alias; + IDataType? clv = Get(Query().Where(x => x.Name == customListViewName))?.FirstOrDefault(); + + // Check if the content type has a custom listview (extra check to prevent duplicates) + if (clv == null) + { + // ContentType has no custom listview so it uses the default one + var udi = new GuidUdi(ObjectTypes.GetUdiType(contentWithListView.NodeDto.NodeObjectType!.Value), contentWithListView.NodeDto.UniqueId); + var listViewType = new List(); + + if (dataType.Id.Equals(Constants.DataTypes.DefaultContentListView) && udi.EntityType == ObjectTypes.GetUdiType(UmbracoObjectTypes.DocumentType)) + listViewType.Add(Constants.Conventions.DataTypes.ListViewPrefix + "Content"); + else if (dataType.Id.Equals(Constants.DataTypes.DefaultMediaListView) && udi.EntityType == ObjectTypes.GetUdiType(UmbracoObjectTypes.MediaType)) + listViewType.Add(Constants.Conventions.DataTypes.ListViewPrefix + "Media"); + else if (dataType.Id.Equals(Constants.DataTypes.DefaultMembersListView) && udi.EntityType == ObjectTypes.GetUdiType(UmbracoObjectTypes.MemberType)) + listViewType.Add(Constants.Conventions.DataTypes.ListViewPrefix + "Members"); + + if (listViewType.Any()) + { + var added = usages.TryAdd(udi, listViewType); + if (!added) + { + usages[udi] = usages[udi].Append(dataType.Name!); + } + } + } + } + + } + } + + return usages; + } + + #region Overrides of RepositoryBase protected override IDataType? PerformGet(int id) => GetMany(id).FirstOrDefault(); diff --git a/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs index 6e559a7c68..0b12e92d66 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs @@ -430,7 +430,8 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers var result = new DataTypeReferences(); var usages = _dataTypeService.GetReferences(id); - foreach(var groupOfEntityType in usages.GroupBy(x => x.Key.EntityType)) + // properties + foreach (var groupOfEntityType in usages.GroupBy(x => x.Key.EntityType)) { //get all the GUIDs for the content types to find var guidsAndPropertyAliases = groupOfEntityType.ToDictionary(i => ((GuidUdi)i.Key).Guid, i => i.Value); @@ -443,6 +444,21 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers result.MemberTypes = GetContentTypeUsages(_memberTypeService.GetAll(guidsAndPropertyAliases.Keys), guidsAndPropertyAliases); } + // ListView + var listViewUsages = _dataTypeService.GetListViewReferences(id); + foreach (var groupOfEntityType in listViewUsages.GroupBy(x => x.Key.EntityType)) + { + //get all the GUIDs for the content types to find + var guidsAndPropertyAliases = groupOfEntityType.ToDictionary(i => ((GuidUdi)i.Key).Guid, i => i.Value); + + if (groupOfEntityType.Key == ObjectTypes.GetUdiType(UmbracoObjectTypes.DocumentType)) + result.DocumentTypes = result.DocumentTypes.Concat(GetListViewContentTypeUsages(_contentTypeService.GetAll(guidsAndPropertyAliases.Keys), guidsAndPropertyAliases)); + else if (groupOfEntityType.Key == ObjectTypes.GetUdiType(UmbracoObjectTypes.MediaType)) + result.MediaTypes = result.MediaTypes.Concat(GetListViewContentTypeUsages(_mediaTypeService.GetAll(guidsAndPropertyAliases.Keys), guidsAndPropertyAliases)); + else if (groupOfEntityType.Key == ObjectTypes.GetUdiType(UmbracoObjectTypes.MemberType)) + result.MemberTypes = result.MemberTypes.Concat(GetListViewContentTypeUsages(_memberTypeService.GetAll(guidsAndPropertyAliases.Keys), guidsAndPropertyAliases)); + } + return result; } @@ -481,6 +497,22 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers }); } + private IEnumerable GetListViewContentTypeUsages( + IEnumerable cts, + IReadOnlyDictionary> usages) => cts.Select(x => new DataTypeReferences.ContentTypeReferences + { + Id = x.Id, + Key = x.Key, + Alias = x.Alias, + Icon = x.Icon, + Name = x.Name, + Udi = new GuidUdi(ObjectTypes.GetUdiType(UmbracoObjectTypes.DocumentType), x.Key), + ListViews = usages.GetValueOrDefault(x.Key)?.Select(lv => new DataTypeReferences.ContentTypeReferences.ListViewReferences + { + Name = lv + }) + }); + #region ReadOnly actions to return basic data - allow access for: content ,media, members, settings, developer /// /// Gets the content json for all data types diff --git a/src/Umbraco.Web.UI.Client/src/views/dataTypes/views/datatype.info.html b/src/Umbraco.Web.UI.Client/src/views/dataTypes/views/datatype.info.html index b5dd3c9271..ac414fbbc4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dataTypes/views/datatype.info.html +++ b/src/Umbraco.Web.UI.Client/src/views/dataTypes/views/datatype.info.html @@ -42,7 +42,7 @@
{{::reference.name}}
{{::reference.alias}}
-
{{::reference.properties | umbCmsJoinArray:', ':'name'}}
+
{{::reference.properties | umbCmsJoinArray:', ':'name'}} {{::reference.listViews | umbCmsJoinArray:', ':'name'}}
@@ -52,7 +52,7 @@
- +
Used in Media Types
@@ -72,7 +72,7 @@
{{::reference.name}}
{{::reference.alias}}
-
{{::reference.properties | umbCmsJoinArray:', ':'name'}}
+
{{::reference.properties | umbCmsJoinArray:', ':'name'}} {{::reference.listViews | umbCmsJoinArray:', ':'name'}}
@@ -103,7 +103,7 @@
{{::reference.name}}
{{::reference.alias}}
-
{{::reference.properties | umbCmsJoinArray:', ':'name'}}
+
{{::reference.properties | umbCmsJoinArray:', ':'name'}} {{::reference.listViews | umbCmsJoinArray:', ':'name'}}
From 2221c4f1c719f072d660df1a9e16b2fbce3fc17b Mon Sep 17 00:00:00 2001 From: Markus Johansson Date: Mon, 29 Jan 2024 10:05:23 +0100 Subject: [PATCH 18/32] #15568 fixed by adding IRichTextEditorIntermediateValue --- .../IRichTextEditorIntermediateValue.cs | 13 +++++++++++++ .../RteMacroRenderingValueConverter.cs | 8 ++++---- 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Core/PropertyEditors/IRichTextEditorIntermediateValue.cs diff --git a/src/Umbraco.Core/PropertyEditors/IRichTextEditorIntermediateValue.cs b/src/Umbraco.Core/PropertyEditors/IRichTextEditorIntermediateValue.cs new file mode 100644 index 0000000000..24bdb25fb6 --- /dev/null +++ b/src/Umbraco.Core/PropertyEditors/IRichTextEditorIntermediateValue.cs @@ -0,0 +1,13 @@ +using Umbraco.Cms.Core.Models.Blocks; + +namespace Umbraco.Cms.Core.PropertyEditors; + +/// +/// Models Intermediate Value for Rich Text Editors Property Value Converter. +/// +public interface IRichTextEditorIntermediateValue +{ + public string Markup { get; } + + public RichTextBlockModel? RichTextBlockModel { get; } +} diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs index 06ec417c4c..c8785d2053 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs @@ -156,7 +156,7 @@ public class RteMacroRenderingValueConverter : SimpleTinyMceValueConverter, IDel public object? ConvertIntermediateToDeliveryApiObject(IPublishedElement owner, IPublishedPropertyType propertyType, PropertyCacheLevel referenceCacheLevel, object? inter, bool preview, bool expanding) { - if (inter is not RichTextEditorIntermediateValue richTextEditorIntermediateValue + if (inter is not IRichTextEditorIntermediateValue richTextEditorIntermediateValue || richTextEditorIntermediateValue.Markup.IsNullOrWhiteSpace()) { // different return types for the JSON configuration forces us to have different return values for empty properties @@ -201,7 +201,7 @@ public class RteMacroRenderingValueConverter : SimpleTinyMceValueConverter, IDel private string? Convert(object? source, bool preview) { - if (source is not RichTextEditorIntermediateValue intermediateValue) + if (source is not IRichTextEditorIntermediateValue intermediateValue) { return null; } @@ -291,7 +291,7 @@ public class RteMacroRenderingValueConverter : SimpleTinyMceValueConverter, IDel return RichTextParsingRegexes.BlockRegex().Replace(source, RenderBlock); } - private RichTextModel CreateRichTextModel(RichTextEditorIntermediateValue richTextEditorIntermediateValue) + private RichTextModel CreateRichTextModel(IRichTextEditorIntermediateValue richTextEditorIntermediateValue) { var markup = _apiRichTextMarkupParser.Parse(richTextEditorIntermediateValue.Markup); @@ -308,7 +308,7 @@ public class RteMacroRenderingValueConverter : SimpleTinyMceValueConverter, IDel }; } - private class RichTextEditorIntermediateValue + private class RichTextEditorIntermediateValue : IRichTextEditorIntermediateValue { public required string Markup { get; set; } From 839b2ff6a2055d6435630b6de7c5f8c6171e452d Mon Sep 17 00:00:00 2001 From: Vitor Rodrigues Date: Wed, 7 Feb 2024 13:43:37 +0100 Subject: [PATCH 19/32] Fixes #15136: Search includes fields from other cultures (#15148) * Fixes #15136: Search includes fields from other cultures Regex was updated to support block list fields Unpublished nodes on the supplied culture are not filtered out * Making the code non-breaking * Fixed failing publish content query integration tests The tests were not setting the content as publish in the specifed culture causing the content items to be ignored --------- Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> --- .../Examine/UmbracoExamineExtensions.cs | 12 ++--- .../UmbracoFieldDefinitionCollection.cs | 2 +- .../IPublishedContentQuery.cs | 17 +++++++ .../PublishedContentQuery.cs | 34 +++++++------ .../PublishedContentQueryTests.cs | 49 ++++++++----------- 5 files changed, 62 insertions(+), 52 deletions(-) diff --git a/src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs b/src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs index 7ba10019c7..daa39dfcf5 100644 --- a/src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs +++ b/src/Umbraco.Infrastructure/Examine/UmbracoExamineExtensions.cs @@ -5,17 +5,17 @@ using Umbraco.Cms.Infrastructure.Examine; namespace Umbraco.Extensions; -public static class UmbracoExamineExtensions +public static partial class UmbracoExamineExtensions { /// /// Matches a culture iso name suffix /// /// /// myFieldName_en-us will match the "en-us" + /// myBlockListField.items[0].myFieldName_en-us will match the "en-us" /// - internal static readonly Regex _cultureIsoCodeFieldNameMatchExpression = new( - "^(?[_\\w]+)_(?[a-z]{2,3}(-[a-z0-9]{2,4})?)$", - RegexOptions.Compiled | RegexOptions.ExplicitCapture); + [GeneratedRegex(@"^(?.+)_(?[a-z]{2,3}(-[a-z0-9]{2,4})?)$", RegexOptions.ExplicitCapture)] + internal static partial Regex CultureIsoCodeFieldNameMatchExpression(); // TODO: We need a public method here to just match a field name against CultureIsoCodeFieldNameMatchExpression @@ -32,7 +32,7 @@ public static class UmbracoExamineExtensions var results = new List(); foreach (var field in allFields) { - Match match = _cultureIsoCodeFieldNameMatchExpression.Match(field); + Match match = CultureIsoCodeFieldNameMatchExpression().Match(field); if (match.Success && culture.InvariantEquals(match.Groups["CultureName"].Value)) { results.Add(field); @@ -54,7 +54,7 @@ public static class UmbracoExamineExtensions foreach (var field in allFields) { - Match match = _cultureIsoCodeFieldNameMatchExpression.Match(field); + Match match = CultureIsoCodeFieldNameMatchExpression().Match(field); if (match.Success && culture.InvariantEquals(match.Groups["CultureName"].Value)) { yield return field; // matches this culture field diff --git a/src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs b/src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs index 9f9e214316..f2c6236a2e 100644 --- a/src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs +++ b/src/Umbraco.Infrastructure/Examine/UmbracoFieldDefinitionCollection.cs @@ -70,7 +70,7 @@ public class UmbracoFieldDefinitionCollection : FieldDefinitionCollection return false; } - Match match = UmbracoExamineExtensions._cultureIsoCodeFieldNameMatchExpression.Match(fieldName); + Match match = UmbracoExamineExtensions.CultureIsoCodeFieldNameMatchExpression().Match(fieldName); if (match.Success) { var nonCultureFieldName = match.Groups["FieldName"].Value; diff --git a/src/Umbraco.Infrastructure/IPublishedContentQuery.cs b/src/Umbraco.Infrastructure/IPublishedContentQuery.cs index 6e82239dac..e232876001 100644 --- a/src/Umbraco.Infrastructure/IPublishedContentQuery.cs +++ b/src/Umbraco.Infrastructure/IPublishedContentQuery.cs @@ -131,4 +131,21 @@ public interface IPublishedContentQuery /// The search results. /// IEnumerable Search(IQueryExecutor query, int skip, int take, out long totalRecords); + + /// + /// Executes the query and converts the results to . + /// + /// The query. + /// The amount of results to skip. + /// The amount of results to take/return. + /// The total amount of records. + /// The culture (defaults to a culture insensitive search). + /// + /// The search results. + /// + /// + /// While enumerating results, the ambient culture is changed to be the searched culture. + /// + IEnumerable Search(IQueryExecutor query, int skip, int take, out long totalRecords, string? culture) + => Search(query, skip, take, out totalRecords); } diff --git a/src/Umbraco.Infrastructure/PublishedContentQuery.cs b/src/Umbraco.Infrastructure/PublishedContentQuery.cs index d075e8b9d2..758115b9ca 100644 --- a/src/Umbraco.Infrastructure/PublishedContentQuery.cs +++ b/src/Umbraco.Infrastructure/PublishedContentQuery.cs @@ -293,21 +293,17 @@ public class PublishedContentQuery : IPublishedContentQuery var fields = umbIndex.GetCultureAndInvariantFields(culture) .ToArray(); // Get all index fields suffixed with the culture name supplied - ordering = query.ManagedQuery(term, fields); + + // Filter out unpublished content for the specified culture if the content varies by culture + // The published__{culture} field is not populated when the content is not published in that culture + ordering = query + .ManagedQuery(term, fields) + .Not().Group(q => q + .Field(UmbracoExamineFieldNames.VariesByCultureFieldName, "y") + .Not().Field($"{UmbracoExamineFieldNames.PublishedFieldName}_{culture.ToLowerInvariant()}", "y")); } - // Filter selected fields because results are loaded from the published snapshot based on these - IOrdering? queryExecutor = ordering.SelectFields(_returnedQueryFields); - - - ISearchResults? results = skip == 0 && take == 0 - ? queryExecutor.Execute() - : queryExecutor.Execute(QueryOptions.SkipTake(skip, take)); - - totalRecords = results.TotalItemCount; - - return new CultureContextualSearchResults(results.ToPublishedSearchResults(_publishedSnapshot.Content), - _variationContextAccessor, culture); + return Search(ordering, skip, take, out totalRecords, culture); } /// @@ -316,6 +312,10 @@ public class PublishedContentQuery : IPublishedContentQuery /// public IEnumerable Search(IQueryExecutor query, int skip, int take, out long totalRecords) + => Search(query, skip, take, out totalRecords, null); + + /// + public IEnumerable Search(IQueryExecutor query, int skip, int take, out long totalRecords, string? culture) { if (skip < 0) { @@ -331,8 +331,8 @@ public class PublishedContentQuery : IPublishedContentQuery if (query is IOrdering ordering) { - // Filter selected fields because results are loaded from the published snapshot based on these - query = ordering.SelectFields(_returnedQueryFields); + // Filter selected fields because results are loaded from the published snapshot based on these + query = ordering.SelectFields(_returnedQueryFields); } ISearchResults? results = skip == 0 && take == 0 @@ -341,7 +341,9 @@ public class PublishedContentQuery : IPublishedContentQuery totalRecords = results.TotalItemCount; - return results.ToPublishedSearchResults(_publishedSnapshot); + return culture.IsNullOrWhiteSpace() + ? results.ToPublishedSearchResults(_publishedSnapshot) + : new CultureContextualSearchResults(results.ToPublishedSearchResults(_publishedSnapshot.Content), _variationContextAccessor, culture); } /// diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs index 84e4be9d60..08e4c20343 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs @@ -3,6 +3,7 @@ using Examine.Lucene; using Examine.Lucene.Directories; using Examine.Lucene.Providers; using Microsoft.Extensions.Logging; +using Microsoft.IdentityModel.Tokens; using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Models.PublishedContent; @@ -41,37 +42,27 @@ public class PublishedContentQueryTests : ExamineBaseTest public IEnumerable GetFields() => _fieldNames; } - private TestIndex CreateTestIndex(Directory luceneDirectory, string[] fieldNames) + private TestIndex CreateTestIndex(Directory luceneDirectory, (string Name, string Culture)[] fields) { - var index = new TestIndex(LoggerFactory, "TestIndex", luceneDirectory, fieldNames); + var index = new TestIndex(LoggerFactory, "TestIndex", luceneDirectory, fields.Select(f => f.Name).ToArray()); using (index.WithThreadingMode(IndexThreadingMode.Synchronous)) { - //populate with some test data - index.IndexItem(new ValueSet( - "1", - "content", - new Dictionary - { - [fieldNames[0]] = "Hello world, there are products here", - [UmbracoExamineFieldNames.VariesByCultureFieldName] = "n" - })); - index.IndexItem(new ValueSet( - "2", - "content", - new Dictionary - { - [fieldNames[1]] = "Hello world, there are products here", - [UmbracoExamineFieldNames.VariesByCultureFieldName] = "y" - })); - index.IndexItem(new ValueSet( - "3", - "content", - new Dictionary - { - [fieldNames[2]] = "Hello world, there are products here", - [UmbracoExamineFieldNames.VariesByCultureFieldName] = "y" - })); + // populate with some test data + for (var i = 0; i < fields.Length; i++) + { + var (name, culture) = fields[i]; + + index.IndexItem(new ValueSet( + $"{i + 1}", + "content", + new Dictionary + { + [name] = "Hello world, there are products here", + [UmbracoExamineFieldNames.VariesByCultureFieldName] = culture.IsNullOrEmpty() ? "n" : "y", + [culture.IsNullOrEmpty() ? UmbracoExamineFieldNames.PublishedFieldName : $"{UmbracoExamineFieldNames.PublishedFieldName}_{culture}"] = "y" + })); + } } return index; @@ -102,8 +93,8 @@ public class PublishedContentQueryTests : ExamineBaseTest { using (var luceneDir = new RandomIdRAMDirectory()) { - var fieldNames = new[] { "title", "title_en-us", "title_fr-fr" }; - using (var indexer = CreateTestIndex(luceneDir, fieldNames)) + var fields = new[] { (Name: "title", Culture: null), (Name: "title_en-us", Culture: "en-us"), (Name: "title_fr-fr", Culture: "fr-fr") }; + using (var indexer = CreateTestIndex(luceneDir, fields)) { var pcq = CreatePublishedContentQuery(indexer); From e1b4d1b9827c82c100a3287125b61c3eca35a232 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 7 Feb 2024 14:35:49 +0100 Subject: [PATCH 20/32] fix useDotNet task --- build/azure-pipelines.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index b088c273f2..c8e370d513 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -150,10 +150,9 @@ stages: vmImage: 'windows-latest' steps: - task: UseDotNet@2 - displayName: Use .NET $(dotnetVersion) + displayName: Use .NET SDK from global.json inputs: - version: $(dotnetVersion) - includePreviewVersions: $(dotnetIncludePreviewVersions) + useGlobalJson: true - task: PowerShell@2 displayName: Install DocFX inputs: From 318d994cf3529565aa3e5dcd539ba32d3fd4082e Mon Sep 17 00:00:00 2001 From: Terence Burridge <134947113+CodeBunTes@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:07:46 +0000 Subject: [PATCH 21/32] Reload the List View after a copy, if to the same parent (#15312) --- .../listview/listview.controller.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js index 68075cb999..0edcd67c19 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js @@ -650,8 +650,17 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time }; function performCopy(target, relateToOriginal, includeDescendants) { + var newPath = null; + var newTarget = null; applySelected( - function (selected, index) { return contentResource.copy({ parentId: target.id, id: getIdCallback(selected[index]), relateToOriginal: relateToOriginal, recursive: includeDescendants }); }, + function (selected, index) { + return contentResource.copy({ parentId: target.id, id: getIdCallback(selected[index]), relateToOriginal: relateToOriginal, recursive: includeDescendants }) + .then(function (path) { + newPath = path; + newTarget = parseInt(target.id); + return path; + }); + }, function (count, total) { var key = (total === 1 ? "bulk_copiedItemOfItem" : "bulk_copiedItemOfItems"); return localizationService.localize(key, [count, total]); @@ -659,6 +668,18 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time function (total) { var key = (total === 1 ? "bulk_copiedItem" : "bulk_copiedItems"); return localizationService.localize(key, [total]); + }) + .then(function () { + //executes if all is successful + if (newPath) { + if (newTarget === $scope.contentId) { + // if we copied this to the same parent, reload the current view completely + $scope.reloadView($scope.contentId); + } else { + // Otherwise just clear the current selection but don't reload + $scope.clearSelection(); + } + } }); } From 7046c3585b65b0fb3e6d87ad640035f2be7f3b66 Mon Sep 17 00:00:00 2001 From: Erik-Jan Westendorp Date: Fri, 15 Dec 2023 14:03:51 +0100 Subject: [PATCH 22/32] Add localization key for 'Cancel and clear query' --- src/Umbraco.Core/EmbeddedResources/Lang/en.xml | 1 + src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml | 1 + .../src/views/prevalueeditors/treesource.html | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 8977859d3d..0000f92695 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -1504,6 +1504,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont That matches types: No matching content The configuration of this property does not match any content. Create the missing content or contact your administrator to adjust the Dynamic Root settings for this property. + Cancel and clear query Deleted item diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 955d66095c..dc5a2404e6 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -1509,6 +1509,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont That matches types: No matching content The configuration of this property does not match any content. Create the missing content or contact your administrator to adjust the Dynamic Root settings for this property. + Cancel and clear query Deleted item diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html index 32bccca77a..1cdf028963 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html @@ -155,7 +155,7 @@
  • - +
From 9e5eb2da0824250b066fd06e85f9d133d6ef6796 Mon Sep 17 00:00:00 2001 From: Lucas Bach Bisgaard Date: Sat, 10 Feb 2024 01:50:03 +0100 Subject: [PATCH 23/32] Remove clean xss from datatype name and alias. (#15552) * Remove clean xss from datatype name and alias. * Edit / and \ to the exclusions argument * Forgot to escape the backslash --------- Co-authored-by: Lucas Bach Bisgaard --- src/Umbraco.Web.BackOffice/Filters/DataTypeValidateAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.BackOffice/Filters/DataTypeValidateAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/DataTypeValidateAttribute.cs index c20061b973..165b5dbd6a 100644 --- a/src/Umbraco.Web.BackOffice/Filters/DataTypeValidateAttribute.cs +++ b/src/Umbraco.Web.BackOffice/Filters/DataTypeValidateAttribute.cs @@ -45,7 +45,7 @@ internal sealed class DataTypeValidateAttribute : TypeFilterAttribute var dataType = (DataTypeSave?)context.ActionArguments["dataType"]; if (dataType is not null) { - dataType.Name = dataType.Name?.CleanForXss('[', ']', '(', ')', ':'); + dataType.Name = dataType.Name?.CleanForXss('[', ']', '(', ')', ':', '/', '\\'); dataType.Alias = dataType.Alias == null ? dataType.Name! : dataType.Alias.CleanForXss('[', ']', '(', ')', ':'); From ea7ae74ccb77af38c1f3429a717357fecefa0cef Mon Sep 17 00:00:00 2001 From: Jeavon Leopold Date: Thu, 8 Feb 2024 10:31:36 +0000 Subject: [PATCH 24/32] Fix certificate health check so that it validates multiple times Also switch deprecated request.Properties to request.Options --- .../Checks/Security/HttpsCheck.cs | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Core/HealthChecks/Checks/Security/HttpsCheck.cs b/src/Umbraco.Core/HealthChecks/Checks/Security/HttpsCheck.cs index dbff50c480..888b136360 100644 --- a/src/Umbraco.Core/HealthChecks/Checks/Security/HttpsCheck.cs +++ b/src/Umbraco.Core/HealthChecks/Checks/Security/HttpsCheck.cs @@ -25,7 +25,6 @@ public class HttpsCheck : HealthCheck private const int NumberOfDaysForExpiryWarning = 14; private const string HttpPropertyKeyCertificateDaysToExpiry = "CertificateDaysToExpiry"; - private static HttpClient? _httpClient; private readonly IOptionsMonitor _globalSettings; private readonly IHostingEnvironment _hostingEnvironment; @@ -46,12 +45,6 @@ public class HttpsCheck : HealthCheck _globalSettings = globalSettings; _hostingEnvironment = hostingEnvironment; } - - private static HttpClient _httpClientEnsureInitialized => _httpClient ??= new HttpClient(new HttpClientHandler - { - ServerCertificateCustomValidationCallback = ServerCertificateCustomValidation, - }); - /// public override async Task> GetStatus() => await Task.WhenAll( @@ -72,8 +65,7 @@ public class HttpsCheck : HealthCheck { if (certificate is not null) { - requestMessage.Properties[HttpPropertyKeyCertificateDaysToExpiry] = - (int)Math.Floor((certificate.NotAfter - DateTime.Now).TotalDays); + requestMessage.Options.Set(new HttpRequestOptionsKey(HttpPropertyKeyCertificateDaysToExpiry), (int?)Math.Floor((certificate.NotAfter - DateTime.Now).TotalDays)); } return sslErrors == SslPolicyErrors.None; @@ -92,17 +84,22 @@ public class HttpsCheck : HealthCheck try { - using HttpResponseMessage response = await _httpClientEnsureInitialized.SendAsync(request); + using var httpClient = new HttpClient(new HttpClientHandler + { + ServerCertificateCustomValidationCallback = ServerCertificateCustomValidation, + }); + + using HttpResponseMessage response = await httpClient.SendAsync(request); if (response.StatusCode == HttpStatusCode.OK) { // Got a valid response, check now if the certificate is expiring within the specified amount of days int? daysToExpiry = 0; - if (request.Properties.TryGetValue( - HttpPropertyKeyCertificateDaysToExpiry, - out var certificateDaysToExpiry)) + if (response.RequestMessage != null && response.RequestMessage.Options.TryGetValue( + new HttpRequestOptionsKey(HttpPropertyKeyCertificateDaysToExpiry), + out var certificateDaysToExpiry)) { - daysToExpiry = (int?)certificateDaysToExpiry; + daysToExpiry = certificateDaysToExpiry; } if (daysToExpiry <= 0) From 3e871f2c332006d2c9382ded89ba922c68b38ee1 Mon Sep 17 00:00:00 2001 From: Lars-Erik Date: Fri, 19 Jan 2024 12:29:31 +0100 Subject: [PATCH 25/32] Add WithIsElement to ContentTypeBuilder --- tests/Umbraco.Tests.Common/Builders/ContentTypeBuilder.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/Umbraco.Tests.Common/Builders/ContentTypeBuilder.cs b/tests/Umbraco.Tests.Common/Builders/ContentTypeBuilder.cs index f86cb7d5cf..5d10f26ff4 100644 --- a/tests/Umbraco.Tests.Common/Builders/ContentTypeBuilder.cs +++ b/tests/Umbraco.Tests.Common/Builders/ContentTypeBuilder.cs @@ -22,6 +22,7 @@ public class ContentTypeBuilder private readonly List _templateBuilders = new(); private ContentVariation? _contentVariation; private int? _defaultTemplateId; + private bool? _isElement; private PropertyTypeCollection _propertyTypeCollection; private int? _propertyTypeIdsIncrementingFrom; @@ -48,6 +49,12 @@ public class ContentTypeBuilder return this; } + public ContentTypeBuilder WithIsElement(bool isElement) + { + _isElement = isElement; + return this; + } + public ContentTypeBuilder WithContentVariation(ContentVariation contentVariation) { _contentVariation = contentVariation; @@ -117,6 +124,7 @@ public class ContentTypeBuilder contentType.CreatorId = GetCreatorId(); contentType.Trashed = GetTrashed(); contentType.IsContainer = GetIsContainer(); + contentType.IsElement = _isElement ?? false; contentType.HistoryCleanup = new HistoryCleanup(); contentType.Variations = contentVariation; From 14be246802f91f155ae2870cfa78eb9b3197703d Mon Sep 17 00:00:00 2001 From: rbottema Date: Mon, 8 Jan 2024 11:38:24 +0100 Subject: [PATCH 26/32] Fix QR code icon Strips the width and height from the QR code SVG to ensure display is correct on all sizes. Used https://svgomg.net/ to optimize and minify the SVG. --- .../src/assets/icons/icon-qr-code.svg | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg index 6eb9d06126..65a7f99781 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg +++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg @@ -1,9 +1 @@ - - - Umbraco CMS - https://umbraco.com - - - - - + From 9ed2e48ff43e6ec3c53781905c7965f95861a19f Mon Sep 17 00:00:00 2001 From: Ethan Nagano <50598649+nagolucky18@users.noreply.github.com> Date: Mon, 12 Feb 2024 14:41:20 -0800 Subject: [PATCH 27/32] 15209 media picker shows incorrect date (#15414) * Trim update date to exclude Z character. When picking media, the items from an SQL database contain an update date that is formated in UTC-0 time by way of a Z character at the end of the string. Removing this string will result in the update date always displaying local time as expected. Issue: 15209 * Use dateHelper instead of slicing Z from date string. For most front end date formatting, dateHelper is used to get the local date. The dateHelper is now passed in to the media picker controller and used to format the date. --- .../mediapicker/mediapicker.controller.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index a6e10f8e8f..ce6a09fa3f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -1,7 +1,7 @@ //used for the media picker dialog angular.module("umbraco") .controller("Umbraco.Editors.MediaPickerController", - function ($scope, $timeout, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, editorService, umbSessionStorage, notificationsService, clipboardService) { + function ($scope, $timeout, mediaResource, entityResource, userService, mediaHelper, mediaTypeHelper, eventsService, treeService, localStorageService, localizationService, dateHelper, editorService, umbSessionStorage, notificationsService, clipboardService) { var vm = this; @@ -575,9 +575,12 @@ angular.module("umbraco") if (item.metaData.MediaPath !== null) { item.thumbnail = mediaHelper.resolveFileFromEntity(item, true); item.image = mediaHelper.resolveFileFromEntity(item, false); - } - if (item.metaData.UpdateDate !== null) { - item.updateDate = item.metaData.UpdateDate; + } + if (item.metaData.UpdateDate !== null) { + userService.getCurrentUser().then(currentUser => { + item.updateDate = dateHelper.getLocalDate(item.metaData.UpdateDate, currentUser.locale, "LLL"); + }); + } } From 37d96db979fc4e3de554fe19f85d216fb9c70843 Mon Sep 17 00:00:00 2001 From: Anna Gevel Date: Wed, 22 Nov 2023 12:16:55 +0100 Subject: [PATCH 28/32] Fixed StackOverflow exception when using NoopPropertyIndexValueFactory Removed recursive call from the GetIndexValues method of NoopPropertyIndexValueFactory for backward compatibility and alignment with other property index value factory classes --- .../PropertyEditors/NoopPropertyIndexValueFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/PropertyEditors/NoopPropertyIndexValueFactory.cs b/src/Umbraco.Core/PropertyEditors/NoopPropertyIndexValueFactory.cs index 004138e370..a9fa060c74 100644 --- a/src/Umbraco.Core/PropertyEditors/NoopPropertyIndexValueFactory.cs +++ b/src/Umbraco.Core/PropertyEditors/NoopPropertyIndexValueFactory.cs @@ -18,5 +18,5 @@ public class NoopPropertyIndexValueFactory : IPropertyIndexValueFactory [Obsolete("Use the overload with the availableCultures parameter instead, scheduled for removal in v14")] public IEnumerable>> GetIndexValues(IProperty property, string? culture, string? segment, bool published) - => GetIndexValues(property, culture, segment, published); + => GetIndexValues(property, culture, segment, published, Enumerable.Empty()); } From 3553e7546afbead882a90dfd28f11f63586c9a23 Mon Sep 17 00:00:00 2001 From: Jan Skovgaard <1932158+BatJan@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:59:29 +0100 Subject: [PATCH 29/32] Bugfix: #14742 - Tabs not coded according to best practice (#14979) --- .../components/tabs/umbtabsnav.directive.js | 56 +++++++++++++++++-- .../content/umb-tabbed-content.html | 4 +- .../views/components/tabs/umb-tabs-nav.html | 7 ++- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tabs/umbtabsnav.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tabs/umbtabsnav.directive.js index 30a0f5140e..56808e6861 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tabs/umbtabsnav.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tabs/umbtabsnav.directive.js @@ -95,6 +95,8 @@ Use this directive to render a tabs navigation. function link(scope, element, attrs, ctrl) { var tabNavItemsWidths = []; + var tabItems = []; + var firstTab, lastTab; // the parent is the component itself so we need to go one level higher var container = element.parent().parent(); @@ -108,6 +110,32 @@ Use this directive to render a tabs navigation. element.find("li:not(umb-tab--expand)").each(function() { tabNavItemsWidths.push($(this).outerWidth()); }); + + tabItems = Array.from(element.find(".umb-tab > button")); + firstTab = tabItems[0]; + lastTab = tabItems[tabItems.length - 1]; + + tabItems.forEach(tab => { + tab.addEventListener("keydown", event => { + var currentTarget = event.currentTarget; + switch (event.key) { + case "ArrowLeft": + moveFocusToPreviousTab(currentTarget); + break; + case "ArrowRight": + moveFocusToNextTab(currentTarget); + break; + case "Home": + firstTab.focus(); + break; + case "End": + lastTab.focus(); + break; + default: + break; + } + }); + }); }); function calculateWidth(){ @@ -121,7 +149,7 @@ Use this directive to render a tabs navigation. // detect how many tabs we can show on the screen for (var i = 0; i <= tabNavItemsWidths.length; i++) { - + var tabWidth = tabNavItemsWidths[i]; tabsWidth += tabWidth; @@ -132,10 +160,31 @@ Use this directive to render a tabs navigation. break; } } - + }); } + function moveFocusToNextTab(currentTab) { + var index = tabItems.indexOf(currentTab); + + if (currentTab === lastTab) { + firstTab.focus(); + } + else { + tabItems[index + 1].focus(); + } + } + + function moveFocusToPreviousTab(currentTab) { + var index = tabItems.indexOf(currentTab); + if(currentTab === firstTab) { + lastTab.focus(); + } + else { + tabItems[index - 1].focus(); + } + } + scope.$on('$destroy', function() { ro.unobserve(container[0]); }); @@ -152,7 +201,7 @@ Use this directive to render a tabs navigation. vm.clickTab = clickTab; vm.toggleTray = toggleTray; vm.hideTray = hideTray; - + function clickTab($event, tab) { if (vm.onTabChange) { hideTray(); @@ -169,7 +218,6 @@ Use this directive to render a tabs navigation. function hideTray() { vm.showTray = false; } - } var directive = { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-tabbed-content.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-tabbed-content.html index c54d692850..2dd0b83130 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-tabbed-content.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-tabbed-content.html @@ -1,12 +1,14 @@
+ + - + -
-
+
XPath Query
@@ -85,77 +86,51 @@
  • - +
  • -
    +
    Dynamic Root Query
    - -
    -
    - -
    -
    - - -
    -
    - {{ ("umb://" + (model.value.type === 'content' ? 'document' : model.value.type) + "/" + model.value.dynamicRoot.originKey | ncNodeName)}} -
    -
    -
    -
    - -
    -
    + + + - -
    -
    -
    - -
    -
    - - {{queryStep.alias}} -
    -
    - - of type: - - - {{ key | umbCmsJoinArray:', '}} - -
    -
    -
    -
    - -
    -
    + +
    + +
    -
    • - +
    From 3d7e79c3e5f06777cc52fefd307006406e3594df Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 14 Feb 2024 07:38:17 +0100 Subject: [PATCH 31/32] V13: Update Login UI to Lit 3 and update the UI Library to 1.7.1 (#15713) * update dependencies to latest (lit 3, vite 5) and fix related issues * update ui library to 1.7.1 * mark all backoffice svg icons with fill="currentColor" * set label on user.html --- src/Umbraco.Web.UI.Client/package-lock.json | 1043 ++++--- src/Umbraco.Web.UI.Client/package.json | 4 +- .../common/infiniteeditors/user/user.html | 4 +- src/Umbraco.Web.UI.Login/index.html | 50 +- src/Umbraco.Web.UI.Login/package-lock.json | 2595 +++++++---------- src/Umbraco.Web.UI.Login/package.json | 13 +- .../public/mockServiceWorker.js | 172 +- src/Umbraco.Web.UI.Login/src/auth.element.ts | 10 +- .../external-login-provider.element.ts | 6 +- .../src/components/pages/mfa.page.element.ts | 13 +- .../src/external/custom-view.element.ts | 8 +- .../src/external/icon.registry.ts | 2 +- .../src/mocks/handlers/backoffice.handlers.ts | 12 +- .../src/mocks/handlers/login.handlers.ts | 40 +- src/Umbraco.Web.UI.Login/src/mocks/index.ts | 13 +- .../src/utils/load-custom-view.function.ts | 2 +- 16 files changed, 1726 insertions(+), 2261 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 043a0ec461..d40879da24 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -7,8 +7,8 @@ "name": "ui", "dependencies": { "@microsoft/signalr": "7.0.12", - "@umbraco-ui/uui": "1.5.0", - "@umbraco-ui/uui-css": "1.5.0", + "@umbraco-ui/uui": "1.7.1", + "@umbraco-ui/uui-css": "1.7.0", "ace-builds": "1.31.1", "angular": "1.8.3", "angular-animate": "1.8.3", @@ -2080,16 +2080,18 @@ "dev": true }, "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz", - "integrity": "sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==", + "peer": true }, "node_modules/@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "peer": true, "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@microsoft/signalr": { @@ -2245,838 +2247,820 @@ "optional": true }, "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "peer": true }, "node_modules/@umbraco-ui/uui": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.5.0.tgz", - "integrity": "sha512-V9pAdCsiaBy+Vq23sZd9JJCk+TX6xMsclJtTUWhwCq8/YUh6KNERbdoVfMYGUZ1yyJ/g+yddQsWlYOxHNp8msw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.7.1.tgz", + "integrity": "sha512-wHGMW8NQaWJTdbbb7r03sah2Esab4Iy8bFWaTU+UtnrOpNsZclPwxZ3kZcjHnFu32xDFFBF0+iQiCki8Uy4dkA==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.5.0", - "@umbraco-ui/uui-avatar": "1.5.0", - "@umbraco-ui/uui-avatar-group": "1.5.0", - "@umbraco-ui/uui-badge": "1.5.0", - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-boolean-input": "1.5.0", - "@umbraco-ui/uui-box": "1.5.0", - "@umbraco-ui/uui-breadcrumbs": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-button-group": "1.5.0", - "@umbraco-ui/uui-button-inline-create": "1.5.0", - "@umbraco-ui/uui-card": "1.5.0", - "@umbraco-ui/uui-card-content-node": "1.5.0", - "@umbraco-ui/uui-card-media": "1.5.0", - "@umbraco-ui/uui-card-user": "1.5.0", - "@umbraco-ui/uui-caret": "1.5.0", - "@umbraco-ui/uui-checkbox": "1.5.0", - "@umbraco-ui/uui-color-area": "1.5.0", - "@umbraco-ui/uui-color-picker": "1.5.0", - "@umbraco-ui/uui-color-slider": "1.5.0", - "@umbraco-ui/uui-color-swatch": "1.5.0", - "@umbraco-ui/uui-color-swatches": "1.5.0", - "@umbraco-ui/uui-combobox": "1.5.0", - "@umbraco-ui/uui-combobox-list": "1.5.0", - "@umbraco-ui/uui-css": "1.5.0", - "@umbraco-ui/uui-dialog": "1.5.0", - "@umbraco-ui/uui-dialog-layout": "1.5.0", - "@umbraco-ui/uui-file-dropzone": "1.5.0", - "@umbraco-ui/uui-file-preview": "1.5.0", - "@umbraco-ui/uui-form": "1.5.0", - "@umbraco-ui/uui-form-layout-item": "1.5.0", - "@umbraco-ui/uui-form-validation-message": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-icon-registry": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0", - "@umbraco-ui/uui-input": "1.5.0", - "@umbraco-ui/uui-input-file": "1.5.0", - "@umbraco-ui/uui-input-lock": "1.5.0", - "@umbraco-ui/uui-input-password": "1.5.0", - "@umbraco-ui/uui-keyboard-shortcut": "1.5.0", - "@umbraco-ui/uui-label": "1.5.0", - "@umbraco-ui/uui-loader": "1.5.0", - "@umbraco-ui/uui-loader-bar": "1.5.0", - "@umbraco-ui/uui-loader-circle": "1.5.0", - "@umbraco-ui/uui-menu-item": "1.5.0", - "@umbraco-ui/uui-modal": "1.5.0", - "@umbraco-ui/uui-pagination": "1.5.0", - "@umbraco-ui/uui-popover": "1.5.0", - "@umbraco-ui/uui-popover-container": "1.5.0", - "@umbraco-ui/uui-progress-bar": "1.5.0", - "@umbraco-ui/uui-radio": "1.5.0", - "@umbraco-ui/uui-range-slider": "1.5.0", - "@umbraco-ui/uui-ref": "1.5.0", - "@umbraco-ui/uui-ref-list": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0", - "@umbraco-ui/uui-ref-node-data-type": "1.5.0", - "@umbraco-ui/uui-ref-node-document-type": "1.5.0", - "@umbraco-ui/uui-ref-node-form": "1.5.0", - "@umbraco-ui/uui-ref-node-member": "1.5.0", - "@umbraco-ui/uui-ref-node-package": "1.5.0", - "@umbraco-ui/uui-ref-node-user": "1.5.0", - "@umbraco-ui/uui-scroll-container": "1.5.0", - "@umbraco-ui/uui-select": "1.5.0", - "@umbraco-ui/uui-slider": "1.5.0", - "@umbraco-ui/uui-symbol-expand": "1.5.0", - "@umbraco-ui/uui-symbol-file": "1.5.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.5.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.5.0", - "@umbraco-ui/uui-symbol-folder": "1.5.0", - "@umbraco-ui/uui-symbol-lock": "1.5.0", - "@umbraco-ui/uui-symbol-more": "1.5.0", - "@umbraco-ui/uui-symbol-sort": "1.5.0", - "@umbraco-ui/uui-table": "1.5.0", - "@umbraco-ui/uui-tabs": "1.5.0", - "@umbraco-ui/uui-tag": "1.5.0", - "@umbraco-ui/uui-textarea": "1.5.0", - "@umbraco-ui/uui-toast-notification": "1.5.0", - "@umbraco-ui/uui-toast-notification-container": "1.5.0", - "@umbraco-ui/uui-toast-notification-layout": "1.5.0", - "@umbraco-ui/uui-toggle": "1.5.0", - "@umbraco-ui/uui-visually-hidden": "1.5.0" + "@umbraco-ui/uui-action-bar": "1.7.0", + "@umbraco-ui/uui-avatar": "1.7.0", + "@umbraco-ui/uui-avatar-group": "1.7.0", + "@umbraco-ui/uui-badge": "1.7.0", + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-boolean-input": "1.7.0", + "@umbraco-ui/uui-box": "1.7.0", + "@umbraco-ui/uui-breadcrumbs": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-button-group": "1.7.0", + "@umbraco-ui/uui-button-inline-create": "1.7.0", + "@umbraco-ui/uui-card": "1.7.0", + "@umbraco-ui/uui-card-block-type": "1.7.0", + "@umbraco-ui/uui-card-content-node": "1.7.0", + "@umbraco-ui/uui-card-media": "1.7.0", + "@umbraco-ui/uui-card-user": "1.7.0", + "@umbraco-ui/uui-caret": "1.7.0", + "@umbraco-ui/uui-checkbox": "1.7.0", + "@umbraco-ui/uui-color-area": "1.7.0", + "@umbraco-ui/uui-color-picker": "1.7.0", + "@umbraco-ui/uui-color-slider": "1.7.0", + "@umbraco-ui/uui-color-swatch": "1.7.0", + "@umbraco-ui/uui-color-swatches": "1.7.0", + "@umbraco-ui/uui-combobox": "1.7.1", + "@umbraco-ui/uui-combobox-list": "1.7.0", + "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui-dialog": "1.7.0", + "@umbraco-ui/uui-dialog-layout": "1.7.0", + "@umbraco-ui/uui-file-dropzone": "1.7.0", + "@umbraco-ui/uui-file-preview": "1.7.0", + "@umbraco-ui/uui-form": "1.7.0", + "@umbraco-ui/uui-form-layout-item": "1.7.0", + "@umbraco-ui/uui-form-validation-message": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-icon-registry": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0", + "@umbraco-ui/uui-input": "1.7.0", + "@umbraco-ui/uui-input-file": "1.7.1", + "@umbraco-ui/uui-input-lock": "1.7.1", + "@umbraco-ui/uui-input-password": "1.7.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.7.0", + "@umbraco-ui/uui-label": "1.7.0", + "@umbraco-ui/uui-loader": "1.7.0", + "@umbraco-ui/uui-loader-bar": "1.7.0", + "@umbraco-ui/uui-loader-circle": "1.7.0", + "@umbraco-ui/uui-menu-item": "1.7.0", + "@umbraco-ui/uui-modal": "1.7.0", + "@umbraco-ui/uui-pagination": "1.7.1", + "@umbraco-ui/uui-popover": "1.7.0", + "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-progress-bar": "1.7.0", + "@umbraco-ui/uui-radio": "1.7.0", + "@umbraco-ui/uui-range-slider": "1.7.0", + "@umbraco-ui/uui-ref": "1.7.0", + "@umbraco-ui/uui-ref-list": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0", + "@umbraco-ui/uui-ref-node-data-type": "1.7.0", + "@umbraco-ui/uui-ref-node-document-type": "1.7.0", + "@umbraco-ui/uui-ref-node-form": "1.7.0", + "@umbraco-ui/uui-ref-node-member": "1.7.0", + "@umbraco-ui/uui-ref-node-package": "1.7.0", + "@umbraco-ui/uui-ref-node-user": "1.7.0", + "@umbraco-ui/uui-scroll-container": "1.7.0", + "@umbraco-ui/uui-select": "1.7.0", + "@umbraco-ui/uui-slider": "1.7.0", + "@umbraco-ui/uui-symbol-expand": "1.7.0", + "@umbraco-ui/uui-symbol-file": "1.7.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.7.0", + "@umbraco-ui/uui-symbol-folder": "1.7.0", + "@umbraco-ui/uui-symbol-lock": "1.7.0", + "@umbraco-ui/uui-symbol-more": "1.7.0", + "@umbraco-ui/uui-symbol-sort": "1.7.0", + "@umbraco-ui/uui-table": "1.7.0", + "@umbraco-ui/uui-tabs": "1.7.1", + "@umbraco-ui/uui-tag": "1.7.0", + "@umbraco-ui/uui-textarea": "1.7.0", + "@umbraco-ui/uui-toast-notification": "1.7.1", + "@umbraco-ui/uui-toast-notification-container": "1.7.1", + "@umbraco-ui/uui-toast-notification-layout": "1.7.0", + "@umbraco-ui/uui-toggle": "1.7.0", + "@umbraco-ui/uui-visually-hidden": "1.7.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.5.0.tgz", - "integrity": "sha512-2B4ONNRTEtoKjnBo8mtvQo2Y9WW7LDSx6q85UuA+YEWfMOgZ0hr0lFepPg+qq/q90/8ZIoItoxRo16UFrPVaHQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.7.0.tgz", + "integrity": "sha512-Lw067iEU4DihiOsL3cg2QqE4x7B7bqjYQK0EouBbD+mhJaE2IOw5eve2UIBN1KU/iQ+7V9q4qa++is1nitvUWA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button-group": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button-group": "1.7.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.5.0.tgz", - "integrity": "sha512-Iw4MQ2IMfJq590ydA6d2WXJ3gC7wO1vpA6tZj3T772B81LBZR31ftoMn3ho4cpavV5Nv4LvBnGhc2YajbsVn5A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.7.0.tgz", + "integrity": "sha512-cW3qTTarFqXK4Ze5xMERo9pj3pRRKTvTDB57a5uA0gQ1/70uhgPnozWSX7EK22ml4w/5pmtxXXgRKfSiU9DGtQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.5.0.tgz", - "integrity": "sha512-hlmqOGLQIN8uJMoLgT+RPHFWIxi8Ridhp/MrKgEjuNF6sTu4bCQyN28XuC9JD+4vBcSjU4a893QGvckalQxZiA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.7.0.tgz", + "integrity": "sha512-TFDR0Mb+ug1NzVXq9RnxMiQ9pcxBcmzfOoxpR1NWMB/sAgNs/H/pTTqjieLel0/A5Am9q//8f7f9vmhTPpybGg==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.5.0", - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-avatar": "1.7.0", + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.5.0.tgz", - "integrity": "sha512-6azqqcqRzVHXYz/JfAody6kDZQG3hiBTiCS8EEYY9GcFNqh8BvFLX4yK9R6zz5BVrjgT3qkmPpE2iIpqV6J58A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.7.0.tgz", + "integrity": "sha512-cdPHjXMag8KkYLaWfyYfp9N1qqG+th2Ijx7ms8EpTHAX2gtU1L/A3ShxWox0Ck1TJ75jrW66+HrqiMwDOmbn6g==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.5.0.tgz", - "integrity": "sha512-HzKRvbf/aPA1y8l9ZLTvF5Up7W6jX8UwqVUr1B8lwckI6tgxOEFPqLya+U4papqZDh4wz/lysXSDESeVfUy8cw==", - "dependencies": { - "lit": "^2.3.1" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.7.0.tgz", + "integrity": "sha512-66aDdgTrq2nx4BNzM9A/lc9dZYz/fyX5OVpkQDRsrpYeOLJMN3oOnE7aChIdBNW3I9lfVNJf6fh0iL27K5JCiQ==", + "peerDependencies": { + "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.5.0.tgz", - "integrity": "sha512-uhIPzi7n3Z4Li3n688Q8v3725apwasZvPntm7kMdtssXay6hUHOcor+hkpPavGXRVxZGg+9gIYRM6sQWp853cA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.7.0.tgz", + "integrity": "sha512-Hp6wOFqFLaZU0oW63GlMJ8s4va/TG+i7Sjs0qT91//5iJhJtpvgwY3j4ARoDfk0d8rKRIapiPT+hNMo9xr1sfQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.5.0.tgz", - "integrity": "sha512-uTHBvwzS9pRu0MVfN74+bux6lK0m1AmY/7xor9ez9/uzDyIK096D9jSLTQkfDyngIhqnV6kFLbG7PqcfQURFJQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.7.0.tgz", + "integrity": "sha512-1P13tsVJXPEpMiHrw1FmsM0dvCLce8DevZAcP1ArDwtqWrwdArR2eRwlhVEZYu2MJkR2tESE3XGTaSOWHyC8og==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-css": "1.4.0" - } - }, - "node_modules/@umbraco-ui/uui-box/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-css": "1.7.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.5.0.tgz", - "integrity": "sha512-mXuzt5o4NZ1E/HVTLYq+TklX9VQSH5zce+Ef1t2EgUE3EFQH0fwcdCRBC9SpklueNj46ngGHmVhyfv8ekne1Wg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.7.0.tgz", + "integrity": "sha512-y0sB4UypNwCle9qPlQ7Y++a4BkmFpn9vSTeJ6WRWueVyjKT99icmCV1c8/Q47blMajp0FLG2/ajevxg/aZSO4Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-button": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.5.0.tgz", - "integrity": "sha512-ujicvfqUAN0JtBcgj8OG1YcyDaArTBdP5LvNsyYB8s0dePgcws71XzJ1mbHbXhuA386ioNue04yGDL+gSFlJ/A==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.7.1.tgz", + "integrity": "sha512-z2nZccn/Hel2QvytWVejDzqjNPRLJ/jLgCmLpgHoKU2IlckEgZqy4wxKcgH2Iu2bJ+wgIwpAAmlidLK0LX0tCw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.5.0.tgz", - "integrity": "sha512-8yhFdfg7p1B8MM2fIxIlc0Mmhnx46scdGhqeRhvaQ2/dcdpVTI1j1hI2JyOM18TUhJeot4olLqwatlXxlFFT+A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.7.0.tgz", + "integrity": "sha512-CM0sytzzEXiDmFfB6GXnmQw5LzCNuwSo66BC6zYI4cg1+mk2a1UBu1Z8CVpvS3tsTkzk/nGd/ZFKkoIziDVKJg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.5.0.tgz", - "integrity": "sha512-J60vRf7nzQyRYKj+qYhMQR6LrQH6PyTrxyqyfDOVGzcWKzsTuRahxuVOIOzrs489cznwRYwL11jtK32MlrSjGQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.7.0.tgz", + "integrity": "sha512-SVep/tcsTJuO8jvZIX0e3EOaY1S+sOk0ZFmq+HxUJDt6csFjXsqJO48DjIon1AKq95ATTM9Iqs/hPSDVHrqNvw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.5.0.tgz", - "integrity": "sha512-RgpnQca3rpjMG/3DAmmrExI7gmNNHBNYwfjRqgCd/3QkBwRrtT/+jdppVsGRxxW5xAN90sJ/eLP7i3F5EfWlSA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.7.0.tgz", + "integrity": "sha512-BBWJ62UH1dmcHvZ3H0fRCnM9c+ebQMNaZlGDDWP5lPfv+2KjXXkLRuj6tPUthHa53e5Rf6AAKjKsjRssM4dsLQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" + } + }, + "node_modules/@umbraco-ui/uui-card-block-type": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.7.0.tgz", + "integrity": "sha512-SrLgooo2imluSV8S3bp+0kA2K7zuMDAXZTuzQJRf2hzq208In65D5rBxn8OcEJsGD3lHMp6+w8rg8Ol5NlEbXA==", + "dependencies": { + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-card": "1.7.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.5.0.tgz", - "integrity": "sha512-aYGeTsppWT0KS9orrqkl9DF2v5l3gSGhBJZqIPiHVBOzczYIcgLWJbdAkaCgpwh1Zacbv3tnB/76965fd4EwPw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.7.0.tgz", + "integrity": "sha512-wkb9BaUfuZkrMczsm1q4vuP0zSOp0gfiiiXCxFRDNmWJc3jKiL3zF619PzviEZrz10/f7WRnA7MLfDgsAmQpAQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-card": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-card": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.5.0.tgz", - "integrity": "sha512-0KktT0IExh06W7QP1FMNqU+tpUL1qDwWeeA19PbZPXwHg15hbSW15a+Hc4aiwqlHYHOPT2gxXoiVc7jqWlMcSQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.7.0.tgz", + "integrity": "sha512-Jwli2j//U1v4zG5fvkrekduf3qCa5w0RNP28RBxeqqQKzO8B5UpWqIP86/qaV7hvlp/ZuTCYrdkeWLgUV85tBg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-card": "1.5.0", - "@umbraco-ui/uui-symbol-file": "1.5.0", - "@umbraco-ui/uui-symbol-folder": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-card": "1.7.0", + "@umbraco-ui/uui-symbol-file": "1.7.0", + "@umbraco-ui/uui-symbol-folder": "1.7.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.5.0.tgz", - "integrity": "sha512-xJjfkRHkt2xim1o+IvEPQiTpIQR+Z9+69096ssuGb3EkxyyUsDmH3aZZH6/+LKdtKR+7mPZVJub9TTWB4VRnwQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.7.0.tgz", + "integrity": "sha512-4fBXEICxi4ICAM2wn40DrUV1pPGSDFJmzacOA1PXxb1pzQjxw/hb/hnu96xqjHscX+bUAWnWHkb60RnrWmmcsg==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.5.0", - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-card": "1.5.0" + "@umbraco-ui/uui-avatar": "1.7.0", + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-card": "1.7.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.5.0.tgz", - "integrity": "sha512-4Apw4TMALEydo5o31gsIyICuPVyKvG/oySNup+5psU3apS0JDQ1RXCgGVDFoFxt5xzM+iJ6/J8ZOOILMVNFM6Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.7.0.tgz", + "integrity": "sha512-sVWUQGaLCAwhFH5mmE83+cwDjTyZamRWHgmVakTac2L9qYkwhTwzRgIol1t4i0DQMDFd4oLZ1zq+ysWvAOCmmQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.5.0.tgz", - "integrity": "sha512-Kve+XAIkSFG9kowbZI1MpDEKihpMTtD9q36pcHiVENqxL1+Tydy60yjy3tHV8o6uamJ8qjR6ZlvLttRwLId9tQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.7.0.tgz", + "integrity": "sha512-7bY8FgSEscGtMYf0EtvmU4XuchV8bdjs+gwBKCVYogAELDdKbCTxWI6/HRqR6wDUOltpP1okFYN6rISugkUKtw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-boolean-input": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-boolean-input": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.5.0.tgz", - "integrity": "sha512-FF6PrUCBo2nOg5iLbD+iB8aa3Vh+skIfqjFsPD80qLE0sKQ/53juZCnCbvvp7Z0YmIqwBlWP7xGEzJBGfS6OlA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.7.0.tgz", + "integrity": "sha512-7FashEB3hoh9p833gEhseq1t2mICVzb5zRe+FJ+vKFnTI2uuIRLjwD0pqSwmVAxoFCPgb81B6V5yH/pSrrzZEQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", + "@umbraco-ui/uui-base": "1.7.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.5.0.tgz", - "integrity": "sha512-y/IwXhtaQJWNjwnZtYTvv47+bsmUYJzFLtXqxGckcUmyJQvoZ6DDxslTSv1B9J3QTXU0zpakqpxPszlNNHUygw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.7.0.tgz", + "integrity": "sha512-9JYlgg6i/gxwTIYsCJ8QnSjhZzZjJBiu2HZwDJ/2rm8uy/jNmbCf5aK+WHR7RbwMGNrF4/X/58t5woBzwSMUIA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-popover-container": "1.7.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.5.0.tgz", - "integrity": "sha512-nkUpUxfD7VlayBHirM56xKqi1h0Opg7Q2suzxEC4KLDVLO1+L0KzsDORn1tfeantSG0PahBMbuve1XOoOwCrAA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.7.0.tgz", + "integrity": "sha512-DVyYeZsBG35430Cay6Dv8oO7dvi+aow6fVAJDHA4+CXdOSet4RTLO3oc1i51JwDmBiBhtLKGfo/wflrFxyfr0w==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.5.0.tgz", - "integrity": "sha512-UDqlGmJIMGyn7C23q33v8dkJoISmIAL0XZNTiPkEhwGjKRlxkbexmGd4L4vFt+nhJDRrN86JoZ64BRTHVN8V7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.7.0.tgz", + "integrity": "sha512-hp4Oicv7eLMvSn6jUerjDkYY6R/8JCRxbXabfbfZOZ/YwocSLN6DBc0nxlb/W8IETy26VCEFXH+tYKvZbsAB2Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0", + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.5.0.tgz", - "integrity": "sha512-SvTKINbckKvqkkS4XnQfpELkW2x47CUa4PsnXqioXNIWP5sBJb9Kydiu0N1+lV57fAkteqNp+YY8mFxn3a6iPA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.7.0.tgz", + "integrity": "sha512-XIPP4BhaRB6nL3HAt2KRsEeslq/I2hMl8eQzgbz8y9V6yf7uq8q0OCMqQy2XB6bQ48N+sOqXfjKLPIT4yTIH7A==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-color-swatch": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-color-swatch": "1.7.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.5.0.tgz", - "integrity": "sha512-SoK4+yR0dJViXZinZ7iqowl6tvWPTTPSOBVE7FfOqOAgFoccOE/nQqjeNjSM0co80OKXqHUsh+kX/HwLjdyNEA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.7.1.tgz", + "integrity": "sha512-4nbsRyqJO+rifoug+1PlWA8oI1L6f3aj7P/p9UT4pgcT8mpJ5Fv70XaFXMPEaCWh8HgZLsvMKDClXNzHXlvcLA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-combobox-list": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-scroll-container": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-combobox-list": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-scroll-container": "1.7.0", + "@umbraco-ui/uui-symbol-expand": "1.7.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.5.0.tgz", - "integrity": "sha512-5cVlhnst3p6eEHFqn6O8LMswx3wdwpzlfAghleQJW+ZUIVo7ZPXznZz7+6yvnVWxnI7+xxFebHgC0KFxGMUVvg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.7.0.tgz", + "integrity": "sha512-vRMz1eDqogVqsuRlzzwq+F2SoXxUoquQ9DqBJPif1LO1LgRUZ3G/j1XyOR+CaMRiPEbu0olyNBHOt15dFbgqhA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-css": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.5.0.tgz", - "integrity": "sha512-jBSJg8KTWDG7DOVzz7A+UpMxMNHtddcLgt9k25vC4H+84xl+TN51RFTqF8C0JCZdWFK0eKWYlJsGqVrDfoVCcg==", - "dependencies": { - "lit": "^2.2.2" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.7.0.tgz", + "integrity": "sha512-//nk4+w55eB+EI3hP3O+2RWKg+gXuwKqfcIjEZiP6Nn2epA2XQUV7K5NmcUwKStPyPh9NCz2+EtSvNqJZaaKhA==", + "peerDependencies": { + "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.5.0.tgz", - "integrity": "sha512-m6J5i+eiLdNApryIY1KW/4kyunAuTpkcWBjQmxyESmlDIqRGdW0lqaahQvcZSZHto03jleUdH5wYTLNgKIb/rw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.7.0.tgz", + "integrity": "sha512-wlvpchoIrD+HQJw5fNrxQ4UP2iSfYss+uJwcxDnoQLvLHR8KyS9jdZVCUe1ozMe5KAJ7w1Tw+qEIiXumMFTUAA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-css": "1.4.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-css": "1.7.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.5.0.tgz", - "integrity": "sha512-vfZ3FMzYccGBVvSSXvCeoHYX+VU8QppXtFR2OGDZwU0b8BOKtfKTP/2VLPEWCG4vJYKPmqZESo3N9bZXWDkWSg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.7.0.tgz", + "integrity": "sha512-xuRXkAWlqAq2eO8VthT4JfOvVwpLeDwQwPOqwz4K50lR/6QHQAZdObG0g0DJuhlvehMMXPXrRneWZrAOWeIYGw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" - } - }, - "node_modules/@umbraco-ui/uui-dialog/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.5.0.tgz", - "integrity": "sha512-3rkTWidY4k2fyktRxfsMVTSvF+EIguv9p1Fga7v4DCNkplCp6OyJnwWby5F//+NvTHphaGchxZirOWMLgLyDog==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.7.0.tgz", + "integrity": "sha512-quMmD9iKg4EqV7JKs7k3pcAnxn/RGQjlXgIMrTAUbZbMclLAtTQrowij7ydX5rAdkPgtpQAWRmRuUTcufse64g==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.5.0.tgz", - "integrity": "sha512-Re+R8uZSD3t3jUgZvzG/DfQtihss7aw+rG41IAjmRO9wBZuUAsowfgCd2OJnuOYJXeaqOYYl+QQr7pmR2a/HNQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.7.0.tgz", + "integrity": "sha512-QJg36PvN5LIHcl+fmcuhMFrkrTc5FDuj5L9DRStB/8V//HMhOKwjhOPcmc6xsxXm26R+jnS/7R67r/9PyjjhsQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-symbol-file": "1.5.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.5.0", - "@umbraco-ui/uui-symbol-folder": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-symbol-file": "1.7.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.7.0", + "@umbraco-ui/uui-symbol-folder": "1.7.0" } }, "node_modules/@umbraco-ui/uui-form": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.5.0.tgz", - "integrity": "sha512-rbXFZzAg93/fzvNkxHavUr62DnSeWuVghd9CK9lhe6A9ER9cfjOcGn/INTYK3HHPBalay9IOq+WV1xxC5H6zyg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.7.0.tgz", + "integrity": "sha512-gHNCYq/kwa7hXLHLKGBYrub8jTJHup7hf+mBf3g1LjipS+8M2a9tdpoO8yWzyEauzFsS4YJo45XqN6SRC1f2MQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.5.0.tgz", - "integrity": "sha512-owla3DWo1deVUEG0JzC7pE70h6Ll6lmbR+B+utbMdEgM6shEMdokpPioeCaXb8v7On9Whz+zJGAGBAYl/oyjug==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.7.0.tgz", + "integrity": "sha512-gorUH9jCcCPdlDUy41xD6+4PQyZEL+9H3rnnKGg4xGQRw1+RnLCgmGa7mYiLfj1ycgi8l7MU50zCsQyNvPAPgg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-form-validation-message": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-form-validation-message": "1.7.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.5.0.tgz", - "integrity": "sha512-wuWCzttkUlEctqdJi9qzSzT8h10WvoK3+5usYB9V8NpdPYzOmbXU5RDYpoTWS0nPO56C6rlRlt3TH1khIQtPJA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.7.0.tgz", + "integrity": "sha512-CU2ykzuIA3153EYKkRsqZ0SuGDxoy1zrdYVczWZ+sVxggyIWwazLMm5EZvdoiF8s3iP0m/v2LyyUh9GkBZ66LA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.5.0.tgz", - "integrity": "sha512-8Sz6PaYTC8KDCKj5ed+xnlnuh9/NOs0tQGPOma1bnVxGJN8LNjl+cJSLp+iU1m3Qq50H0TG+0K/dS3WUExjbZw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.7.0.tgz", + "integrity": "sha512-PtOSZkTxWskRrppdhxf17D+d54OylvtjE7muyLb2eJEYoP7KEaWdJ8Lfei5LtaUCRJlstFwQrCh/QbtWhe8Dfw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.5.0.tgz", - "integrity": "sha512-ei+HnaCKFjcCYjHYC0hqncY2vDfbgRkWhftOnrhqVZPJkE4omWDmVsLSGg/vm88ar1QleDmVj+CAa4J9T+uVeg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.7.0.tgz", + "integrity": "sha512-hG3VlF5VLt2XaNYHRUdqs2m5F4s9FUS4WxMc/TRu9Dzhqtie3A7UZ23qtONAcTCSPUxEXW5t809JUyxFi8kpBg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.5.0.tgz", - "integrity": "sha512-nxNEQDI4SNBXnI2/Ov60vcdzKFyRCInwZDFNAKyt31F1yTNM0EM0ne5yV4AqM6YPOKVoWzqFcLz2rx64X+oLvQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.7.0.tgz", + "integrity": "sha512-zgNKwT5L8Ez1R9WUO+vFRPbaUHHoSc6ohOfLA790WCA+F2krzbc7z3hNk6fHkFTR73K4rCaMu6gRbDX/PvuD8w==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon-registry": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon-registry": "1.7.0" } }, "node_modules/@umbraco-ui/uui-input": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.5.0.tgz", - "integrity": "sha512-TlbSIRh2Z7xJxW0GEPENd369W1hHgr9Y8IIRE5RDllXzZc8yho4QXPJSDFQTiHMf41LIkOTfIkrQst5047FiXg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.7.0.tgz", + "integrity": "sha512-c99s0hoggDTWFb3cq0uVcZcHCmstK82tVFJ4yPpaTMjJsilVCg9JnXE1B4tHvT25ZyAvN/pjJ/SYvLmKtU/MZA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.5.0.tgz", - "integrity": "sha512-8h/qGED5KE7sb/YE7dHapZxcWXGm0qCPJft8AGOu/ZK/WdOUV1WHynLjV4yGVZgY9PVZGc+GQTzvdgwxxpltQw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.7.1.tgz", + "integrity": "sha512-bzakMaaE1iSR7ioIzp2TGoBbwmBM+k712+0x+sK2dnQswRlLHL/Y95e7Byp/Aq6fNPayIwP6FaotB72JADDTig==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.5.0", - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-file-dropzone": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0" + "@umbraco-ui/uui-action-bar": "1.7.0", + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-file-dropzone": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.5.0.tgz", - "integrity": "sha512-KBhZLLD+5qyibbcp0AiJo7V4e/+GiKouGz/rCk6/3vxEKpe8CtWekcHhjrdlsHcOluQeBcb1Pdqng0wC9UTO5Q==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.7.1.tgz", + "integrity": "sha512-kfHYiX9844/yE2yIwgk/e73BXiFYi5qn/aCJiy9T3lO6DEFaaHOJUccMyWsNIvSiPHYRX/11Mm0sP30jotjgGQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-input": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-input": "1.7.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.5.0.tgz", - "integrity": "sha512-8wvQ/10jfufU0QWhK3gBVo5V/fzk4AuX8wPuieKZDY9Jnwkr7ugZ11DOJtaV3Az/4a0nrfF3TQ2gbBC7zHx2JA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.7.0.tgz", + "integrity": "sha512-IU7/obNqFaHfuAyga8/wXC26+nqUEaovw67SeA83+2VUSyE7FeNTwW+AV7WFU7ZxeMYUvdJyxIpY43fClFg97A==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0", - "@umbraco-ui/uui-input": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0", + "@umbraco-ui/uui-input": "1.7.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.5.0.tgz", - "integrity": "sha512-KVTMHl6X0T4cUA3bUgM06xzwCN3VD5W3tZloF0i6e3PTHhkyCE5tKD/2Hizm56OGb+ifaI/oN3L1m7vEPC8IHw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.7.0.tgz", + "integrity": "sha512-PJmHNDCTiif89zkLUbBCdlnjY87TkqDfYQVjmhNwaO0DPxpQDh8gG2TvwD3Wp+aqdoVjR8FPIQH5pst+ulBa4g==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.5.0.tgz", - "integrity": "sha512-Sc6XuMEyivBEQDfMOA6JT7nW5H4/eD6dzUtUNabOwzCG5GUpvTMfRccpdjmzOvl9VCGNWtE9ikqCBZWexWA6YA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.7.0.tgz", + "integrity": "sha512-uk1m3wux4dNb/0AqSGslODLo6yVT9aXKBYcHTsvW2P0NQI8IImiJVWw9TWmNrfuBPACJhEqo3pVvfe/PCfsWzQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.5.0.tgz", - "integrity": "sha512-lhl1KqRbM5NTp08fvxgzOsbHFz04z8/WjaOar6lqNnL0R+CcFtVWQrv69Opht9Sj1NdHESmHEVnX0yodod2LhQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.7.0.tgz", + "integrity": "sha512-RKKThaEF1jqG+iU/vwH91QfXxaRvO10hABEReUj6IJYiU0sVCHxmZJczXnJFZKbl5pyEycOznV//b66J5kUddw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.5.0.tgz", - "integrity": "sha512-qUcVXi4i+ClozPc0Vfw7g90CLAQVj04F71xtatxDY5nhSWDEMEI6b/pXtN/B9TklkqfgE1mf/gRziFrpbVjLhA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.7.0.tgz", + "integrity": "sha512-9lDRavgADrcQss5mbdmBrorzgSFNBr4srDA3B6PCya9pFpGdu/NgvQr/SrQzU0U2YSeW4jB88pyHwZaI6PCYug==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.5.0.tgz", - "integrity": "sha512-059/DJDYbgOmr/LPXbiDaTkBcInmzUUu/YDtQt/SkZPCO33uuB7TDc+++cMgFYskdXBpqesNvVfZOUd4P6zJyA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.7.0.tgz", + "integrity": "sha512-7/FqKCntviNUS8yzKhw4lYCWj598gYbzxBRvGJxVPinMOfAgMa8MAOGKpi7VDFHsqfHASfDCzHkqdywq0ku3nQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.5.0.tgz", - "integrity": "sha512-rmKuTz0Xgf0LyQRqs3tr2Z4O6oaNCd7UmI8kEbluk4yKpk5MU38BlFY9p39fpiEVUuzjcg9pBjrEyxrC/H9xjA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.7.0.tgz", + "integrity": "sha512-RTsrBmD1zjcP7XGPIGsxfBfOH+u4k3Jtw1qy/bxD1XLNH3ggOtfpQrpMzn/kxaer/wxYrUnXoDZDRjRuhHwvbg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-loader-bar": "1.5.0", - "@umbraco-ui/uui-symbol-expand": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-loader-bar": "1.7.0", + "@umbraco-ui/uui-symbol-expand": "1.7.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.5.0.tgz", - "integrity": "sha512-q9g4rA8OYCPlOmZMES/O17NiAu18wtMxNHMuT6dADP2tuULE+TKT6A8vqC7aq8JkWOTAXRAFvTjTmcvm6L2pvg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.7.0.tgz", + "integrity": "sha512-/XTu5kbPAgkbMrm1MISz+hvvEh3d2guBl7bs5EhiLBsq4XqnaDQwh15joS4wub5R2lfaodvJg7Or2VvFV+v5ug==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.5.0.tgz", - "integrity": "sha512-I3gCWbyLRFvi5fAlezQZarvj7FuEZ7NVZbbKJxqEhbo1bwOxDMXlDNxIIrxSg3R8YAuDNP9Pbdw+rnQwupuOMQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.7.1.tgz", + "integrity": "sha512-T6oomUkqf6xFc4ZMGX4YHmeBDBLwSfkTz/9sksqTpFpiK86XGJMQ0yOfPhlWNZ9TrC4OJZDurZ/jnY1l97OxcQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-button-group": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-button-group": "1.7.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.5.0.tgz", - "integrity": "sha512-Ab8UL4UGxTUn6hYbTqPrMtyGpQr3Xw1E/PVKG3+j+UrNw1Ro5piKgh0TahwxLnrsXWOPXfy53oaXNYsMGenndA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.7.0.tgz", + "integrity": "sha512-aGG2AOXWfiRSo+0HAZkmZkWCXZTWyBB6mQ7+1XVcSHubsGLTimc6jcs+9y8c/OgMlFlm+YhDmp0bVSdmUKmYIg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.5.0.tgz", - "integrity": "sha512-issjf86TwvwLA6sJOs5pLRMFY+WBc4oeTZiJMz5mhZ5C5UoRmU65L6RP/0UnzZ4ZGY2Gpdh2YatNnZ7hVMg5ig==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.7.0.tgz", + "integrity": "sha512-az2Em1ZKaBLbPBKS3SePeCh6dk4NpdqsM+uRC5DFDLc95oAciKnC/gSjjZf1VtlL+hjb907R+nDQmszC9K7qfA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.5.0.tgz", - "integrity": "sha512-B/v7VsBBwo19Y+4NBRllt7Ls+WLQfx6vY57rfO8MQG7zxGznxpTSIYvd3wxdRuDsFQeVwwoYjF1/YBJ7iWUnEQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.7.0.tgz", + "integrity": "sha512-LjoK+DbO6BcNBJXr6ZKUHTfXPf4ZeChCVDEf1YfsiyLGxoKgt605YqJ8t8OWLInlO3m1rZmB7f0Uxc58nnPjxg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.5.0.tgz", - "integrity": "sha512-3e52VZHcgHB/17eLTmiZwdm7ENgfX6AF4Dw+8H2x8jdRjyvt8lbykCq+6xewAZFsLAu7vTOEKtd2RhQFI2+hwg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.7.0.tgz", + "integrity": "sha512-dNuBdHKNVJUaeemA87uCNTBIeN6S+dLdgxGI2ayQNzA/71EDSdBlIMrdm8FTJ0H8Un/itvgaujhu7EHbckai3w==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.5.0.tgz", - "integrity": "sha512-oHmIoF+KrHDWiOKonIWq7n94C6CzStBXrleS6iwCgWY++ayaHKCPlCuQIYp3BmGjnMQn8Ou0r2x/RuBPuraLVQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.7.0.tgz", + "integrity": "sha512-3LV9H0HciGSMEpX1I7zSzmPssGvF+C907bl8hWnlmaVVKGirBjrKPHmeZQW/zpqRCtvDWipFYKOcgbKQzCA2Vw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.5.0.tgz", - "integrity": "sha512-wba/OP6b/mG5kp4bUgBBcBAAy3RWTbokVyjb52FR7nyqNMnIE/UBdgi0XeBx4j6lZeEbr5k5ZOGQ1knEHbPWyQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.7.0.tgz", + "integrity": "sha512-/llhIEmVoJ4gb3LmOH1cfJ5zOSJry7TfJTxzruUpCxi+O68zMscgRZr+eh9DdF+Lz7zMbRxlubbVOZ58HhEPmQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.5.0.tgz", - "integrity": "sha512-sxs3hC97zDuFaV8mvXLAbqqtWk0kqDdHY9ORt9CxacdT36nQS58Sw60/plCryqoyp7P2cUZVtlEeff53OKOTCQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.7.0.tgz", + "integrity": "sha512-BEb878VsSmRJuq1FCtoS9ryBvUErUfK8bQy93ErwgmesdUcuYpBJK1PfSe4x7SiLjD1vDlH9GHaWLyFiSJKfIQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.5.0.tgz", - "integrity": "sha512-bjmMgrIW+/4bmUXwMwFFaPrg2MeTxXssb6EpbBItJ+s0QhTEcTNyAD/DK3RlSMRE5VPO11sRwgCr06aIhklx0Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.7.0.tgz", + "integrity": "sha512-yqTS6B3uA0e8g29+nqbUnyPncyRdeYGNR4mjA4gdL4iwPumBvC49tPoWds8Nq0lEyxJg9fLNMezokPOMs2fKvw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-ref": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-ref": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.5.0.tgz", - "integrity": "sha512-k14MI3cRELOmAwmtFeBzgCFw4+uin0JSqf85ZaqNkXSAmg+4I0ayUI6PGz+Jw66yGHvw3YNeUMKPmLO8l6M79A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.7.0.tgz", + "integrity": "sha512-TmnpFGaG1QqUqvwlmXlXzpPZ+tCigqCxv4VVOYA9XwfUeqwoWmziQJ1jJyqdxSrHxRYkgg9Or8ZqObpKZ0HrCg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.5.0.tgz", - "integrity": "sha512-ouytDUaSls7Hsd0WaDy4wgfKMLpxlxx16WWyHlzX5lMyhkR+S3olyNZcgDRtz9xIQV+dVE3iDsUeQcNAigCdaw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.7.0.tgz", + "integrity": "sha512-KiZWbggePxAmHWr31yJzWOrA4DLGMbw8goMSC49zinBX4X2FOqgOTG8dl4dCXMxN114wxcTDRFvdTcWpIOHeEQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.5.0.tgz", - "integrity": "sha512-D86A1+ScVGTer2kci6Y9X4ZAhCnm4kxUi7bCFH7dn7oi/Fq8fhs3PBuA7mr1FrZgrPvXVdW+Qa7ldxxU58NIWA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.7.0.tgz", + "integrity": "sha512-FUZA7jjWOOA8HILRhD30mKO6NX0Hv+wL61gfIbWt95iGsmPwknth550Dm+i1Cc/3L63QmZD0qBQRTKRl7zfynA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.5.0.tgz", - "integrity": "sha512-/UPmUNk6KP2unKnJKjr1qGkdPlFGTRj3K7H/mczCY7IbtzEccdEswWJCdUy/doIkAKbDdaqKe3/9HBoA3JtWPw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.7.0.tgz", + "integrity": "sha512-PFXZzlPmJaNLrvCO3p9n5ViIBXfr7nJtm+3WphuUM6KiJMMa0Fv7au1CINv6abu+TzjBh6VcmoNdt8Hu2MfS7g==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.5.0.tgz", - "integrity": "sha512-XkET8XKb3XxmjlIDrmtwm9o0QsaG81bcpUBEBA/wUC0OcJNrjTKyv6ciAVDP7HaW6XpN8XwsRbqdcrYwM8lXDQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.7.0.tgz", + "integrity": "sha512-OVvo+YDs0a3jqtm09XwaZdRNFwmDnSIBCTAllG+fLRbYQfwF0pCp96WOmuwQfGjlXhPrIjbhJ6YJH7R8QRUzbw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.5.0.tgz", - "integrity": "sha512-9TrIr1JWw3cIkWfQrdv9iLRIqm/dd10d6uZEWaGJ/MuxyCywqMg/LSApV/NLapB4HXhIG4pGCiXvUa8OVW99ew==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.7.0.tgz", + "integrity": "sha512-Z2qF53n9O7Ft/xgexY/lzUd8xeFusCLSnz7hkqfWgTIbSvdI9FXtMiqCWqD1nWmijIPYBKaqujBfibGtx1DcSg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-ref-node": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-ref-node": "1.7.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.5.0.tgz", - "integrity": "sha512-Xj5jnmCEDyRENmWtuPI1QYEMzrmi/9/LaajkPEIZEYVu2owI940F0viS5X+X/FvKehSxoSt9ainCwkLphgzNiw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.7.0.tgz", + "integrity": "sha512-W4rETai/KAyXkDRUn6h14S6PLigswzkE45ufHAc7K2QZGUgXikpntbE8UpsEfq1QdMQRTHDmjorGn2qT+C6ULA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.5.0.tgz", - "integrity": "sha512-lcMiIM6WxF5YraIXAqSpujx3OJzq6Snfik0BUypTWbUZdKVQTgLPh3A6We9PdD6K64AX2Zk4eH8yhQ+5GNImzQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.7.0.tgz", + "integrity": "sha512-pkPWTciiL9hPXpDO26wkkZFLze+jgL/xZkGgtrULrMRS5mJ6gan+8bB14iGtPt/ekFdgDmt6YcKozjp8g15xGg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.5.0.tgz", - "integrity": "sha512-Mp6xz7C7GbAuQ1Totd2WLzvS56ekx4l31mAvUvor0GqrUF/hHxwfrGZOAWoBqoTdKQAFKbZVSM782a+cwNv3hg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.7.0.tgz", + "integrity": "sha512-kP93yvwsvRUEyS4+PhkhwXpkWZUm77sKerB6Dte0Z579WMQclSAivy6va9kkj5zKxZYPcRbJ3H498FvfhxhMkw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.5.0.tgz", - "integrity": "sha512-ZCuGAJT2qFs4wQ6Z+g/qV3obv/SbriMnaIOGy6XTTAuMlh2+aNAwm33Je0wYKCTwHNUmnl427wTMEkQcMziD4g==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.7.0.tgz", + "integrity": "sha512-Z9bv8uYU2+tQ3UoJM2Ymdpmey73bLBNuaIKJG1AOXi1c2CB1UHaIn0C0Cvj4eHLoIEVp29UZOpQM7ri3/zb7lg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.5.0.tgz", - "integrity": "sha512-ClB/lT/ebyUBmPqExB2ZinMOo/bCMEgjGxjkXy2THX4lOLUqvjDNEKLq99MAREKSh/mmGq7iB3Z/hd9/EDu75Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.7.0.tgz", + "integrity": "sha512-m/vx7WnCbYw0cNqS7TM6JeS7S/AMEQlnVUOWa2w2GDIuKNy6Jb1bk0soW1B3Fi6Hc6Pq+pMeaKgVPIM5F7F4Cg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.5.0.tgz", - "integrity": "sha512-0YL88rFFI5SOzzORtm1VtMihN4if7r0CIRe5Q3Sv0WwHjrMfIM08DeONCgN2j+ZoKgnTvt9KpE1OGigshouRug==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.7.0.tgz", + "integrity": "sha512-lyhROAhwbmgK24DerwTiP5iP8GeOiAcgbgkUfHhG8X6hWMx9nV3H1nJHil5jFAeXk9nbAzDw4UfUgQWeKePLTg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.5.0.tgz", - "integrity": "sha512-/qkf6AdAIsRmUfsBdtFkFk5wPWw6JvSVHvgk/UvZulHHb2F8TamPSJfb6voh86Vq8DzVIcy3ZbqatxH7LZBY1g==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.7.0.tgz", + "integrity": "sha512-ZyS82vIqgqpPTx1atPaN+bw+Wr5e2lY2G9dpjTVx15PZtlI2Hp9aouiWyDRuCai8cc9Cj7n+7wF/K8QC7J8uCw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.5.0.tgz", - "integrity": "sha512-Sxt4n5IBT+XIqu2nJxP4RnhourwC+1X5bD40YgUBmqZJ9KV//tox4zo2elU19WCeRZFkklZGfn2smLY1FD0OGg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.7.0.tgz", + "integrity": "sha512-0EgbdXHY/aKniF0GZV6q64BWBsHK/dmar2hRNa/CpXHOGr04caY2svs44adWo4AOdGbPy9ayIglEzwSBRV+vXA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.5.0.tgz", - "integrity": "sha512-EH7tEPCB+PTyjWbW+bdekk4M5hcjvYYpCKTnl3Pdpzh0mrxHPt9xa8908JB0tG8n0m0EcP+L7k8pthUmkgpK7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.7.0.tgz", + "integrity": "sha512-w+f3jvnVhkETiT3NERIsHJrYDZJC5zfihtW/KRE7isJflF8vrnEyUylv5ZJEih2kj0qCphoCswfMNQjwZbmMFQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.5.0.tgz", - "integrity": "sha512-EuhU4kle4swMFZnsguWPz77rOtrk0IQcXuEA60fjzFGJCwsg7yyu9Ns209IEUsYh5ktstj8pXKT8+ZDila5umg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.7.0.tgz", + "integrity": "sha512-mYG0BKW3F8quwsBRck3mhINDJrl+bmfTzQsQRBjjCtP/BuIlqb2JSZDn0KBK1Jj7gl2MJINgZSzsL89zjyRVHg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.5.0.tgz", - "integrity": "sha512-/cifoZXuZbDmuZFPD0rr95Gpuy18DnboOYb/Ir6G3PANJ0fWOhzykHUrdx18ItLzhhwfE3dcZk4EWcGrEkfnfg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.7.0.tgz", + "integrity": "sha512-gE8KNPAKZbUkAf+ZYLWe0zK4TC914sNfoCZJY4v8aEJ8xkZ/mYXJ7FxVvE+gvYuZ033VqrO5Ko5AwWEXfw1iIA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-table": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.5.0.tgz", - "integrity": "sha512-tjhpEzBYCQdgieoXcIgcOjROrScF0Ifutz/6gmpcdrXYbgZ+YkWX7dSLAeQj3fzGebaPbNYzGOmGZA9/opZ1rg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.7.0.tgz", + "integrity": "sha512-9t9vdWOQ0NKg6aHTWqoIfAEK0M/DDrGkcn96FGvxxbPd+qkta4XDYCMEfOfMjGnGz+lukWoACectczEHXuI6gA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.5.0.tgz", - "integrity": "sha512-0D5NLufis9Tzc5Vr+fl8Z0wABHyz1Tep76Qnx0nXyYzAZvdNq2IxThHbGqA1cb+FjVJSKdfp6ONfiPc/SIVAzA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.7.1.tgz", + "integrity": "sha512-HYX5abtHKEse8UC17bUJM0LV4Kt0MNVIV4I2PtOOMIbLFx8kIVL/bdi/IO5T8VzYtecLQI8dgELc0Y2wgRSvNA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-popover-container": "1.5.0", - "@umbraco-ui/uui-symbol-more": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-symbol-more": "1.7.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.5.0.tgz", - "integrity": "sha512-OZGitHjdn4coj1x7F7zfeIx5M9NhGd8+CqpD915V9Qm8YlTQxFLq1M8tqjIxaYAB5EcHXuyzRpSUCrt/WUvipA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.7.0.tgz", + "integrity": "sha512-twrXe2U733r92ubBGXxWV9F5QP7SCJhKwYZbC2jbFOGoHpcxCtELvy36vEvgoWUF2BorPLQZSci7RHO0Hbnasw==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.5.0.tgz", - "integrity": "sha512-+zDqbYKYfaiG0IXEaQatUaWsD4umtkTtbCMnqVPMhxwneVoE9d69ejat2zLFUI/ERm3nKMyq/NRfxzXJgzlDng==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.7.0.tgz", + "integrity": "sha512-rMqd4h5U/hW/wRacbr6D7/MoK8gqgiLh341Q+CFTEAnWdXNvRakHe4DNspguDIYCPUTjjRshTJowj9ZdbxHO7w==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.5.0.tgz", - "integrity": "sha512-cFjz4/uZudR3yuSqK5gqzAio55ZOOxQAOc8bC5keS0HXL84JcDwrEP4/Nz7X/uUNUqauYZG/iBUirAvqfv7Osw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.7.1.tgz", + "integrity": "sha512-SDAW0oYyboC5GvKg6GP0ZbNkr2C1qkVxSsO3gSAxI9+aUUbYuc3SijudyGCuESzdNshTbmya5OpUC3mnd5zdGA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-button": "1.5.0", - "@umbraco-ui/uui-css": "1.4.0", - "@umbraco-ui/uui-icon": "1.5.0", - "@umbraco-ui/uui-icon-registry-essential": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-button": "1.7.1", + "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui-icon": "1.7.0", + "@umbraco-ui/uui-icon-registry-essential": "1.7.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.5.0.tgz", - "integrity": "sha512-AB4kwgocUeDwkxiCYNH0AOMEtExDS6sEq9sk2i8AGDAEjprAB3m0HM9AlrA+T0V1GtSuv+Q1DEuCyxnVbuK0WQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.7.1.tgz", + "integrity": "sha512-m/B0XqBjAfEe30y2gHKJNbPxijF17zTU0VXb0sxTVa+1pb+eOtIMXVB6+DaYsr0TcsqPnq09kQruVEmvO8uWkg==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-toast-notification": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-toast-notification": "1.7.1" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.5.0.tgz", - "integrity": "sha512-rM7cGCdMolhsndfZT9zGAPI9P3bl1lNpjDhWI124Mgx+KS8t2Q2h9O+7FGqFnjCTJOQES1pdQ+enl2NxCuEkNg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.7.0.tgz", + "integrity": "sha512-5edQz3E84q3dKCvqFhZoMYY8258m9rPXak6gnqtZyGhAzwx8qZ8r9TDTcXftBnW+EB7Th9DheCUZLrphs35ZlA==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-css": "1.4.0" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification-layout/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" - } - }, - "node_modules/@umbraco-ui/uui-toast-notification/node_modules/@umbraco-ui/uui-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0.tgz", - "integrity": "sha512-HBCFPuXJijeZbjnjdqmg3oqOGB3RmpQKT/s/Uy0TSJfaQGfz0e73o2eRghYHWF2rdqHw6brKFrZTZHBVvCE/xA==", - "dependencies": { - "lit": "^2.2.2" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-css": "1.7.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.5.0.tgz", - "integrity": "sha512-vsJSpBSmlrLzspCa1dGQGYXfc6RwTGTzSlNQdnzzP7qefVRP4GlOaqYV0TJhHMcYdbai+iEkrLznzJQvM9JFLA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.7.0.tgz", + "integrity": "sha512-1Rz7CyBy38IF926maF1fyNjLG/my/4oWQRl0/22h/Xr6SYj/wWNE/1u4rg2bW1HGSu9mNtiel4wd7tDJ4g30Ew==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0", - "@umbraco-ui/uui-boolean-input": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-boolean-input": "1.7.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.5.0.tgz", - "integrity": "sha512-3Imqxp8+hvirakPogqzvRlU+uhshpGRdrEMU7phCS5VGzDEl8NL1BhxR31EQAw7DspwbD5non3ZwbTwLYydfCg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.7.0.tgz", + "integrity": "sha512-yPa1Z4S+ItjS+i9xgIobZ5QxfUyLRLguzqX8VARgCCxyoh5yXkoABhI9Fb0siSwc9TOtKuRaB+qQoV5rLnpu/g==", "dependencies": { - "@umbraco-ui/uui-base": "1.5.0" + "@umbraco-ui/uui-base": "1.7.0" } }, "node_modules/@ungap/structured-clone": { @@ -11748,29 +11732,32 @@ } }, "node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", + "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "peer": true, "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" } }, "node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", + "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "peer": true, "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" } }, "node_modules/lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2" } diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index ec8ec22307..1c244f4899 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@microsoft/signalr": "7.0.12", - "@umbraco-ui/uui": "1.5.0", - "@umbraco-ui/uui-css": "1.5.0", + "@umbraco-ui/uui": "1.7.1", + "@umbraco-ui/uui-css": "1.7.0", "ace-builds": "1.31.1", "angular": "1.8.3", "angular-animate": "1.8.3", diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/user/user.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/user/user.html index 3e0cb02e4f..8871627ca0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/user/user.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/user/user.html @@ -73,9 +73,7 @@ look="{{ ::login.options.buttonLook }}" color="{{ ::login.options.buttonColor }}"> - Un-link your - {{ ::login.caption }} - account + Un-link your {{ ::login.caption }} account
    diff --git a/src/Umbraco.Web.UI.Login/index.html b/src/Umbraco.Web.UI.Login/index.html index 3a656f45d9..4c0be79720 100644 --- a/src/Umbraco.Web.UI.Login/index.html +++ b/src/Umbraco.Web.UI.Login/index.html @@ -11,35 +11,33 @@ Umbraco - -
    NameValue{{vm.labels.headerName}}{{vm.labels.headerValue}}