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"; } 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/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 4421e7d2f5..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 @@ -2011,6 +2012,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 fb57ab9ffa..608c6943ea 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 @@ -2033,7 +2034,15 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Webhook key Retry count Toggle debug mode for more information. - Not OK status code + Not OK status code + 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/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) 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 ccc4915d6b..3a8a120bcd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IDataTypeRepository.cs @@ -17,4 +17,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/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.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/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()); } 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; + } } 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); diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index 4eeae15ca0..733638fd95 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -11,9 +11,7 @@ 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.OperationStatus; -using Umbraco.Cms.Core.Strings; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Services.Implement @@ -664,6 +662,12 @@ namespace Umbraco.Cms.Core.Services.Implement return await Task.FromResult(Attempt.SucceedWithStatus(DataTypeOperationStatus.Success, usages)); } + public IReadOnlyDictionary> GetListViewReferences(int id) + { + using ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true); + return _dataTypeRepository.FindListViewUsages(id); + } + /// public IEnumerable ValidateConfigurationData(IDataType dataType) { diff --git a/src/Umbraco.Core/Services/IDataTypeService.cs b/src/Umbraco.Core/Services/IDataTypeService.cs index ad593b6d0f..60b5c34af0 100644 --- a/src/Umbraco.Core/Services/IDataTypeService.cs +++ b/src/Umbraco.Core/Services/IDataTypeService.cs @@ -17,6 +17,7 @@ public interface IDataTypeService : IService /// [Obsolete("Please use GetReferencesAsync. Will be deleted in V15.")] IReadOnlyDictionary> GetReferences(int id); + IReadOnlyDictionary> GetListViewReferences(int id) => throw new NotImplementedException(); /// /// Returns a dictionary of content type s and the property type aliases that use a 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/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; } 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/Migrations/MigrationPlanExecutor.cs b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs index 94531c0b96..a3646ed5c9 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.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DataTypeRepository.cs index eb2533010b..94b1d06ede 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; @@ -128,6 +131,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.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/RteMacroRenderingValueConverter.cs index 5fe36f0517..c8fdefa508 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; } 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/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs index ce127a347a..60846f6b4f 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()) { } @@ -108,7 +129,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 @@ -125,7 +147,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/src/Umbraco.Web.BackOffice/Controllers/BackOfficeController.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeController.cs index acf83bb5bd..a32be8e30c 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeController.cs @@ -412,7 +412,8 @@ public class BackOfficeController : UmbracoController if (user == null) { // ... this should really not happen - return RedirectToLogin(new { flow = "external-login", status = "localUserNotFound" }); + TempData[ViewDataExtensions.TokenExternalSignInError] = new[] { "Local user does not exist" }; + return RedirectToLogin(new { flow = "external-login", status = "localUserNotFound", logout = "true"}); } ExternalLoginInfo? info = @@ -421,7 +422,9 @@ public class BackOfficeController : UmbracoController if (info == null) { // Add error and redirect for it to be displayed - return RedirectToLogin(new { flow = "external-login", status = "externalLoginInfoNotFound" }); + TempData[ViewDataExtensions.TokenExternalSignInError] = + new[] { "An error occurred, could not get external login info" }; + return RedirectToLogin(new { flow = "external-login", status = "externalLoginInfoNotFound", logout = "true"}); } IdentityResult addLoginResult = await _userManager.AddLoginAsync(user, info); @@ -434,7 +437,8 @@ public class BackOfficeController : UmbracoController } // Add errors and redirect for it to be displayed - return RedirectToLogin(new { flow = "external-login", status = "failed" }); + TempData[ViewDataExtensions.TokenExternalSignInError] = addLoginResult.Errors; + return RedirectToLogin(new { flow = "external-login", status = "failed", logout = "true" }); } /// @@ -455,8 +459,9 @@ public class BackOfficeController : UmbracoController _httpContextAccessor.HttpContext, ViewDataExtensions.TokenExternalSignInError, _jsonSerializer) || - ViewData.FromTempData(TempData, ViewDataExtensions.TokenExternalSignInError) || ViewData.FromTempData(TempData, ViewDataExtensions.TokenPasswordResetCode)) + ViewData.FromTempData(TempData, ViewDataExtensions.TokenExternalSignInError)) { + // Return early to let the client side handle the messaging return defaultResponse(); } diff --git a/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs index 117aa42f9a..f6a7e4919c 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/DataTypeController.cs @@ -433,7 +433,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); @@ -446,6 +447,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; } @@ -484,6 +500,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.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.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('[', ']', '(', ')', ':'); diff --git a/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs b/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs index 0e4f8b9723..1d1558026c 100644 --- a/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs +++ b/src/Umbraco.Web.BackOffice/Mapping/WebhookMapDefinition.cs @@ -43,6 +43,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; } diff --git a/src/Umbraco.Web.Common/Extensions/ViewDataExtensions.cs b/src/Umbraco.Web.Common/Extensions/ViewDataExtensions.cs index 7710152792..96c5e2f0f0 100644 --- a/src/Umbraco.Web.Common/Extensions/ViewDataExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/ViewDataExtensions.cs @@ -122,9 +122,11 @@ public static class ViewDataExtensions this ViewDataDictionary viewData, BackOfficeExternalLoginProviderErrors errors) => viewData[TokenExternalSignInError] = errors; + [Obsolete("This is deprecated and will be removed in V15")] public static string? GetPasswordResetCode(this ViewDataDictionary viewData) => (string?)viewData[TokenPasswordResetCode]; + [Obsolete("This is deprecated and will be removed in V15")] public static void SetPasswordResetCode(this ViewDataDictionary viewData, string value) => viewData[TokenPasswordResetCode] = value; 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 { diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 5339c7f0e9..642285aeaf 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/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 - - - - - + 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 } }; 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/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) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js index dacd9cdd84..d77306379a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnodepreview.directive.js @@ -85,9 +85,11 @@ @param {boolean} allowRemove (binding): Show/Hide the remove button. @param {boolean} allowOpen (binding): Show/Hide the open button. @param {boolean} allowEdit (binding): Show/Hide the edit button (Added in version 7.7.0). +@param {boolean} allowChange (binding): Show/Hide the change button (Added in version 10.1.0). @param {function} onRemove (expression): Callback function when the remove button is clicked. @param {function} onOpen (expression): Callback function when the open button is clicked. @param {function} onEdit (expression): Callback function when the edit button is clicked (Added in version 7.7.0). +@param {function} onChange (expression): Callback function when the change button is clicked (Added in version 10.1.0). @param {string} openUrl (binding): Fallback URL for onOpen (Added in version 7.12.0). @param {string} editUrl (binding): Fallback URL for onEdit (Added in version 7.12.0). @param {string} removeUrl (binding): Fallback URL for onRemove (Added in version 7.12.0). diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index cf284188f9..8ac3c170e9 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -432,22 +432,21 @@ table thead button:focus{ /* UI interactions */ -.ui-sortable-handle { - cursor: move; +.ui-sortable:not(.ui-sortable-disabled) .ui-sortable-handle { + cursor: move; } -.umb-table tbody.ui-sortable tr -{ - cursor:pointer; +.umb-table tbody.ui-sortable tr { + cursor: pointer; } .umb-table tbody.ui-sortable tr.ui-sortable-helper { background-color: @sortableHelperBg; border: none; } -.umb-table tbody.ui-sortable tr.ui-sortable-helper td - { - border:none; + +.umb-table tbody.ui-sortable tr.ui-sortable-helper td { + border: none; } .umb-table tbody.ui-sortable tr.ui-sortable-placeholder { 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"> 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"); + }); + } } 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.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 @@
+ + - + -
@@ -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'}}
diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.controller.js b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.controller.js index 7821ccb396..bf24d143ad 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.controller.js @@ -3,9 +3,39 @@ angular.module('umbraco') .controller("Umbraco.PrevalueEditors.TreeSourceController", - function($scope, $timeout, entityResource, iconHelper, editorService, eventsService){ + function ($scope, $filter, $timeout, $q, entityResource, angularHelper, iconHelper, editorService, eventsService, localizationService, udiService, udiParser) { - $scope.showXPath = false; + const vm = this; + + vm.clear = clear; + vm.clearXPath = clearXPath; + vm.clearDynamicStartNode = clearDynamicStartNode; + vm.chooseDynamicStartNode = chooseDynamicStartNode; + vm.chooseXPath = chooseXPath; + vm.openContentPicker = openContentPicker; + vm.openDynamicRootOriginPicker = openDynamicRootOriginPicker; + vm.appendDynamicQueryStep = appendDynamicQueryStep; + vm.removeQueryStep = removeQueryStep; + + vm.dynamicRootOrigin = null; + vm.querySteps = []; + vm.sortableModel = []; + + vm.sortableOptionsForQuerySteps = { + axis: "y", + containment: "parent", + distance: 10, + opacity: 0.7, + tolerance: "pointer", + scroll: true, + zIndex: 6000, + update: function (e, ui) { + setDirty(); + } + }; + + vm.showDynamicStartNode = false; + vm.showXPath = false; if (!$scope.model) { $scope.model = {}; @@ -21,8 +51,15 @@ angular.module('umbraco') }; } - if($scope.model.value.id && $scope.model.value.type !== "member"){ - entityResource.getById($scope.model.value.id, entityType()).then(function(item){ + if ($scope.model.value.dynamicRoot && $scope.model.value.dynamicRoot.querySteps) { + + vm.sortableModel = $scope.model.value.dynamicRoot.querySteps; + + syncRenderModel(); + } + + if ($scope.model.value.id && $scope.model.value.type !== "member") { + entityResource.getById($scope.model.value.id, entityType()).then(item => { populate(item); }); } else { @@ -33,7 +70,7 @@ angular.module('umbraco') function entityType() { var ent = "Document"; - if($scope.model.value.type === "media"){ + if ($scope.model.value.type === "media"){ ent = "Media"; } else if ($scope.model.value.type === "member") { @@ -42,8 +79,15 @@ angular.module('umbraco') return ent; } - $scope.openContentPicker = function() { - var treePicker = { + function setDirty() { + const currentForm = angularHelper.getCurrentForm($scope); + if (currentForm) { + currentForm.$setDirty(); + } + } + + function openContentPicker() { + const treePicker = { idType: $scope.model.config.idType, section: $scope.model.value.type, treeAlias: $scope.model.value.type, @@ -56,38 +100,44 @@ angular.module('umbraco') close: function() { editorService.close(); } - }; - editorService.treePicker(treePicker); - }; + }; - $scope.chooseXPath = function() { - $scope.showXPath = true; + editorService.treePicker(treePicker); + } + + function chooseXPath() { + vm.showXPath = true; $scope.model.value.dynamicRoot = null; - }; - $scope.chooseDynamicStartNode = function() { - $scope.showXPath = false; + } + + function chooseDynamicStartNode() { + vm.showXPath = false; $scope.model.value.dynamicRoot = { originAlias: "Parent", querySteps: [] }; - }; + } - $scope.clearXPath = function() { + function clearXPath() { + vm.showXPath = false; $scope.model.value.query = null; - $scope.showXPath = false; - }; - $scope.clearDynamicStartNode = function() { - $scope.model.value.dynamicRoot = null; - $scope.showDynamicStartNode = false; - }; + } - $scope.clear = function() { + function clearDynamicStartNode() { + vm.showDynamicStartNode = false; + vm.querySteps = []; + vm.sortableModel = []; + $scope.model.value.dynamicRoot = null; + setSortingState(vm.querySteps); + } + + function clear() { $scope.model.value.id = null; $scope.node = null; $scope.model.value.query = null; $scope.model.value.dynamicRoot = null; treeSourceChanged(); - }; + } function treeSourceChanged() { eventsService.emit("treeSourceChanged", { value: $scope.model.value.type }); @@ -95,7 +145,7 @@ angular.module('umbraco') //we always need to ensure we dont submit anything broken var unsubscribe = $scope.$on("formSubmitting", function (ev, args) { - if($scope.model.value.type === "member") { + if ($scope.model.value.type === "member") { $scope.model.value.id = null; $scope.model.value.query = ""; $scope.model.value.dynamicRoot = null; @@ -108,7 +158,7 @@ angular.module('umbraco') }); function populate(item) { - $scope.clear(); + clear(); item.icon = iconHelper.convertFromLegacyIcon(item.icon); $scope.node = item; $scope.node.path = ""; @@ -118,13 +168,69 @@ angular.module('umbraco') }); } + // Dynamic Root specific + $scope.$watch("model.value.dynamicRoot", function (newVal, oldVal) { - // Dynamic Root specific: + const alias = newVal ? newVal.originAlias : null; + const originKey = newVal ? newVal.originKey : null; + + if (!alias) { + vm.dynamicRootOrigin = null; + return; + } + + const icon = getIconForOriginAlias(alias); + const key = `dynamicRoot_origin${alias}Title`; + + vm.dynamicRootOrigin = { + alias: alias, + icon: icon + }; + + setSortingState(newVal.querySteps); + + if (originKey) { + const lookupId = udiService.build($scope.model.value.type === 'content' ? 'document' : $scope.model.value.type, originKey); + + vm.dynamicRootOrigin.description = "Loading..."; + //vm.dynamicRootOrigin.description = $filter('ncNodeName')(lookupId); + + const udi = udiParser.parse(lookupId); + if (udi) { + entityResource.getById(udi.value, udi.entityType).then(ent => { + vm.dynamicRootOrigin.description = ent.name; + }) + } + + } + + localizationService.localize(key).then(data => { + vm.dynamicRootOrigin.name = data; + }); + + }); + + $scope.$watchCollection("vm.sortableModel", function (newVal, oldVal) { + if (newVal !== oldVal) { + $scope.model.value.dynamicRoot.querySteps = newVal; + + syncRenderModel(); + } + }); + + function syncRenderModel() { + const promises = []; + + $scope.model.value.dynamicRoot.querySteps.forEach(x => { + promises.push(getDataForQueryStep(x)); + }); + + $q.all(promises).then(data => { + vm.querySteps = data; + setSortingState(vm.querySteps); + }); + } - $scope.dynamicRootOriginIcon = null; - $scope.$watch("model.value.dynamicRoot.originAlias", function (newVal, oldVal) { - $scope.dynamicRootOriginIcon = getIconForOriginAlias(newVal); - }) function getIconForOriginAlias(originAlias) { switch (originAlias) { case "Root": @@ -139,9 +245,9 @@ angular.module('umbraco') return "icon-wand"; } } - $scope.getIconForQueryStepAlias = getIconForQueryStepAlias; - function getIconForQueryStepAlias(originAlias) { - switch (originAlias) { + + function getIconForQueryStep(queryStep) { + switch (queryStep.alias) { case "NearestAncestorOrSelf": return "icon-chevron-up"; case "FurthestAncestorOrSelf": @@ -154,32 +260,82 @@ angular.module('umbraco') return "icon-lab"; } - $scope.sortableOptionsForQuerySteps = { - axis: "y", - containment: "parent", - distance: 10, - opacity: 0.7, - tolerance: "pointer", - scroll: true, - zIndex: 6000 - }; + function getNameKeyForQueryStep(queryStep) { - $scope.removeQueryStep = function (queryStep) { - var index = $scope.model.value.dynamicRoot.querySteps.indexOf(queryStep); - if(index !== -1) { + let key = ""; + + switch (queryStep.alias) { + case "NearestAncestorOrSelf": + case "FurthestAncestorOrSelf": + case "NearestDescendantOrSelf": + case "FurthestDescendantOrSelf": + key = `dynamicRoot_queryStep${queryStep.alias}Title`; + } + + return key; + } + + function getDataForQueryStep(queryStep) { + const deferred = $q.defer(); + + const icon = getIconForQueryStep(queryStep); + let nameKey = getNameKeyForQueryStep(queryStep); + + const keys = [ + nameKey, + "dynamicRoot_queryStepTypes" + ]; + + localizationService.localizeMany(keys).then(values => { + + const name = values[0] === "[]" ? queryStep.alias : values[0]; + let description = null; + + if (queryStep.anyOfDocTypeKeys && queryStep.anyOfDocTypeKeys.length > 0) { + description = (values[1] || "That matches types: ") + queryStep.anyOfDocTypeKeys.join(", ") + } + + const obj = { + alias: queryStep.alias, + name: name, + description: description, + icon: icon + }; + + deferred.resolve(obj); + + }); + + return deferred.promise; + } + + function removeQueryStep(queryStep, index) { + if (index !== -1) { $scope.model.value.dynamicRoot.querySteps.splice(index, 1); + vm.sortableModel = $scope.model.value.dynamicRoot.querySteps; + vm.querySteps.splice(index, 1); + setSortingState(vm.querySteps); } } - $scope.openDynamicRootOriginPicker = function() { - var originPicker = { + function setSortingState(items) { + // disable sorting if the list only consist of one item + if (items.length <= 1 || $scope.readonly) { + vm.sortableOptionsForQuerySteps.disabled = true; + } else { + vm.sortableOptionsForQuerySteps.disabled = false; + } + } + + function openDynamicRootOriginPicker() { + const originPicker = { view: "views/common/infiniteeditors/pickdynamicrootorigin/pickdynamicrootorigin.html", contentType: $scope.model.value.type, size: "small", value: {...$scope.model.value.dynamicRoot}, multiPicker: false, submit: function(model) { - $scope.model.value.dynamicRoot = model.value; + $scope.model.value.dynamicRoot = model.value; editorService.close(); }, close: function() { @@ -187,19 +343,32 @@ angular.module('umbraco') } }; editorService.open(originPicker); - }; + } - $scope.appendDynamicQueryStep = function() { - var queryStepPicker = { + function appendDynamicQueryStep() { + const queryStepPicker = { view: "views/common/infiniteeditors/pickdynamicrootquerystep/pickdynamicrootquerystep.html", contentType: $scope.model.value.type, size: "small", multiPicker: false, submit: function(model) { - if(!$scope.model.value.dynamicRoot.querySteps) { + if (!$scope.model.value.dynamicRoot.querySteps) { $scope.model.value.dynamicRoot.querySteps = []; } + $scope.model.value.dynamicRoot.querySteps.push(model.value); + + vm.sortableModel = $scope.model.value.dynamicRoot.querySteps; + + const promises = [ + getDataForQueryStep(model.value) + ]; + + $q.all(promises).then(data => { + vm.querySteps.push(data[0]); + setSortingState(vm.querySteps); + }); + editorService.close(); }, close: function() { @@ -207,5 +376,6 @@ angular.module('umbraco') } }; editorService.open(queryStepPicker); - }; + } + }); 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..a0cc2496ad 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html @@ -1,48 +1,49 @@ -
+
-
Root node
+ + ng-if="node" + class="mt1" + icon="node.icon" + name="node.name" + published="node.published" + description="node.path" + allow-remove="true" + allow-edit="true" + on-remove="vm.clear()" + on-edit="vm.openContentPicker()">
-
+
-
+
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:', '}} - -
    -
    -
    -
    - -
    -
    + +
    + +
    -
    • - +
    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(); + } + } }); } 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 @@
    - - + + 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}}