From b2a2df7a8a0979a54bc2297b1346b6a99a1dc495 Mon Sep 17 00:00:00 2001 From: Jason Elkin Date: Thu, 22 Aug 2024 21:01:21 +0100 Subject: [PATCH 001/167] Ignore Visual Studio's generated launchSettings file. --- tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore new file mode 100644 index 000000000000..ff99115ae5ae --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore @@ -0,0 +1,2 @@ +# Ignore Visual Studio's generated launchSettings file. +Properties/launchSettings.json From a47a1775f22be137cb6cffe400f911d8202acf35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nick=20Ho=C3=A0ng?= <4602123+nick-hoang@users.noreply.github.com> Date: Tue, 3 Sep 2024 06:54:32 +0700 Subject: [PATCH 002/167] Prevent templates being editable when using Production runtime mode (#16923) Co-authored-by: Nick Hoang Co-authored-by: Jason Elkin --- src/Umbraco.Web.UI.Client/src/views/templates/edit.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index a5527095d79a..76bb769c9e89 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -127,6 +127,7 @@ type="submit" button-style="success" state="vm.page.saveButtonState" + disabled="vm.runtimeModeProduction" shortcut="ctrl+s" label="Save" label-key="buttons_save"> From 3e6116fcbafebeaa4fed3a209855cc6bb717cfa6 Mon Sep 17 00:00:00 2001 From: Miguel Pinto Date: Thu, 5 Sep 2024 14:08:48 +0200 Subject: [PATCH 003/167] No longer shows success message if content moving is cancelled (#15051) * Fix for issue https://github.com/umbraco/Umbraco-CMS/issues/13923 - Added AttemptMove method to the ContentService - Updated ContentController PostMove method to return ValidationProblem whenever the node is not moved * Align changes with V14 solution. Make it non breaking. --------- Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> --- src/Umbraco.Core/Services/ContentService.cs | 20 ++++++++++++------- src/Umbraco.Core/Services/IContentService.cs | 16 +++++++++++++++ .../Controllers/ContentController.cs | 7 ++++++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index e723bfcdd284..8bdaba271ecf 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -2448,22 +2448,26 @@ public OperationResult MoveToRecycleBin(IContent content, int userId = Constants /// The to move /// Id of the Content's new Parent /// Optional Id of the User moving the Content - public void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId) + public void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId) => + AttemptMove(content, parentId, userId); + + /// + [Obsolete("Adds return type to Move method. Will be removed in V14, as the original method will be adjusted.")] + public OperationResult AttemptMove(IContent content, int parentId, int userId = Constants.Security.SuperUserId) { + EventMessages eventMessages = EventMessagesFactory.Get(); + if (content.ParentId == parentId) { - return; + return OperationResult.Succeed(eventMessages); } // if moving to the recycle bin then use the proper method if (parentId == Constants.System.RecycleBinContent) { - MoveToRecycleBin(content, userId); - return; + return MoveToRecycleBin(content, userId); } - EventMessages eventMessages = EventMessagesFactory.Get(); - var moves = new List<(IContent, string)>(); using (ICoreScope scope = ScopeProvider.CreateCoreScope()) @@ -2482,7 +2486,7 @@ public void Move(IContent content, int parentId, int userId = Constants.Security if (scope.Notifications.PublishCancelable(movingNotification)) { scope.Complete(); - return; // causes rollback + return OperationResult.Cancel(eventMessages);// causes rollback } // if content was trashed, and since we're not moving to the recycle bin, @@ -2517,6 +2521,8 @@ public void Move(IContent content, int parentId, int userId = Constants.Security scope.Complete(); } + + return OperationResult.Succeed(eventMessages); } // MUST be called from within WriteLock diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index 0d3cc80b8208..1733a741425e 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -1,3 +1,4 @@ +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Persistence.Querying; @@ -315,6 +316,21 @@ public interface IContentService : IContentServiceBase /// void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId); + /// + /// Attempts to move the to under the node with id . + /// + /// The that shall be moved. + /// The id of the new parent node. + /// Id of the user attempting to move . + /// Success if moving succeeded, otherwise Failed. + [Obsolete("Adds return type to Move method. Will be removed in V14, as the original method will be adjusted.")] + OperationResult + AttemptMove(IContent content, int parentId, int userId = Constants.Security.SuperUserId) + { + Move(content, parentId, userId); + return OperationResult.Succeed(new EventMessages()); + } + /// /// Copies a document. /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs index 81b37bb10819..62cbae301270 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentController.cs @@ -2254,7 +2254,12 @@ public async Task PostSort(ContentSortOrder sorted) return null; } - _contentService.Move(toMove, move.ParentId, _backofficeSecurityAccessor.BackOfficeSecurity?.GetUserId().Result ?? -1); + OperationResult moveResult = _contentService.AttemptMove(toMove, move.ParentId, _backofficeSecurityAccessor.BackOfficeSecurity?.GetUserId().Result ?? -1); + + if (!moveResult.Success) + { + return ValidationProblem(); + } return Content(toMove.Path, MediaTypeNames.Text.Plain, Encoding.UTF8); } From 3667217053b9643d6369fe360ed7f012c12ffdf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 17 Sep 2024 09:51:47 +0200 Subject: [PATCH 004/167] only resolve if value is present (#17070) --- .../src/common/services/rte-blockeditor-clipboard.service.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/rte-blockeditor-clipboard.service.js b/src/Umbraco.Web.UI.Client/src/common/services/rte-blockeditor-clipboard.service.js index 216b7fe1e860..0a1aee1f277c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/rte-blockeditor-clipboard.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/rte-blockeditor-clipboard.service.js @@ -50,13 +50,13 @@ function rawRteBlockResolver(propertyValue, propPasteResolverMethod) { - if (propertyValue != null && typeof propertyValue === "object") { + if (propertyValue && typeof propertyValue === "object" && propertyValue.markup) { // object property of 'blocks' holds the data for the Block Editor. var value = propertyValue.blocks; // we got an object, and it has these three props then we are most likely dealing with a Block Editor. - if ((value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) { + if ((value && value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) { // replaceUdisOfObject replaces udis of the value object(by instance reference), but also returns the updated markup (as we cant update the reference of a string). propertyValue.markup = replaceUdisOfObject(value.layout, value, propertyValue.markup); From d58768f26d1db7bf6b6a4628c10f7aa61012ad94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 17 Sep 2024 09:52:00 +0200 Subject: [PATCH 005/167] utilize lock unlock events for readonly mode while saving (#17077) --- .../components/content/edit.controller.js | 7 +++++-- .../content/umbtabbedcontent.directive.js | 13 ++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 8a8ae0a36b5d..e3b3ba413c51 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -5,7 +5,7 @@ appState, contentResource, entityResource, navigationService, notificationsService, contentAppHelper, serverValidationManager, contentEditingHelper, localizationService, formHelper, umbRequestHelper, editorState, $http, eventsService, overlayService, $location, localStorageService, treeService, - $exceptionHandler, uploadTracker) { + $exceptionHandler, uploadTracker) { var evts = []; var infiniteMode = $scope.infiniteModel && $scope.infiniteModel.infiniteMode; @@ -497,6 +497,7 @@ //Set them all to be invalid var fieldsToRollback = checkValidility(); eventsService.emit("content.saving", { content: $scope.content, action: args.action }); + eventsService.emit("form.lock"); return contentEditingHelper.contentEditorPerformSave({ saveMethod: args.saveMethod, @@ -517,6 +518,7 @@ syncTreeNode($scope.content, data.path, false, args.reloadChildren); eventsService.emit("content.saved", { content: $scope.content, action: args.action, valid: true }); + eventsService.emit("form.unlock"); if($scope.contentForm.$invalid !== true) { resetNestedFieldValiation(fieldsToRollback); @@ -534,6 +536,7 @@ if (err && err.status === 400 && err.data) { // content was saved but is invalid. eventsService.emit("content.saved", { content: $scope.content, action: args.action, valid: false }); + eventsService.emit("form.unlock"); } return $q.reject(err); @@ -1002,7 +1005,7 @@ const openPreviewWindow = (url, target) => { // Chromes popup blocker will kick in if a window is opened // without the initial scoped request. This trick will fix that. - + const previewWindow = $window.open(url, target); previewWindow.addEventListener('load', () => { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js index f003e1afa633..e76da32a545b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js @@ -2,7 +2,7 @@ 'use strict'; /** This directive is used to render out the current variant tabs and properties and exposes an API for other directives to consume */ - function tabbedContentDirective($timeout, $filter, contentEditingHelper, contentTypeHelper) { + function tabbedContentDirective($timeout, $filter, contentEditingHelper, contentTypeHelper, eventsService) { function link($scope, $element) { @@ -156,14 +156,13 @@ } }); - $scope.$on("formSubmitting", function() { - $scope.allowUpdate = false; + eventsService.on("form.lock", function() { + $scope.$evalAsync(() => { + $scope.allowUpdate = false; + }); }); - $scope.$on("formSubmitted", function() { - setAllowUpdate(); - }); - $scope.$on("formSubmittedValidationFailed", function() { + eventsService.on("form.unlock", function() { setAllowUpdate(); }); From eb0f8b5c24f0e5d1dbdfc98069a874def891c833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 17 Sep 2024 10:06:16 +0200 Subject: [PATCH 006/167] fire change event (#17078) --- .../src/common/services/tinymce.service.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js index 18707c1f60d5..7ed6b9ee500b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js @@ -1056,6 +1056,10 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s editor.undoManager.clear(); } } + + angularHelper.safeApply($rootScope, function () { + editor.dispatch("Change"); + }); }); }); From d64bf5de2207798b58609f2cbe2c4a06a3b7761c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20=C3=96hman?= Date: Tue, 17 Sep 2024 13:56:58 +0200 Subject: [PATCH 007/167] v13.5 - New Swedish translation crashes Umbraco, removed duplicate areas. (#17059) --- .../EmbeddedResources/Lang/sv.xml | 3 --- .../Services/LocalizedTextService.cs | 25 +++++++++++++------ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml index 0a688083eb19..47a787aada14 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml @@ -4,9 +4,6 @@ The Umbraco community https://docs.umbraco.com/umbraco-cms/extending/language-files - - Innehåll - Hantera domännamn Hantera versioner diff --git a/src/Umbraco.Core/Services/LocalizedTextService.cs b/src/Umbraco.Core/Services/LocalizedTextService.cs index 1634f60baa36..51012200bd05 100644 --- a/src/Umbraco.Core/Services/LocalizedTextService.cs +++ b/src/Umbraco.Core/Services/LocalizedTextService.cs @@ -350,7 +350,13 @@ private IDictionary> GetAreaStoredTranslatio IEnumerable areas = xmlSource[cult].Value.XPathSelectElements("//area"); foreach (XElement area in areas) { - var result = new Dictionary(StringComparer.InvariantCulture); + var areaAlias = area.Attribute("alias")!.Value; + + if (!overallResult.TryGetValue(areaAlias, out IDictionary? result)) + { + result = new Dictionary(StringComparer.InvariantCulture); + } + IEnumerable keys = area.XPathSelectElements("./key"); foreach (XElement key in keys) { @@ -364,7 +370,10 @@ private IDictionary> GetAreaStoredTranslatio } } - overallResult.Add(area.Attribute("alias")!.Value, result); + if (!overallResult.ContainsKey(areaAlias)) + { + overallResult.Add(areaAlias, result); + } } // Merge English Dictionary @@ -374,11 +383,11 @@ private IDictionary> GetAreaStoredTranslatio IEnumerable enUS = xmlSource[englishCulture].Value.XPathSelectElements("//area"); foreach (XElement area in enUS) { - IDictionary - result = new Dictionary(StringComparer.InvariantCulture); - if (overallResult.ContainsKey(area.Attribute("alias")!.Value)) + var areaAlias = area.Attribute("alias")!.Value; + + if (!overallResult.TryGetValue(areaAlias, out IDictionary? result)) { - result = overallResult[area.Attribute("alias")!.Value]; + result = new Dictionary(StringComparer.InvariantCulture); } IEnumerable keys = area.XPathSelectElements("./key"); @@ -394,9 +403,9 @@ private IDictionary> GetAreaStoredTranslatio } } - if (!overallResult.ContainsKey(area.Attribute("alias")!.Value)) + if (!overallResult.ContainsKey(areaAlias)) { - overallResult.Add(area.Attribute("alias")!.Value, result); + overallResult.Add(areaAlias, result); } } } From 6a453a091060479960ddca786b748184a7ad6d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20=C3=96hman?= Date: Tue, 17 Sep 2024 13:56:58 +0200 Subject: [PATCH 008/167] v13.5 - New Swedish translation crashes Umbraco, removed duplicate areas. (#17059) Cherry-picked from d64bf5de2207798b58609f2cbe2c4a06a3b7761c --- .../EmbeddedResources/Lang/sv.xml | 3 --- .../Services/LocalizedTextService.cs | 25 +++++++++++++------ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml index 0a688083eb19..47a787aada14 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml @@ -4,9 +4,6 @@ The Umbraco community https://docs.umbraco.com/umbraco-cms/extending/language-files - - Innehåll - Hantera domännamn Hantera versioner diff --git a/src/Umbraco.Core/Services/LocalizedTextService.cs b/src/Umbraco.Core/Services/LocalizedTextService.cs index 1634f60baa36..51012200bd05 100644 --- a/src/Umbraco.Core/Services/LocalizedTextService.cs +++ b/src/Umbraco.Core/Services/LocalizedTextService.cs @@ -350,7 +350,13 @@ private IDictionary> GetAreaStoredTranslatio IEnumerable areas = xmlSource[cult].Value.XPathSelectElements("//area"); foreach (XElement area in areas) { - var result = new Dictionary(StringComparer.InvariantCulture); + var areaAlias = area.Attribute("alias")!.Value; + + if (!overallResult.TryGetValue(areaAlias, out IDictionary? result)) + { + result = new Dictionary(StringComparer.InvariantCulture); + } + IEnumerable keys = area.XPathSelectElements("./key"); foreach (XElement key in keys) { @@ -364,7 +370,10 @@ private IDictionary> GetAreaStoredTranslatio } } - overallResult.Add(area.Attribute("alias")!.Value, result); + if (!overallResult.ContainsKey(areaAlias)) + { + overallResult.Add(areaAlias, result); + } } // Merge English Dictionary @@ -374,11 +383,11 @@ private IDictionary> GetAreaStoredTranslatio IEnumerable enUS = xmlSource[englishCulture].Value.XPathSelectElements("//area"); foreach (XElement area in enUS) { - IDictionary - result = new Dictionary(StringComparer.InvariantCulture); - if (overallResult.ContainsKey(area.Attribute("alias")!.Value)) + var areaAlias = area.Attribute("alias")!.Value; + + if (!overallResult.TryGetValue(areaAlias, out IDictionary? result)) { - result = overallResult[area.Attribute("alias")!.Value]; + result = new Dictionary(StringComparer.InvariantCulture); } IEnumerable keys = area.XPathSelectElements("./key"); @@ -394,9 +403,9 @@ private IDictionary> GetAreaStoredTranslatio } } - if (!overallResult.ContainsKey(area.Attribute("alias")!.Value)) + if (!overallResult.ContainsKey(areaAlias)) { - overallResult.Add(area.Attribute("alias")!.Value, result); + overallResult.Add(areaAlias, result); } } } From 842cacde1923beaa90b373dab6844c6a009f8bd7 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 17 Sep 2024 14:50:57 +0200 Subject: [PATCH 009/167] Bump version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index ff1a0edbe511..cb406a4d2210 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "13.5.0", + "version": "13.5.1", "assemblyVersion": { "precision": "build" }, From 6939472f37c94d070ba8b8622293f9ac10c83d20 Mon Sep 17 00:00:00 2001 From: Terence Burridge Date: Wed, 20 Mar 2024 17:58:48 +0000 Subject: [PATCH 010/167] Update valid reasons not to have a template on a content node to include having a redirect field Cherry-picked from: 385a5345b1dcd1fbc20afb854cfeff1c36f52210 --- src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs index d8fbca45d48e..c46bb890b147 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs @@ -128,11 +128,12 @@ private async Task CheckNoTemplateAsync( IPublishedRequest request = def.PublishedRequest; // Here we need to check if there is no hijacked route and no template assigned but there is a content item. - // If this is the case we want to return a blank page. + // If this is the case we want to return a blank page, the only exception being if the content item has a redirect field present. // We also check if templates have been disabled since if they are then we're allowed to render even though there's no template, // for example for json rendering in headless. if (request.HasPublishedContent() && !request.HasTemplate() + && !request.IsRedirect() && !_umbracoFeatures.Disabled.DisableTemplates && !hasHijackedRoute) { From 9b19d63a6a4ea44bd4b56bbb0874284a1bc5ba52 Mon Sep 17 00:00:00 2001 From: NguyenThuyLan <116753400+NguyenThuyLan@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:19:09 +0700 Subject: [PATCH 011/167] update ImageSharpMiddlewareOption for fixing invalid width and height (#17126) Co-authored-by: Lan Nguyen Thuy --- .../ConfigureImageSharpMiddlewareOptions.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs index 9a1ecead89b2..1ef672270ef8 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Options; @@ -48,16 +49,26 @@ public void Configure(ImageSharpMiddlewareOptions options) return Task.CompletedTask; } - int width = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), context.Culture); - if (width <= 0 || width > _imagingSettings.Resize.MaxWidth) + if (context.Commands.Contains(ResizeWebProcessor.Width)) { - context.Commands.Remove(ResizeWebProcessor.Width); + if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), NumberStyles.Integer, + CultureInfo.InvariantCulture, out var width) + || width < 0 + || width >= _imagingSettings.Resize.MaxWidth) + { + context.Commands.Remove(ResizeWebProcessor.Width); + } } - int height = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), context.Culture); - if (height <= 0 || height > _imagingSettings.Resize.MaxHeight) + if (context.Commands.Contains(ResizeWebProcessor.Height)) { - context.Commands.Remove(ResizeWebProcessor.Height); + if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), NumberStyles.Integer, + CultureInfo.InvariantCulture, out var height) + || height < 0 + || height >= _imagingSettings.Resize.MaxHeight) + { + context.Commands.Remove(ResizeWebProcessor.Height); + } } return Task.CompletedTask; From a40eadcfcee4413ed2d7fcc0928f615ea9aabddc Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Thu, 26 Sep 2024 07:52:39 +0200 Subject: [PATCH 012/167] Add `RemoveDefault()` extension method to fluent API for CMS webhook events (#15424) * Add RemoveDefault extension method * Move default webhook event types to single list (cherry picked from commit 8f26263178656f092972e845e332962e9e158f1e) --- ...hookEventCollectionBuilderCmsExtensions.cs | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Webhooks/WebhookEventCollectionBuilderCmsExtensions.cs b/src/Umbraco.Core/Webhooks/WebhookEventCollectionBuilderCmsExtensions.cs index 361891de6a13..679e105b72d5 100644 --- a/src/Umbraco.Core/Webhooks/WebhookEventCollectionBuilderCmsExtensions.cs +++ b/src/Umbraco.Core/Webhooks/WebhookEventCollectionBuilderCmsExtensions.cs @@ -9,6 +9,15 @@ namespace Umbraco.Cms.Core.DependencyInjection; /// public static class WebhookEventCollectionBuilderCmsExtensions { + private static readonly Type[] _defaultTypes = + [ + typeof(ContentDeletedWebhookEvent), + typeof(ContentPublishedWebhookEvent), + typeof(ContentUnpublishedWebhookEvent), + typeof(MediaDeletedWebhookEvent), + typeof(MediaSavedWebhookEvent), + ]; + /// /// Adds the default webhook events. /// @@ -21,12 +30,24 @@ public static class WebhookEventCollectionBuilderCmsExtensions /// public static WebhookEventCollectionBuilderCms AddDefault(this WebhookEventCollectionBuilderCms builder) { - builder.Builder - .Add() - .Add() - .Add() - .Add() - .Add(); + builder.Builder.Add(_defaultTypes); + + return builder; + } + + /// + /// Removes the default webhook events. + /// + /// The builder. + /// + /// The builder. + /// + public static WebhookEventCollectionBuilderCms RemoveDefault(this WebhookEventCollectionBuilderCms builder) + { + foreach (Type type in _defaultTypes) + { + builder.Builder.Remove(type); + } return builder; } From f1cddd91c6e85e4ed454fa42578eb98ca1728aef Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 26 Sep 2024 09:54:43 +0200 Subject: [PATCH 013/167] Missing context complete (cherry picked from commit fdb9cfa3e7ada8db6effb6ce7cb9a58f09817538) --- .../Migrations/Upgrade/V_14_0_0/AddGuidsToUserGroups.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/AddGuidsToUserGroups.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/AddGuidsToUserGroups.cs index 67bdaf7395ce..461ed59c8eee 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/AddGuidsToUserGroups.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/AddGuidsToUserGroups.cs @@ -23,6 +23,7 @@ protected override void Migrate() // If the new column already exists we'll do nothing. if (ColumnExists(Constants.DatabaseSchema.Tables.UserGroup, NewColumnName)) { + Context.Complete(); return; } @@ -31,10 +32,12 @@ protected override void Migrate() if (DatabaseType != DatabaseType.SQLite) { MigrateSqlServer(); + Context.Complete(); return; } MigrateSqlite(); + Context.Complete(); } private void MigrateSqlServer() From c9c9374de1150019f6d484b74038742edd1d1e93 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 26 Sep 2024 14:39:12 +0200 Subject: [PATCH 014/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index a5500fd8de2f..b2c598f6ef0b 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit a5500fd8de2fb14285d8f99cd3d5edeb1c5eb462 +Subproject commit b2c598f6ef0b62bb64186c61125f4d00177b48ca From 45f43a6b7ac632a76d4bd0f70176c37b69cdbf6c Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Fri, 27 Sep 2024 10:36:15 +0700 Subject: [PATCH 015/167] V14 Added Content tests with different document types properties (#17131) * Added tests for Allow At Root property * Added Content tests for Allowed Child Nodes property * Added Content tests for the Allow at root property * Added Content tests for the Allowed child node property * Added Content tests for the Collection property * Added Content tests with allow vary by culture * Added more waits * Updated tests due to api helper changes * Added Content tests with allowed templates * Bumped version of test helper * Updated code due to api helper changes * Fixed naming --- .../package-lock.json | 9 +- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../ContentWithAllowAtRoot.spec.ts | 27 ++++ .../ContentWithAllowVaryByCulture.spec.ts | 128 ++++++++++++++++ .../ContentWithAllowedChildNodes.spec.ts | 98 +++++++++++++ .../ContentWithAllowedTemplates.spec.ts | 66 +++++++++ .../ContentWithCollections.spec.ts | 138 ++++++++++++++++++ .../DocumentTypeDesignTab.spec.ts | 2 +- 8 files changed, 463 insertions(+), 7 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowVaryByCulture.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedChildNodes.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedTemplates.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithCollections.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index bb227d8a121a..99eeb24f0a52 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "dependencies": { "@umbraco/json-models-builders": "^2.0.20", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.84", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.86", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -64,10 +64,9 @@ } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.84", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.84.tgz", - "integrity": "sha512-vH13Lg48knTkkLVTwhMXUKTOdjtmixFj0wF5Qhgb++13u4AVDb+oW+TbFwTjSYaLeNMraq5Uhwmto/XuJPs2Rw==", - "license": "MIT", + "version": "2.0.0-beta.86", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.86.tgz", + "integrity": "sha512-tF7nJCMgBJwaPtxWAuDOJ9lc3T11aO6ped9AxzAJTmzFdSJG16w8jzjWiNgCaU2xRsw5fRyos+I1YrFW249vLw==", "dependencies": { "@umbraco/json-models-builders": "2.0.20", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 30706ad5de01..a6949b54fa36 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.20", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.84", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.86", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts new file mode 100644 index 000000000000..f02822053331 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts @@ -0,0 +1,27 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const documentTypeName = 'TestDocumentTypeForContent'; + +test.beforeEach(async ({umbracoApi, umbracoUi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoUi.goToBackOffice(); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('cannot create content if allow at root is disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const noAllowedDocumentTypeAvailableMessage = 'There are no allowed Document Types available for creating content here'; + await umbracoApi.documentType.createDefaultDocumentType(documentTypeName); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + + // Assert + await umbracoUi.content.isDocumentTypeNameVisible(documentTypeName, false); + await umbracoUi.content.doesModalHaveText(noAllowedDocumentTypeAvailableMessage); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowVaryByCulture.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowVaryByCulture.spec.ts new file mode 100644 index 000000000000..1c9fbc542f21 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowVaryByCulture.spec.ts @@ -0,0 +1,128 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; +const secondLanguageName = 'Danish'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.language.ensureNameNotExists(secondLanguageName); + await umbracoApi.language.createDanishLanguage(); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.language.ensureNameNotExists(secondLanguageName); +}); + +test('can create content with allow vary by culture enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.documentType.createDocumentTypeWithAllowVaryByCulture(documentTypeName); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + await umbracoUi.content.clickSaveAndCloseButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); +}); + +test('can create content with names that vary by culture', async ({umbracoApi, umbracoUi}) => { + // Arrange + const danishContentName = 'Test indhold'; + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowVaryByCulture(documentTypeName); + await umbracoApi.document.createDefaultDocumentWithEnglishCulture(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickVariantSelectorButton(); + await umbracoUi.content.clickVariantAddModeButton(); + await umbracoUi.content.enterContentName(danishContentName); + await umbracoUi.content.clickSaveButton(); + await umbracoUi.content.clickSaveAndCloseButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(danishContentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(danishContentName); + expect(contentData.variants.length).toBe(2); + expect(contentData.variants[0].name).toBe(contentName); + expect(contentData.variants[1].name).toBe(danishContentName); +}); + +test('can create content with names that vary by culture and content that is invariant', async ({umbracoApi, umbracoUi}) => { + // Arrange + const danishContentName = 'Test indhold'; + const textContent = 'This is a test text'; + const danishTextContent = 'Dette er testtekst'; + const dataTypeName = 'Textstring'; + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id, 'Test Group', false); + await umbracoApi.document.createDocumentWithEnglishCultureAndTextContent(contentName, documentTypeId, textContent, dataTypeName); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickVariantSelectorButton(); + await umbracoUi.content.clickVariantAddModeButton(); + await umbracoUi.content.enterContentName(danishContentName); + await umbracoUi.content.enterTextstring(danishTextContent); + await umbracoUi.content.clickSaveButton(); + await umbracoUi.content.clickSaveAndCloseButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(danishContentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(danishContentName); + expect(contentData.variants.length).toBe(2); + expect(contentData.variants[0].name).toBe(contentName); + expect(contentData.variants[1].name).toBe(danishContentName); + expect(contentData.values.length).toBe(1); + expect(contentData.values[0].value).toBe(danishTextContent); +}); + +test('can create content with names and content that vary by culture', async ({umbracoApi, umbracoUi}) => { + // Arrange + const danishContentName = 'Test indhold'; + const textContent = 'This is a test text'; + const danishTextContent = 'Dette er testtekst'; + const dataTypeName = 'Textstring'; + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id, 'Test Group', true); + await umbracoApi.document.createDocumentWithEnglishCultureAndTextContent(contentName, documentTypeId, textContent, dataTypeName, true); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickVariantSelectorButton(); + await umbracoUi.content.clickVariantAddModeButton(); + await umbracoUi.content.enterContentName(danishContentName); + await umbracoUi.content.enterTextstring(danishTextContent); + await umbracoUi.content.clickSaveButton(); + await umbracoUi.content.clickSaveAndCloseButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(danishContentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(danishContentName); + expect(contentData.variants.length).toBe(2); + expect(contentData.variants[0].name).toBe(contentName); + expect(contentData.variants[1].name).toBe(danishContentName); + expect(contentData.values.length).toBe(2); + expect(contentData.values[0].value).toBe(textContent); + expect(contentData.values[1].value).toBe(danishTextContent); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedChildNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedChildNodes.spec.ts new file mode 100644 index 000000000000..2016a0ee4c27 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedChildNodes.spec.ts @@ -0,0 +1,98 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; + +test.beforeEach(async ({umbracoApi, umbracoUi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoUi.goToBackOffice(); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can create content with allowed child node enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeName = 'Test Child Document Type'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.documentType.createDocumentTypeWithAllowedChildNode(documentTypeName, childDocumentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + + // Clean + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); +}); + +test('cannot create child content if allowed child node is disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const noAllowedDocumentTypeAvailableMessage = 'There are no allowed Document Types available for creating content here'; + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickCreateButton(); + + // Assert + await umbracoUi.content.isDocumentTypeNameVisible(documentTypeName, false); + await umbracoUi.content.doesModalHaveText(noAllowedDocumentTypeAvailableMessage); +}); + +test('can create multiple child nodes with different document types', async ({umbracoApi, umbracoUi}) => { + // Arrange + const firstChildDocumentTypeName = 'First Child Document Type'; + const secondChildDocumentTypeName = 'Second Child Document Type'; + const firstChildContentName = 'First Child Content'; + const secondChildContentName = 'Second Child Content'; + const firstChildDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(firstChildDocumentTypeName); + const secondChildDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(secondChildDocumentTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedTwoChildNodes(documentTypeName, firstChildDocumentTypeId, secondChildDocumentTypeId); + const contentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(firstChildContentName, firstChildDocumentTypeId, contentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(secondChildDocumentTypeName); + // This wait is needed + await umbracoUi.waitForTimeout(500); + await umbracoUi.content.enterContentName(secondChildContentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(secondChildContentName)).toBeTruthy(); + const childData = await umbracoApi.document.getChildren(contentId); + expect(childData.length).toBe(2); + expect(childData[0].variants[0].name).toBe(firstChildContentName); + expect(childData[1].variants[0].name).toBe(secondChildContentName); + // verify that the child content displays in the tree after reloading children + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickReloadButton(); + await umbracoUi.content.clickCaretButtonForContentName(contentName); + await umbracoUi.content.doesContentTreeHaveName(firstChildContentName); + await umbracoUi.content.doesContentTreeHaveName(secondChildContentName); + + // Clean + await umbracoApi.document.ensureNameNotExists(firstChildContentName); + await umbracoApi.document.ensureNameNotExists(secondChildContentName); + await umbracoApi.documentType.ensureNameNotExists(firstChildDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(secondChildDocumentTypeName); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedTemplates.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedTemplates.spec.ts new file mode 100644 index 000000000000..f58d86c36e9a --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowedTemplates.spec.ts @@ -0,0 +1,66 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; +const templateName = 'TestTemplate'; +let templateId = ''; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.template.ensureNameNotExists(templateName); + templateId = await umbracoApi.template.createDefaultTemplate(templateName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +test('can create content with an allowed template', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.documentType.createDocumentTypeWithAllowedTemplate(documentTypeName, templateId, true); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.template.id).toBe(templateId); +}); + +test('can create content with multiple allowed templates', async ({umbracoApi, umbracoUi}) => { + // Arrange + const defaultTemplateName = 'TestDefaultTemplate'; + await umbracoApi.template.ensureNameNotExists(defaultTemplateName); + const defaultTemplateId = await umbracoApi.template.createDefaultTemplate(templateName); + await umbracoApi.documentType.createDocumentTypeWithTwoAllowedTemplates(documentTypeName, templateId, defaultTemplateId, true, defaultTemplateId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.template.id).toBe(defaultTemplateId); + + // Clean + await umbracoApi.template.ensureNameNotExists(defaultTemplateName); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithCollections.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithCollections.spec.ts new file mode 100644 index 000000000000..837f7ababa9a --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithCollections.spec.ts @@ -0,0 +1,138 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; +const childDocumentTypeName = 'TestChildDocumentType'; +const firstChildContentName = 'First Child Content'; +const secondChildContentName = 'Second Child Content'; +const dataTypeName = 'List View - Content'; +let dataTypeData; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can create content configured as a collection', async ({umbracoApi, umbracoUi}) => { + // Arrange + const noItemsToShowMessage = 'There are no items to show in the list.'; + await umbracoApi.documentType.createDocumentTypeWithCollectionId(documentTypeName, dataTypeData.id); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.isTabNameVisible('Collection'); + await umbracoUi.content.doesDocumentWorkspaceHaveText(noItemsToShowMessage); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); +}); + +test('can create child content in a collection', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedNames = [firstChildContentName]; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndCollectionId(documentTypeName, childDocumentTypeId, dataTypeData.id); + const contentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(childDocumentTypeName); + // This wait is needed + await umbracoUi.waitForTimeout(500); + await umbracoUi.content.enterContentName(firstChildContentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + const childData = await umbracoApi.document.getChildren(contentId); + expect(childData.length).toBe(expectedNames.length); + expect(childData[0].variants[0].name).toBe(firstChildContentName); + // verify that the child content displays in collection list after reloading tree + await umbracoUi.waitForTimeout(1000); + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickReloadButton(); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.doesDocumentTableColumnNameValuesMatch(expectedNames); + + // Clean + await umbracoApi.document.ensureNameNotExists(firstChildContentName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); +}); + +test('can create multiple child nodes in a collection', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedNames = [secondChildContentName, firstChildContentName]; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndCollectionId(documentTypeName, childDocumentTypeId, dataTypeData.id); + const contentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(firstChildContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(childDocumentTypeName); + // This wait is needed + await umbracoUi.waitForTimeout(500); + await umbracoUi.content.enterContentName(secondChildContentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + const childData = await umbracoApi.document.getChildren(contentId); + expect(childData.length).toBe(expectedNames.length); + expect(childData[0].variants[0].name).toBe(firstChildContentName); + expect(childData[1].variants[0].name).toBe(secondChildContentName); + // verify that the child content displays in collection list after reloading tree + await umbracoUi.waitForTimeout(1000); + await umbracoUi.content.clickActionsMenuForContent(contentName); + await umbracoUi.content.clickReloadButton(); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.doesDocumentTableColumnNameValuesMatch(expectedNames); + + // Clean + await umbracoApi.document.ensureNameNotExists(firstChildContentName); + await umbracoApi.document.ensureNameNotExists(secondChildContentName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); +}); + +test('can search in a collection of content', async ({umbracoApi, umbracoUi}) => { + // Arrange + const searchKeyword = 'First'; + const expectedSearchResult = [firstChildContentName]; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndCollectionId(documentTypeName, childDocumentTypeId, dataTypeData.id); + const contentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(firstChildContentName, childDocumentTypeId, contentId); + await umbracoApi.document.createDefaultDocumentWithParent(secondChildContentName, childDocumentTypeId, contentId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.searchByKeywordInCollection(searchKeyword); + + // Assert + await umbracoUi.content.doesDocumentTableColumnNameValuesMatch(expectedSearchResult); + + // Clean + await umbracoApi.document.ensureNameNotExists(firstChildContentName); + await umbracoApi.document.ensureNameNotExists(secondChildContentName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts index eb87b7288a79..3f19d68085a0 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts @@ -397,7 +397,7 @@ test('can enable validation for a property in a document type', async ({umbracoA test('can allow vary by culture for a property in a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); - await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id, groupName, true); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id, groupName, false); await umbracoUi.documentType.goToSection(ConstantHelper.sections.settings); // Act From 762d72b0184c44e739d8d544d30aa1396a7eb8e3 Mon Sep 17 00:00:00 2001 From: NguyenThuyLan <116753400+NguyenThuyLan@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:19:09 +0700 Subject: [PATCH 016/167] update ImageSharpMiddlewareOption for fixing invalid width and height (#17126) Co-authored-by: Lan Nguyen Thuy (cherry picked from commit 9b19d63a6a4ea44bd4b56bbb0874284a1bc5ba52) --- .../ConfigureImageSharpMiddlewareOptions.cs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs index 9a1ecead89b2..1ef672270ef8 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Options; @@ -48,16 +49,26 @@ public void Configure(ImageSharpMiddlewareOptions options) return Task.CompletedTask; } - int width = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), context.Culture); - if (width <= 0 || width > _imagingSettings.Resize.MaxWidth) + if (context.Commands.Contains(ResizeWebProcessor.Width)) { - context.Commands.Remove(ResizeWebProcessor.Width); + if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), NumberStyles.Integer, + CultureInfo.InvariantCulture, out var width) + || width < 0 + || width >= _imagingSettings.Resize.MaxWidth) + { + context.Commands.Remove(ResizeWebProcessor.Width); + } } - int height = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), context.Culture); - if (height <= 0 || height > _imagingSettings.Resize.MaxHeight) + if (context.Commands.Contains(ResizeWebProcessor.Height)) { - context.Commands.Remove(ResizeWebProcessor.Height); + if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), NumberStyles.Integer, + CultureInfo.InvariantCulture, out var height) + || height < 0 + || height >= _imagingSettings.Resize.MaxHeight) + { + context.Commands.Remove(ResizeWebProcessor.Height); + } } return Task.CompletedTask; From 9a12eea495c4122b941bd21c5afd7726cf87d920 Mon Sep 17 00:00:00 2001 From: NguyenThuyLan <116753400+NguyenThuyLan@users.noreply.github.com> Date: Fri, 27 Sep 2024 12:41:55 +0700 Subject: [PATCH 017/167] Fix error format code (#17146) * update ImageSharpMiddlewareOption for fixing invalid width and height (#17126) Co-authored-by: Lan Nguyen Thuy * Fix issue format parameters --------- Co-authored-by: Lan Nguyen Thuy --- .../ConfigureImageSharpMiddlewareOptions.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs index 9a1ecead89b2..79fcd0a9bf05 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Options; @@ -48,16 +49,32 @@ public void Configure(ImageSharpMiddlewareOptions options) return Task.CompletedTask; } - int width = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), context.Culture); - if (width <= 0 || width > _imagingSettings.Resize.MaxWidth) + if (context.Commands.Contains(ResizeWebProcessor.Width)) { - context.Commands.Remove(ResizeWebProcessor.Width); + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var width) + || width < 0 + || width >= _imagingSettings.Resize.MaxWidth) + { + context.Commands.Remove(ResizeWebProcessor.Width); + } } - int height = context.Parser.ParseValue(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), context.Culture); - if (height <= 0 || height > _imagingSettings.Resize.MaxHeight) + if (context.Commands.Contains(ResizeWebProcessor.Height)) { - context.Commands.Remove(ResizeWebProcessor.Height); + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var height) + || height < 0 + || height >= _imagingSettings.Resize.MaxHeight) + { + context.Commands.Remove(ResizeWebProcessor.Height); + } } return Task.CompletedTask; From 46604909be4a3ab9f5e9a1ed32542fbe45e074ee Mon Sep 17 00:00:00 2001 From: NguyenThuyLan <116753400+nguyenthuylan@users.noreply.github.com> Date: Fri, 27 Sep 2024 07:41:55 +0200 Subject: [PATCH 018/167] Fix error format code (#17146) * update ImageSharpMiddlewareOption for fixing invalid width and height (#17126) Co-authored-by: Lan Nguyen Thuy * Fix issue format parameters --------- Co-authored-by: Lan Nguyen Thuy (cherry picked from commit 9a12eea495c4122b941bd21c5afd7726cf87d920) --- .../ConfigureImageSharpMiddlewareOptions.cs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs index 1ef672270ef8..79fcd0a9bf05 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs @@ -51,8 +51,11 @@ public void Configure(ImageSharpMiddlewareOptions options) if (context.Commands.Contains(ResizeWebProcessor.Width)) { - if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), NumberStyles.Integer, - CultureInfo.InvariantCulture, out var width) + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var width) || width < 0 || width >= _imagingSettings.Resize.MaxWidth) { @@ -62,8 +65,11 @@ public void Configure(ImageSharpMiddlewareOptions options) if (context.Commands.Contains(ResizeWebProcessor.Height)) { - if (!int.TryParse(context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), NumberStyles.Integer, - CultureInfo.InvariantCulture, out var height) + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var height) || height < 0 || height >= _imagingSettings.Resize.MaxHeight) { From d57d12d54d95d1a4df22553692798973f90f29d7 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Fri, 27 Sep 2024 07:43:12 +0200 Subject: [PATCH 019/167] Fixed imagesharp 2 also --- .../ConfigureImageSharpMiddlewareOptions.cs | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Cms.Imaging.ImageSharp2/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp2/ConfigureImageSharpMiddlewareOptions.cs index 8daa1b689b01..dcc67bf5d32e 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp2/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp2/ConfigureImageSharpMiddlewareOptions.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Options; @@ -47,20 +48,32 @@ public void Configure(ImageSharpMiddlewareOptions options) return Task.CompletedTask; } - var width = context.Parser.ParseValue( - context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), - context.Culture); - if (width <= 0 || width > _imagingSettings.Resize.MaxWidth) + if (context.Commands.Contains(ResizeWebProcessor.Width)) { - context.Commands.Remove(ResizeWebProcessor.Width); + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Width), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var width) + || width < 0 + || width >= _imagingSettings.Resize.MaxWidth) + { + context.Commands.Remove(ResizeWebProcessor.Width); + } } - var height = context.Parser.ParseValue( - context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), - context.Culture); - if (height <= 0 || height > _imagingSettings.Resize.MaxHeight) + if (context.Commands.Contains(ResizeWebProcessor.Height)) { - context.Commands.Remove(ResizeWebProcessor.Height); + if (!int.TryParse( + context.Commands.GetValueOrDefault(ResizeWebProcessor.Height), + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out var height) + || height < 0 + || height >= _imagingSettings.Resize.MaxHeight) + { + context.Commands.Remove(ResizeWebProcessor.Height); + } } return Task.CompletedTask; From 4fae91d55c544f912973926f80a8ba5b49ccd751 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:32:44 +0200 Subject: [PATCH 020/167] V14 QA added content tests with list view content (#17115) * Added tests for List view * More tests * Added rest of test * Bumped version * Fixed failing tests * Added tests and fixed comments * Cleaned up tests * Bumped testhelpers * Bumped again * Set condition to only run sql server when enabled * Run all content test * Reverted changes --- build/azure-pipelines.yml | 5 + .../ContentWithListViewContent.spec.ts | 393 ++++++++++++++++++ .../tests/DefaultConfig/Media/Media.spec.ts | 13 +- 3 files changed, 405 insertions(+), 6 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithListViewContent.spec.ts diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 9e7207bf071a..faa31ae51103 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -5,6 +5,10 @@ parameters: displayName: Run SQL Server Integration Tests type: boolean default: false + - name: sqlServerAcceptanceTests + displayName: Run SQL Server Acceptance Tests + type: boolean + default: false - name: myGetDeploy displayName: Deploy to MyGet type: boolean @@ -549,6 +553,7 @@ stages: - job: displayName: E2E Tests (SQL Server) + condition: eq(${{parameters.sqlServerAcceptanceTests}}, True) variables: # Connection string CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithListViewContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithListViewContent.spec.ts new file mode 100644 index 000000000000..0a39d0c4f959 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithListViewContent.spec.ts @@ -0,0 +1,393 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'List View - Content Custom'; +const childDocumentTypeName = 'ChildDocumentTypeForContent'; +const childContentName = 'ChildContent'; + +test.beforeEach(async ({umbracoApi, umbracoUi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.dataType.ensureNameNotExists(dataTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); + await umbracoUi.goToBackOffice(); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.dataType.ensureNameNotExists(dataTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeName); +}); + +test('can create content with the list view data type', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Draft'; + const defaultListViewDataTypeName = 'List View - Content'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(defaultListViewDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, defaultListViewDataTypeName, dataTypeData.id, childDocumentTypeId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe(expectedState); + expect(await umbracoApi.document.getChildrenAmount(contentData.id)).toEqual(0); +}); + +test('can publish content with the list view data type', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Published'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.clickSaveAndPublishButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationsHaveCount(2); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe(expectedState); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(0); +}); + +test('can create content with a child in the list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.clickCreateContentWithName(childDocumentTypeName); + await umbracoUi.content.enterNameInContainer(childContentName); + await umbracoUi.content.clickSaveModalButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); +}); + +test('can publish content with a child in the list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Published'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.clickSaveAndPublishButton(); + await umbracoUi.content.goToContentInListViewWithName(childContentName); + await umbracoUi.content.clickContainerSaveAndPublishButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationsHaveCount(2); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe(expectedState); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); + // Checks if child is published + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe(expectedState); +}); + +test('can not publish child in a list when parent is not published', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Draft'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.goToContentInListViewWithName(childContentName); + await umbracoUi.content.clickContainerSaveAndPublishButton(); + + // Assert + // Content created, but not published + await umbracoUi.content.doesSuccessNotificationsHaveCount(1); + await umbracoUi.content.isErrorNotificationVisible(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.variants[0].state).toBe(expectedState); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); + // Checks if child is still in draft + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe(expectedState); +}); + +test('child is removed from list after child content is deleted', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); + + // Act + await umbracoUi.content.clickCaretButtonForContentName(contentName); + await umbracoUi.content.clickActionsMenuForContent(childContentName); + await umbracoUi.content.clickTrashButton(); + await umbracoUi.content.clickConfirmTrashButton(); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.doesListViewHaveNoItemsInList(); + + // Assert + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(0); + expect(await umbracoApi.document.doesNameExist(childContentName)).toBeFalsy(); +}); + +test('can sort list by name', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + const secondChildContentName = 'ASecondChildContent'; + await umbracoApi.dataType.createListViewContentDataType(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoApi.document.createDefaultDocumentWithParent(secondChildContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + const childAmountBeforeDelete = await umbracoApi.document.getChildrenAmount(documentId); + expect(childAmountBeforeDelete).toEqual(2); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.clickNameButtonInListView(); + + // Assert + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(2); + await umbracoUi.content.doesFirstItemInListViewHaveName(secondChildContentName); +}); + +test('can publish child content from list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Published'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + const publishData = {"publishSchedules": [{"culture": null}]}; + await umbracoApi.document.publish(documentId, publishData); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickPublishSelectedListItems(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe(expectedState); +}); + +test('can not publish child content from list when parent is not published', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Draft'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickPublishSelectedListItems(); + + // Assert + await umbracoUi.content.isErrorNotificationVisible(); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe(expectedState); +}); + +test('can unpublish child content from list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedState = 'Draft'; + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + const childDocumentId = await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + const publishData = {"publishSchedules": [{"culture": null}]}; + await umbracoApi.document.publish(documentId, publishData); + await umbracoApi.document.publish(childDocumentId, publishData); + const childContentDataBeforeUnpublished = await umbracoApi.document.getByName(childContentName); + expect(childContentDataBeforeUnpublished.variants[0].state).toBe('Published'); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickUnpublishSelectedListItems(); + await umbracoUi.content.clickConfirmToUnpublishButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + const childContentData = await umbracoApi.document.getByName(childContentName); + expect(childContentData.variants[0].state).toBe(expectedState); +}); + +test('can duplicate child content in list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const secondDocumentName = 'SecondDocument'; + await umbracoApi.document.ensureNameNotExists(secondDocumentName); + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + const secondDocumentId = await umbracoApi.document.createDefaultDocument(secondDocumentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickDuplicateToSelectedListItems(); + await umbracoUi.content.selectDocumentWithNameAtRoot(secondDocumentName); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesFirstItemInListViewHaveName(childContentName); + await umbracoUi.content.goToContentWithName(secondDocumentName); + await umbracoUi.content.doesFirstItemInListViewHaveName(childContentName); + // Checks firstContentNode + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(1); + // Checks secondContentNode + expect(await umbracoApi.document.getChildrenAmount(secondDocumentId)).toEqual(1); +}); + +test('can move child content in list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const secondDocumentName = 'SecondDocument'; + await umbracoApi.document.ensureNameNotExists(secondDocumentName); + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + const secondDocumentId = await umbracoApi.document.createDefaultDocument(secondDocumentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickMoveToSelectedListItems(); + await umbracoUi.content.selectDocumentWithNameAtRoot(secondDocumentName); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesListViewContainCount(0); + await umbracoUi.content.goToContentWithName(secondDocumentName); + await umbracoUi.content.doesFirstItemInListViewHaveName(childContentName); + // Checks firstContentNode + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(0); + // Checks secondContentNode + expect(await umbracoApi.document.getChildrenAmount(secondDocumentId)).toEqual(1); +}); + +test('can trash child content in list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + + // Act + await umbracoUi.content.selectContentWithNameInListView(childContentName); + await umbracoUi.content.clickTrashSelectedListItems(); + await umbracoUi.content.clickConfirmTrashButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesListViewContainCount(0); + expect(await umbracoApi.document.getChildrenAmount(documentId)).toEqual(0); + await umbracoUi.content.isItemVisibleInRecycleBin(childContentName); +}); + +test('can search for child content in list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const secondChildName = 'SecondChildDocument'; + await umbracoApi.document.ensureNameNotExists(secondChildName); + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoApi.document.createDefaultDocumentWithParent(secondChildName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.doesListViewContainCount(2); + + // Act + await umbracoUi.content.searchByKeywordInCollection(childContentName); + + // Assert + await umbracoUi.content.doesListViewContainCount(1); + await umbracoUi.content.doesFirstItemInListViewHaveName(childContentName); +}); + +test('can change from list view to grid view in list', async ({umbracoApi, umbracoUi}) => { + // Arrange + const childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeName); + await umbracoApi.dataType.createListViewContentDataTypeWithAllPermissions(dataTypeName); + const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithAPropertyEditorAndAnAllowedChildNode(documentTypeName, dataTypeName, dataTypeData.id, childDocumentTypeId); + const documentId = await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoApi.document.createDefaultDocumentWithParent(childContentName, childDocumentTypeId, documentId); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.isDocumentListViewVisible(); + + // Act + await umbracoUi.content.changeToGridView(); + + // Assert + await umbracoUi.content.isDocumentGridViewVisible(); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts index 8dcf57923aa3..803eb63c79d5 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts @@ -192,7 +192,7 @@ test('can trash a media item', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickConfirmTrashButton(); // Assert - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeTruthy(); @@ -212,7 +212,8 @@ test('can restore a media item from the recycle bin', async ({umbracoApi, umbrac await umbracoUi.media.restoreMediaItem(mediaFileName); // Assert - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName, false); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); + await umbracoUi.media.reloadMediaTree(); await umbracoUi.media.isTreeItemVisible(mediaFileName); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeTruthy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy(); @@ -229,11 +230,11 @@ test('can delete a media item from the recycle bin', async ({umbracoApi, umbraco await umbracoUi.media.goToSection(ConstantHelper.sections.media); // Act - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName); await umbracoUi.media.deleteMediaItem(mediaFileName); // Assert - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName, false); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy(); }); @@ -246,12 +247,12 @@ test('can empty the recycle bin', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.goToSection(ConstantHelper.sections.media); // Act - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName); await umbracoUi.media.clickEmptyRecycleBinButton(); await umbracoUi.media.clickConfirmEmptyRecycleBinButton(); // Assert - await umbracoUi.media.isMediaItemVisibleInRecycleBin(mediaFileName, false); + await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy(); }); From 2d7c00f27f629c8b24cd37aa8940892bb593ed18 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 30 Sep 2024 10:24:03 +0200 Subject: [PATCH 021/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index b2c598f6ef0b..71eeca096330 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit b2c598f6ef0b62bb64186c61125f4d00177b48ca +Subproject commit 71eeca096330781e1a4f061aecaab528009234c5 From 348f1f2baee858c7a4fae7ac769eefa72b231272 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 1 Oct 2024 07:58:41 +0200 Subject: [PATCH 022/167] Change webhook permissions to require webhook tree access for all endpoints --- .../Controllers/Webhook/CreateWebhookController.cs | 3 --- .../Controllers/Webhook/DeleteWebhookController.cs | 3 --- .../Controllers/Webhook/UpdateWebhookController.cs | 3 --- .../Controllers/Webhook/WebhookControllerBase.cs | 3 +++ 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/CreateWebhookController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/CreateWebhookController.cs index c513c83d70b3..705292c82a6f 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/CreateWebhookController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/CreateWebhookController.cs @@ -1,5 +1,4 @@ using Asp.Versioning; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Factories; @@ -8,12 +7,10 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Webhook; [ApiVersion("1.0")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessWebhooks)] public class CreateWebhookController : WebhookControllerBase { private readonly IWebhookService _webhookService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/DeleteWebhookController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/DeleteWebhookController.cs index ecb8d7d9f7b7..a45302464ad3 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/DeleteWebhookController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/DeleteWebhookController.cs @@ -1,5 +1,4 @@ using Asp.Versioning; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; @@ -7,12 +6,10 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Webhook; [ApiVersion("1.0")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessWebhooks)] public class DeleteWebhookController : WebhookControllerBase { private readonly IWebhookService _webhookService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/UpdateWebhookController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/UpdateWebhookController.cs index c5469d575f63..8f22721b5e6c 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/UpdateWebhookController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/UpdateWebhookController.cs @@ -1,5 +1,4 @@ using Asp.Versioning; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Factories; @@ -8,12 +7,10 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Webhook; [ApiVersion("1.0")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessWebhooks)] public class UpdateWebhookController : WebhookControllerBase { private readonly IWebhookService _webhookService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/WebhookControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/WebhookControllerBase.cs index 98c3868c65fd..d32de4bf7ac1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Webhook/WebhookControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Webhook/WebhookControllerBase.cs @@ -1,13 +1,16 @@ +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Common.Builders; using Umbraco.Cms.Api.Management.Routing; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Webhook; [VersionedApiBackOfficeRoute("webhook")] [ApiExplorerSettings(GroupName = "Webhook")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessWebhooks)] public abstract class WebhookControllerBase : ManagementApiControllerBase { protected IActionResult WebhookOperationStatusResult(WebhookOperationStatus status) => From 865787db1d51477d3f191ce0696737ffcb2b2953 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:48:41 +0200 Subject: [PATCH 023/167] Bump version.json --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 3b2f02bc6665..05117000e84a 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "14.3.0", + "version": "14.3.1", "assemblyVersion": { "precision": "build" }, From 9bab74d30ef17aad03a6c7d3d89eedc4b1b4999c Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:55:34 +0200 Subject: [PATCH 024/167] Bump version.json --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index f49d971518b0..6bec70b51b3b 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "10.8.6", + "version": "10.8.7", "assemblyVersion": { "precision": "build" }, From 42912dd5c9072298811865eeb50eaf65a8f24ce7 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:44:18 +0200 Subject: [PATCH 025/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index 71eeca096330..224d17f3d43c 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit 71eeca096330781e1a4f061aecaab528009234c5 +Subproject commit 224d17f3d43c8ca3037b807b40a8d7c86ce4827a From 4cfe4986285927f9ef2bf643673c38304d967995 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:45:04 +0200 Subject: [PATCH 026/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index 71eeca096330..224d17f3d43c 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit 71eeca096330781e1a4f061aecaab528009234c5 +Subproject commit 224d17f3d43c8ca3037b807b40a8d7c86ce4827a From ea608cc630ff15737c689888f5f13bb44b6aced8 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:46:06 +0200 Subject: [PATCH 027/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index 224d17f3d43c..586bde9f2316 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit 224d17f3d43c8ca3037b807b40a8d7c86ce4827a +Subproject commit 586bde9f23168c08c519f143dbd7463bbe71eea5 From ed63b51e46b8e613851af237d9e81f9451a7381f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:46:21 +0200 Subject: [PATCH 028/167] update backoffice submodule --- src/Umbraco.Web.UI.Client | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client b/src/Umbraco.Web.UI.Client index 224d17f3d43c..586bde9f2316 160000 --- a/src/Umbraco.Web.UI.Client +++ b/src/Umbraco.Web.UI.Client @@ -1 +1 @@ -Subproject commit 224d17f3d43c8ca3037b807b40a8d7c86ce4827a +Subproject commit 586bde9f23168c08c519f143dbd7463bbe71eea5 From b814608c06e66d638ee203920da90f52946b0d78 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:34:23 +0200 Subject: [PATCH 029/167] Bump version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index cb406a4d2210..ba35bbaff3c8 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json", - "version": "13.5.1", + "version": "13.5.2", "assemblyVersion": { "precision": "build" }, From 7787af2df1e4b906fac9c8b6b10446319774b155 Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Thu, 10 Oct 2024 18:09:11 +0200 Subject: [PATCH 030/167] Fix install url detection (#17241) --- src/Umbraco.Core/Routing/UmbracoRequestPaths.cs | 5 ++++- .../Umbraco.Core/Routing/UmbracoRequestPathsTests.cs | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Routing/UmbracoRequestPaths.cs b/src/Umbraco.Core/Routing/UmbracoRequestPaths.cs index b70970673a31..f31b9fca0608 100644 --- a/src/Umbraco.Core/Routing/UmbracoRequestPaths.cs +++ b/src/Umbraco.Core/Routing/UmbracoRequestPaths.cs @@ -148,7 +148,10 @@ private static bool IsPluginControllerRoute(string path) /// /// Checks if the current uri is an install request /// - public bool IsInstallerRequest(string absPath) => absPath.InvariantStartsWith(_installPath); + public bool IsInstallerRequest(string absPath) => + absPath.InvariantEquals(_installPath) + || absPath.InvariantStartsWith(_installPath.EnsureEndsWith('/')) + || absPath.InvariantStartsWith(_installPath.EnsureEndsWith('?')); /// /// Rudimentary check to see if it's not a server side request diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UmbracoRequestPathsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UmbracoRequestPathsTests.cs index d4856c2b1213..9c0e4cbb16f0 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UmbracoRequestPathsTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UmbracoRequestPathsTests.cs @@ -102,9 +102,15 @@ public void Is_Back_Office_Request(string input, string virtualPath, bool expect [TestCase("http://www.domain.com/install/test/test", true)] [TestCase("http://www.domain.com/Install/test/test.aspx", true)] [TestCase("http://www.domain.com/install/test/test.js", true)] + [TestCase("http://www.domain.com/install?param=value", true)] [TestCase("http://www.domain.com/instal", false)] [TestCase("http://www.domain.com/umbraco", false)] [TestCase("http://www.domain.com/umbraco/umbraco", false)] + [TestCase("http://www.domain.com/installation", false)] + [TestCase("http://www.domain.com/installation/", false)] + [TestCase("http://www.domain.com/installation/test", false)] + [TestCase("http://www.domain.com/installation/test.js", false)] + [TestCase("http://www.domain.com/installation?param=value", false)] public void Is_Installer_Request(string input, bool expected) { var source = new Uri(input); From c3db3457e7cb8e41c66673aee19246051ece3e80 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 11 Oct 2024 09:45:01 +0200 Subject: [PATCH 031/167] Fix ContentStore locking exceptions in async code (#17246) * Add ContentCache test * Use SemaphoreSlim as write lock * Apply lock imrpovements to SnapDictionary * Obsolete unused MonitorLock --- src/Umbraco.Core/MonitorLock.cs | 1 + .../ContentStore.cs | 25 +++--- .../SnapDictionary.cs | 82 ++++++++++--------- .../PublishedCache/ContentCacheTests.cs | 77 +++++++++++++++++ 4 files changed, 135 insertions(+), 50 deletions(-) create mode 100644 tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs diff --git a/src/Umbraco.Core/MonitorLock.cs b/src/Umbraco.Core/MonitorLock.cs index 45dbdbbd109a..d8885ed25693 100644 --- a/src/Umbraco.Core/MonitorLock.cs +++ b/src/Umbraco.Core/MonitorLock.cs @@ -4,6 +4,7 @@ namespace Umbraco.Cms.Core; /// Provides an equivalent to the c# lock statement, to be used in a using block. /// /// Ie replace lock (o) {...} by using (new MonitorLock(o)) { ... } +[Obsolete("Use System.Threading.Lock instead. This will be removed in a future version.")] public class MonitorLock : IDisposable { private readonly bool _entered; diff --git a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs index 0230032dc292..d706301ff848 100644 --- a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs +++ b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs @@ -52,9 +52,9 @@ public class ContentStore // SnapDictionary has unit tests to ensure it all works correctly // For locking information, see SnapDictionary private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; - private readonly object _rlocko = new(); private readonly IVariationContextAccessor _variationContextAccessor; - private readonly object _wlocko = new(); + private readonly object _rlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -319,7 +319,7 @@ public override void Release(bool completed) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -327,14 +327,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter monitor before timeout in content store"); } @@ -344,6 +346,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -374,6 +377,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -409,7 +413,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) { if (lockInfo.Taken) { - Monitor.Exit(_wlocko); + _writeLock.Release(); } } } @@ -1817,7 +1821,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen ref // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -1829,8 +1833,7 @@ public Snapshot CreateSnapshot() } else if (_genObj.Gen != snapGen) { - throw new PanicException( - $"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); + throw new PanicException($"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); } } else diff --git a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs index b6c87e22bb09..70bdcfe03860 100644 --- a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs +++ b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs @@ -28,13 +28,9 @@ public class SnapDictionary // This class is optimized for many readers, few writers // Readers are lock-free - // NOTE - we used to lock _rlocko the long hand way with Monitor.Enter(_rlocko, ref lockTaken) but this has - // been replaced with a normal c# lock because that's exactly how the normal c# lock works, - // see https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/ - // for the readlock, there's no reason here to use the long hand way. private readonly ConcurrentDictionary> _items; private readonly object _rlocko = new(); - private readonly object _wlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -187,7 +183,7 @@ public ScopedWriteLock(SnapDictionary dictionary, bool scoped) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -195,14 +191,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter the monitor before timeout in SnapDictionary"); } @@ -217,6 +215,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // RuntimeHelpers.PrepareConstrainedRegions(); try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -244,43 +243,48 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) return; } - if (commit == false) + try { - lock (_rlocko) + if (commit == false) { - try - { - } - finally + lock (_rlocko) { - // forget about the temp. liveGen - _nextGen = false; - _liveGen -= 1; + try + { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution + } + finally + { + // forget about the temp. liveGen + _nextGen = false; + _liveGen -= 1; + } } - } - foreach (KeyValuePair> item in _items) - { - LinkedNode? link = item.Value; - if (link.Gen <= _liveGen) + foreach (KeyValuePair> item in _items) { - continue; - } + LinkedNode? link = item.Value; + if (link.Gen <= _liveGen) + { + continue; + } - TKey key = item.Key; - if (link.Next == null) - { - _items.TryRemove(key, out link); - } - else - { - _items.TryUpdate(key, link.Next, link); + TKey key = item.Key; + if (link.Next == null) + { + _items.TryRemove(key, out link); + } + else + { + _items.TryUpdate(key, link.Next, link); + } } } } - - // TODO: Shouldn't this be in a finally block? - Monitor.Exit(_wlocko); + finally + { + _writeLock.Release(); + } } #endregion @@ -434,7 +438,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen object // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -624,7 +628,7 @@ internal class TestHelper public bool NextGen => _dict._nextGen; - public bool IsLocked => Monitor.IsEntered(_dict._wlocko); + public bool IsLocked => _dict._writeLock.CurrentCount == 0; public bool CollectAuto { diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs new file mode 100644 index 000000000000..6507bd6cdacc --- /dev/null +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs @@ -0,0 +1,77 @@ +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache.DataSource; +using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Common.Builders.Extensions; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.PublishedCache; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class ContentCacheTests : UmbracoIntegrationTestWithContent +{ + private ContentStore GetContentStore() + { + var path = Path.Combine(GetRequiredService().LocalTempPath, "NuCache"); + Directory.CreateDirectory(path); + + var localContentDbPath = Path.Combine(path, "NuCache.Content.db"); + var localContentDbExists = File.Exists(localContentDbPath); + var contentDataSerializer = new ContentDataSerializer(new DictionaryOfPropertyDataSerializer()); + var localContentDb = BTree.GetTree(localContentDbPath, localContentDbExists, new NuCacheSettings(), contentDataSerializer); + + return new ContentStore( + GetRequiredService(), + GetRequiredService(), + LoggerFactory.CreateLogger(), + LoggerFactory, + GetRequiredService(), // new NoopPublishedModelFactory + localContentDb); + } + + private ContentNodeKit CreateContentNodeKit() + { + var contentData = new ContentDataBuilder() + .WithName("Content 1") + .WithProperties(new PropertyDataBuilder() + .WithPropertyData("welcomeText", "Welcome") + .WithPropertyData("welcomeText", "Welcome", "en-US") + .WithPropertyData("welcomeText", "Willkommen", "de") + .WithPropertyData("welcomeText", "Welkom", "nl") + .WithPropertyData("welcomeText2", "Welcome") + .WithPropertyData("welcomeText2", "Welcome", "en-US") + .WithPropertyData("noprop", "xxx") + .Build()) + .Build(); + + return ContentNodeKitBuilder.CreateWithContent( + ContentType.Id, + 1, + "-1,1", + draftData: contentData, + publishedData: contentData); + } + + [Test] + public async Task SetLocked() + { + var contentStore = GetContentStore(); + + using (contentStore.GetScopedWriteLock(ScopeProvider)) + { + var contentNodeKit = CreateContentNodeKit(); + + contentStore.SetLocked(contentNodeKit); + + // Try running the same operation again in an async task + await Task.Run(() => contentStore.SetLocked(contentNodeKit)); + } + } +} From 30b114d5389e1650aa462085a45aac0d7f42f4d5 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 11 Oct 2024 09:45:01 +0200 Subject: [PATCH 032/167] Fix ContentStore locking exceptions in async code (#17246) * Add ContentCache test * Use SemaphoreSlim as write lock * Apply lock imrpovements to SnapDictionary * Obsolete unused MonitorLock (cherry picked from commit c3db3457e7cb8e41c66673aee19246051ece3e80) --- src/Umbraco.Core/MonitorLock.cs | 1 + .../ContentStore.cs | 25 +++--- .../SnapDictionary.cs | 82 ++++++++++--------- .../PublishedCache/ContentCacheTests.cs | 77 +++++++++++++++++ 4 files changed, 135 insertions(+), 50 deletions(-) create mode 100644 tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs diff --git a/src/Umbraco.Core/MonitorLock.cs b/src/Umbraco.Core/MonitorLock.cs index 45dbdbbd109a..d8885ed25693 100644 --- a/src/Umbraco.Core/MonitorLock.cs +++ b/src/Umbraco.Core/MonitorLock.cs @@ -4,6 +4,7 @@ namespace Umbraco.Cms.Core; /// Provides an equivalent to the c# lock statement, to be used in a using block. /// /// Ie replace lock (o) {...} by using (new MonitorLock(o)) { ... } +[Obsolete("Use System.Threading.Lock instead. This will be removed in a future version.")] public class MonitorLock : IDisposable { private readonly bool _entered; diff --git a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs index 0230032dc292..d706301ff848 100644 --- a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs +++ b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs @@ -52,9 +52,9 @@ public class ContentStore // SnapDictionary has unit tests to ensure it all works correctly // For locking information, see SnapDictionary private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; - private readonly object _rlocko = new(); private readonly IVariationContextAccessor _variationContextAccessor; - private readonly object _wlocko = new(); + private readonly object _rlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -319,7 +319,7 @@ public override void Release(bool completed) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -327,14 +327,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter monitor before timeout in content store"); } @@ -344,6 +346,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -374,6 +377,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -409,7 +413,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) { if (lockInfo.Taken) { - Monitor.Exit(_wlocko); + _writeLock.Release(); } } } @@ -1817,7 +1821,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen ref // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -1829,8 +1833,7 @@ public Snapshot CreateSnapshot() } else if (_genObj.Gen != snapGen) { - throw new PanicException( - $"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); + throw new PanicException($"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); } } else diff --git a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs index b6c87e22bb09..70bdcfe03860 100644 --- a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs +++ b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs @@ -28,13 +28,9 @@ public class SnapDictionary // This class is optimized for many readers, few writers // Readers are lock-free - // NOTE - we used to lock _rlocko the long hand way with Monitor.Enter(_rlocko, ref lockTaken) but this has - // been replaced with a normal c# lock because that's exactly how the normal c# lock works, - // see https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/ - // for the readlock, there's no reason here to use the long hand way. private readonly ConcurrentDictionary> _items; private readonly object _rlocko = new(); - private readonly object _wlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -187,7 +183,7 @@ public ScopedWriteLock(SnapDictionary dictionary, bool scoped) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -195,14 +191,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter the monitor before timeout in SnapDictionary"); } @@ -217,6 +215,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // RuntimeHelpers.PrepareConstrainedRegions(); try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -244,43 +243,48 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) return; } - if (commit == false) + try { - lock (_rlocko) + if (commit == false) { - try - { - } - finally + lock (_rlocko) { - // forget about the temp. liveGen - _nextGen = false; - _liveGen -= 1; + try + { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution + } + finally + { + // forget about the temp. liveGen + _nextGen = false; + _liveGen -= 1; + } } - } - foreach (KeyValuePair> item in _items) - { - LinkedNode? link = item.Value; - if (link.Gen <= _liveGen) + foreach (KeyValuePair> item in _items) { - continue; - } + LinkedNode? link = item.Value; + if (link.Gen <= _liveGen) + { + continue; + } - TKey key = item.Key; - if (link.Next == null) - { - _items.TryRemove(key, out link); - } - else - { - _items.TryUpdate(key, link.Next, link); + TKey key = item.Key; + if (link.Next == null) + { + _items.TryRemove(key, out link); + } + else + { + _items.TryUpdate(key, link.Next, link); + } } } } - - // TODO: Shouldn't this be in a finally block? - Monitor.Exit(_wlocko); + finally + { + _writeLock.Release(); + } } #endregion @@ -434,7 +438,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen object // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -624,7 +628,7 @@ internal class TestHelper public bool NextGen => _dict._nextGen; - public bool IsLocked => Monitor.IsEntered(_dict._wlocko); + public bool IsLocked => _dict._writeLock.CurrentCount == 0; public bool CollectAuto { diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs new file mode 100644 index 000000000000..6507bd6cdacc --- /dev/null +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs @@ -0,0 +1,77 @@ +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache.DataSource; +using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Common.Builders.Extensions; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.PublishedCache; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class ContentCacheTests : UmbracoIntegrationTestWithContent +{ + private ContentStore GetContentStore() + { + var path = Path.Combine(GetRequiredService().LocalTempPath, "NuCache"); + Directory.CreateDirectory(path); + + var localContentDbPath = Path.Combine(path, "NuCache.Content.db"); + var localContentDbExists = File.Exists(localContentDbPath); + var contentDataSerializer = new ContentDataSerializer(new DictionaryOfPropertyDataSerializer()); + var localContentDb = BTree.GetTree(localContentDbPath, localContentDbExists, new NuCacheSettings(), contentDataSerializer); + + return new ContentStore( + GetRequiredService(), + GetRequiredService(), + LoggerFactory.CreateLogger(), + LoggerFactory, + GetRequiredService(), // new NoopPublishedModelFactory + localContentDb); + } + + private ContentNodeKit CreateContentNodeKit() + { + var contentData = new ContentDataBuilder() + .WithName("Content 1") + .WithProperties(new PropertyDataBuilder() + .WithPropertyData("welcomeText", "Welcome") + .WithPropertyData("welcomeText", "Welcome", "en-US") + .WithPropertyData("welcomeText", "Willkommen", "de") + .WithPropertyData("welcomeText", "Welkom", "nl") + .WithPropertyData("welcomeText2", "Welcome") + .WithPropertyData("welcomeText2", "Welcome", "en-US") + .WithPropertyData("noprop", "xxx") + .Build()) + .Build(); + + return ContentNodeKitBuilder.CreateWithContent( + ContentType.Id, + 1, + "-1,1", + draftData: contentData, + publishedData: contentData); + } + + [Test] + public async Task SetLocked() + { + var contentStore = GetContentStore(); + + using (contentStore.GetScopedWriteLock(ScopeProvider)) + { + var contentNodeKit = CreateContentNodeKit(); + + contentStore.SetLocked(contentNodeKit); + + // Try running the same operation again in an async task + await Task.Run(() => contentStore.SetLocked(contentNodeKit)); + } + } +} From 9f5867bdf815669e8c7e65942b023cfa53d8233f Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:15:49 +0700 Subject: [PATCH 033/167] V14 QA Fixing the failing acceptance tests in the pipeline v14 (#17214) * Added more waits * Updated assert steps * Fixed api method name * Added more waits to avoid the failing test in window * Updated tests due to business changes * Added more waits to avoid the failing tests in window * Updated test due to Ui changes * Bumped version * Bumped version of test helper * Bumped version --- .../package-lock.json | 19 +++++++++---------- .../Umbraco.Tests.AcceptanceTest/package.json | 4 ++-- .../ContentWithAllowAtRoot.spec.ts | 2 -- .../Content/CultureAndHostnames.spec.ts | 1 + .../DataType/DataTypeFolder.spec.ts | 2 +- .../Packages/PackagesPackages.spec.ts | 1 + .../DocumentTypeTemplatesTab.spec.ts | 14 ++++++-------- .../Settings/PartialView/PartialView.spec.ts | 1 + .../Settings/Template/Templates.spec.ts | 1 + .../tests/DefaultConfig/Users/User.spec.ts | 2 +- 10 files changed, 23 insertions(+), 24 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 99eeb24f0a52..4ce3aee211b1 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^2.0.20", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.86", + "@umbraco/json-models-builders": "^2.0.21", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.90", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -55,20 +55,19 @@ } }, "node_modules/@umbraco/json-models-builders": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.20.tgz", - "integrity": "sha512-LmTtklne1HlhMr1nALA+P5FrjIC9jL3A6Pcxj4dy+IPnTgnU2vMYaQIfE8wwz5Z5fZ5AAhWx/Zpdi8xCTbVSuQ==", - "license": "MIT", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.21.tgz", + "integrity": "sha512-/8jf444B8XjYMJ4mdun6Nc1GD6z4VTOAMi/foRKNwDu6H+UEVx8KcFfwel+M1rQOz1OULyIsf+XJDYc7TMujOA==", "dependencies": { "camelize": "^1.0.1" } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.86", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.86.tgz", - "integrity": "sha512-tF7nJCMgBJwaPtxWAuDOJ9lc3T11aO6ped9AxzAJTmzFdSJG16w8jzjWiNgCaU2xRsw5fRyos+I1YrFW249vLw==", + "version": "2.0.0-beta.90", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.90.tgz", + "integrity": "sha512-H55F9gttpQR8Fah77gxWxX3S/PY539r82tQRDbo6GgPHeilSVmLXcgesZ+2cgLaAQ406D6JGDvJVqIZukmEzuQ==", "dependencies": { - "@umbraco/json-models-builders": "2.0.20", + "@umbraco/json-models-builders": "2.0.21", "node-fetch": "^2.6.7" } }, diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index a6949b54fa36..f41b929af2b5 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -18,8 +18,8 @@ "typescript": "^4.8.3" }, "dependencies": { - "@umbraco/json-models-builders": "^2.0.20", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.86", + "@umbraco/json-models-builders": "^2.0.21", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.90", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts index f02822053331..595a4aa3e2d9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithDocumentTypeProperties/ContentWithAllowAtRoot.spec.ts @@ -13,7 +13,6 @@ test.afterEach(async ({umbracoApi}) => { test('cannot create content if allow at root is disabled', async ({umbracoApi, umbracoUi}) => { // Arrange - const noAllowedDocumentTypeAvailableMessage = 'There are no allowed Document Types available for creating content here'; await umbracoApi.documentType.createDefaultDocumentType(documentTypeName); await umbracoUi.content.goToSection(ConstantHelper.sections.content); @@ -23,5 +22,4 @@ test('cannot create content if allow at root is disabled', async ({umbracoApi, u // Assert await umbracoUi.content.isDocumentTypeNameVisible(documentTypeName, false); - await umbracoUi.content.doesModalHaveText(noAllowedDocumentTypeAvailableMessage); }); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts index 369bbb769284..73ed97bd6159 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/CultureAndHostnames.spec.ts @@ -108,6 +108,7 @@ test('can add culture and hostname for multiple languages', async ({umbracoApi, // Act await umbracoUi.content.clickActionsMenuForContent(contentName); await umbracoUi.content.clickCultureAndHostnamesButton(); + await umbracoUi.waitForTimeout(500); await umbracoUi.content.clickAddNewDomainButton(); await umbracoUi.content.enterDomain(domainName, 0); await umbracoUi.content.selectDomainLanguageOption(languageName, 0); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts index 2b5ce0857d8a..400027741c19 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts @@ -23,7 +23,7 @@ test('can create a data type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dataType.createFolder(dataTypeFolderName); // Assert - expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeTruthy(); + expect(await umbracoApi.dataType.doesFolderExist(dataTypeFolderName)).toBeTruthy(); }); test('can rename a data type folder', async ({umbracoApi, umbracoUi}) => { diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts index 59a68325cfc7..ab3438654027 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts @@ -10,5 +10,6 @@ test('can see the marketplace', async ({umbracoUi}) => { await umbracoUi.package.clickPackagesTab(); // Assert + await umbracoUi.waitForTimeout(1000); await umbracoUi.package.isMarketPlaceIFrameVisible(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeTemplatesTab.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeTemplatesTab.spec.ts index 1390bbdc4f65..7308be62d802 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeTemplatesTab.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeTemplatesTab.spec.ts @@ -16,7 +16,6 @@ test.afterEach(async ({umbracoApi}) => { test('can add an allowed template to a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Arrange await umbracoApi.documentType.createDefaultDocumentType(documentTypeName); - await umbracoApi.template.ensureNameNotExists(templateName); const templateId = await umbracoApi.template.createDefaultTemplate(templateName); await umbracoUi.documentType.goToSection(ConstantHelper.sections.settings); @@ -39,28 +38,27 @@ test('can add an allowed template to a document type', {tag: '@smoke'}, async ({ test('can set an allowed template as default for document type', async ({umbracoApi, umbracoUi}) => { // Arrange - await umbracoApi.template.ensureNameNotExists(templateName); - const templateId = await umbracoApi.template.createDefaultTemplate(templateName); - await umbracoApi.documentType.createDocumentTypeWithAllowedTemplate(documentTypeName, templateId); + const secondTemplateName = 'Test Second Template'; + const firstTemplateId = await umbracoApi.template.createDefaultTemplate(templateName); + const secondTemplateId = await umbracoApi.template.createDefaultTemplate(secondTemplateName); + await umbracoApi.documentType.createDocumentTypeWithTwoAllowedTemplates(documentTypeName, firstTemplateId, secondTemplateId, true, firstTemplateId); await umbracoUi.documentType.goToSection(ConstantHelper.sections.settings); // Act await umbracoUi.documentType.goToDocumentType(documentTypeName); await umbracoUi.documentType.clickDocumentTypeTemplatesTab(); - await umbracoUi.documentType.clickDefaultTemplateButton(); + await umbracoUi.documentType.clickSetAsDefaultButton(); await umbracoUi.documentType.clickSaveButton(); // Assert await umbracoUi.documentType.isSuccessNotificationVisible(); const documentTypeData = await umbracoApi.documentType.getByName(documentTypeName); - expect(documentTypeData.allowedTemplates[0].id).toBe(templateId); - expect(documentTypeData.defaultTemplate.id).toBe(templateId); + expect(documentTypeData.defaultTemplate.id).toBe(secondTemplateId); }); // When removing a template, the defaultTemplateId is set to "" which is not correct test.skip('can remove an allowed template from a document type', async ({umbracoApi, umbracoUi}) => { // Arrange - await umbracoApi.template.ensureNameNotExists(templateName); const templateId = await umbracoApi.template.createDefaultTemplate(templateName); await umbracoApi.documentType.createDocumentTypeWithAllowedTemplate(documentTypeName, templateId); await umbracoUi.documentType.goToSection(ConstantHelper.sections.settings); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts index 9b1ad8f8be3f..6f095bc27565 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts @@ -180,6 +180,7 @@ test('can use query builder with Where statement for a partial view', async ({um // Act await umbracoUi.partialView.openPartialViewAtRoot(partialViewFileName); + await umbracoUi.waitForTimeout(500); await umbracoUi.partialView.addQueryBuilderWithWhereStatement(propertyAliasValue, operatorValue, constrainValue); // Verify that the code is shown await umbracoUi.partialView.isQueryBuilderCodeShown(expectedCode); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts index 46fdf12ff53e..adebbd26f7d4 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts @@ -201,6 +201,7 @@ test('can use query builder with Where statement for a template', async ({umbrac // Act await umbracoUi.template.goToTemplate(templateName); + await umbracoUi.waitForTimeout(500); await umbracoUi.template.addQueryBuilderWithWhereStatement(propertyAliasValue, operatorValue, constrainValue); // Verify that the code is shown await umbracoUi.template.isQueryBuilderCodeShown(expectedCode); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index 87c69bb6a972..4f9c65b0e762 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -117,7 +117,7 @@ test('can update culture for a user', async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.user.clickUserWithName(nameOfTheUser); - await umbracoUi.user.selectUserLanguage('Dansk'); + await umbracoUi.user.selectUserLanguage('Dansk (Danmark)'); await umbracoUi.user.clickSaveButton(); // Assert From da2a4d17138f0e8ee5e40cb8665aaf94ea620094 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:57:52 +0700 Subject: [PATCH 034/167] V14 QA Added the acceptance tests for rendering content with textstring (#17247) * Added tests for textstring in the rendered content * Updated tests for rendering content with textstring * Added tests for rendering content with numeric * Added tests for rendering content with textarea * Removed tests * Bumped version * Make all tests for rendering content run in the pipeline * Make all smoke tests run in the pipeline --- .../RenderingContentWithTextstring.spec.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts new file mode 100644 index 000000000000..9a394ffd07cb --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts @@ -0,0 +1,43 @@ +import {test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'Textstring'; +const templateName = 'TestTemplateForContent'; +let dataTypeData; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const textstrings = [ + {type: 'an empty textstring', value: ''}, + {type: 'a non-empty textstring', value: 'Welcome to Umbraco site'}, + {type: 'a textstring contains special characters', value: '@#^&*()_+[]{};:"<>,./?'}, + {type: 'a numeric textstring', value: '0123456789'}, + {type: 'a textstring contains an SQL injection', value: "' OR '1'='1'; --"}, + {type: 'a textstring contains a cross-site scripting', value: ""} +]; + +for (const textstring of textstrings) { + test(`can render content with ${textstring.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const textstringValue = textstring.value; + await umbracoApi.document.createPublishedDocumentWithValue(contentName, textstringValue, dataTypeData.id, documentTypeName, templateName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(textstringValue); + }); +} + From 05519761266f24e82f5fc3df05dcc578d7b1414d Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:26:55 +0700 Subject: [PATCH 035/167] V14 QA Added acceptance tests for notification message (#17195) * Updated step to verify the notification message * Added tests for notification message * Bumped version * Updated expected notification message * Bumped version --- .../DefaultConfig/Content/Content.spec.ts | 16 ++++---- .../DefaultConfig/DataType/DataType.spec.ts | 10 +++-- .../DataType/DataTypeFolder.spec.ts | 17 +++++--- .../Dictionary/Dictionary.spec.ts | 8 ++-- .../tests/DefaultConfig/Media/Media.spec.ts | 17 +++++--- .../Members/MemberGroups.spec.ts | 12 +++--- .../DefaultConfig/Members/Members.spec.ts | 22 +++++------ .../DocumentBlueprint.spec.ts | 9 +++-- .../DocumentType/DocumentType.spec.ts | 16 ++++---- .../DocumentType/DocumentTypeFolder.spec.ts | 12 +++--- .../Settings/Language/Language.spec.ts | 16 ++++---- .../Settings/MediaType/MediaType.spec.ts | 12 +++--- .../MediaType/MediaTypeFolder.spec.ts | 10 +++-- .../Settings/PartialView/PartialView.spec.ts | 20 +++++----- .../PartialView/PartialViewFolder.spec.ts | 14 +++---- .../Settings/Script/Script.spec.ts | 12 +++--- .../Settings/Script/ScriptFolder.spec.ts | 16 ++++---- .../Settings/Stylesheet/Stylesheet.spec.ts | 18 ++++----- .../Stylesheet/StylesheetFolder.spec.ts | 16 ++++---- .../Settings/Template/Templates.spec.ts | 30 +++++++------- .../tests/DefaultConfig/Users/User.spec.ts | 39 +++++++++---------- 21 files changed, 180 insertions(+), 162 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts index 0c7a869eb039..693762a0ec3a 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; let documentTypeId = ''; @@ -32,7 +32,7 @@ test('can create empty content', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickSaveButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.variants[0].state).toBe(expectedState); @@ -54,6 +54,8 @@ test('can save and publish empty content', {tag: '@smoke'}, async ({umbracoApi, // Assert await umbracoUi.content.doesSuccessNotificationsHaveCount(2); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.published); expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.variants[0].state).toBe(expectedState); @@ -75,7 +77,7 @@ test('can create content', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickSaveButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.values[0].value).toBe(contentText); @@ -96,7 +98,7 @@ test('can rename content', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickSaveButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedContentData = await umbracoApi.document.get(contentId); expect(updatedContentData.variants[0].name).toEqual(contentName); }); @@ -116,7 +118,7 @@ test('can update content', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickSaveButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedContentData = await umbracoApi.document.get(contentId); expect(updatedContentData.variants[0].name).toEqual(contentName); expect(updatedContentData.values[0].value).toBe(contentText); @@ -135,7 +137,7 @@ test('can publish content', async ({umbracoApi, umbracoUi}) => { await umbracoUi.content.clickPublishButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.published); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.variants[0].state).toBe('Published'); }); @@ -156,7 +158,7 @@ test('can unpublish content', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) = await umbracoUi.content.clickConfirmToUnpublishButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.unpublished); const contentData = await umbracoApi.document.getByName(contentName); expect(contentData.variants[0].state).toBe('Draft'); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataType.spec.ts index cf3b771973b6..12fddb5d0ccb 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataType.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataType.spec.ts @@ -1,4 +1,4 @@ -import {test} from '@umbraco/playwright-testhelpers'; +import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const dataTypeName = 'TestDataType'; @@ -24,7 +24,7 @@ test('can create a data type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.dataType.clickSaveButton(); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); }); @@ -41,6 +41,7 @@ test('can rename a data type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.dataType.clickSaveButton(); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); expect(await umbracoApi.dataType.doesNameExist(wrongDataTypeName)).toBeFalsy(); }); @@ -55,7 +56,7 @@ test('can delete a data type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.dataType.deleteDataType(dataTypeName); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeFalsy(); }); @@ -75,6 +76,7 @@ test('can change property editor in a data type', {tag: '@smoke'}, async ({umbra await umbracoUi.dataType.clickSaveButton(); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); expect(dataTypeData.editorAlias).toBe(updatedEditorAlias); @@ -110,7 +112,7 @@ test('can change settings', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.dataType.clickSaveButton(); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); expect(dataTypeData.values).toContainEqual(expectedDataTypeValues); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts index 400027741c19..e2177f63371e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/DataTypeFolder.spec.ts @@ -1,4 +1,4 @@ -import {test} from '@umbraco/playwright-testhelpers'; +import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const dataTypeName = 'TestDataType'; @@ -23,7 +23,8 @@ test('can create a data type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dataType.createFolder(dataTypeFolderName); // Assert - expect(await umbracoApi.dataType.doesFolderExist(dataTypeFolderName)).toBeTruthy(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); + expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeTruthy(); }); test('can rename a data type folder', async ({umbracoApi, umbracoUi}) => { @@ -41,6 +42,7 @@ test('can rename a data type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dataType.clickConfirmRenameFolderButton(); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderUpdated); expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeTruthy(); expect(await umbracoApi.dataType.doesNameExist(wrongDataTypeFolderName)).toBeFalsy(); }); @@ -55,6 +57,7 @@ test('can delete a data type folder', {tag: '@smoke'}, async ({umbracoApi, umbra await umbracoUi.dataType.deleteDataTypeFolder(dataTypeFolderName); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeFalsy(); }); @@ -75,6 +78,7 @@ test('can create a data type in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dataType.clickSaveButton(); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); const dataTypeChildren = await umbracoApi.dataType.getChildren(dataTypeFolderId); expect(dataTypeChildren[0].name).toBe(dataTypeName); @@ -94,6 +98,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dataType.createFolder(childFolderName); // Assert + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.dataType.doesNameExist(childFolderName)).toBeTruthy(); const dataTypeChildren = await umbracoApi.dataType.getChildren(dataTypeFolderId); expect(dataTypeChildren[0].name).toBe(childFolderName); @@ -114,7 +119,7 @@ test('can create a folder in a folder in a folder', async ({umbracoApi, umbracoU await umbracoUi.dataType.createFolder(childOfChildFolderName); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.dataType.doesNameExist(childOfChildFolderName)).toBeTruthy(); const childrenFolderData = await umbracoApi.dataType.getChildren(childFolderId); expect(childrenFolderData[0].name).toBe(childOfChildFolderName); @@ -135,7 +140,7 @@ test('cannot delete a non-empty data type folder', async ({umbracoApi, umbracoUi await umbracoUi.dataType.deleteDataTypeFolder(dataTypeFolderName); // Assert - await umbracoUi.dataType.isErrorNotificationVisible(); + await umbracoUi.dataType.doesErrorNotificationHaveText(NotificationConstantHelper.error.notEmptyFolder); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); expect(await umbracoApi.dataType.doesNameExist(dataTypeFolderName)).toBeTruthy(); const dataTypeChildren = await umbracoApi.dataType.getChildren(dataTypeFolderId); @@ -161,7 +166,7 @@ test('can move a data type to a data type folder', async ({umbracoApi, umbracoUi await umbracoUi.dataType.moveDataTypeToFolder(dataTypeFolderName); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.moved); const dataTypeInFolder = await umbracoApi.dataType.getChildren(dataTypeFolderId); expect(dataTypeInFolder[0].id).toEqual(dataTypeId); @@ -184,7 +189,7 @@ test('can duplicate a data type to a data type folder', async ({umbracoApi, umbr await umbracoUi.dataType.duplicateDataTypeToFolder(dataTypeFolderName); // Assert - await umbracoUi.dataType.isSuccessNotificationVisible(); + await umbracoUi.dataType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.duplicated); const dataTypeInFolder = await umbracoApi.dataType.getChildren(dataTypeFolderId); expect(dataTypeInFolder[0].name).toEqual(dataTypeName + ' (copy)'); expect(await umbracoApi.dataType.doesNameExist(dataTypeName)).toBeTruthy(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts index 68ad9ee39b81..00b31a883829 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Dictionary/Dictionary.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const dictionaryName = 'TestDictionaryItem'; @@ -24,7 +24,7 @@ test('can create a dictionary item', async ({umbracoApi, umbracoUi}) => { // Assert expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeTruthy(); - await umbracoUi.dictionary.isSuccessNotificationVisible(); + await umbracoUi.dictionary.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); await umbracoUi.dictionary.clickLeftArrowButton(); // Verify the dictionary item displays in the tree and in the list await umbracoUi.dictionary.isDictionaryTreeItemVisible(dictionaryName); @@ -42,7 +42,7 @@ test('can delete a dictionary item', async ({umbracoApi, umbracoUi}) => { await umbracoUi.dictionary.deleteDictionary(); // Assert - await umbracoUi.dictionary.isSuccessNotificationVisible(); + await umbracoUi.dictionary.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.dictionary.doesNameExist(dictionaryName)).toBeFalsy(); // Verify the dictionary item does not display in the tree await umbracoUi.dictionary.isDictionaryTreeItemVisible(dictionaryName, false); @@ -64,7 +64,7 @@ test('can create a dictionary item in a dictionary', {tag: '@smoke'}, async ({um await umbracoUi.dictionary.clickSaveButton(); // Assert - await umbracoUi.dictionary.isSuccessNotificationVisible(); + await umbracoUi.dictionary.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); const dictionaryChildren = await umbracoApi.dictionary.getChildren(parentDictionaryId); expect(dictionaryChildren[0].name).toEqual(dictionaryName); await umbracoUi.dictionary.clickLeftArrowButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts index 803eb63c79d5..ea45f76b42c7 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const mediaFileName = 'TestMediaFile'; @@ -45,7 +45,7 @@ test('can rename a media file', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.isSuccessNotificationVisible(); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); await umbracoUi.media.isTreeItemVisible(mediaFileName); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeTruthy(); }); @@ -73,7 +73,7 @@ for (const mediaFileType of mediaFileTypes) { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.isSuccessNotificationVisible(); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); await umbracoUi.media.isTreeItemVisible(mediaFileType.fileName); expect(await umbracoApi.media.doesNameExist(mediaFileType.fileName)).toBeTruthy(); @@ -93,7 +93,7 @@ test.skip('can delete a media file', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.deleteMediaItem(mediaFileName); // Assert - await umbracoUi.media.isSuccessNotificationVisible(); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); await umbracoUi.media.isTreeItemVisible(mediaFileName, false); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); }); @@ -110,7 +110,7 @@ test('can create a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.isSuccessNotificationVisible(); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); await umbracoUi.media.isTreeItemVisible(folderName); expect(await umbracoApi.media.doesNameExist(folderName)).toBeTruthy(); @@ -132,6 +132,7 @@ test.skip('can delete a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickConfirmToDeleteButton(); // Assert + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); await umbracoUi.media.isTreeItemVisible(folderName, false); expect(await umbracoApi.media.doesNameExist(folderName)).toBeFalsy(); }); @@ -151,7 +152,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.isSuccessNotificationVisible(); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); await umbracoUi.media.isTreeItemVisible(parentFolderName); await umbracoUi.media.clickMediaCaretButtonForName(parentFolderName); await umbracoUi.media.isTreeItemVisible(folderName); @@ -192,6 +193,7 @@ test('can trash a media item', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickConfirmTrashButton(); // Assert + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.movedToRecycleBin); await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeTruthy(); @@ -212,6 +214,7 @@ test('can restore a media item from the recycle bin', async ({umbracoApi, umbrac await umbracoUi.media.restoreMediaItem(mediaFileName); // Assert + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.restored); await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); await umbracoUi.media.reloadMediaTree(); await umbracoUi.media.isTreeItemVisible(mediaFileName); @@ -234,6 +237,7 @@ test('can delete a media item from the recycle bin', async ({umbracoApi, umbraco await umbracoUi.media.deleteMediaItem(mediaFileName); // Assert + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy(); @@ -252,6 +256,7 @@ test('can empty the recycle bin', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickConfirmEmptyRecycleBinButton(); // Assert + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.emptiedRecycleBin); await umbracoUi.media.isItemVisibleInRecycleBin(mediaFileName, false); expect(await umbracoApi.media.doesNameExist(mediaFileName)).toBeFalsy(); expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(mediaFileName)).toBeFalsy(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/MemberGroups.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/MemberGroups.spec.ts index 80ce20aff81a..43c10cd3fabb 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/MemberGroups.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/MemberGroups.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const memberGroupName = 'Test Member Group'; @@ -13,7 +13,7 @@ test.afterEach(async ({umbracoApi}) => { await umbracoApi.memberGroup.ensureNameNotExists(memberGroupName); }); -test('can create a member group', {tag: '@smoke'}, async ({page, umbracoApi, umbracoUi}) => { +test('can create a member group', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Act await umbracoUi.memberGroup.clickMemberGroupsTab(); await umbracoUi.memberGroup.clickMemberGroupCreateButton(); @@ -21,7 +21,7 @@ test('can create a member group', {tag: '@smoke'}, async ({page, umbracoApi, umb await umbracoUi.memberGroup.clickSaveButton(); // Assert - await umbracoUi.memberGroup.isSuccessNotificationVisible(); + await umbracoUi.memberGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); await umbracoUi.memberGroup.clickLeftArrowButton(); await umbracoUi.memberGroup.isMemberGroupNameVisible(memberGroupName); expect(await umbracoApi.memberGroup.doesNameExist(memberGroupName)).toBeTruthy(); @@ -34,7 +34,7 @@ test('cannot create member group with empty name', async ({umbracoApi, umbracoUi await umbracoUi.memberGroup.clickSaveButton(); // Assert - await umbracoUi.memberGroup.isErrorNotificationVisible(); + await umbracoUi.memberGroup.doesErrorNotificationHaveText(NotificationConstantHelper.error.emptyName); expect(await umbracoApi.memberGroup.doesNameExist(memberGroupName)).toBeFalsy(); }); @@ -46,12 +46,12 @@ test.skip('cannot create member group with duplicate name', async ({umbracoApi, // Act await umbracoUi.memberGroup.clickMemberGroupsTab(); - await umbracoUi.memberGroup.clickCreateButton(true); + await umbracoUi.memberGroup.clickCreateButton(); await umbracoUi.memberGroup.enterMemberGroupName(memberGroupName); await umbracoUi.memberGroup.clickSaveButton(); // Assert - await umbracoUi.memberGroup.isErrorNotificationVisible(); + await umbracoUi.memberGroup.doesErrorNotificationHaveText(NotificationConstantHelper.error.duplicateName); }); // TODO: Remove skip when the front-end is ready. Currently it is impossible to delete a member group. diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/Members.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/Members.spec.ts index f44a164a2066..ebecb2dd2a29 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/Members.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/Members.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; let memberId = ''; @@ -38,7 +38,7 @@ test('can create a member', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.member.doesNameExist(memberName)).toBeTruthy(); }); @@ -55,7 +55,7 @@ test('can edit comments', async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.values[0].value).toBe(comment); }); @@ -73,7 +73,7 @@ test('can edit username', async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.username).toBe(updatedUsername); }); @@ -91,7 +91,7 @@ test('can edit email', async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.email).toBe(updatedEmail); }); @@ -111,7 +111,7 @@ test('can edit password', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); }); test('can add member group', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { @@ -129,7 +129,7 @@ test('can add member group', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.groups[0]).toBe(memberGroupId); @@ -153,7 +153,7 @@ test('can remove member group', async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.groups.length).toBe(0); @@ -197,7 +197,7 @@ test('can enable approved', async ({umbracoApi, umbracoUi}) => { await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const memberData = await umbracoApi.member.get(memberId); expect(memberData.isApproved).toBe(true); }); @@ -215,7 +215,7 @@ test('can delete member', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.memberGroup.clickConfirmToDeleteButton(); // Assert - await umbracoUi.member.isSuccessNotificationVisible(); + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.member.doesNameExist(memberName)).toBeFalsy(); }); @@ -236,7 +236,7 @@ test('cannot create member with invalid email', async ({umbracoApi, umbracoUi}) await umbracoUi.member.clickSaveButton(); // Assert - await umbracoUi.member.isErrorNotificationVisible(); + await umbracoUi.member.doesErrorNotificationHaveText(NotificationConstantHelper.error.invalidEmail); expect(await umbracoApi.member.doesNameExist(memberName)).toBeFalsy(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts index db71845ef117..67e5844fee18 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentBlueprint/DocumentBlueprint.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const documentBlueprintName = 'TestDocumentBlueprints'; @@ -29,7 +29,7 @@ test('can create a document blueprint from the settings menu', {tag: '@smoke'}, await umbracoUi.documentBlueprint.clickSaveButton(); // Assert - await umbracoUi.documentBlueprint.isSuccessNotificationVisible(); + await umbracoUi.documentBlueprint.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.documentBlueprint.doesNameExist(documentBlueprintName)).toBeTruthy(); await umbracoUi.documentBlueprint.isDocumentBlueprintRootTreeItemVisible(documentBlueprintName, true); }); @@ -48,6 +48,7 @@ test('can rename a document blueprint', async ({umbracoApi, umbracoUi}) => { await umbracoUi.documentBlueprint.clickSaveButton(); // Assert + await umbracoUi.documentBlueprint.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.documentBlueprint.doesNameExist(documentBlueprintName)).toBeTruthy(); expect(await umbracoApi.documentBlueprint.doesNameExist(wrongDocumentBlueprintName)).toBeFalsy(); await umbracoUi.documentBlueprint.isDocumentBlueprintRootTreeItemVisible(documentBlueprintName, true, false); @@ -67,7 +68,7 @@ test('can delete a document blueprint', async ({umbracoApi, umbracoUi}) => { await umbracoUi.documentBlueprint.clickConfirmToDeleteButton(); // Assert - await umbracoUi.documentBlueprint.isSuccessNotificationVisible(); + await umbracoUi.documentBlueprint.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.documentBlueprint.doesNameExist(documentBlueprintName)).toBeFalsy(); await umbracoUi.documentBlueprint.isDocumentBlueprintRootTreeItemVisible(documentBlueprintName, false, false); }); @@ -85,7 +86,7 @@ test('can create a document blueprint from the content menu', async ({umbracoApi await umbracoUi.content.clickSaveModalButton(); // Assert - await umbracoUi.content.isSuccessNotificationVisible(); + await umbracoUi.documentBlueprint.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.documentBlueprint.doesNameExist(documentBlueprintName)).toBeTruthy(); await umbracoUi.documentBlueprint.goToSettingsTreeItem('Document Blueprints'); await umbracoUi.documentBlueprint.isDocumentBlueprintRootTreeItemVisible(documentBlueprintName, true); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentType.spec.ts index e12749b1cd43..20f3f096ec83 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentType.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentType.spec.ts @@ -1,4 +1,4 @@ -import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const documentTypeName = 'TestDocumentType'; @@ -24,7 +24,7 @@ test('can create a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoU await umbracoUi.documentType.clickSaveButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.documentType.doesNameExist(documentTypeName)).toBeTruthy(); await umbracoUi.documentType.reloadTree('Document Types'); await umbracoUi.documentType.isDocumentTreeItemVisible(documentTypeName); @@ -43,7 +43,7 @@ test('can create a document type with a template', {tag: '@smoke'}, async ({umbr await umbracoUi.documentType.clickSaveButton(); // Assert - // Checks if both the success notification for document Types and teh template are visible + // Checks if both the success notification for document Types and the template are visible await umbracoUi.documentType.doesSuccessNotificationsHaveCount(2); // Checks if the documentType contains the template const documentTypeData = await umbracoApi.documentType.getByName(documentTypeName); @@ -67,7 +67,7 @@ test('can create a element type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi await umbracoUi.documentType.clickSaveButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.documentType.doesNameExist(documentTypeName)).toBeTruthy(); // Checks if the isElement is true const documentTypeData = await umbracoApi.documentType.getByName(documentTypeName); @@ -87,7 +87,7 @@ test('can rename a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoU await umbracoUi.documentType.clickSaveButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.documentType.doesNameExist(documentTypeName)).toBeTruthy(); await umbracoUi.documentType.isDocumentTreeItemVisible(wrongName, false); await umbracoUi.documentType.isDocumentTreeItemVisible(documentTypeName); @@ -108,7 +108,7 @@ test('can update the alias for a document type', async ({umbracoApi, umbracoUi}) await umbracoUi.documentType.clickSaveButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); await umbracoUi.documentType.isDocumentTreeItemVisible(documentTypeName, true); const documentTypeDataNew = await umbracoApi.documentType.getByName(documentTypeName); expect(documentTypeDataNew.alias).toBe(newAlias); @@ -126,7 +126,7 @@ test('can add an icon for a document type', {tag: '@smoke'}, async ({umbracoApi, await umbracoUi.documentType.clickSaveButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const documentTypeData = await umbracoApi.documentType.getByName(documentTypeName); expect(documentTypeData.icon).toBe(bugIcon); await umbracoUi.documentType.isDocumentTreeItemVisible(documentTypeName, true); @@ -145,6 +145,6 @@ test('can delete a document type', {tag: '@smoke'}, async ({umbracoApi, umbracoU await umbracoUi.documentType.clickConfirmToDeleteButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.documentType.doesNameExist(documentTypeName)).toBeFalsy(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeFolder.spec.ts index a96999f4418c..320c7f60bf3d 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeFolder.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const documentFolderName = 'TestFolder'; @@ -22,7 +22,7 @@ test('can create a empty document type folder', {tag: '@smoke'}, async ({umbraco await umbracoUi.documentType.clickCreateFolderButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); const folder = await umbracoApi.documentType.getByName(documentFolderName); expect(folder.name).toBe(documentFolderName); // Checks if the folder is in the root @@ -41,7 +41,7 @@ test('can delete a document type folder', {tag: '@smoke'}, async ({umbracoApi, u await umbracoUi.documentType.deleteFolder(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); await umbracoApi.documentType.doesNameExist(documentFolderName); await umbracoUi.documentType.isDocumentTreeItemVisible(documentFolderName, false); }); @@ -61,7 +61,7 @@ test('can rename a document type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.documentType.clickConfirmRenameFolderButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderUpdated); const folder = await umbracoApi.documentType.getByName(documentFolderName); expect(folder.name).toBe(documentFolderName); await umbracoUi.documentType.isDocumentTreeItemVisible(oldFolderName, false); @@ -84,7 +84,7 @@ test('can create a document type folder in a folder', async ({umbracoApi, umbrac await umbracoUi.documentType.clickCreateFolderButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); const folder = await umbracoApi.documentType.getByName(childFolderName); expect(folder.name).toBe(childFolderName); // Checks if the parentFolder contains the ChildFolder as a child @@ -115,7 +115,7 @@ test('can create a folder in a folder in a folder', {tag: '@smoke'}, async ({umb await umbracoUi.documentType.clickCreateFolderButton(); // Assert - await umbracoUi.documentType.isSuccessNotificationVisible(); + await umbracoUi.documentType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); await umbracoUi.documentType.reloadTree(parentFolderName); await umbracoUi.documentType.isDocumentTreeItemVisible(documentFolderName); const grandParentChildren = await umbracoApi.documentType.getChildren(grandParentFolderId); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Language/Language.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Language/Language.spec.ts index 9d756daab3bf..fb1e9c7a7a2c 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Language/Language.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Language/Language.spec.ts @@ -1,4 +1,4 @@ -import {test} from '@umbraco/playwright-testhelpers'; +import {NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const languageName = 'Arabic'; @@ -25,7 +25,7 @@ test('can add language', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.language.clickSaveButton(); // Assert - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.language.doesExist(isoCode)).toBeTruthy(); // Verify the created language displays in the list await umbracoUi.language.clickLanguagesMenu(); @@ -44,7 +44,7 @@ test('can update default language option', {tag: '@smoke'}, async ({umbracoApi, await umbracoUi.language.clickSaveButton(); // Assert - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const languageData = await umbracoApi.language.get(isoCode); expect(languageData.isDefault).toBe(true); @@ -67,7 +67,7 @@ test('can update mandatory language option', async ({umbracoApi, umbracoUi}) => await umbracoUi.language.clickSaveButton(); // Assert - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const languageData = await umbracoApi.language.get(isoCode); expect(languageData.isMandatory).toBe(true); }); @@ -82,7 +82,7 @@ test('can delete language', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.language.removeLanguageByName(languageName); // Assert - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.language.doesExist(isoCode)).toBeFalsy(); await umbracoUi.language.isLanguageNameVisible(languageName, false); }); @@ -99,7 +99,7 @@ test('can remove fallback language', async ({umbracoApi, umbracoUi}) => { await umbracoUi.language.clickSaveButton(); // Act - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const languageData = await umbracoApi.language.get(isoCode); expect(languageData.fallbackIsoCode).toBeFalsy(); }); @@ -117,7 +117,7 @@ test('can add fallback language', async ({umbracoApi, umbracoUi}) => { await umbracoUi.language.clickSaveButton(); // Act - await umbracoUi.language.isSuccessNotificationVisible(); + await umbracoUi.language.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const languageData = await umbracoApi.language.get(isoCode); expect(languageData.fallbackIsoCode).toBe(defaultLanguageIsoCode); }); @@ -134,5 +134,5 @@ test('cannot add a language with duplicate ISO code', async ({umbracoApi, umbrac await umbracoUi.language.clickSaveButton(); // Assert - await umbracoUi.language.isErrorNotificationVisible(); + await umbracoUi.language.doesErrorNotificationHaveText(NotificationConstantHelper.error.duplicateISOcode); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts index 96d562206eba..0690dac4ef08 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaType.spec.ts @@ -1,5 +1,5 @@ import {expect} from "@playwright/test"; -import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; const mediaTypeName = 'TestMediaType'; @@ -22,7 +22,7 @@ test('can create a media type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.mediaType.clickSaveButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.mediaType.doesNameExist(mediaTypeName)).toBeTruthy(); }); @@ -38,7 +38,7 @@ test('can rename a media type', async ({umbracoApi, umbracoUi}) => { await umbracoUi.mediaType.clickSaveButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.mediaType.doesNameExist(mediaTypeName)).toBeTruthy(); }); @@ -56,7 +56,7 @@ test('can update the alias for a media type', async ({umbracoApi, umbracoUi}) => await umbracoUi.mediaType.clickSaveButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const mediaTypeData = await umbracoApi.mediaType.getByName(mediaTypeName); expect(mediaTypeData.alias).toBe(updatedAlias); }); @@ -72,7 +72,7 @@ test('can add an icon for a media type', {tag: '@smoke'}, async ({umbracoApi, um await umbracoUi.mediaType.clickSaveButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const mediaTypeData = await umbracoApi.mediaType.getByName(mediaTypeName); expect(mediaTypeData.icon).toBe(bugIcon); await umbracoUi.mediaType.isTreeItemVisible(mediaTypeName, true); @@ -89,6 +89,6 @@ test('can delete a media type', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.mediaType.clickConfirmToDeleteButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.mediaType.doesNameExist(mediaTypeName)).toBeFalsy(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaTypeFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaTypeFolder.spec.ts index 83006c9e54db..7863d90fee79 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaTypeFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/MediaType/MediaTypeFolder.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const mediaTypeFolderName = 'TestMediaTypeFolder'; @@ -19,7 +19,7 @@ test('can create a empty media type folder', async ({umbracoApi, umbracoUi}) => await umbracoUi.mediaType.createFolder(mediaTypeFolderName); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); const folder = await umbracoApi.mediaType.getByName(mediaTypeFolderName); expect(folder.name).toBe(mediaTypeFolderName); // Checks if the folder is in the root @@ -37,7 +37,7 @@ test('can delete a media type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.mediaType.deleteFolder(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); expect(await umbracoApi.mediaType.doesNameExist(mediaTypeFolderName)).toBeFalsy(); }); @@ -55,7 +55,7 @@ test('can rename a media type folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.mediaType.clickConfirmRenameFolderButton(); // Assert - await umbracoUi.mediaType.isSuccessNotificationVisible(); + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderUpdated); const folder = await umbracoApi.mediaType.getByName(mediaTypeFolderName); expect(folder.name).toBe(mediaTypeFolderName); }); @@ -72,6 +72,7 @@ test('can create a media type folder in a folder', async ({umbracoApi, umbracoUi await umbracoUi.mediaType.createFolder(childFolderName); // Assert + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); await umbracoUi.mediaType.clickCaretButtonForName(mediaTypeFolderName); await umbracoUi.mediaType.isTreeItemVisible(childFolderName, true); const parentFolderChildren = await umbracoApi.mediaType.getChildren(parentFolderId); @@ -97,6 +98,7 @@ test('can create a media type folder in a folder in a folder', async ({umbracoAp await umbracoUi.mediaType.createFolder(childFolderName); // Assert + await umbracoUi.mediaType.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); await umbracoUi.mediaType.clickCaretButtonForName(mediaTypeFolderName); await umbracoUi.mediaType.isTreeItemVisible(childFolderName, true); const grandParentFolderChildren = await umbracoApi.mediaType.getChildren(grandParentFolderId); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts index 6f095bc27565..bd81a05d72e1 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialView.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const partialViewName = 'TestPartialView'; @@ -26,7 +26,7 @@ test('can create an empty partial view', {tag: '@smoke'}, async ({umbracoApi, um await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.partialView.doesNameExist(partialViewFileName)).toBeTruthy(); // Verify the new partial view is displayed under the Partial Views section await umbracoUi.partialView.isPartialViewRootTreeItemVisible(partialViewFileName); @@ -46,7 +46,7 @@ test('can create a partial view from snippet', async ({umbracoApi, umbracoUi}) = await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeTruthy(); const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); @@ -80,7 +80,7 @@ test('can rename a partial view', {tag: '@smoke'}, async ({umbracoApi, umbracoUi await umbracoUi.partialView.rename(partialViewName); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.renamed); expect(await umbracoApi.partialView.doesNameExist(partialViewFileName)).toBeTruthy(); expect(await umbracoApi.partialView.doesNameExist(wrongPartialViewFileName)).toBeFalsy(); // Verify the old partial view is NOT displayed under the Partial Views section @@ -107,7 +107,7 @@ test.skip('can update a partial view content', {tag: '@smoke'}, async ({umbracoA await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); expect(updatedPartialView.content).toBe(updatedPartialViewContent); }); @@ -147,7 +147,7 @@ test.skip('can use query builder with Order By statement for a partial view', as await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); expect(updatedPartialView.content).toBe(expectedTemplateContent); }); @@ -188,7 +188,7 @@ test('can use query builder with Where statement for a partial view', async ({um await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedPartialView = await umbracoApi.partialView.getByName(partialViewFileName); expect(updatedPartialView.content).toBe(expectedTemplateContent); }); @@ -210,7 +210,7 @@ test.skip('can insert dictionary item into a partial view', async ({umbracoApi, await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); expect(partialViewData.content).toBe(partialViewContent); }); @@ -230,7 +230,7 @@ test.skip('can insert value into a partial view', async ({umbracoApi, umbracoUi} await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const partialViewData = await umbracoApi.partialView.getByName(partialViewFileName); expect(partialViewData.content).toBe(partialViewContent); }); @@ -246,7 +246,7 @@ test('can delete a partial view', {tag: '@smoke'}, async ({umbracoApi, umbracoUi await umbracoUi.partialView.clickDeleteAndConfirmButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.partialView.doesExist(partialViewFileName)).toBeFalsy(); // Verify the partial view is NOT displayed under the Partial Views section await umbracoUi.partialView.clickRootFolderCaretButton(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts index 58741a3d7a57..cae5b85dc22b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/PartialView/PartialViewFolder.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const partialViewName = 'TestPartialView'; @@ -23,7 +23,7 @@ test('can create a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.partialView.createFolder(folderName); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.partialView.doesFolderExist(folderName)).toBeTruthy(); // Verify the partial view folder is displayed under the Partial Views section await umbracoUi.partialView.clickRootFolderCaretButton(); @@ -65,7 +65,7 @@ test('can create a partial view in a folder', async ({umbracoApi, umbracoUi}) => await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); const childrenData = await umbracoApi.partialView.getChildren(folderPath); expect(childrenData[0].name).toEqual(partialViewFileName); // Verify the partial view is displayed in the folder under the Partial Views section @@ -94,7 +94,7 @@ test('can create a partial view in a folder in a folder', async ({umbracoApi, um await umbracoUi.partialView.clickSaveButton(); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); const childFolderChildrenData = await umbracoApi.partialView.getChildren(childFolderPath); expect(childFolderChildrenData[0].name).toEqual(partialViewFileName); @@ -114,7 +114,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.partialView.createFolder(childFolderName); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.partialView.doesNameExist(childFolderName)).toBeTruthy(); const partialViewChildren = await umbracoApi.partialView.getChildren('/' + folderName); expect(partialViewChildren[0].path).toBe('/' + folderName + '/' + childFolderName); @@ -137,7 +137,7 @@ test('can create a folder in a folder in a folder', {tag: '@smoke'}, async ({umb await umbracoUi.partialView.createFolder(childOfChildFolderName); // Assert - await umbracoUi.partialView.isSuccessNotificationVisible(); + await umbracoUi.partialView.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.partialView.doesNameExist(childOfChildFolderName)).toBeTruthy(); const partialViewChildren = await umbracoApi.partialView.getChildren('/' + folderName + '/' + childFolderName); expect(partialViewChildren[0].path).toBe('/' + folderName + '/' + childFolderName + '/' + childOfChildFolderName); @@ -158,5 +158,5 @@ test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.partialView.deleteFolder(); // Assert - await umbracoUi.script.isErrorNotificationVisible(); + await umbracoUi.partialView.doesErrorNotificationHaveText(NotificationConstantHelper.error.notEmpty); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/Script.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/Script.spec.ts index 282a503021c1..3c3f009838ff 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/Script.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/Script.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const scriptName = 'TestScript.js'; @@ -25,7 +25,7 @@ test('can create a empty script', {tag: '@smoke'}, async ({umbracoApi, umbracoUi await umbracoUi.script.clickSaveButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeTruthy(); await umbracoUi.script.isScriptRootTreeItemVisible(scriptName); }); @@ -44,7 +44,7 @@ test('can create a script with content', async ({umbracoApi, umbracoUi}) => { await umbracoUi.script.clickSaveButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeTruthy(); const scriptData = await umbracoApi.script.getByName(scriptName); expect(scriptData.content).toBe(scriptContent); @@ -63,7 +63,7 @@ test('can update a script', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.script.clickSaveButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const updatedScript = await umbracoApi.script.get(scriptPath); expect(updatedScript.content).toBe(updatedScriptContent); }); @@ -79,7 +79,7 @@ test('can delete a script', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.script.clickDeleteAndConfirmButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeFalsy(); await umbracoUi.script.isScriptRootTreeItemVisible(scriptName, false, false); }); @@ -96,7 +96,7 @@ test('can rename a script', async ({umbracoApi, umbracoUi}) => { await umbracoUi.script.rename(scriptName); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeTruthy(); expect(await umbracoApi.script.doesNameExist(wrongScriptName)).toBeFalsy(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/ScriptFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/ScriptFolder.spec.ts index d8f105867d99..e7453a2a4cbf 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/ScriptFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Script/ScriptFolder.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const scriptName = 'TestScript.js'; @@ -24,7 +24,7 @@ test('can create a folder', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.waitForTimeout(1000); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.script.doesFolderExist(scriptFolderName)).toBeTruthy(); await umbracoUi.script.isScriptRootTreeItemVisible(scriptFolderName); }); @@ -40,7 +40,7 @@ test('can delete a folder', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.script.deleteFolder(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); expect(await umbracoApi.script.doesFolderExist(scriptFolderName)).toBeFalsy(); await umbracoUi.script.isScriptRootTreeItemVisible(scriptFolderName, false, false); }); @@ -61,7 +61,7 @@ test('can create a script in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.script.clickSaveButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeTruthy(); const scriptChildren = await umbracoApi.script.getChildren('/' + scriptFolderName); expect(scriptChildren[0].path).toBe('/' + scriptFolderName + '/' + scriptName); @@ -83,7 +83,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.script.createFolder(childFolderName); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.script.doesNameExist(childFolderName)).toBeTruthy(); const scriptChildren = await umbracoApi.script.getChildren('/' + scriptFolderName); expect(scriptChildren[0].path).toBe('/' + scriptFolderName + '/' + childFolderName); @@ -106,7 +106,7 @@ test('can create a folder in a folder in a folder', {tag: '@smoke'}, async ({umb await umbracoUi.script.createFolder(childOfChildFolderName); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.script.doesNameExist(childOfChildFolderName)).toBeTruthy(); const scriptChildren = await umbracoApi.script.getChildren('/' + scriptFolderName + '/' + childFolderName); expect(scriptChildren[0].path).toBe('/' + scriptFolderName + '/' + childFolderName + '/' + childOfChildFolderName); @@ -131,7 +131,7 @@ test('can create a script in a folder in a folder', async ({umbracoApi, umbracoU await umbracoUi.script.clickSaveButton(); // Assert - await umbracoUi.script.isSuccessNotificationVisible(); + await umbracoUi.script.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.script.doesNameExist(scriptName)).toBeTruthy(); const scriptChildren = await umbracoApi.script.getChildren('/' + scriptFolderName + '/' + childFolderName); expect(scriptChildren[0].path).toBe('/' + scriptFolderName + '/' + childFolderName + '/' + scriptName); @@ -152,5 +152,5 @@ test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.script.deleteFolder(); // Assert - await umbracoUi.script.isErrorNotificationVisible(); + await umbracoUi.script.doesErrorNotificationHaveText(NotificationConstantHelper.error.notEmpty); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts index 43ee3af2d75c..bd6de2872563 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/Stylesheet.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const stylesheetName = 'TestStyleSheetFile.css'; @@ -27,7 +27,7 @@ test('can create a empty stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbra await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeTruthy(); await umbracoUi.stylesheet.isStylesheetRootTreeItemVisible(stylesheetName); }); @@ -46,7 +46,7 @@ test('can create a stylesheet with content', async ({umbracoApi, umbracoUi}) => await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeTruthy(); const stylesheetData = await umbracoApi.stylesheet.getByName(stylesheetName); expect(stylesheetData.content).toEqual(stylesheetContent); @@ -67,7 +67,7 @@ test.skip('can create a new Rich Text Editor stylesheet file', {tag: '@smoke'}, await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.stylesheet.doesExist(stylesheetName)).toBeTruthy(); const stylesheetData = await umbracoApi.stylesheet.getByName(stylesheetName); expect(stylesheetData.content).toEqual(stylesheetContent); @@ -87,7 +87,7 @@ test.skip('can update a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbrac await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const stylesheetData = await umbracoApi.stylesheet.getByName(stylesheetName); expect(stylesheetData.content).toEqual(stylesheetContent); }); @@ -103,7 +103,7 @@ test('can delete a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.stylesheet.clickDeleteAndConfirmButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeFalsy(); await umbracoUi.stylesheet.isStylesheetRootTreeItemVisible(stylesheetName, false, false); }); @@ -121,7 +121,7 @@ test('can rename a stylesheet', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) await umbracoUi.stylesheet.rename(stylesheetName); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.renamed); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeTruthy(); expect(await umbracoApi.stylesheet.doesNameExist(wrongStylesheetName)).toBeFalsy(); }); @@ -143,7 +143,7 @@ test('can edit rich text editor styles', async ({umbracoApi, umbracoUi}) => { await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const stylesheetData = await umbracoApi.stylesheet.getByName(stylesheetName); expect(stylesheetData.content).toEqual(newStylesheetContent); }); @@ -161,7 +161,7 @@ test('can remove rich text editor styles', async ({umbracoApi, umbracoUi}) => { await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const stylesheetData = await umbracoApi.stylesheet.getByName(stylesheetName); expect(stylesheetData.content).toEqual(''); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/StylesheetFolder.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/StylesheetFolder.spec.ts index edc2552fbaa5..42bd719e56ae 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/StylesheetFolder.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Stylesheet/StylesheetFolder.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const stylesheetName = 'TestStyleSheetFile.css'; @@ -24,7 +24,7 @@ test('can create a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.waitForTimeout(1000); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.stylesheet.doesFolderExist(stylesheetFolderName)).toBeTruthy(); await umbracoUi.stylesheet.isStylesheetRootTreeItemVisible(stylesheetFolderName); }); @@ -40,7 +40,7 @@ test('can delete a folder', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => await umbracoUi.stylesheet.deleteFolder(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderDeleted); expect(await umbracoApi.stylesheet.doesFolderExist(stylesheetFolderName)).toBeFalsy(); await umbracoUi.stylesheet.isStylesheetRootTreeItemVisible(stylesheetFolderName, false, false); }); @@ -57,7 +57,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.stylesheet.createFolder(childFolderName); //Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.stylesheet.doesNameExist(childFolderName)).toBeTruthy(); const styleChildren = await umbracoApi.stylesheet.getChildren('/' + stylesheetFolderName); expect(styleChildren[0].path).toBe('/' + stylesheetFolderName + '/' + childFolderName); @@ -80,7 +80,7 @@ test('can create a folder in a folder in a folder', {tag: '@smoke'}, async ({umb await umbracoUi.stylesheet.createFolder(childOfChildFolderName); //Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); expect(await umbracoApi.stylesheet.doesNameExist(childOfChildFolderName)).toBeTruthy(); const styleChildren = await umbracoApi.stylesheet.getChildren('/' + stylesheetFolderName + '/' + childFolderName); expect(styleChildren[0].path).toBe('/' + stylesheetFolderName + '/' + childFolderName + '/' + childOfChildFolderName); @@ -104,7 +104,7 @@ test('can create a stylesheet in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeTruthy(); const stylesheetChildren = await umbracoApi.stylesheet.getChildren('/' + stylesheetFolderName); expect(stylesheetChildren[0].path).toBe('/' + stylesheetFolderName + '/' + stylesheetName); @@ -133,7 +133,7 @@ test('can create a stylesheet in a folder in a folder', async ({umbracoApi, umbr await umbracoUi.stylesheet.clickSaveButton(); // Assert - await umbracoUi.stylesheet.isSuccessNotificationVisible(); + await umbracoUi.stylesheet.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.stylesheet.doesNameExist(stylesheetName)).toBeTruthy(); const stylesheetChildren = await umbracoApi.stylesheet.getChildren('/' + stylesheetFolderName + '/' + childFolderName); expect(stylesheetChildren[0].path).toBe('/' + stylesheetFolderName + '/' + childFolderName + '/' + stylesheetName); @@ -156,5 +156,5 @@ test('cannot delete non-empty folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.stylesheet.deleteFolder(); //Assert - await umbracoUi.stylesheet.isErrorNotificationVisible(); + await umbracoUi.stylesheet.doesErrorNotificationHaveText(NotificationConstantHelper.error.notEmpty); }); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts index adebbd26f7d4..64eb299a9450 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/Template/Templates.spec.ts @@ -1,4 +1,4 @@ -import {AliasHelper, ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from "@playwright/test"; const templateName = 'TestTemplate'; @@ -24,7 +24,7 @@ test('can create a template', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) = await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.template.doesNameExist(templateName)).toBeTruthy(); await umbracoUi.template.isTemplateRootTreeItemVisible(templateName); }); @@ -42,7 +42,7 @@ test('can update content of a template', {tag: '@smoke'}, async ({umbracoApi, um await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); // Checks if the template was updated const updatedTemplate = await umbracoApi.template.getByName(templateName); expect(updatedTemplate.content).toBe(updatedTemplateContent); @@ -62,7 +62,7 @@ test('can rename a template', async ({umbracoApi, umbracoUi}) => { await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.get(templateId); expect(templateData.name).toBe(templateName); }); @@ -78,7 +78,7 @@ test('can delete a template', async ({umbracoApi, umbracoUi}) => { await umbracoUi.template.clickDeleteAndConfirmButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.template.doesNameExist(templateName)).toBeFalsy(); await umbracoUi.template.isTemplateRootTreeItemVisible(templateName, false); }); @@ -98,7 +98,7 @@ test('can set a template as master template', async ({umbracoApi, umbracoUi}) => await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); await umbracoUi.template.isMasterTemplateNameVisible(templateName); // Checks if the childTemplate has the masterTemplate set const childTemplateData = await umbracoApi.template.getByName(childTemplateName); @@ -125,7 +125,7 @@ test('can remove a master template', async ({umbracoApi, umbracoUi}) => { await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); await umbracoUi.template.isMasterTemplateNameVisible('No master'); const childTemplate = await umbracoApi.template.getByName(childTemplateName); expect(childTemplate.masterTemplate).toBe(null); @@ -169,7 +169,7 @@ test.skip('can use query builder with Order By statement for a template', async await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(expectedTemplateContent); }); @@ -209,7 +209,7 @@ test('can use query builder with Where statement for a template', async ({umbrac await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(expectedTemplateContent); }); @@ -229,7 +229,7 @@ test('can insert sections - render child template into a template', async ({umbr await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(templateContent); }); @@ -250,7 +250,7 @@ test('can insert sections - render a named section into a template', async ({umb await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(templateContent); }); @@ -292,7 +292,7 @@ test('can insert dictionary item into a template', async ({umbracoApi, umbracoUi await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(templateContent); @@ -317,7 +317,7 @@ test('can insert partial view into a template', async ({umbracoApi, umbracoUi}) await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(templateContent); }); @@ -337,7 +337,7 @@ test.skip('can insert value into a template', async ({umbracoApi, umbracoUi}) => await umbracoUi.template.clickSaveButton(); // Assert - await umbracoUi.template.isSuccessNotificationVisible(); + await umbracoUi.template.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const templateData = await umbracoApi.template.getByName(templateName); expect(templateData.content).toBe(templateContent); }); @@ -381,5 +381,7 @@ test('cannot create a template with an empty name', {tag: '@smoke'}, async ({umb // Assert await umbracoUi.template.isErrorNotificationVisible(); + // TODO: Uncomment this when the front-end updates the error message + //await umbracoUi.template.doesErrorNotificationHaveText(NotificationConstantHelper.error.emptyName); expect(await umbracoApi.template.doesNameExist(templateName)).toBeFalsy(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index 4f9c65b0e762..ec223fa5c819 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -1,4 +1,4 @@ -import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; import {expect} from '@playwright/test'; const nameOfTheUser = 'TestUser'; @@ -28,7 +28,7 @@ test('can create a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickCreateUserButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeTruthy(); }); @@ -46,7 +46,7 @@ test('can rename a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeTruthy(); }); @@ -62,7 +62,7 @@ test('can delete a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickConfirmToDeleteButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); expect(await umbracoApi.user.doesNameExist(nameOfTheUser)).toBeFalsy(); // Checks if the user is deleted from the list await umbracoUi.user.clickUsersTabButton(); @@ -85,8 +85,7 @@ test('can add multiple user groups to a user', async ({umbracoApi, umbracoUi}) = await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); - const userData = await umbracoApi.user.getByName(nameOfTheUser); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainUserGroupIds(nameOfTheUser, [userGroupWriters.id, userGroupTranslators.id])).toBeTruthy(); }); @@ -103,7 +102,7 @@ test('can remove a user group from a user', {tag: '@smoke'}, async ({umbracoApi, await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.userGroupIds).toEqual([]); }); @@ -121,7 +120,7 @@ test('can update culture for a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.languageIsoCode).toEqual(danishIsoCode); }); @@ -146,7 +145,7 @@ test('can add a content start node to a user', {tag: '@smoke'}, async ({umbracoA await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeTruthy(); // Clean @@ -181,7 +180,7 @@ test('can add multiple content start nodes for a user', async ({umbracoApi, umbr await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId, secondDocumentId])).toBeTruthy(); // Clean @@ -214,7 +213,7 @@ test('can remove a content start node from a user', {tag: '@smoke'}, async ({umb await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainContentStartNodeIds(nameOfTheUser, [documentId])).toBeFalsy(); // Clean @@ -239,7 +238,7 @@ test('can add media start nodes for a user', {tag: '@smoke'}, async ({umbracoApi await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeTruthy(); // Clean @@ -271,7 +270,7 @@ test('can add multiple media start nodes for a user', async ({umbracoApi, umbrac await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [firstMediaId, secondMediaId])).toBeTruthy(); // Clean @@ -300,7 +299,7 @@ test('can remove a media start node from a user', async ({umbracoApi, umbracoUi} await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(await umbracoApi.user.doesUserContainMediaStartNodeIds(nameOfTheUser, [mediaId])).toBeFalsy(); // Clean @@ -319,7 +318,7 @@ test('can allow access to all documents for a user', async ({umbracoApi, umbraco await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.hasDocumentRootAccess).toBeTruthy() }); @@ -336,7 +335,7 @@ test('can allow access to all media for a user', async ({umbracoApi, umbracoUi}) await umbracoUi.user.clickSaveButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.hasMediaRootAccess).toBeTruthy(); }); @@ -422,7 +421,7 @@ test('can disable a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickConfirmDisableButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); expect(umbracoUi.user.isUserDisabledTextVisible()).toBeTruthy(); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.state).toBe(disabledStatus); @@ -442,7 +441,7 @@ test('can enable a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickConfirmEnableButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.userDisabled); await umbracoUi.user.isUserActiveTextVisible(); // The state of the user is not enabled. The reason for this is that the user has not logged in, resulting in the state Inactive. const userData = await umbracoApi.user.getByName(nameOfTheUser); @@ -461,7 +460,7 @@ test('can add an avatar to a user', {tag: '@smoke'}, async ({umbracoApi, umbraco await umbracoUi.user.changePhotoWithFileChooser(filePath); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.avatarUploaded); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.avatarUrls).not.toHaveLength(0); }); @@ -478,7 +477,7 @@ test('can remove an avatar from a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickRemovePhotoButton(); // Assert - await umbracoUi.user.isSuccessNotificationVisible(); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.avatarUrls).toHaveLength(0); }); From 5183391a869c5a253f051b759b1f8fc0bb41e7d8 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:07:25 +0200 Subject: [PATCH 036/167] Updated nuget package (#17286) --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 47df4cf5101c..1096af77d670 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -20,7 +20,7 @@ - + @@ -90,4 +90,4 @@ - \ No newline at end of file + From f4f83bccbe1319200f2c045228540af9542a50bc Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 16 Oct 2024 10:25:17 +0200 Subject: [PATCH 037/167] Added an explicit dependency to Microsoft.Extensions.Caching.Memory to force it to use a non-vulnerable version (#17287) --- Directory.Packages.props | 5 ++++- src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj | 3 +++ .../Umbraco.Cms.Persistence.EFCore.csproj | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 43435394c1ee..fb5de6c69872 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -91,5 +91,8 @@ + + + - \ No newline at end of file + diff --git a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj index f479e709011e..51caf6043f6d 100644 --- a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj +++ b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj @@ -15,6 +15,9 @@ + + + diff --git a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj index 4500c2812b74..ed8a10f42ff6 100644 --- a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj @@ -7,6 +7,10 @@ + + + + From 2d71b5a63b45982553f7f7eb282821a6861ff41b Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 16 Oct 2024 12:16:38 +0200 Subject: [PATCH 038/167] Updated image sharp to a non vulnerable version (#17290) --- src/Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 4d6bf155d351..0ea425c69ae7 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -48,7 +48,7 @@ - + @@ -64,4 +64,4 @@ - \ No newline at end of file + From a497f3f4ddc21d677753a577e5e09f441577617d Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:07:25 +0200 Subject: [PATCH 039/167] Updated nuget package (#17286) (cherry picked from commit 5183391a869c5a253f051b759b1f8fc0bb41e7d8) --- Directory.Packages.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 47df4cf5101c..1096af77d670 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -20,7 +20,7 @@ - + @@ -90,4 +90,4 @@ - \ No newline at end of file + From 378d4ecfef3a6f34ff849b7208419f0406523837 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Fri, 11 Oct 2024 09:45:01 +0200 Subject: [PATCH 040/167] Fix ContentStore locking exceptions in async code (#17246) * Add ContentCache test * Use SemaphoreSlim as write lock * Apply lock imrpovements to SnapDictionary * Obsolete unused MonitorLock (cherry picked from commit c3db3457e7cb8e41c66673aee19246051ece3e80) --- src/Umbraco.Core/MonitorLock.cs | 1 + .../ContentStore.cs | 25 +++--- .../SnapDictionary.cs | 82 ++++++++++--------- .../PublishedCache/ContentCacheTests.cs | 77 +++++++++++++++++ 4 files changed, 135 insertions(+), 50 deletions(-) create mode 100644 tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs diff --git a/src/Umbraco.Core/MonitorLock.cs b/src/Umbraco.Core/MonitorLock.cs index 45dbdbbd109a..d8885ed25693 100644 --- a/src/Umbraco.Core/MonitorLock.cs +++ b/src/Umbraco.Core/MonitorLock.cs @@ -4,6 +4,7 @@ namespace Umbraco.Cms.Core; /// Provides an equivalent to the c# lock statement, to be used in a using block. /// /// Ie replace lock (o) {...} by using (new MonitorLock(o)) { ... } +[Obsolete("Use System.Threading.Lock instead. This will be removed in a future version.")] public class MonitorLock : IDisposable { private readonly bool _entered; diff --git a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs index 0230032dc292..d706301ff848 100644 --- a/src/Umbraco.PublishedCache.NuCache/ContentStore.cs +++ b/src/Umbraco.PublishedCache.NuCache/ContentStore.cs @@ -52,9 +52,9 @@ public class ContentStore // SnapDictionary has unit tests to ensure it all works correctly // For locking information, see SnapDictionary private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor; - private readonly object _rlocko = new(); private readonly IVariationContextAccessor _variationContextAccessor; - private readonly object _wlocko = new(); + private readonly object _rlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -319,7 +319,7 @@ public override void Release(bool completed) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -327,14 +327,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter monitor before timeout in content store"); } @@ -344,6 +346,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -374,6 +377,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) // see SnapDictionary try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -409,7 +413,7 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) { if (lockInfo.Taken) { - Monitor.Exit(_wlocko); + _writeLock.Release(); } } } @@ -1817,7 +1821,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen ref // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -1829,8 +1833,7 @@ public Snapshot CreateSnapshot() } else if (_genObj.Gen != snapGen) { - throw new PanicException( - $"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); + throw new PanicException($"The generation {_genObj.Gen} does not equal the snapshot generation {snapGen}"); } } else diff --git a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs index b6c87e22bb09..70bdcfe03860 100644 --- a/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs +++ b/src/Umbraco.PublishedCache.NuCache/SnapDictionary.cs @@ -28,13 +28,9 @@ public class SnapDictionary // This class is optimized for many readers, few writers // Readers are lock-free - // NOTE - we used to lock _rlocko the long hand way with Monitor.Enter(_rlocko, ref lockTaken) but this has - // been replaced with a normal c# lock because that's exactly how the normal c# lock works, - // see https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/ - // for the readlock, there's no reason here to use the long hand way. private readonly ConcurrentDictionary> _items; private readonly object _rlocko = new(); - private readonly object _wlocko = new(); + private readonly SemaphoreSlim _writeLock = new(1); private Task? _collectTask; private GenObj? _genObj; private long _liveGen; @@ -187,7 +183,7 @@ public ScopedWriteLock(SnapDictionary dictionary, bool scoped) private void EnsureLocked() { - if (!Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount != 0) { throw new InvalidOperationException("Write lock must be acquried."); } @@ -195,14 +191,16 @@ private void EnsureLocked() private void Lock(WriteLockInfo lockInfo, bool forceGen = false) { - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { throw new InvalidOperationException("Recursive locks not allowed"); } - Monitor.TryEnter(_wlocko, _monitorTimeout, ref lockInfo.Taken); - - if (Monitor.IsEntered(_wlocko) is false) + if (_writeLock.Wait(_monitorTimeout)) + { + lockInfo.Taken = true; + } + else { throw new TimeoutException("Could not enter the monitor before timeout in SnapDictionary"); } @@ -217,6 +215,7 @@ private void Lock(WriteLockInfo lockInfo, bool forceGen = false) // RuntimeHelpers.PrepareConstrainedRegions(); try { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution } finally { @@ -244,43 +243,48 @@ private void Release(WriteLockInfo lockInfo, bool commit = true) return; } - if (commit == false) + try { - lock (_rlocko) + if (commit == false) { - try - { - } - finally + lock (_rlocko) { - // forget about the temp. liveGen - _nextGen = false; - _liveGen -= 1; + try + { + // Run all code in finally to ensure ThreadAbortException does not interrupt execution + } + finally + { + // forget about the temp. liveGen + _nextGen = false; + _liveGen -= 1; + } } - } - foreach (KeyValuePair> item in _items) - { - LinkedNode? link = item.Value; - if (link.Gen <= _liveGen) + foreach (KeyValuePair> item in _items) { - continue; - } + LinkedNode? link = item.Value; + if (link.Gen <= _liveGen) + { + continue; + } - TKey key = item.Key; - if (link.Next == null) - { - _items.TryRemove(key, out link); - } - else - { - _items.TryUpdate(key, link.Next, link); + TKey key = item.Key; + if (link.Next == null) + { + _items.TryRemove(key, out link); + } + else + { + _items.TryUpdate(key, link.Next, link); + } } } } - - // TODO: Shouldn't this be in a finally block? - Monitor.Exit(_wlocko); + finally + { + _writeLock.Release(); + } } #endregion @@ -434,7 +438,7 @@ public Snapshot CreateSnapshot() // else we need to try to create a new gen object // whether we are wlocked or not, noone can rlock while we do, // so _liveGen and _nextGen are safe - if (Monitor.IsEntered(_wlocko)) + if (_writeLock.CurrentCount == 0) { // write-locked, cannot use latest gen (at least 1) so use previous var snapGen = _nextGen ? _liveGen - 1 : _liveGen; @@ -624,7 +628,7 @@ internal class TestHelper public bool NextGen => _dict._nextGen; - public bool IsLocked => Monitor.IsEntered(_dict._wlocko); + public bool IsLocked => _dict._writeLock.CurrentCount == 0; public bool CollectAuto { diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs new file mode 100644 index 000000000000..6507bd6cdacc --- /dev/null +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/PublishedCache/ContentCacheTests.cs @@ -0,0 +1,77 @@ +using Microsoft.Extensions.Logging; +using NUnit.Framework; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache; +using Umbraco.Cms.Infrastructure.PublishedCache.DataSource; +using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Common.Builders.Extensions; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.PublishedCache; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class ContentCacheTests : UmbracoIntegrationTestWithContent +{ + private ContentStore GetContentStore() + { + var path = Path.Combine(GetRequiredService().LocalTempPath, "NuCache"); + Directory.CreateDirectory(path); + + var localContentDbPath = Path.Combine(path, "NuCache.Content.db"); + var localContentDbExists = File.Exists(localContentDbPath); + var contentDataSerializer = new ContentDataSerializer(new DictionaryOfPropertyDataSerializer()); + var localContentDb = BTree.GetTree(localContentDbPath, localContentDbExists, new NuCacheSettings(), contentDataSerializer); + + return new ContentStore( + GetRequiredService(), + GetRequiredService(), + LoggerFactory.CreateLogger(), + LoggerFactory, + GetRequiredService(), // new NoopPublishedModelFactory + localContentDb); + } + + private ContentNodeKit CreateContentNodeKit() + { + var contentData = new ContentDataBuilder() + .WithName("Content 1") + .WithProperties(new PropertyDataBuilder() + .WithPropertyData("welcomeText", "Welcome") + .WithPropertyData("welcomeText", "Welcome", "en-US") + .WithPropertyData("welcomeText", "Willkommen", "de") + .WithPropertyData("welcomeText", "Welkom", "nl") + .WithPropertyData("welcomeText2", "Welcome") + .WithPropertyData("welcomeText2", "Welcome", "en-US") + .WithPropertyData("noprop", "xxx") + .Build()) + .Build(); + + return ContentNodeKitBuilder.CreateWithContent( + ContentType.Id, + 1, + "-1,1", + draftData: contentData, + publishedData: contentData); + } + + [Test] + public async Task SetLocked() + { + var contentStore = GetContentStore(); + + using (contentStore.GetScopedWriteLock(ScopeProvider)) + { + var contentNodeKit = CreateContentNodeKit(); + + contentStore.SetLocked(contentNodeKit); + + // Try running the same operation again in an async task + await Task.Run(() => contentStore.SetLocked(contentNodeKit)); + } + } +} From 00563013b6624cb9caccec88f169e26cb6e5e12e Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 16 Oct 2024 12:46:24 +0200 Subject: [PATCH 041/167] V14 QA Updated package E2E tests (#17236) * Updated tests * Cleaned package tests * Updated package test file * Bumped version * Added missing semicolons * Run all smoke tests * Run smoke tests --- .../fixtures/packageLibrary/package.xml | 2 - .../Packages/CreatedPackages.spec.ts | 236 ++++++++---------- .../Packages/InstalledPackages.spec.ts | 6 +- .../Packages/PackagesPackages.spec.ts | 1 - 4 files changed, 107 insertions(+), 138 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/fixtures/packageLibrary/package.xml b/tests/Umbraco.Tests.AcceptanceTest/fixtures/packageLibrary/package.xml index 72693f113d23..f3a15e71542e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/fixtures/packageLibrary/package.xml +++ b/tests/Umbraco.Tests.AcceptanceTest/fixtures/packageLibrary/package.xml @@ -11,8 +11,6 @@ - - diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts index 0b72f77f0ccd..244aaa3f4bdd 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts @@ -15,127 +15,122 @@ test.afterEach(async ({umbracoApi}) => { await umbracoApi.package.ensureNameNotExists(packageName); }); -test.skip('can create a empty package', {tag: '@smoke'}, async ({umbracoUi}) => { +test('can create a empty package', {tag: '@smoke'}, async ({umbracoUi}) => { // Act await umbracoUi.package.clickCreatePackageButton(); await umbracoUi.package.enterPackageName(packageName); - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickCreateButton(); // Assert + await umbracoUi.package.isSuccessNotificationVisible(); + await umbracoUi.package.clickCreatedTab(); await umbracoUi.package.isPackageNameVisible(packageName); }); -test.skip('can update package name', async ({umbracoApi, umbracoUi}) => { +test('can update package name', async ({umbracoApi, umbracoUi}) => { // Arrange const wrongPackageName = 'WrongPackageName'; await umbracoApi.package.ensureNameNotExists(wrongPackageName); await umbracoApi.package.createEmptyPackage(wrongPackageName); await umbracoUi.reloadPage(); + await umbracoUi.package.goToSection(ConstantHelper.sections.packages); + await umbracoUi.package.clickCreatedTab(); // Act await umbracoUi.package.clickExistingPackageName(wrongPackageName); await umbracoUi.package.enterPackageName(packageName); - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickUpdateButton(); // Assert + await umbracoUi.package.isSuccessNotificationVisible(); + await umbracoUi.package.clickCreatedTab(); await umbracoUi.package.isPackageNameVisible(packageName); expect(umbracoApi.package.doesNameExist(packageName)).toBeTruthy(); }); -test.skip('can delete a package', async ({umbracoApi, umbracoUi}) => { +test('can delete a package', async ({umbracoApi, umbracoUi}) => { // Arrange await umbracoApi.package.createEmptyPackage(packageName); await umbracoUi.reloadPage(); + await umbracoUi.package.clickCreatedTab(); // Act await umbracoUi.package.clickDeleteButtonForPackageName(packageName); - await umbracoUi.package.clickDeleteExactLabel(); + await umbracoUi.package.clickConfirmToDeleteButton(); // Assert + await umbracoUi.package.clickCreatedTab(); await umbracoUi.package.isPackageNameVisible(packageName, false); expect(await umbracoApi.package.doesNameExist(packageName)).toBeFalsy(); }); -// TODO: Update the locators for the choose button. If it is updated or not -// TODO: Remove .skip when the test is able to run. Currently it is not possible to add content to a package -test.skip('can create a package with content', async ({page, umbracoApi, umbracoUi}) => { +test('can create a package with content', async ({umbracoApi, umbracoUi}) => { // Arrange const documentTypeName = 'TestDocumentType'; const documentName = 'TestDocument'; await umbracoApi.documentType.ensureNameNotExists(documentTypeName); - await umbracoApi.package.createEmptyPackage(packageName); const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); - // The frontend has updated the button name to "Choose" of "Add". But they are a bit unsure if they want to change it to select instead. - // So for the moment I have used the page instead of our UiHelper. Because it is easier to change the locator. - // await umbracoUi.package.clickAddContentToPackageButton(); - await page.locator('[label="Content"] >> [label="Choose"]').click(); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); + await umbracoUi.package.clickAddContentToPackageButton(); await umbracoUi.package.clickLabelWithName(documentName); - await umbracoUi.package.clickChooseBtn(); - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert + await umbracoUi.package.isSuccessNotificationVisible(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.contentNodeId == documentId).toBeTruthy(); - await umbracoUi.package.clickExistingPackageName(packageName); - expect(umbracoUi.package.isButtonWithNameVisible(documentName + ' ' + documentId)).toBeTruthy(); + expect(umbracoUi.package.isButtonWithNameVisible(documentName)).toBeTruthy(); // Clean await umbracoApi.documentType.ensureNameNotExists(documentTypeName); }); -// Currently unable to run this test. Because you are not able to save a mediaId -test.skip('can create a package with media', async ({umbracoApi, umbracoUi}) => { +test('can create a package with media', async ({umbracoApi, umbracoUi}) => { // Arrange - const mediaTypeName = 'TestMediaType'; const mediaName = 'TestMedia'; - await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); - await umbracoApi.package.createEmptyPackage(packageName); - const mediaTypeId = await umbracoApi.mediaType.createDefaultMediaType(mediaTypeName); - const mediaId = await umbracoApi.media.createDefaultMedia(mediaName, mediaTypeId); - await umbracoUi.reloadPage(); + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMediaFile(mediaName); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddMediaToPackageButton(); - await umbracoUi.package.clickCaretButton(); - await umbracoUi.package.clickLabelWithName(mediaName); + await umbracoUi.media.selectMediaByName(mediaName); await umbracoUi.package.clickSubmitButton(); - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); - expect(umbracoUi.package.isButtonWithNameVisible(mediaTypeName + ' ' + mediaId)).toBeTruthy(); + await umbracoUi.package.isSuccessNotificationVisible(); + expect(umbracoUi.package.isTextWithExactNameVisible(mediaName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.mediaIds[0] == mediaId).toBeTruthy(); // Clean - await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); + await umbracoApi.media.ensureNameNotExists(mediaName); }); -test.skip('can create a package with document types', async ({umbracoApi, umbracoUi}) => { +test('can create a package with document types', async ({umbracoApi, umbracoUi}) => { // Arrange const documentTypeName = 'TestDocumentType'; await umbracoApi.documentType.ensureNameNotExists(documentTypeName); - await umbracoApi.package.createEmptyPackage(packageName); const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddDocumentTypeToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(documentTypeName); - await umbracoUi.package.clickSubmitButton(); - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); - expect(umbracoUi.package.isButtonWithNameVisible(documentTypeName + ' ' + documentTypeId)).toBeTruthy(); + await umbracoUi.package.isSuccessNotificationVisible(); + expect(umbracoUi.package.isButtonWithNameVisible(documentTypeName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.documentTypes[0] == documentTypeId).toBeTruthy(); @@ -143,26 +138,23 @@ test.skip('can create a package with document types', async ({umbracoApi, umbrac await umbracoApi.documentType.ensureNameNotExists(documentTypeName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with media types', async ({umbracoApi, umbracoUi}) => { +test('can create a package with media types', async ({umbracoApi, umbracoUi}) => { // Arrange const mediaTypeName = 'TestMediaType'; await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); - await umbracoApi.package.createEmptyPackage(packageName); const mediaTypeId = await umbracoApi.mediaType.createDefaultMediaType(mediaTypeName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddMediaTypeToPackageButton(); - await umbracoUi.package.clickCaretButton(); - await umbracoUi.package.clickLabelWithName(mediaTypeName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickButtonWithName(mediaTypeName, true); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); - expect(umbracoUi.package.isButtonWithNameVisible(mediaTypeName + ' ' + mediaTypeId)).toBeTruthy(); + await umbracoUi.package.isSuccessNotificationVisible(); + expect(umbracoUi.package.isButtonWithNameVisible(mediaTypeName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.mediaTypes[0] == mediaTypeId).toBeTruthy(); @@ -170,25 +162,23 @@ test.skip('can create a package with media types', async ({umbracoApi, umbracoUi await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); }); -// TODO: Remove .skip when the test is able to run. After adding a language to a package and saving. The language is not saved or anything. -test.skip('can create a package with languages', async ({umbracoApi, umbracoUi}) => { +test('can create a package with languages', async ({umbracoApi, umbracoUi}) => { // Arrange - const languageId = await umbracoApi.language.createDefaultDanishLanguage(); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); + await umbracoApi.language.ensureNameNotExists('Danish'); + const languageId = await umbracoApi.language.createDanishLanguage(); const languageData = await umbracoApi.language.get(languageId); const languageName = languageData.name; // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddLanguageToPackageButton(); - await umbracoUi.package.clickCaretButton(); - await umbracoUi.package.clickLabelWithName(languageName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickButtonWithName(languageName); + await umbracoUi.package.clickSubmitButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(languageName + ' ' + languageId)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.languages[0] == languageId).toBeTruthy(); @@ -197,76 +187,69 @@ test.skip('can create a package with languages', async ({umbracoApi, umbracoUi}) await umbracoApi.language.ensureNameNotExists(languageName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with dictionary', async ({umbracoApi, umbracoUi}) => { +test('can create a package with dictionary', async ({umbracoApi, umbracoUi}) => { // Arrange const dictionaryName = 'TestDictionary'; - await umbracoApi.dictionary.createDefaultDictionary(dictionaryName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); + const dictionaryId = await umbracoApi.dictionary.createDefaultDictionary(dictionaryName); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddDictionaryToPackageButton(); - await umbracoUi.package.clickCaretButton(); - await umbracoUi.package.clickLabelWithName(dictionaryName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickButtonWithName(dictionaryName); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(dictionaryName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); - expect(packageData.dictionaryItems[0] == dictionaryName).toBeTruthy(); + expect(packageData.dictionaryItems[0] == dictionaryId).toBeTruthy(); // Clean await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); }); -// TODO: Remove .skip when the test is able to run. After adding a dataType to a package and saving. The datatype is not saved or anything. -test.skip('can create a package with data types', async ({umbracoApi, umbracoUi}) => { +test('can create a package with data types', async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeName = 'TestDataType'; + await umbracoApi.dataType.ensureNameNotExists(dataTypeName); const dataTypeId = await umbracoApi.dataType.createDateTypeDataType(dataTypeName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddDataTypesToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(dataTypeName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(dataTypeName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.dataTypes[0] == dataTypeId).toBeTruthy(); // Clean - await umbracoApi.dictionary.ensureNameNotExists(dataTypeName); + await umbracoApi.dataType.ensureNameNotExists(dataTypeName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with templates', async ({umbracoApi, umbracoUi}) => { +test('can create a package with templates', async ({umbracoApi, umbracoUi}) => { // Arrange const templateName = 'TestTemplate'; + await umbracoApi.template.ensureNameNotExists(templateName); const templateId = await umbracoApi.template.createDefaultTemplate(templateName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddTemplatesToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(templateName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(templateName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.templates[0] == templateId).toBeTruthy(); @@ -275,24 +258,22 @@ test.skip('can create a package with templates', async ({umbracoApi, umbracoUi}) await umbracoApi.template.ensureNameNotExists(templateName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with stylesheets', async ({umbracoApi, umbracoUi}) => { +test('can create a package with stylesheets', async ({umbracoApi, umbracoUi}) => { // Arrange - const stylesheetName = 'TestStylesheet'; + const stylesheetName = 'TestStylesheet.css'; + await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); const stylesheetId = await umbracoApi.stylesheet.createDefaultStylesheet(stylesheetName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddStylesheetToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(stylesheetName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(stylesheetName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.stylesheets[0] == stylesheetId).toBeTruthy(); @@ -301,24 +282,22 @@ test.skip('can create a package with stylesheets', async ({umbracoApi, umbracoUi await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with scripts', async ({umbracoApi, umbracoUi}) => { +test('can create a package with scripts', async ({umbracoApi, umbracoUi}) => { // Arrange - const scriptName = 'TestScripts'; + const scriptName = 'TestScripts.js'; + await umbracoApi.script.ensureNameNotExists(scriptName); const scriptId = await umbracoApi.script.createDefaultScript(scriptName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddScriptToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(scriptName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(scriptName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.scripts[0] == scriptId).toBeTruthy(); @@ -327,35 +306,30 @@ test.skip('can create a package with scripts', async ({umbracoApi, umbracoUi}) = await umbracoApi.script.ensureNameNotExists(scriptName); }); -// TODO: Remove .skip when the test is able to run. Currently waiting for button -test.skip('can create a package with partial views', async ({umbracoApi, umbracoUi}) => { +test('can create a package with partial views', async ({umbracoApi, umbracoUi}) => { // Arrange - const partialViewName = 'TestPartialView'; + const partialViewName = 'TestPartialView.cshtml'; const partialViewId = await umbracoApi.partialView.createDefaultPartialView(partialViewName); - await umbracoApi.package.createEmptyPackage(packageName); - await umbracoUi.reloadPage(); // Act - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.clickCreatePackageButton(); + await umbracoUi.package.enterPackageName(packageName); await umbracoUi.package.clickAddPartialViewToPackageButton(); - await umbracoUi.package.clickCaretButton(); await umbracoUi.package.clickLabelWithName(partialViewName); - await umbracoUi.package.clickSubmitButton() - await umbracoUi.package.clickSaveChangesToPackageButton(); + await umbracoUi.package.clickChooseContainerButton(); + await umbracoUi.package.clickCreateButton(); // Assert - await umbracoUi.package.clickExistingPackageName(packageName); + await umbracoUi.package.isSuccessNotificationVisible(); expect(umbracoUi.package.isButtonWithNameVisible(partialViewName)).toBeTruthy(); const packageData = await umbracoApi.package.getByName(packageName); expect(packageData.partialViews[0] == partialViewId).toBeTruthy(); // Clean - await umbracoApi.package.ensureNameNotExists(packageName); + await umbracoApi.partialView.ensureNameNotExists(partialViewName); }); -// Currently you are not able to download a package -//TODO: Remove skip when the frontend is ready -test.skip('can download a package', async ({umbracoApi, umbracoUi}) => { +test('can download a package', async ({umbracoApi, umbracoUi}) => { // Arrange const packageId = await umbracoApi.package.createEmptyPackage(packageName); await umbracoUi.reloadPage(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts index 603b52d1e71b..9164b496f5d9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts @@ -1,8 +1,6 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -// We can't install any packages so we do not have any installed. -//TODO: Remove skip when the frontend is ready -test.skip('can see no package have been installed', async ({page, umbracoUi}) => { +test('can see the umbraco package is installed', async ({umbracoUi}) => { // Arrange await umbracoUi.goToBackOffice(); await umbracoUi.package.goToSection(ConstantHelper.sections.packages); @@ -11,5 +9,5 @@ test.skip('can see no package have been installed', async ({page, umbracoUi}) => await umbracoUi.package.clickInstalledTab(); // Assert - await umbracoUi.package.isTextNoPackagesHaveBeenInstalledVisible(); + await umbracoUi.package.isUmbracoBackofficePackageVisible(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts index ab3438654027..6d3c159e9599 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts @@ -1,6 +1,5 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -// The MarketPlace is a iFrame we are using from the DXP team, so it is not something we should test. This test is just checking if we have the IFrame test('can see the marketplace', async ({umbracoUi}) => { // Arrange await umbracoUi.goToBackOffice(); From 2b3a91757d4e1fb50a869e2e746b481524e2be7e Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:26:36 +0200 Subject: [PATCH 042/167] V14 QA added user permission tests (#17226) * Added test * Small changes * Added content start node tests * Added media start node tests * Cleaned up * More updates * Cleaned up * Added wait * Cleaned up * Bumped helpers * Updated to run user tests * Fixed user tests * Bumped helpers * Added missing semicolon * Fixes based on comments * Run smoke tests --- .../Permissions/ContentStartNodes.spec.ts | 97 +++++++++++++++++++ .../Users/Permissions/MediaStartNodes.spec.ts | 88 +++++++++++++++++ .../Users/Permissions/UICulture.spec.ts | 49 ++++++++++ .../tests/DefaultConfig/Users/User.spec.ts | 19 ++-- 4 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts new file mode 100644 index 000000000000..24b50a707e3f --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts @@ -0,0 +1,97 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from '@playwright/test'; + +const testUser = { + name: 'Test User', + email: 'verySecureEmail@123.test', + password: 'verySecurePassword123', +}; + +const userGroupName = 'TestUserGroup'; + +const rootDocumentTypeName = 'RootDocumentType'; +const childDocumentTypeOneName = 'ChildDocumentTypeOne'; +const childDocumentTypeTwoName = 'ChildDocumentTypeTwo'; +let childDocumentTypeOneId = null; +let rootDocumentTypeId = null; + +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +let rootDocumentId = null; +let childDocumentOneId = null; +const rootDocumentName = 'RootDocument'; +const childDocumentOneName = 'ChildDocumentOne'; +const childDocumentTwoName = 'ChildDocumentTwo'; + +let userGroupId = null; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + childDocumentTypeOneId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeOneName); + const childDocumentTypeTwoId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeTwoName); + rootDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedTwoChildNodes(rootDocumentTypeName, childDocumentTypeOneId, childDocumentTypeTwoId); + rootDocumentId = await umbracoApi.document.createDefaultDocument(rootDocumentName, rootDocumentTypeId); + childDocumentOneId = await umbracoApi.document.createDefaultDocumentWithParent(childDocumentOneName, childDocumentTypeOneId, rootDocumentId); + await umbracoApi.document.createDefaultDocumentWithParent(childDocumentTwoName, childDocumentTypeTwoId, rootDocumentId); + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can see root start node and children', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [rootDocumentId]); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isContentVisible(rootDocumentName); + await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentTwoName); +}); + +test('can see parent of start node but not access it', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [childDocumentOneId]); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isContentVisible(rootDocumentName); + await umbracoUi.content.goToContentWithName(rootDocumentName); + await umbracoUi.content.isTextWithMessageVisible('The authenticated user do not have access to this resource'); + await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentTwoName, false); +}); + +test('can not see any content when no start nodes specified', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isContentVisible(rootDocumentName, false); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts new file mode 100644 index 000000000000..f9dec390200b --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts @@ -0,0 +1,88 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = { + name: 'Test User', + email: 'verySecureEmail@123.test', + password: 'verySecurePassword123', +}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +let rootFolderId = null; +let childFolderOneId = null; +const rootFolderName = 'RootFolder'; +const childFolderOneName = 'ChildFolderOne'; +const childFolderTwoName = 'ChildFolderTwo'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.media.ensureNameNotExists(rootFolderName); + await umbracoApi.media.ensureNameNotExists(childFolderOneName); + await umbracoApi.media.ensureNameNotExists(childFolderTwoName); + rootFolderId = await umbracoApi.media.createDefaultMediaFolder(rootFolderName); + childFolderOneId = await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderOneName, rootFolderId); + await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderTwoName, rootFolderId); + userGroupId = await umbracoApi.userGroup.createUserGroupWithMediaSection(userGroupName); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.media.ensureNameNotExists(rootFolderName); + await umbracoApi.media.ensureNameNotExists(childFolderOneName); + await umbracoApi.media.ensureNameNotExists(childFolderTwoName); +}); + +test('can see root media start node and children', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], false, [rootFolderId]); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName); + await umbracoUi.media.clickCaretButtonForMediaName(rootFolderName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderOneName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderTwoName); +}); + +test('can see parent of start node but not access it', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], false, [childFolderOneId]); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName); + await umbracoUi.waitForTimeout(500); + await umbracoUi.media.goToMediaWithName(rootFolderName); + await umbracoUi.media.isTextWithMessageVisible('The authenticated user do not have access to this resource'); + await umbracoUi.media.clickCaretButtonForMediaName(rootFolderName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderOneName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderTwoName, false); +}); + +test('can not see any media when no media start nodes specified', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName, false); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts new file mode 100644 index 000000000000..5d94160d4a53 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts @@ -0,0 +1,49 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = { + name: 'Test User', + email: 'verySecureEmail@123.test', + password: 'verySecurePassword123', +}; + +const userGroupName = 'TestUserGroup'; + +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; +let userGroupId = null; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can see correct translation for content in english', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'en-us'); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + + // Act + await umbracoUi.goToBackOffice(); + + // Assert + await umbracoUi.user.isSectionWithNameVisible(ConstantHelper.sections.content, false); +}); + +test('can see correct translation for content in danish', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'da-dk'); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + + // Act + await umbracoUi.goToBackOffice(); + + // Assert + // Indhold is the Danish translation of Content + await umbracoUi.user.isSectionWithNameVisible('Indhold', true); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index ec223fa5c819..61977241e7e4 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -4,13 +4,16 @@ import {expect} from '@playwright/test'; const nameOfTheUser = 'TestUser'; const userEmail = 'TestUser@EmailTest.test'; const defaultUserGroupName = 'Writers'; +let userCount = null; test.beforeEach(async ({umbracoUi, umbracoApi}) => { await umbracoUi.goToBackOffice(); await umbracoApi.user.ensureNameNotExists(nameOfTheUser); }); -test.afterEach(async ({umbracoApi}) => { +test.afterEach(async ({umbracoApi, umbracoUi}) => { + // Waits so we can try to avoid db locks + await umbracoUi.waitForTimeout(500); await umbracoApi.user.ensureNameNotExists(nameOfTheUser); }); @@ -501,10 +504,11 @@ test('can search for a user', async ({umbracoApi, umbracoUi}) => { // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + userCount = await umbracoApi.user.getUsersCount(); await umbracoUi.user.goToSection(ConstantHelper.sections.users); // Act - await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.doesUserSectionContainUserAmount(userCount); await umbracoUi.user.searchInUserSection(nameOfTheUser); // Assert @@ -519,10 +523,11 @@ test('can filter by status', async ({umbracoApi, umbracoUi}) => { const inactiveStatus = 'Inactive'; const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + userCount = await umbracoApi.user.getUsersCount(); await umbracoUi.user.goToSection(ConstantHelper.sections.users); // Act - await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.doesUserSectionContainUserAmount(userCount); await umbracoUi.user.filterByStatusName(inactiveStatus); // Assert @@ -537,10 +542,11 @@ test('can filter by user groups', async ({umbracoApi, umbracoUi}) => { // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + userCount = await umbracoApi.user.getUsersCount(); await umbracoUi.user.goToSection(ConstantHelper.sections.users); // Act - await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.doesUserSectionContainUserAmount(userCount); await umbracoUi.user.filterByGroupName(defaultUserGroupName); // Assert @@ -554,16 +560,17 @@ test('can order by newest user', async ({umbracoApi, umbracoUi}) => { // Arrange const userGroup = await umbracoApi.userGroup.getByName(defaultUserGroupName); await umbracoApi.user.createDefaultUser(nameOfTheUser, userEmail, [userGroup.id]); + userCount = await umbracoApi.user.getUsersCount(); await umbracoUi.user.goToSection(ConstantHelper.sections.users); // Act - await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.doesUserSectionContainUserAmount(userCount); await umbracoUi.user.orderByNewestUser(); // Assert // Wait for filtering to be done await umbracoUi.waitForTimeout(200); - await umbracoUi.user.doesUserSectionContainUserAmount(2); + await umbracoUi.user.doesUserSectionContainUserAmount(userCount); await umbracoUi.user.isUserWithNameTheFirstUserInList(nameOfTheUser); }); From 6d98162e19bfd34ed0de5eee31de51e8b5ca0123 Mon Sep 17 00:00:00 2001 From: Jason Elkin Date: Wed, 16 Oct 2024 14:08:37 +0100 Subject: [PATCH 043/167] Unlock form after unsuccessful save and publish. (#17285) (cherry picked from commit ee37ad0f4b1b952eb180c582e9954d35eafc013b) --- .../common/directives/components/content/edit.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index e3b3ba413c51..20f8c0b91ac4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -536,9 +536,9 @@ if (err && err.status === 400 && err.data) { // content was saved but is invalid. eventsService.emit("content.saved", { content: $scope.content, action: args.action, valid: false }); - eventsService.emit("form.unlock"); } + eventsService.emit("form.unlock"); return $q.reject(err); }); } @@ -759,7 +759,7 @@ //ensure error messages are displayed formHelper.showNotifications(err.data); clearNotifications($scope.content); - + handleHttpException(err); deferred.reject(err); }); From 1581eb61d37068365d910677d80d08b138c561fb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:53:10 +0200 Subject: [PATCH 044/167] V15: Rich Text Editor links do not work with query strings and anchors (#17288) * fix: anchors and query strings do not work Since the change from UDIs to localLinks in href, the pattern matched a little too much in the href section completely ignoring any "extras" such as querystrings and anchors after the locallink, which meant that the locallink did not get replaced at all if they were present. This is fixed by limiting the regexp a bit. * fix: legacy links do not follow the same regexp as new links Because we are no longer matching the whole `href` attribute but only some of its contents, we need to fix up the old pattern. It has been extended with matching groups that follow the same pattern as the new links. * feat: allow a-tags to be multiline example: ```html Test ``` * fix: split regex into two parts: first a tokenizer for a-tags and then a type-finder * fix: ensure only "document" and "media" are matching to speed up the pattern * feat: allow a-tags to be multiline (cherry picked from commit 35e8f2e4604b265ccc4059bc007bce588cb73553) --- .../Templates/HtmlLocalLinkParser.cs | 76 +++++++++---------- .../Templates/HtmlLocalLinkParserTests.cs | 36 ++++++++- 2 files changed, 69 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs index c79506fb5f3f..9dc302c2187e 100644 --- a/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs +++ b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs @@ -14,11 +14,15 @@ public sealed class HtmlLocalLinkParser // media // other page internal static readonly Regex LocalLinkTagPattern = new( - @"document|media)['""].*?(?href=[""']/{localLink:(?[a-fA-F0-9-]+)})[""'])|((?href=[""']/{localLink:(?[a-fA-F0-9-]+)})[""'].*?type=(['""])(?document|media)(?:['""])))|(?:(?:type=['""](?document|media)['""])|(?:(?href=[""']/{localLink:[a-fA-F0-9-]+})[""'])))[^>]*>", + @"\/?{localLink:(?[a-fA-F0-9-]+)})[^>]*?>", + RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline); + + internal static readonly Regex TypePattern = new( + """type=['"](?(?:media|document))['"]""", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); internal static readonly Regex LocalLinkPattern = new( - @"href=""[/]?(?:\{|\%7B)localLink:([a-zA-Z0-9-://]+)(?:\}|\%7D)", + @"href=['""](?\/?(?:\{|\%7B)localLink:(?[a-zA-Z0-9-://]+)(?:\}|\%7D))", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); private readonly IPublishedUrlProvider _publishedUrlProvider; @@ -84,24 +88,20 @@ public string EnsureInternalLinks(string text) { if (tagData.Udi is not null) { - var newLink = "#"; - if (tagData.Udi?.EntityType == Constants.UdiEntityType.Document) - { - newLink = _publishedUrlProvider.GetUrl(tagData.Udi.Guid); - } - else if (tagData.Udi?.EntityType == Constants.UdiEntityType.Media) + var newLink = tagData.Udi?.EntityType switch { - newLink = _publishedUrlProvider.GetMediaUrl(tagData.Udi.Guid); - } - + Constants.UdiEntityType.Document => _publishedUrlProvider.GetUrl(tagData.Udi.Guid), + Constants.UdiEntityType.Media => _publishedUrlProvider.GetMediaUrl(tagData.Udi.Guid), + _ => "" + }; text = StripTypeAttributeFromTag(text, tagData.Udi!.EntityType); - text = text.Replace(tagData.TagHref, "href=\"" + newLink); + text = text.Replace(tagData.TagHref, newLink); } else if (tagData.IntId.HasValue) { var newLink = _publishedUrlProvider.GetUrl(tagData.IntId.Value); - text = text.Replace(tagData.TagHref, "href=\"" + newLink); + text = text.Replace(tagData.TagHref, newLink); } } @@ -109,7 +109,7 @@ public string EnsureInternalLinks(string text) } // under normal circumstances, the type attribute is preceded by a space - // to cover the rare occasion where it isn't, we first replace with a a space and then without. + // to cover the rare occasion where it isn't, we first replace with a space and then without. private string StripTypeAttributeFromTag(string tag, string type) => tag.Replace($" type=\"{type}\"", string.Empty) .Replace($"type=\"{type}\"", string.Empty); @@ -119,21 +119,22 @@ private IEnumerable FindLocalLinkIds(string text) MatchCollection localLinkTagMatches = LocalLinkTagPattern.Matches(text); foreach (Match linkTag in localLinkTagMatches) { - if (linkTag.Groups.Count < 1) + if (Guid.TryParse(linkTag.Groups["guid"].Value, out Guid guid) is false) { continue; } - if (Guid.TryParse(linkTag.Groups["guid"].Value, out Guid guid) is false) + // Find the type attribute + Match typeMatch = TypePattern.Match(linkTag.Value); + if (typeMatch.Success is false) { continue; } yield return new LocalLinkTag( null, - new GuidUdi(linkTag.Groups["type"].Value, guid), - linkTag.Groups["locallink"].Value, - linkTag.Value); + new GuidUdi(typeMatch.Groups["type"].Value, guid), + linkTag.Groups["locallink"].Value); } // also return legacy results for values that have not been migrated @@ -150,25 +151,26 @@ private IEnumerable FindLegacyLocalLinkIds(string text) MatchCollection tags = LocalLinkPattern.Matches(text); foreach (Match tag in tags) { - if (tag.Groups.Count > 0) + if (tag.Groups.Count <= 0) { - var id = tag.Groups[1].Value; // .Remove(tag.Groups[1].Value.Length - 1, 1); + continue; + } - // The id could be an int or a UDI - if (UdiParser.TryParse(id, out Udi? udi)) - { - var guidUdi = udi as GuidUdi; - if (guidUdi is not null) - { - yield return new LocalLinkTag(null, guidUdi, tag.Value, null); - } - } + var id = tag.Groups["guid"].Value; - if (int.TryParse(id, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intId)) + // The id could be an int or a UDI + if (UdiParser.TryParse(id, out Udi? udi)) + { + if (udi is GuidUdi guidUdi) { - yield return new LocalLinkTag (intId, null, tag.Value, null); + yield return new LocalLinkTag(null, guidUdi, tag.Groups["locallink"].Value); } } + + if (int.TryParse(id, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intId)) + { + yield return new LocalLinkTag (intId, null, tag.Groups["locallink"].Value); + } } } @@ -181,20 +183,10 @@ public LocalLinkTag(int? intId, GuidUdi? udi, string tagHref) TagHref = tagHref; } - public LocalLinkTag(int? intId, GuidUdi? udi, string tagHref, string? fullTag) - { - IntId = intId; - Udi = udi; - TagHref = tagHref; - FullTag = fullTag; - } - public int? IntId { get; } public GuidUdi? Udi { get; } public string TagHref { get; } - - public string? FullTag { get; } } } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Templates/HtmlLocalLinkParserTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Templates/HtmlLocalLinkParserTests.cs index 6ef0f74e2f91..43e4eccedb29 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Templates/HtmlLocalLinkParserTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Templates/HtmlLocalLinkParserTests.cs @@ -119,6 +119,34 @@ public void Returns_Udis_From_Legacy_And_Current_LocalLinks() [TestCase( "world", "world")] + [TestCase( + "

world

world

", + "

world

world

")] + + // attributes order should not matter + [TestCase( + "world", + "world")] + [TestCase( + "world", + "world")] + [TestCase( + "world", + "world")] + + // anchors and query strings + [TestCase( + "world", + "world")] + [TestCase( + "world", + "world")] + + // custom type ignored + [TestCase( + "world", + "world")] + // legacy [TestCase( "hello href=\"{localLink:1234}\" world ", @@ -129,9 +157,15 @@ public void Returns_Udis_From_Legacy_And_Current_LocalLinks() [TestCase( "hello href=\"{localLink:umb://document/9931BDE0AAC34BABB838909A7B47570E}\" world ", "hello href=\"/my-test-url\" world ")] + [TestCase( + "hello href=\"{localLink:umb://document/9931BDE0AAC34BABB838909A7B47570E}#anchor\" world ", + "hello href=\"/my-test-url#anchor\" world ")] [TestCase( "hello href=\"{localLink:umb://media/9931BDE0AAC34BABB838909A7B47570E}\" world ", "hello href=\"/media/1001/my-image.jpg\" world ")] + [TestCase( + "hello href='{localLink:umb://media/9931BDE0AAC34BABB838909A7B47570E}' world ", + "hello href='/media/1001/my-image.jpg' world ")] // This one has an invalid char so won't match. [TestCase( @@ -139,7 +173,7 @@ public void Returns_Udis_From_Legacy_And_Current_LocalLinks() "hello href=\"{localLink:umb^://document/9931BDE0-AAC3-4BAB-B838-909A7B47570E}\" world ")] [TestCase( "hello href=\"{localLink:umb://document-type/9931BDE0-AAC3-4BAB-B838-909A7B47570E}\" world ", - "hello href=\"#\" world ")] + "hello href=\"\" world ")] public void ParseLocalLinks(string input, string result) { // setup a mock URL provider which we'll use for testing From ba1080541b8039fde6f0bb8bc36237580f5f8ea1 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Thu, 17 Oct 2024 09:59:41 +0200 Subject: [PATCH 045/167] Updated to string.empty (#17294) --- src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs index 9dc302c2187e..b8d6b3f3c528 100644 --- a/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs +++ b/src/Umbraco.Core/Templates/HtmlLocalLinkParser.cs @@ -92,7 +92,7 @@ public string EnsureInternalLinks(string text) { Constants.UdiEntityType.Document => _publishedUrlProvider.GetUrl(tagData.Udi.Guid), Constants.UdiEntityType.Media => _publishedUrlProvider.GetMediaUrl(tagData.Udi.Guid), - _ => "" + _ => string.Empty, }; text = StripTypeAttributeFromTag(text, tagData.Udi!.EntityType); From a8f56311449ab8e0490b8e031e35760cd0645615 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 17 Oct 2024 11:25:02 +0200 Subject: [PATCH 046/167] V13: Update @umbraco-ui/uui to 1.11.0 (#17281) * build(deps): update @umbraco-ui/uui from 1.7.1 to 1.11.0 * fix: umb-login-element no attributes Cherry-picked a fix from V14 where the custom login input component was no longer needed, which was fixed because it errors out. This simplifies the login form. * cherry-pick code to handle 'enter' click from v14 --- src/Umbraco.Web.UI.Client/package-lock.json | 984 +++++++++--------- src/Umbraco.Web.UI.Client/package.json | 4 +- src/Umbraco.Web.UI.Login/package-lock.json | 956 ++++++++--------- src/Umbraco.Web.UI.Login/package.json | 6 +- src/Umbraco.Web.UI.Login/src/auth-styles.css | 38 +- src/Umbraco.Web.UI.Login/src/auth.element.ts | 41 +- .../src/components/login-input.element.ts | 64 -- .../components/pages/login.page.element.ts | 13 + src/Umbraco.Web.UI.Login/src/index.ts | 1 - 9 files changed, 1030 insertions(+), 1077 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Login/src/components/login-input.element.ts diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 4d87f71a6065..18c7fcd688d6 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.7.1", - "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", "ace-builds": "1.31.1", "angular": "1.8.3", "angular-animate": "1.8.3", @@ -2080,9 +2080,9 @@ "dev": true }, "node_modules/@lit-labs/ssr-dom-shim": { - "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==", "peer": true }, "node_modules/@lit/reactive-element": { @@ -2253,814 +2253,814 @@ "peer": true }, "node_modules/@umbraco-ui/uui": { - "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.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" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.11.0.tgz", + "integrity": "sha512-1mX7adcpAZRswPA1p64kqE83Rg5cbZsYM/b/OyUcObaL2cIuBCVvjjuUjgkL2el993GptIzl05XVocdj1dDCeQ==", + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-avatar-group": "1.11.0", + "@umbraco-ui/uui-badge": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-box": "1.11.0", + "@umbraco-ui/uui-breadcrumbs": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0", + "@umbraco-ui/uui-button-inline-create": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-card-block-type": "1.11.0", + "@umbraco-ui/uui-card-content-node": "1.11.0", + "@umbraco-ui/uui-card-media": "1.11.0", + "@umbraco-ui/uui-card-user": "1.11.0", + "@umbraco-ui/uui-caret": "1.11.0", + "@umbraco-ui/uui-checkbox": "1.11.0", + "@umbraco-ui/uui-color-area": "1.11.0", + "@umbraco-ui/uui-color-picker": "1.11.0", + "@umbraco-ui/uui-color-slider": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0", + "@umbraco-ui/uui-color-swatches": "1.11.0", + "@umbraco-ui/uui-combobox": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-dialog": "1.11.0", + "@umbraco-ui/uui-dialog-layout": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-file-preview": "1.11.0", + "@umbraco-ui/uui-form": "1.11.0", + "@umbraco-ui/uui-form-layout-item": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0", + "@umbraco-ui/uui-input-file": "1.11.0", + "@umbraco-ui/uui-input-lock": "1.11.0", + "@umbraco-ui/uui-input-password": "1.11.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.11.0", + "@umbraco-ui/uui-label": "1.11.0", + "@umbraco-ui/uui-loader": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-loader-circle": "1.11.0", + "@umbraco-ui/uui-menu-item": "1.11.0", + "@umbraco-ui/uui-modal": "1.11.0", + "@umbraco-ui/uui-pagination": "1.11.0", + "@umbraco-ui/uui-popover": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-progress-bar": "1.11.0", + "@umbraco-ui/uui-radio": "1.11.0", + "@umbraco-ui/uui-range-slider": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0", + "@umbraco-ui/uui-ref-list": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0", + "@umbraco-ui/uui-ref-node-data-type": "1.11.0", + "@umbraco-ui/uui-ref-node-document-type": "1.11.0", + "@umbraco-ui/uui-ref-node-form": "1.11.0", + "@umbraco-ui/uui-ref-node-member": "1.11.0", + "@umbraco-ui/uui-ref-node-package": "1.11.0", + "@umbraco-ui/uui-ref-node-user": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-select": "1.11.0", + "@umbraco-ui/uui-slider": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0", + "@umbraco-ui/uui-symbol-lock": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0", + "@umbraco-ui/uui-symbol-sort": "1.11.0", + "@umbraco-ui/uui-table": "1.11.0", + "@umbraco-ui/uui-tabs": "1.11.0", + "@umbraco-ui/uui-tag": "1.11.0", + "@umbraco-ui/uui-textarea": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0", + "@umbraco-ui/uui-toast-notification-container": "1.11.0", + "@umbraco-ui/uui-toast-notification-layout": "1.11.0", + "@umbraco-ui/uui-toggle": "1.11.0", + "@umbraco-ui/uui-visually-hidden": "1.11.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.11.0.tgz", + "integrity": "sha512-lhWw7CiLL2FIXVOWgmAt8yeb625HYWXceMQMEwhlic4bp/jpVmrbYGuKl4SyubR4ws6ein4Uzzy1EWfT5K+kFQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.7.0.tgz", - "integrity": "sha512-cW3qTTarFqXK4Ze5xMERo9pj3pRRKTvTDB57a5uA0gQ1/70uhgPnozWSX7EK22ml4w/5pmtxXXgRKfSiU9DGtQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.11.0.tgz", + "integrity": "sha512-ixM8Kx9rE15iWYJgk28mEGeNvVDag/I8mZH/lceuq5Mm0EhUbG6gJGPkUSkDSNTnDRijkjwlF4oeCO+8nA+DRw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.11.0.tgz", + "integrity": "sha512-/edFijQFzOsNMBbhg8eu0imhDnLE4MSoC30o4dQ4bI3XCtGLfJh1BiOgA+TLUU1vH7D0NIvidzH49+OOIUrvMg==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.11.0.tgz", + "integrity": "sha512-7VMZzUZ+CYaFhsCe8XS8VgadBhXZtJh0ilZ695YG9Q9IAbAVyeART59VwRzO/1kS0hfCj10DPEKp8IPMbePWEA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.7.0.tgz", - "integrity": "sha512-66aDdgTrq2nx4BNzM9A/lc9dZYz/fyX5OVpkQDRsrpYeOLJMN3oOnE7aChIdBNW3I9lfVNJf6fh0iL27K5JCiQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.11.0.tgz", + "integrity": "sha512-w7HQDNtEt0qnu+psrwxvrdNxUT08qZ1fYygqH9yeKFyE5GMDvYlL1TWU696Lo72LTbTdSMm/ka9b2QBJv1ZJxA==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.11.0.tgz", + "integrity": "sha512-3r/lMYSrFzrw6EclCRjJADtf+1yAYPcz5QRQ4yD7WxLD/Kb338HRgQ50pMG5Jwq28cdDha4n7aNx7mGInrHD3g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.7.0.tgz", - "integrity": "sha512-1P13tsVJXPEpMiHrw1FmsM0dvCLce8DevZAcP1ArDwtqWrwdArR2eRwlhVEZYu2MJkR2tESE3XGTaSOWHyC8og==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.11.0.tgz", + "integrity": "sha512-gYiERouKMpFy/n/6LDh9ckzWpUa2vBmCsWS41Gskct3WZNSVdApZ3g2yvE9ZoJoJB2Q26JfbKShuw0BaJkEFxg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.11.0.tgz", + "integrity": "sha512-wRTtuZAKb0z2Mi3P3wb1CcIO1ExnnFD8vCsHxiTEAjb2e2VzEaEwnnugHnr8chxlOKiTPyX8NtsBXDLTnL/TRA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.11.0.tgz", + "integrity": "sha512-/9B8Rsar9OE9NP84fXBzu5HkEIvXuEtmoaa37QQq9STgLyqrqRMxj6Mt47k69tQgh79HDNu+nwc8A5Gv+h+HHA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.11.0.tgz", + "integrity": "sha512-TW2OioMnjyTCjJA6lJhoX80SyeEb/R2BK6Py82/ZCifnVQ2QFWZ6PtIcnqGT+b0x95xTvzc19f+z4N841wYc8g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.11.0.tgz", + "integrity": "sha512-hoKR3sj5V4kzJ9qR0xe5q6giz41QmcPVQRP+qd90BjpxefezgnN2fud+RC59ZbhssAmep031b1pONRZyFr+6ow==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.7.0.tgz", - "integrity": "sha512-BBWJ62UH1dmcHvZ3H0fRCnM9c+ebQMNaZlGDDWP5lPfv+2KjXXkLRuj6tPUthHa53e5Rf6AAKjKsjRssM4dsLQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.11.0.tgz", + "integrity": "sha512-MIesvjoBVgSNo+2ManDIpLtWXwsO3emhsloQH+nMoyU/ryy/HZMe/p4HRx/leZmM17HG3KXm2j8GpLHie8bU+w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.11.0.tgz", + "integrity": "sha512-kZeFGwSwjdD+M9HwzJ+1bScFCnS3AV36RzXDc6YklVPh63PKlt+wDmiIDd2I4+jHp8NC1buzUz/2dkmZVYOYrg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.11.0.tgz", + "integrity": "sha512-iEzCVOpucAoCQnDYaGaq2k38zXUax+09gUypt907h0YPc6vRoTou5N5masvxZYyRYJrtWxv5kFs+MtLynREjGA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.11.0.tgz", + "integrity": "sha512-uOdN0iu5OKsOtxhTSE8epuUMo2iXq6FEVqBPQBHAmAFELDFyNf2UBwnBxnrTuU6RJ0jbGuLTqQQM7Gv8vD6Kjg==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.11.0.tgz", + "integrity": "sha512-/6No4e+eLqCmivNeCHlLfmChKb6F8asv9pgZdi6mUr44TOc44OGvvuF1vONslf9f4B2eKbRTFmFwGVIfWpjOAw==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.7.0.tgz", - "integrity": "sha512-sVWUQGaLCAwhFH5mmE83+cwDjTyZamRWHgmVakTac2L9qYkwhTwzRgIol1t4i0DQMDFd4oLZ1zq+ysWvAOCmmQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.11.0.tgz", + "integrity": "sha512-Lq+zBOMeobRvFPhEps03efcy+NFOm27w5jqwJ/4ad2TbEMLTBLdSose/3ZqPV4nvTPMlWButRIFo3Nrp+4jL/Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.7.0.tgz", - "integrity": "sha512-7bY8FgSEscGtMYf0EtvmU4XuchV8bdjs+gwBKCVYogAELDdKbCTxWI6/HRqR6wDUOltpP1okFYN6rISugkUKtw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.11.0.tgz", + "integrity": "sha512-bOfJXJ5LMiGCMD37A3mzYjiGTIvzjREN2AhtqGLbwcrAgj662WVhw0aQobo2+iIwaMUIAvl3kNS8930XDeUe/A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.11.0.tgz", + "integrity": "sha512-R1fWHHk7BPilveIF7vPWECAHz/FPKIdvqllYu9f/oJ3RWm7DJtfcNI+Eb7hwkPR/Uj8ug7SkcL4ZvXOG30Ux4A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.11.0.tgz", + "integrity": "sha512-EHU2DXmET3ehRQMwkVtS+nyrfIm8c9cu01GDQR6GFzRNl3G7nUKKdK0LyRQUEm7bSXbWpwctGz6qzB9/MCuxBg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.11.0.tgz", + "integrity": "sha512-E2mW4hvARy4C7ETZ4PUCgeUPgSvw4HEPX1CpOWl32vM85R4F/K/RdS6OsSP3GHO/8oBYPjlLfX8betMrf4+3+Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.11.0.tgz", + "integrity": "sha512-BeCyW9FyVmjE2W8u3k5bPwkRUIVbudK2q9VTKmIcnkwsZz8wv6dDpFoFb92So8YSzMhdiVIRQ14fnphHwMHfWQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.11.0.tgz", + "integrity": "sha512-t+BKLHKlnFdSB/AB0vihqMl7EuIUI1M+m7q07E/or+BX7juV2H+sVAwWdYiOlCjpC5wqi1RAKh41tPWyslc/vQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-color-swatch": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.11.0.tgz", + "integrity": "sha512-Z+cfhxoK6/tGdErNc1rvrT9NDjuZPJ/SHAJlm83ziPvbWxTGVgjf75nqNZ3z6VW9EVWWJ0Fstz2VTzo4K0mcRA==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.11.0.tgz", + "integrity": "sha512-XV59sGG4NYZq6llWC3OqxxpR44Cavwfn+/7ee8kTBPmjWhzvS5XijDCGQxhrLcIK74L6OnqrfLcUgItPQUA3Dg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-css": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.11.0.tgz", + "integrity": "sha512-DpYKHmA4/te9gYUTLfLNgp0sotkq9TJQ9XkBzXJerwye+IzZdKhIsCWf/m5S6jf065MPjncEtwBgxDdvvB8DrQ==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.11.0.tgz", + "integrity": "sha512-aEpitRE2an8YGm/s0QDfGW/0ccWlnqgA9DhrosZ7kxTElj7BVMQOGVh/nQKBjf+finOGThjvTCM33eksmgPaOw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.11.0.tgz", + "integrity": "sha512-z7ZTDonZ/mEJ6u/WH7De/NzT4IZ+zgqR0mJn4ypsf8T0ixB/r7aDHZG9cTP9hG4gnUag8VNbdashMCroDLSYNA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.11.0.tgz", + "integrity": "sha512-oV/SKvKuSze7eTbALCU0sCGmzMe8JgVQrrOPwWpepO/x2VHlWTNQbBQpsFmTOksR89Qx8NlK3Umo84i1RkeF1w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.11.0.tgz", + "integrity": "sha512-ZgJb3rdlKHo3iu9XZwy+elzhcBfZXb1LzoRIsLuanVHYeq/pbSXFtw8cJYJ3a65dnA6ryvGbY2m5TrWw39slMg==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.11.0.tgz", + "integrity": "sha512-+RqU/N8FUfbvmNPYCOyjS5e4H86dsT7h4A/2+NT2HmuyFObeXhCFMyp/60Kpfb6X7wJtnw1qa8go3zb8Gv5cpw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.11.0.tgz", + "integrity": "sha512-o8V+S7mNoTV5mceCaTtY6+dFhzpJAxcR/e+1kN7yq6SfiabVjfW6EBqQYAnVc/hT9WfS3AUgO/8YFdr1CKOTqA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-form-validation-message": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.11.0.tgz", + "integrity": "sha512-VxkPNQNPbMNMX/cPzrkekdGC7QUlyb9aH4feGe1RzD33hRc9FQufoTxS4gjSeX6yemjYu/78nqroBAMzIEmvUg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.7.0.tgz", - "integrity": "sha512-PtOSZkTxWskRrppdhxf17D+d54OylvtjE7muyLb2eJEYoP7KEaWdJ8Lfei5LtaUCRJlstFwQrCh/QbtWhe8Dfw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.11.0.tgz", + "integrity": "sha512-aH7tKlqfkMRU4+T8neSedU+YpHuFEhDe2ckHuqILw3iK1/j56Y0lUeoabkh1y/SWRZwydkkOjIhwDFIv48Ceag==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.11.0.tgz", + "integrity": "sha512-NbNDV35f1rSgKK2xFV/CPAdLPLhAFThilCPGraMY260WNIFwpcbP8n+PQ1dzNSec6xhIEMV4AC4Y5SvK/z54LA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.11.0.tgz", + "integrity": "sha512-WU5LRcjDFeGlr/Dq540IHLC1mMLgEkMJXjCNOb2d/7jLP3FHDs0T4qJGgzILYfeX7fDjQCnxkWVfaDmGGikSWA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.11.0.tgz", + "integrity": "sha512-DWe25cOCtYvRgqShL/UL4OnTRSbIZgTLp1JSdzLzSFxNm3PO2mAhYZuOMdGCjDkjv0G2lszmaqd7Ix8Xw+51ZA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.11.0.tgz", + "integrity": "sha512-u19lW5F7aiMN/D3wHhqJgqdreKaHJDoZ76A37nys2kItNWHvpoFbRrHkAaaN9RQVrl0rwmx3R6Sbs+IWFuTCJA==", "dependencies": { - "@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" + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.11.0.tgz", + "integrity": "sha512-VCpLcFZ+OOeCubczsQsxrhqj3iPdq7o81YMxckd+BLiqU0O5nDxioSuZf5WeU7zttkTE64a0NYu0fKaRC7hLOA==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.11.0.tgz", + "integrity": "sha512-doilXxlrc8v6BUtXUhlrno2aQSzlApUw1B9nnG2TuFOxoJ3iynJV6p6CcwPNlNPEYzPeiHFOaizPeDaZWZYmRg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", - "@umbraco-ui/uui-input": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.11.0.tgz", + "integrity": "sha512-wRhfCnjjmZzs2gVoF1gZXNvIooPH8Qytr7UE6ijr6rDWbkDsltjhHocsPpcBAu1LUhqmqmlXDPHOOnc4sraL4A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.7.0.tgz", - "integrity": "sha512-uk1m3wux4dNb/0AqSGslODLo6yVT9aXKBYcHTsvW2P0NQI8IImiJVWw9TWmNrfuBPACJhEqo3pVvfe/PCfsWzQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.11.0.tgz", + "integrity": "sha512-xeVOm9gGyPERnmwjmBNiqsfHFU4ROn6wGIEg6bV/CRdz0sjOKBHMYjdH+hg00kRQjj8oYt52HK4dVos8lDDYZg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.11.0.tgz", + "integrity": "sha512-BoNCOFV+CXwMH/WEwVo5ADj6QXg1tIRPtzVtN3gZGTcDizbqp20171JtkeW3IvOpE6s9Gypn22bv1sUI+ZZOFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.11.0.tgz", + "integrity": "sha512-WSIGG4Xlb/SuhnMmL0yd5ZaFUUdHR1UnZ6vv9ja5ORug88AnvPTNMY/53u2ilSh6NT0GCPXWFAbVgIZDn5KaFA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.11.0.tgz", + "integrity": "sha512-78xMkQVPUxSwEbvUIdg7L6lamliVKS+NVh+ZRGB+U3HG5t+kwXlcjgaQ4ebdkB7LgLvqrT41GEbXPsmk8hVKKQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.11.0.tgz", + "integrity": "sha512-SMbTptyJdLCh03pSa1MflC0im6c7jaRdjb3p6exQ7cz++TdoLveJyOKAWaJ2TvaAShoaLOdlVHRD88sXcuj2Eg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-loader-bar": "1.7.0", - "@umbraco-ui/uui-symbol-expand": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.7.0.tgz", - "integrity": "sha512-/XTu5kbPAgkbMrm1MISz+hvvEh3d2guBl7bs5EhiLBsq4XqnaDQwh15joS4wub5R2lfaodvJg7Or2VvFV+v5ug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.11.0.tgz", + "integrity": "sha512-rNq8lhzKj4bk4EMgAIlnHcaQX0W7kQhHWBeJahvLL6jNMmiMGtN/ZtE0efG5tx1r4dixTPbiXXGAl8qMqgTIig==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.7.1.tgz", - "integrity": "sha512-T6oomUkqf6xFc4ZMGX4YHmeBDBLwSfkTz/9sksqTpFpiK86XGJMQ0yOfPhlWNZ9TrC4OJZDurZ/jnY1l97OxcQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.11.0.tgz", + "integrity": "sha512-aQf9MH4BlBbR9r+u4jbknuivhXPrwn65YjLkO3gDDfVfeSSu+ZsrNxReUVnVehF+bP55htcxgwC/lKDJldHVEQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.11.0.tgz", + "integrity": "sha512-ZHjkuJ1z8P/zLFeBf8LB8+c/JXm6YK5SORVnZfIlF8MZSDLanFlST62uOT7dcop96yihI/zIr7O5vO8OEw44bw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.11.0.tgz", + "integrity": "sha512-i90xXibf8BfP4Yd5Bp4wOfjnFEWQ2Qmn9vnDOWcxmsM9q7NQFx7m4287jJCMtfz2DUbj0VIFJlA2rffWnnSJzw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.11.0.tgz", + "integrity": "sha512-ZTRlebLZV19wvNS5TtX+Ku/1cXgAXBR9anYydx/+e2sXQeotwsak74vHqVgNYTzFqD+8EuRlwYJOI4kMer8COw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.11.0.tgz", + "integrity": "sha512-s2KhChBWMlpUThSAm7HGPcbCFXJ7vQTTgSw1e+VED/p/xwKhMrcMiwGX1s4fRTXt4tnCm8AcbMSkhfrW4DW8IA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.11.0.tgz", + "integrity": "sha512-ReU+Xh8VEH9L+ap4Zwo4+TFWDodoiU5iNkkM0NwbHMz/PLiBE0tVKD5wgppkJKnTRxDxS3MG98C+3DOvXqO2ZQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.11.0.tgz", + "integrity": "sha512-gAtI3/FgcUmmUPSNY9HMGnlMSby9PrcZ1hJRFmv+b86Ducc+4ljmsro97noTexYG1zttDPMkvYGFqOeE5bAeDQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.7.0.tgz", - "integrity": "sha512-BEb878VsSmRJuq1FCtoS9ryBvUErUfK8bQy93ErwgmesdUcuYpBJK1PfSe4x7SiLjD1vDlH9GHaWLyFiSJKfIQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.11.0.tgz", + "integrity": "sha512-c0DLRyNs/sRKPqmnjY6QAfuPa8+etQpXK683gJEn5R4zwcJGGPFzRf6BD9nIcecAAnbL+MFd6cgCBZWlDq/BJA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.11.0.tgz", + "integrity": "sha512-/+kpfFBb1su5/7egIAHQfeCm3+VQuMrwt07evovAeAM6YAdZsEcv8l2B0V09uKIcJJn/eJOfVVWlqWqi+qQazg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-ref": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.11.0.tgz", + "integrity": "sha512-MED2t6TvjNgzLhV2aaWf/WJ6qA5fhWgFC11hCfEDdjqzhot7TrL4yI/YRDaEJXcYjb5rivod+c346ejSL9+Eog==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.11.0.tgz", + "integrity": "sha512-S2kzH14m508FBkYalKsWEPLT2xShqryxuSs6caiYAi3cXm5MJq04phvRxl9Yo7h74PESojmZWHjRquPfCLEHog==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.11.0.tgz", + "integrity": "sha512-S1RobwV2O69eyw5sDRrJJDcFNF49hfZ/UcsluK9snPBe080Hzcqjl8bp+6AnH5NyicVwwDW43s6KImXhlIhtVw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.11.0.tgz", + "integrity": "sha512-rFqPLY2xnFNFaGgPvneYHapLbnmNhUBaGYnSBe8GJkywz1YFBfdJKj7OftKiqMVWidNz32fejGEUouj9zztxyw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.11.0.tgz", + "integrity": "sha512-ykakG0czZnDdCMy5bRawizwYTu4J267vM1bJrfUa22+hSMKGMy/o4oKS+aKQ2Rh5eUlfBq80iylLDhn4rdmJ6A==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.11.0.tgz", + "integrity": "sha512-mrvjf+0usJmJRtTwg90bvLZvftBLG6IQPUxPqWEN7cYbwnDnT0GDn/5qA8Yx9+eND+xMU/I3Dvke9XOyLXfT9Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.11.0.tgz", + "integrity": "sha512-e+8Fnc2rFtRdv52DpZW0UC9CnxzhXmIqRldYjTpbaL6Xjg9qNSdeW5AvJNk+fgufL6LJOO6NUXs6ixTp8eiOIA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-select": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.11.0.tgz", + "integrity": "sha512-slTOIvJZMMtCnVEhBVjAs1MPQBb1BAAa6R+DOoslC4aqA1yEgXWQmFu0xVZqiN0NTz3kqEF5zfexumVJ5f79LQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.7.0.tgz", - "integrity": "sha512-kP93yvwsvRUEyS4+PhkhwXpkWZUm77sKerB6Dte0Z579WMQclSAivy6va9kkj5zKxZYPcRbJ3H498FvfhxhMkw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.11.0.tgz", + "integrity": "sha512-sxWZCvznmTkpJ+VyoIjMRsVQuYC2SMnTWFd+7xrg3pk5SRySNxhZhyQUyf5jI1hAzrW9ATySDZlaRYCOMsC7uA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.11.0.tgz", + "integrity": "sha512-bFGp9Dhp8heBfNnu3ozw9DOIfwjkVcKNfHLSts6wg+J3vLW4x0y9jLfxSyvArQQUcUHKsgOzEHoNw6igYDpDJw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.11.0.tgz", + "integrity": "sha512-AK411VsceFqOAGtvlK2VcyTqwPbYVdqJkXbTbsSxYVhIB2jMVISppwlefqerx4zbPASBp4aeIN54PZWN+Y3dfw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.11.0.tgz", + "integrity": "sha512-Tma0hziyVM3ZXUduL97i8s3zs5JjbZi9lbydPx7foL/vAhEdP7fov8OXF1kMBhYIEieT11td/9ARxKlDOaLojQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.11.0.tgz", + "integrity": "sha512-22JNF2zs9iumu5JTsn6WmvyMqOwjrZ5/tfeL8+4ZnrxWM5CmJ7neKTm5BHoJyj0oM1wML2NWAc4McbWNOXktrg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.11.0.tgz", + "integrity": "sha512-NcQQupEQASwp8pyxVFG6v7rCvNAbgtE2R9IDlLl5yC/k3449TZ/NiEgMaSlmNhexBEc4SCoTMD9IuaEBo4vmZg==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.11.0.tgz", + "integrity": "sha512-1PsxVXj5zT3vXOcb+LP6/bgfGOt0aUmIoAGtV6mO/QHb1XPmOB07xrRzkk7CX+VixOCIdkTGYNU/CFjPJwLsow==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.11.0.tgz", + "integrity": "sha512-72OwXzXAm9XXLB/+qGhtl7IRzrq/2uDdMFG93EMJs0NM3MU0EM0Ild7MuIAPecGiCGjBYn/iyZmWhYMDhS/KOA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.11.0.tgz", + "integrity": "sha512-Y+PQc77PvmVOGAaPGRTYrtLI3MCV/BqE9hl0f+yGZYK/C97r3ogGQxMguU5zThf49EOEL3VmB/WWS/HEFblsjA==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-table": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.11.0.tgz", + "integrity": "sha512-AXKMARK9WtyuU9T72LGprhBQXpYKw4rWGoGQwUjRk4lwdQD8WKeY3kfIIcaeabBiK5FPnZaEoCpxIkmPt77n2w==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.7.1.tgz", - "integrity": "sha512-HYX5abtHKEse8UC17bUJM0LV4Kt0MNVIV4I2PtOOMIbLFx8kIVL/bdi/IO5T8VzYtecLQI8dgELc0Y2wgRSvNA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.11.0.tgz", + "integrity": "sha512-IyB1qao2G3T5UNBj3Kw9EL7ikjAp8COvHVH8eTD+fjx1PbrNJmDl6utTV6tpysxLkT7UQ3o6QtjxstDtlUSqsg==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.7.0.tgz", - "integrity": "sha512-twrXe2U733r92ubBGXxWV9F5QP7SCJhKwYZbC2jbFOGoHpcxCtELvy36vEvgoWUF2BorPLQZSci7RHO0Hbnasw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.11.0.tgz", + "integrity": "sha512-TGMkL7J+PPOq0dZiXnj5Y7f6+c/IJl71I2cme75cE/SkzoI01hr1KvEEThHT83yn64PPqews8ZCh1fKwmI1tmw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.11.0.tgz", + "integrity": "sha512-g4ciGte7YgHJkzhkLPn4xiGfjHXFbUWa86S4bg3WricucdF20EReLRc6I2jW7mo8lL+h+y8wLcIIQ8CquscLsQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.11.0.tgz", + "integrity": "sha512-5Mhhwn5z/IdlO3iuMMM8HYlDXg9GM23NxCykDcNGpGxMW0TeMFNLNxsBqm+5fOsNYjL2vhv3utPZyeE57ulyQA==", "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.11.0.tgz", + "integrity": "sha512-Y0LunmaTU/06i6mZF/RmopCDvsZMbgYlayJ3K7w6qkqXeJCnLg9cWHQSmOvIz9DJPO84NOcoYCwsLo4DRYa8WQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-toast-notification": "1.7.1" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.11.0.tgz", + "integrity": "sha512-lYuYhtgnO4ELs+qxc2bt6JPBdm+RYhcujMTpx8sSgCYPkHiwxnZt9WEfQQJe4wcwNyuGyMTcwn2d6BKMYgqP9g==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.11.0.tgz", + "integrity": "sha512-ZWafhMLnR/Z55U4Nw2mUYiPOWrIcSYS4Oay388ZuEKZmfQ0iwGYGSBo4awn3OeY/mVoY88QY6R2siRq9jABKig==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.11.0.tgz", + "integrity": "sha512-IxZwVLvX311+iupaupA36C6Ea3Aox/KAh/C5hE81qN+fNI/A8CZxr4OHHEvnQj4VcL0gTG0qt4PbxSR4hRfxmw==", "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@ungap/structured-clone": { @@ -11732,31 +11732,31 @@ } }, "node_modules/lit": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", - "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", + "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", "peer": true, "dependencies": { "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.0.4", - "lit-html": "^3.1.2" + "lit-element": "^4.1.0", + "lit-html": "^3.2.0" } }, "node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.1.2" + "lit-html": "^3.2.0" } }, "node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", "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 1c244f489914..ae65e8a6b884 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.7.1", - "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", "ace-builds": "1.31.1", "angular": "1.8.3", "angular-animate": "1.8.3", diff --git a/src/Umbraco.Web.UI.Login/package-lock.json b/src/Umbraco.Web.UI.Login/package-lock.json index b4524339e1e8..0e32d8cc1453 100644 --- a/src/Umbraco.Web.UI.Login/package-lock.json +++ b/src/Umbraco.Web.UI.Login/package-lock.json @@ -11,8 +11,8 @@ "rxjs": "^7.8.1" }, "devDependencies": { - "@umbraco-ui/uui": "1.7.1", - "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", "typescript": "^5.3.3", "vite": "^5.1.7" }, @@ -730,897 +730,897 @@ "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" }, "node_modules/@umbraco-ui/uui": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.7.1.tgz", - "integrity": "sha512-wHGMW8NQaWJTdbbb7r03sah2Esab4Iy8bFWaTU+UtnrOpNsZclPwxZ3kZcjHnFu32xDFFBF0+iQiCki8Uy4dkA==", - "dev": true, - "dependencies": { - "@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" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.11.0.tgz", + "integrity": "sha512-1mX7adcpAZRswPA1p64kqE83Rg5cbZsYM/b/OyUcObaL2cIuBCVvjjuUjgkL2el993GptIzl05XVocdj1dDCeQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-avatar-group": "1.11.0", + "@umbraco-ui/uui-badge": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-box": "1.11.0", + "@umbraco-ui/uui-breadcrumbs": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0", + "@umbraco-ui/uui-button-inline-create": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-card-block-type": "1.11.0", + "@umbraco-ui/uui-card-content-node": "1.11.0", + "@umbraco-ui/uui-card-media": "1.11.0", + "@umbraco-ui/uui-card-user": "1.11.0", + "@umbraco-ui/uui-caret": "1.11.0", + "@umbraco-ui/uui-checkbox": "1.11.0", + "@umbraco-ui/uui-color-area": "1.11.0", + "@umbraco-ui/uui-color-picker": "1.11.0", + "@umbraco-ui/uui-color-slider": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0", + "@umbraco-ui/uui-color-swatches": "1.11.0", + "@umbraco-ui/uui-combobox": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-dialog": "1.11.0", + "@umbraco-ui/uui-dialog-layout": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-file-preview": "1.11.0", + "@umbraco-ui/uui-form": "1.11.0", + "@umbraco-ui/uui-form-layout-item": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0", + "@umbraco-ui/uui-input-file": "1.11.0", + "@umbraco-ui/uui-input-lock": "1.11.0", + "@umbraco-ui/uui-input-password": "1.11.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.11.0", + "@umbraco-ui/uui-label": "1.11.0", + "@umbraco-ui/uui-loader": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-loader-circle": "1.11.0", + "@umbraco-ui/uui-menu-item": "1.11.0", + "@umbraco-ui/uui-modal": "1.11.0", + "@umbraco-ui/uui-pagination": "1.11.0", + "@umbraco-ui/uui-popover": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-progress-bar": "1.11.0", + "@umbraco-ui/uui-radio": "1.11.0", + "@umbraco-ui/uui-range-slider": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0", + "@umbraco-ui/uui-ref-list": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0", + "@umbraco-ui/uui-ref-node-data-type": "1.11.0", + "@umbraco-ui/uui-ref-node-document-type": "1.11.0", + "@umbraco-ui/uui-ref-node-form": "1.11.0", + "@umbraco-ui/uui-ref-node-member": "1.11.0", + "@umbraco-ui/uui-ref-node-package": "1.11.0", + "@umbraco-ui/uui-ref-node-user": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-select": "1.11.0", + "@umbraco-ui/uui-slider": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0", + "@umbraco-ui/uui-symbol-lock": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0", + "@umbraco-ui/uui-symbol-sort": "1.11.0", + "@umbraco-ui/uui-table": "1.11.0", + "@umbraco-ui/uui-tabs": "1.11.0", + "@umbraco-ui/uui-tag": "1.11.0", + "@umbraco-ui/uui-textarea": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0", + "@umbraco-ui/uui-toast-notification-container": "1.11.0", + "@umbraco-ui/uui-toast-notification-layout": "1.11.0", + "@umbraco-ui/uui-toggle": "1.11.0", + "@umbraco-ui/uui-visually-hidden": "1.11.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.11.0.tgz", + "integrity": "sha512-lhWw7CiLL2FIXVOWgmAt8yeb625HYWXceMQMEwhlic4bp/jpVmrbYGuKl4SyubR4ws6ein4Uzzy1EWfT5K+kFQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.7.0.tgz", - "integrity": "sha512-cW3qTTarFqXK4Ze5xMERo9pj3pRRKTvTDB57a5uA0gQ1/70uhgPnozWSX7EK22ml4w/5pmtxXXgRKfSiU9DGtQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.11.0.tgz", + "integrity": "sha512-ixM8Kx9rE15iWYJgk28mEGeNvVDag/I8mZH/lceuq5Mm0EhUbG6gJGPkUSkDSNTnDRijkjwlF4oeCO+8nA+DRw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.11.0.tgz", + "integrity": "sha512-/edFijQFzOsNMBbhg8eu0imhDnLE4MSoC30o4dQ4bI3XCtGLfJh1BiOgA+TLUU1vH7D0NIvidzH49+OOIUrvMg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.11.0.tgz", + "integrity": "sha512-7VMZzUZ+CYaFhsCe8XS8VgadBhXZtJh0ilZ695YG9Q9IAbAVyeART59VwRzO/1kS0hfCj10DPEKp8IPMbePWEA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.7.0.tgz", - "integrity": "sha512-66aDdgTrq2nx4BNzM9A/lc9dZYz/fyX5OVpkQDRsrpYeOLJMN3oOnE7aChIdBNW3I9lfVNJf6fh0iL27K5JCiQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.11.0.tgz", + "integrity": "sha512-w7HQDNtEt0qnu+psrwxvrdNxUT08qZ1fYygqH9yeKFyE5GMDvYlL1TWU696Lo72LTbTdSMm/ka9b2QBJv1ZJxA==", "dev": true, "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.11.0.tgz", + "integrity": "sha512-3r/lMYSrFzrw6EclCRjJADtf+1yAYPcz5QRQ4yD7WxLD/Kb338HRgQ50pMG5Jwq28cdDha4n7aNx7mGInrHD3g==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.7.0.tgz", - "integrity": "sha512-1P13tsVJXPEpMiHrw1FmsM0dvCLce8DevZAcP1ArDwtqWrwdArR2eRwlhVEZYu2MJkR2tESE3XGTaSOWHyC8og==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.11.0.tgz", + "integrity": "sha512-gYiERouKMpFy/n/6LDh9ckzWpUa2vBmCsWS41Gskct3WZNSVdApZ3g2yvE9ZoJoJB2Q26JfbKShuw0BaJkEFxg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.11.0.tgz", + "integrity": "sha512-wRTtuZAKb0z2Mi3P3wb1CcIO1ExnnFD8vCsHxiTEAjb2e2VzEaEwnnugHnr8chxlOKiTPyX8NtsBXDLTnL/TRA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.11.0.tgz", + "integrity": "sha512-/9B8Rsar9OE9NP84fXBzu5HkEIvXuEtmoaa37QQq9STgLyqrqRMxj6Mt47k69tQgh79HDNu+nwc8A5Gv+h+HHA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.11.0.tgz", + "integrity": "sha512-TW2OioMnjyTCjJA6lJhoX80SyeEb/R2BK6Py82/ZCifnVQ2QFWZ6PtIcnqGT+b0x95xTvzc19f+z4N841wYc8g==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.11.0.tgz", + "integrity": "sha512-hoKR3sj5V4kzJ9qR0xe5q6giz41QmcPVQRP+qd90BjpxefezgnN2fud+RC59ZbhssAmep031b1pONRZyFr+6ow==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.7.0.tgz", - "integrity": "sha512-BBWJ62UH1dmcHvZ3H0fRCnM9c+ebQMNaZlGDDWP5lPfv+2KjXXkLRuj6tPUthHa53e5Rf6AAKjKsjRssM4dsLQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.11.0.tgz", + "integrity": "sha512-MIesvjoBVgSNo+2ManDIpLtWXwsO3emhsloQH+nMoyU/ryy/HZMe/p4HRx/leZmM17HG3KXm2j8GpLHie8bU+w==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.11.0.tgz", + "integrity": "sha512-kZeFGwSwjdD+M9HwzJ+1bScFCnS3AV36RzXDc6YklVPh63PKlt+wDmiIDd2I4+jHp8NC1buzUz/2dkmZVYOYrg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.11.0.tgz", + "integrity": "sha512-iEzCVOpucAoCQnDYaGaq2k38zXUax+09gUypt907h0YPc6vRoTou5N5masvxZYyRYJrtWxv5kFs+MtLynREjGA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.11.0.tgz", + "integrity": "sha512-uOdN0iu5OKsOtxhTSE8epuUMo2iXq6FEVqBPQBHAmAFELDFyNf2UBwnBxnrTuU6RJ0jbGuLTqQQM7Gv8vD6Kjg==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.11.0.tgz", + "integrity": "sha512-/6No4e+eLqCmivNeCHlLfmChKb6F8asv9pgZdi6mUr44TOc44OGvvuF1vONslf9f4B2eKbRTFmFwGVIfWpjOAw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-avatar": "1.7.0", - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-card": "1.7.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.7.0.tgz", - "integrity": "sha512-sVWUQGaLCAwhFH5mmE83+cwDjTyZamRWHgmVakTac2L9qYkwhTwzRgIol1t4i0DQMDFd4oLZ1zq+ysWvAOCmmQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.11.0.tgz", + "integrity": "sha512-Lq+zBOMeobRvFPhEps03efcy+NFOm27w5jqwJ/4ad2TbEMLTBLdSose/3ZqPV4nvTPMlWButRIFo3Nrp+4jL/Q==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.7.0.tgz", - "integrity": "sha512-7bY8FgSEscGtMYf0EtvmU4XuchV8bdjs+gwBKCVYogAELDdKbCTxWI6/HRqR6wDUOltpP1okFYN6rISugkUKtw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.11.0.tgz", + "integrity": "sha512-bOfJXJ5LMiGCMD37A3mzYjiGTIvzjREN2AhtqGLbwcrAgj662WVhw0aQobo2+iIwaMUIAvl3kNS8930XDeUe/A==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.11.0.tgz", + "integrity": "sha512-R1fWHHk7BPilveIF7vPWECAHz/FPKIdvqllYu9f/oJ3RWm7DJtfcNI+Eb7hwkPR/Uj8ug7SkcL4ZvXOG30Ux4A==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.11.0.tgz", + "integrity": "sha512-EHU2DXmET3ehRQMwkVtS+nyrfIm8c9cu01GDQR6GFzRNl3G7nUKKdK0LyRQUEm7bSXbWpwctGz6qzB9/MCuxBg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-popover-container": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.11.0.tgz", + "integrity": "sha512-E2mW4hvARy4C7ETZ4PUCgeUPgSvw4HEPX1CpOWl32vM85R4F/K/RdS6OsSP3GHO/8oBYPjlLfX8betMrf4+3+Q==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.11.0.tgz", + "integrity": "sha512-BeCyW9FyVmjE2W8u3k5bPwkRUIVbudK2q9VTKmIcnkwsZz8wv6dDpFoFb92So8YSzMhdiVIRQ14fnphHwMHfWQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.11.0.tgz", + "integrity": "sha512-t+BKLHKlnFdSB/AB0vihqMl7EuIUI1M+m7q07E/or+BX7juV2H+sVAwWdYiOlCjpC5wqi1RAKh41tPWyslc/vQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-color-swatch": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.11.0.tgz", + "integrity": "sha512-Z+cfhxoK6/tGdErNc1rvrT9NDjuZPJ/SHAJlm83ziPvbWxTGVgjf75nqNZ3z6VW9EVWWJ0Fstz2VTzo4K0mcRA==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.11.0.tgz", + "integrity": "sha512-XV59sGG4NYZq6llWC3OqxxpR44Cavwfn+/7ee8kTBPmjWhzvS5XijDCGQxhrLcIK74L6OnqrfLcUgItPQUA3Dg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-css": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.11.0.tgz", + "integrity": "sha512-DpYKHmA4/te9gYUTLfLNgp0sotkq9TJQ9XkBzXJerwye+IzZdKhIsCWf/m5S6jf065MPjncEtwBgxDdvvB8DrQ==", "dev": true, "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.11.0.tgz", + "integrity": "sha512-aEpitRE2an8YGm/s0QDfGW/0ccWlnqgA9DhrosZ7kxTElj7BVMQOGVh/nQKBjf+finOGThjvTCM33eksmgPaOw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.11.0.tgz", + "integrity": "sha512-z7ZTDonZ/mEJ6u/WH7De/NzT4IZ+zgqR0mJn4ypsf8T0ixB/r7aDHZG9cTP9hG4gnUag8VNbdashMCroDLSYNA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.11.0.tgz", + "integrity": "sha512-oV/SKvKuSze7eTbALCU0sCGmzMe8JgVQrrOPwWpepO/x2VHlWTNQbBQpsFmTOksR89Qx8NlK3Umo84i1RkeF1w==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.11.0.tgz", + "integrity": "sha512-ZgJb3rdlKHo3iu9XZwy+elzhcBfZXb1LzoRIsLuanVHYeq/pbSXFtw8cJYJ3a65dnA6ryvGbY2m5TrWw39slMg==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.11.0.tgz", + "integrity": "sha512-+RqU/N8FUfbvmNPYCOyjS5e4H86dsT7h4A/2+NT2HmuyFObeXhCFMyp/60Kpfb6X7wJtnw1qa8go3zb8Gv5cpw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.11.0.tgz", + "integrity": "sha512-o8V+S7mNoTV5mceCaTtY6+dFhzpJAxcR/e+1kN7yq6SfiabVjfW6EBqQYAnVc/hT9WfS3AUgO/8YFdr1CKOTqA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-form-validation-message": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.11.0.tgz", + "integrity": "sha512-VxkPNQNPbMNMX/cPzrkekdGC7QUlyb9aH4feGe1RzD33hRc9FQufoTxS4gjSeX6yemjYu/78nqroBAMzIEmvUg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.7.0.tgz", - "integrity": "sha512-PtOSZkTxWskRrppdhxf17D+d54OylvtjE7muyLb2eJEYoP7KEaWdJ8Lfei5LtaUCRJlstFwQrCh/QbtWhe8Dfw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.11.0.tgz", + "integrity": "sha512-aH7tKlqfkMRU4+T8neSedU+YpHuFEhDe2ckHuqILw3iK1/j56Y0lUeoabkh1y/SWRZwydkkOjIhwDFIv48Ceag==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.11.0.tgz", + "integrity": "sha512-NbNDV35f1rSgKK2xFV/CPAdLPLhAFThilCPGraMY260WNIFwpcbP8n+PQ1dzNSec6xhIEMV4AC4Y5SvK/z54LA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.11.0.tgz", + "integrity": "sha512-WU5LRcjDFeGlr/Dq540IHLC1mMLgEkMJXjCNOb2d/7jLP3FHDs0T4qJGgzILYfeX7fDjQCnxkWVfaDmGGikSWA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.11.0.tgz", + "integrity": "sha512-DWe25cOCtYvRgqShL/UL4OnTRSbIZgTLp1JSdzLzSFxNm3PO2mAhYZuOMdGCjDkjv0G2lszmaqd7Ix8Xw+51ZA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.11.0.tgz", + "integrity": "sha512-u19lW5F7aiMN/D3wHhqJgqdreKaHJDoZ76A37nys2kItNWHvpoFbRrHkAaaN9RQVrl0rwmx3R6Sbs+IWFuTCJA==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.11.0.tgz", + "integrity": "sha512-VCpLcFZ+OOeCubczsQsxrhqj3iPdq7o81YMxckd+BLiqU0O5nDxioSuZf5WeU7zttkTE64a0NYu0fKaRC7hLOA==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.11.0.tgz", + "integrity": "sha512-doilXxlrc8v6BUtXUhlrno2aQSzlApUw1B9nnG2TuFOxoJ3iynJV6p6CcwPNlNPEYzPeiHFOaizPeDaZWZYmRg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon-registry-essential": "1.7.0", - "@umbraco-ui/uui-input": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.11.0.tgz", + "integrity": "sha512-wRhfCnjjmZzs2gVoF1gZXNvIooPH8Qytr7UE6ijr6rDWbkDsltjhHocsPpcBAu1LUhqmqmlXDPHOOnc4sraL4A==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.7.0.tgz", - "integrity": "sha512-uk1m3wux4dNb/0AqSGslODLo6yVT9aXKBYcHTsvW2P0NQI8IImiJVWw9TWmNrfuBPACJhEqo3pVvfe/PCfsWzQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.11.0.tgz", + "integrity": "sha512-xeVOm9gGyPERnmwjmBNiqsfHFU4ROn6wGIEg6bV/CRdz0sjOKBHMYjdH+hg00kRQjj8oYt52HK4dVos8lDDYZg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.11.0.tgz", + "integrity": "sha512-BoNCOFV+CXwMH/WEwVo5ADj6QXg1tIRPtzVtN3gZGTcDizbqp20171JtkeW3IvOpE6s9Gypn22bv1sUI+ZZOFA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.11.0.tgz", + "integrity": "sha512-WSIGG4Xlb/SuhnMmL0yd5ZaFUUdHR1UnZ6vv9ja5ORug88AnvPTNMY/53u2ilSh6NT0GCPXWFAbVgIZDn5KaFA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.11.0.tgz", + "integrity": "sha512-78xMkQVPUxSwEbvUIdg7L6lamliVKS+NVh+ZRGB+U3HG5t+kwXlcjgaQ4ebdkB7LgLvqrT41GEbXPsmk8hVKKQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.11.0.tgz", + "integrity": "sha512-SMbTptyJdLCh03pSa1MflC0im6c7jaRdjb3p6exQ7cz++TdoLveJyOKAWaJ2TvaAShoaLOdlVHRD88sXcuj2Eg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-loader-bar": "1.7.0", - "@umbraco-ui/uui-symbol-expand": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.7.0.tgz", - "integrity": "sha512-/XTu5kbPAgkbMrm1MISz+hvvEh3d2guBl7bs5EhiLBsq4XqnaDQwh15joS4wub5R2lfaodvJg7Or2VvFV+v5ug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.11.0.tgz", + "integrity": "sha512-rNq8lhzKj4bk4EMgAIlnHcaQX0W7kQhHWBeJahvLL6jNMmiMGtN/ZtE0efG5tx1r4dixTPbiXXGAl8qMqgTIig==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.7.1.tgz", - "integrity": "sha512-T6oomUkqf6xFc4ZMGX4YHmeBDBLwSfkTz/9sksqTpFpiK86XGJMQ0yOfPhlWNZ9TrC4OJZDurZ/jnY1l97OxcQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.11.0.tgz", + "integrity": "sha512-aQf9MH4BlBbR9r+u4jbknuivhXPrwn65YjLkO3gDDfVfeSSu+ZsrNxReUVnVehF+bP55htcxgwC/lKDJldHVEQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-button": "1.7.1", - "@umbraco-ui/uui-button-group": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.11.0.tgz", + "integrity": "sha512-ZHjkuJ1z8P/zLFeBf8LB8+c/JXm6YK5SORVnZfIlF8MZSDLanFlST62uOT7dcop96yihI/zIr7O5vO8OEw44bw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.11.0.tgz", + "integrity": "sha512-i90xXibf8BfP4Yd5Bp4wOfjnFEWQ2Qmn9vnDOWcxmsM9q7NQFx7m4287jJCMtfz2DUbj0VIFJlA2rffWnnSJzw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.11.0.tgz", + "integrity": "sha512-ZTRlebLZV19wvNS5TtX+Ku/1cXgAXBR9anYydx/+e2sXQeotwsak74vHqVgNYTzFqD+8EuRlwYJOI4kMer8COw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.11.0.tgz", + "integrity": "sha512-s2KhChBWMlpUThSAm7HGPcbCFXJ7vQTTgSw1e+VED/p/xwKhMrcMiwGX1s4fRTXt4tnCm8AcbMSkhfrW4DW8IA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.11.0.tgz", + "integrity": "sha512-ReU+Xh8VEH9L+ap4Zwo4+TFWDodoiU5iNkkM0NwbHMz/PLiBE0tVKD5wgppkJKnTRxDxS3MG98C+3DOvXqO2ZQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.11.0.tgz", + "integrity": "sha512-gAtI3/FgcUmmUPSNY9HMGnlMSby9PrcZ1hJRFmv+b86Ducc+4ljmsro97noTexYG1zttDPMkvYGFqOeE5bAeDQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.7.0.tgz", - "integrity": "sha512-BEb878VsSmRJuq1FCtoS9ryBvUErUfK8bQy93ErwgmesdUcuYpBJK1PfSe4x7SiLjD1vDlH9GHaWLyFiSJKfIQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.11.0.tgz", + "integrity": "sha512-c0DLRyNs/sRKPqmnjY6QAfuPa8+etQpXK683gJEn5R4zwcJGGPFzRf6BD9nIcecAAnbL+MFd6cgCBZWlDq/BJA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.11.0.tgz", + "integrity": "sha512-/+kpfFBb1su5/7egIAHQfeCm3+VQuMrwt07evovAeAM6YAdZsEcv8l2B0V09uKIcJJn/eJOfVVWlqWqi+qQazg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-icon": "1.7.0", - "@umbraco-ui/uui-ref": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.11.0.tgz", + "integrity": "sha512-MED2t6TvjNgzLhV2aaWf/WJ6qA5fhWgFC11hCfEDdjqzhot7TrL4yI/YRDaEJXcYjb5rivod+c346ejSL9+Eog==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.11.0.tgz", + "integrity": "sha512-S2kzH14m508FBkYalKsWEPLT2xShqryxuSs6caiYAi3cXm5MJq04phvRxl9Yo7h74PESojmZWHjRquPfCLEHog==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.11.0.tgz", + "integrity": "sha512-S1RobwV2O69eyw5sDRrJJDcFNF49hfZ/UcsluK9snPBe080Hzcqjl8bp+6AnH5NyicVwwDW43s6KImXhlIhtVw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.11.0.tgz", + "integrity": "sha512-rFqPLY2xnFNFaGgPvneYHapLbnmNhUBaGYnSBe8GJkywz1YFBfdJKj7OftKiqMVWidNz32fejGEUouj9zztxyw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.11.0.tgz", + "integrity": "sha512-ykakG0czZnDdCMy5bRawizwYTu4J267vM1bJrfUa22+hSMKGMy/o4oKS+aKQ2Rh5eUlfBq80iylLDhn4rdmJ6A==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.11.0.tgz", + "integrity": "sha512-mrvjf+0usJmJRtTwg90bvLZvftBLG6IQPUxPqWEN7cYbwnDnT0GDn/5qA8Yx9+eND+xMU/I3Dvke9XOyLXfT9Q==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-ref-node": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.11.0.tgz", + "integrity": "sha512-e+8Fnc2rFtRdv52DpZW0UC9CnxzhXmIqRldYjTpbaL6Xjg9qNSdeW5AvJNk+fgufL6LJOO6NUXs6ixTp8eiOIA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-select": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.11.0.tgz", + "integrity": "sha512-slTOIvJZMMtCnVEhBVjAs1MPQBb1BAAa6R+DOoslC4aqA1yEgXWQmFu0xVZqiN0NTz3kqEF5zfexumVJ5f79LQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.7.0.tgz", - "integrity": "sha512-kP93yvwsvRUEyS4+PhkhwXpkWZUm77sKerB6Dte0Z579WMQclSAivy6va9kkj5zKxZYPcRbJ3H498FvfhxhMkw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.11.0.tgz", + "integrity": "sha512-sxWZCvznmTkpJ+VyoIjMRsVQuYC2SMnTWFd+7xrg3pk5SRySNxhZhyQUyf5jI1hAzrW9ATySDZlaRYCOMsC7uA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.11.0.tgz", + "integrity": "sha512-bFGp9Dhp8heBfNnu3ozw9DOIfwjkVcKNfHLSts6wg+J3vLW4x0y9jLfxSyvArQQUcUHKsgOzEHoNw6igYDpDJw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.11.0.tgz", + "integrity": "sha512-AK411VsceFqOAGtvlK2VcyTqwPbYVdqJkXbTbsSxYVhIB2jMVISppwlefqerx4zbPASBp4aeIN54PZWN+Y3dfw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.11.0.tgz", + "integrity": "sha512-Tma0hziyVM3ZXUduL97i8s3zs5JjbZi9lbydPx7foL/vAhEdP7fov8OXF1kMBhYIEieT11td/9ARxKlDOaLojQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.11.0.tgz", + "integrity": "sha512-22JNF2zs9iumu5JTsn6WmvyMqOwjrZ5/tfeL8+4ZnrxWM5CmJ7neKTm5BHoJyj0oM1wML2NWAc4McbWNOXktrg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.11.0.tgz", + "integrity": "sha512-NcQQupEQASwp8pyxVFG6v7rCvNAbgtE2R9IDlLl5yC/k3449TZ/NiEgMaSlmNhexBEc4SCoTMD9IuaEBo4vmZg==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.11.0.tgz", + "integrity": "sha512-1PsxVXj5zT3vXOcb+LP6/bgfGOt0aUmIoAGtV6mO/QHb1XPmOB07xrRzkk7CX+VixOCIdkTGYNU/CFjPJwLsow==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.11.0.tgz", + "integrity": "sha512-72OwXzXAm9XXLB/+qGhtl7IRzrq/2uDdMFG93EMJs0NM3MU0EM0Ild7MuIAPecGiCGjBYn/iyZmWhYMDhS/KOA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.11.0.tgz", + "integrity": "sha512-Y+PQc77PvmVOGAaPGRTYrtLI3MCV/BqE9hl0f+yGZYK/C97r3ogGQxMguU5zThf49EOEL3VmB/WWS/HEFblsjA==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-table": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.11.0.tgz", + "integrity": "sha512-AXKMARK9WtyuU9T72LGprhBQXpYKw4rWGoGQwUjRk4lwdQD8WKeY3kfIIcaeabBiK5FPnZaEoCpxIkmPt77n2w==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.7.1.tgz", - "integrity": "sha512-HYX5abtHKEse8UC17bUJM0LV4Kt0MNVIV4I2PtOOMIbLFx8kIVL/bdi/IO5T8VzYtecLQI8dgELc0Y2wgRSvNA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.11.0.tgz", + "integrity": "sha512-IyB1qao2G3T5UNBj3Kw9EL7ikjAp8COvHVH8eTD+fjx1PbrNJmDl6utTV6tpysxLkT7UQ3o6QtjxstDtlUSqsg==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.7.0.tgz", - "integrity": "sha512-twrXe2U733r92ubBGXxWV9F5QP7SCJhKwYZbC2jbFOGoHpcxCtELvy36vEvgoWUF2BorPLQZSci7RHO0Hbnasw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.11.0.tgz", + "integrity": "sha512-TGMkL7J+PPOq0dZiXnj5Y7f6+c/IJl71I2cme75cE/SkzoI01hr1KvEEThHT83yn64PPqews8ZCh1fKwmI1tmw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.11.0.tgz", + "integrity": "sha512-g4ciGte7YgHJkzhkLPn4xiGfjHXFbUWa86S4bg3WricucdF20EReLRc6I2jW7mo8lL+h+y8wLcIIQ8CquscLsQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.11.0.tgz", + "integrity": "sha512-5Mhhwn5z/IdlO3iuMMM8HYlDXg9GM23NxCykDcNGpGxMW0TeMFNLNxsBqm+5fOsNYjL2vhv3utPZyeE57ulyQA==", "dev": true, "dependencies": { - "@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" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.11.0.tgz", + "integrity": "sha512-Y0LunmaTU/06i6mZF/RmopCDvsZMbgYlayJ3K7w6qkqXeJCnLg9cWHQSmOvIz9DJPO84NOcoYCwsLo4DRYa8WQ==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-toast-notification": "1.7.1" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.11.0.tgz", + "integrity": "sha512-lYuYhtgnO4ELs+qxc2bt6JPBdm+RYhcujMTpx8sSgCYPkHiwxnZt9WEfQQJe4wcwNyuGyMTcwn2d6BKMYgqP9g==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-css": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.11.0.tgz", + "integrity": "sha512-ZWafhMLnR/Z55U4Nw2mUYiPOWrIcSYS4Oay388ZuEKZmfQ0iwGYGSBo4awn3OeY/mVoY88QY6R2siRq9jABKig==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0", - "@umbraco-ui/uui-boolean-input": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "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==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.11.0.tgz", + "integrity": "sha512-IxZwVLvX311+iupaupA36C6Ea3Aox/KAh/C5hE81qN+fNI/A8CZxr4OHHEvnQj4VcL0gTG0qt4PbxSR4hRfxmw==", "dev": true, "dependencies": { - "@umbraco-ui/uui-base": "1.7.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/ansi-escapes": { diff --git a/src/Umbraco.Web.UI.Login/package.json b/src/Umbraco.Web.UI.Login/package.json index 90e3bf68cb4c..486e3e94eb95 100644 --- a/src/Umbraco.Web.UI.Login/package.json +++ b/src/Umbraco.Web.UI.Login/package.json @@ -16,10 +16,10 @@ "lit": "^3.1.2", "msw": "^2.2.0", "rxjs": "^7.8.1" - }, + }, "devDependencies": { - "@umbraco-ui/uui": "1.7.1", - "@umbraco-ui/uui-css": "1.7.0", + "@umbraco-ui/uui": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", "typescript": "^5.3.3", "vite": "^5.1.7" }, diff --git a/src/Umbraco.Web.UI.Login/src/auth-styles.css b/src/Umbraco.Web.UI.Login/src/auth-styles.css index 8e5b5efd53bf..f63dfa92e60d 100644 --- a/src/Umbraco.Web.UI.Login/src/auth-styles.css +++ b/src/Umbraco.Web.UI.Login/src/auth-styles.css @@ -1,24 +1,12 @@ -#umb-login-form umb-login-input { +#umb-login-form input { width: 100%; height: var(--input-height); box-sizing: border-box; display: block; border: 1px solid var(--uui-color-border); border-radius: var(--uui-border-radius); - outline: none; background-color: var(--uui-color-surface); -} - -#umb-login-form umb-login-input input { - width: 100%; - height: 100%; - display: block; - box-sizing: border-box; - border: none; - outline: none; - background: none; padding: var(--uui-size-1, 3px) var(--uui-size-space-4, 9px); - font-size: inherit; } #umb-login-form uui-form-layout-item { @@ -26,11 +14,31 @@ margin-bottom: var(--uui-size-space-4); } -#umb-login-form umb-login-input:focus-within { +#umb-login-form input:focus-within { border-color: var(--uui-input-border-color-focus, var(--uui-color-border-emphasis, #a1a1a1)); outline: calc(2px * var(--uui-show-focus-outline, 1)) solid var(--uui-color-focus); } -#umb-login-form umb-login-input:hover:not(:focus-within) { +#umb-login-form input:hover:not(:focus-within) { border-color: var(--uui-input-border-color-hover, var(--uui-color-border-standalone, #c2c2c2)); } + +#umb-login-form input::-ms-reveal { + display: none; +} + +#umb-login-form input span { + position: absolute; + right: 1px; + top: 50%; + transform: translateY(-50%); + z-index: 100; +} + +#umb-login-form input span svg { + background-color: white; + display: block; + padding: .2em; + width: 1.3em; + height: 1.3em; +} diff --git a/src/Umbraco.Web.UI.Login/src/auth.element.ts b/src/Umbraco.Web.UI.Login/src/auth.element.ts index a22e5e840eb2..3f5bfd1428d9 100644 --- a/src/Umbraco.Web.UI.Login/src/auth.element.ts +++ b/src/Umbraco.Web.UI.Login/src/auth.element.ts @@ -5,9 +5,7 @@ import { until } from 'lit/directives/until.js'; import { umbAuthContext } from './context/auth.context.js'; import { umbLocalizationContext } from './external/localization/localization-context.js'; -import { UmbLocalizeElement } from './external/localization/localize.element.js'; -import type { UmbLoginInputElement } from './components/login-input.element.js'; -import type { InputType, UUIFormLayoutItemElement, UUILabelElement } from '@umbraco-ui/uui'; +import type { InputType, UUIFormLayoutItemElement } from '@umbraco-ui/uui'; import authStyles from './auth-styles.css?inline'; @@ -16,35 +14,35 @@ const createInput = (opts: { type: InputType; name: string; autocomplete: AutoFill; - requiredMessage: string; label: string; inputmode: string; + autofocus?: boolean; }) => { - const input = document.createElement('umb-login-input'); + const input = document.createElement('input'); input.type = opts.type; input.name = opts.name; input.autocomplete = opts.autocomplete; input.id = opts.id; input.required = true; - input.requiredMessage = opts.requiredMessage; - input.label = opts.label; - input.spellcheck = false; input.inputMode = opts.inputmode; + input.ariaLabel = opts.label; + input.autofocus = opts.autofocus || false; return input; }; -const createLabel = (opts: { forId: string; localizeAlias: string }) => { - const label = document.createElement('uui-label'); - const umbLocalize = document.createElement('umb-localize') as UmbLocalizeElement; +const createLabel = (opts: { forId: string; localizeAlias: string; localizeFallback: string; }) => { + const label = document.createElement('label'); + const umbLocalize: any = document.createElement('umb-localize'); umbLocalize.key = opts.localizeAlias; - label.for = opts.forId; + umbLocalize.innerHTML = opts.localizeFallback; + label.htmlFor = opts.forId; label.appendChild(umbLocalize); return label; }; -const createFormLayoutItem = (label: UUILabelElement, input: UmbLoginInputElement) => { +const createFormLayoutItem = (label: HTMLLabelElement, input: HTMLInputElement) => { const formLayoutItem = document.createElement('uui-form-layout-item') as UUIFormLayoutItemElement; formLayoutItem.appendChild(label); formLayoutItem.appendChild(input); @@ -115,10 +113,10 @@ export default class UmbAuthElement extends LitElement { _form?: HTMLFormElement; _usernameLayoutItem?: UUIFormLayoutItemElement; _passwordLayoutItem?: UUIFormLayoutItemElement; - _usernameInput?: UmbLoginInputElement; - _passwordInput?: UmbLoginInputElement; - _usernameLabel?: UUILabelElement; - _passwordLabel?: UUILabelElement; + _usernameInput?: HTMLInputElement; + _passwordInput?: HTMLInputElement; + _usernameLabel?: HTMLLabelElement; + _passwordLabel?: HTMLLabelElement; constructor() { super(); @@ -161,31 +159,30 @@ export default class UmbAuthElement extends LitElement { ? await umbLocalizationContext.localize('general_email', undefined, 'Email') : await umbLocalizationContext.localize('general_username', undefined, 'Username'); const labelPassword = await umbLocalizationContext.localize('general_password', undefined, 'Password'); - const requiredMessage = await umbLocalizationContext.localize('general_required', undefined, 'Required'); this._usernameInput = createInput({ id: 'username-input', type: 'text', name: 'username', autocomplete: 'username', - requiredMessage, label: labelUsername, inputmode: this.usernameIsEmail ? 'email' : '', + autofocus: true, }); this._passwordInput = createInput({ id: 'password-input', type: 'password', name: 'password', autocomplete: 'current-password', - requiredMessage, label: labelPassword, inputmode: '', }); this._usernameLabel = createLabel({ forId: 'username-input', - localizeAlias: this.usernameIsEmail ? 'general_email' : 'general_username', + localizeAlias: this.usernameIsEmail ? 'general_email' : 'auth_username', + localizeFallback: this.usernameIsEmail ? 'Email' : 'Username', }); - this._passwordLabel = createLabel({forId: 'password-input', localizeAlias: 'general_password'}); + this._passwordLabel = createLabel({forId: 'password-input', localizeAlias: 'general_password', localizeFallback: 'Password'}); this._usernameLayoutItem = createFormLayoutItem(this._usernameLabel, this._usernameInput); this._passwordLayoutItem = createFormLayoutItem(this._passwordLabel, this._passwordInput); diff --git a/src/Umbraco.Web.UI.Login/src/components/login-input.element.ts b/src/Umbraco.Web.UI.Login/src/components/login-input.element.ts deleted file mode 100644 index d3e62621728f..000000000000 --- a/src/Umbraco.Web.UI.Login/src/components/login-input.element.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { UUIInputElement } from '@umbraco-ui/uui'; -import { customElement } from 'lit/decorators.js'; - -/** - * This is a custom element based on UUIInputElement that is used in the login page. - * It differs from UUIInputElement in that it does not render a Shadow DOM. - * - * @element umb-login-input - * @inheritDoc UUIInputElement - */ -@customElement('umb-login-input') -export class UmbLoginInputElement extends UUIInputElement { - /** - * Remove the id attribute from the inner input element to avoid duplicate ids. - * - * @override - * @protected - */ - protected firstUpdated() { - const innerInput = this.querySelector('input'); - innerInput?.removeAttribute('id'); - - innerInput?.addEventListener('mousedown', () => { - this.style.setProperty('--uui-show-focus-outline', '0'); - }); - innerInput?.addEventListener('blur', () => { - this.style.setProperty('--uui-show-focus-outline', ''); - }); - } - - /** - * Since this element does not render a Shadow DOM nor does it have a unique ID, - * we need to override this method to get the form element. - * - * @override - * @protected - */ - protected getFormElement(): HTMLElement { - const formElement = this.querySelector('input'); - - if (!formElement) { - throw new Error('Form element not found'); - } - - return formElement; - } - - /** - * Instruct Lit to not render a Shadow DOM. - * - * @protected - */ - protected createRenderRoot() { - return this; - } - - static styles = [...UUIInputElement.styles]; -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-login-input': UmbLoginInputElement; - } -} diff --git a/src/Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts b/src/Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts index 196db95d2664..cf231e1acc85 100644 --- a/src/Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts +++ b/src/Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts @@ -36,6 +36,13 @@ export default class UmbLoginPageElement extends LitElement { if (!this.#formElement) return; + // We need to listen for the enter key to submit the form, because the uui-button does not support the native input fields submit event + this.#formElement.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + this.#onSubmitClick(); + } + }); + this.#formElement.onsubmit = this.#handleSubmit; } @@ -53,6 +60,12 @@ export default class UmbLoginPageElement extends LitElement { const password = formData.get('password') as string; const persist = formData.has('persist'); + if (!username || !password) { + this._loginError = await umbLocalizationContext.localize('auth_userFailedLogin'); + this._loginState = 'failed'; + return; + } + this._loginState = 'waiting'; const response = await umbAuthContext.login({ diff --git a/src/Umbraco.Web.UI.Login/src/index.ts b/src/Umbraco.Web.UI.Login/src/index.ts index 7e95f9a4427e..765843201bca 100644 --- a/src/Umbraco.Web.UI.Login/src/index.ts +++ b/src/Umbraco.Web.UI.Login/src/index.ts @@ -15,7 +15,6 @@ import './components/external-login-provider.element.js'; import './components/layouts/new-password-layout.element.js'; import './components/layouts/confirmation-layout.element.js'; import './components/layouts/error-layout.element.js'; -import './components/login-input.element.js'; import './external/icon.registry.js'; import './external/custom-view.element.js'; From a6253957c8715eb459847c21e4f6f9b5ae7ee9f9 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Fri, 18 Oct 2024 09:17:17 +0200 Subject: [PATCH 047/167] MNTP: Improve site and root context for dynamic root (#17303) --- .../DynamicRoot/Origin/RootDynamicRootOriginFinder.cs | 4 +++- .../DynamicRoot/Origin/SiteDynamicRootOriginFinder.cs | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/DynamicRoot/Origin/RootDynamicRootOriginFinder.cs b/src/Umbraco.Core/DynamicRoot/Origin/RootDynamicRootOriginFinder.cs index 44766fb2dc3f..c5c28ffcfa2c 100644 --- a/src/Umbraco.Core/DynamicRoot/Origin/RootDynamicRootOriginFinder.cs +++ b/src/Umbraco.Core/DynamicRoot/Origin/RootDynamicRootOriginFinder.cs @@ -27,7 +27,9 @@ public RootDynamicRootOriginFinder(IEntityService entityService) return null; } - var entity = _entityService.Get(query.Context.ParentKey); + // when creating new content, CurrentKey will be null - fallback to using ParentKey + Guid entityKey = query.Context.CurrentKey ?? query.Context.ParentKey; + var entity = _entityService.Get(entityKey); if (entity is null || _allowedObjectTypes.Contains(entity.NodeObjectType) is false) { diff --git a/src/Umbraco.Core/DynamicRoot/Origin/SiteDynamicRootOriginFinder.cs b/src/Umbraco.Core/DynamicRoot/Origin/SiteDynamicRootOriginFinder.cs index d1e515de5921..f9b207db03f8 100644 --- a/src/Umbraco.Core/DynamicRoot/Origin/SiteDynamicRootOriginFinder.cs +++ b/src/Umbraco.Core/DynamicRoot/Origin/SiteDynamicRootOriginFinder.cs @@ -20,12 +20,14 @@ public SiteDynamicRootOriginFinder(IEntityService entityService, IDomainService public override Guid? FindOriginKey(DynamicRootNodeQuery query) { - if (query.OriginAlias != SupportedOriginType || query.Context.CurrentKey.HasValue is false) + if (query.OriginAlias != SupportedOriginType) { return null; } - IEntitySlim? entity = _entityService.Get(query.Context.CurrentKey.Value); + // when creating new content, CurrentKey will be null - fallback to using ParentKey + Guid entityKey = query.Context.CurrentKey ?? query.Context.ParentKey; + IEntitySlim? entity = _entityService.Get(entityKey); if (entity is null || entity.NodeObjectType != Constants.ObjectTypes.Document) { return null; From eab27123dde740d8af69c1a27c655966917f7ee1 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Fri, 18 Oct 2024 09:39:29 +0200 Subject: [PATCH 048/167] MNTP: Re-initialize contextual dialog options upon content creation (#17301) --- .../contentpicker/contentpicker.controller.js | 135 ++++++++++-------- 1 file changed, 75 insertions(+), 60 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js index a6fc601d8fd8..c5b476d6c5fb 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js @@ -15,7 +15,7 @@ * @param {any} editorService * @param {any} userService */ -function contentPickerController($scope, $q, $routeParams, $location, entityResource, editorState, iconHelper, navigationService, localizationService, editorService, userService, overlayService) { +function contentPickerController($scope, $q, $routeParams, $location, entityResource, editorState, iconHelper, navigationService, localizationService, editorService, userService, overlayService, eventsService) { var vm = { labels: { @@ -25,6 +25,7 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso }; var unsubscribe; + var savedEventUnsubscribe; function subscribe() { unsubscribe = $scope.$on("formSubmitting", function (ev, args) { @@ -33,6 +34,13 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso }); $scope.model.value = trim(currIds.join(), ","); }); + + const initialEditorStateId = editorState?.current ? editorState.current.id : 0; + savedEventUnsubscribe = eventsService.on("content.saved", function () { + if($scope.invalidStartNode === true && editorState?.current && editorState.current.id !== initialEditorStateId) { + initDialogOptions(); + } + }); } function trim(str, chr) { @@ -214,70 +222,74 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso }); } - //We need to manually handle the filter for members here since the tree displayed is different and only contains - // searchable list views - if (entityType === "Member") { - //first change the not allowed filter css class - dialogOptions.filterCssClass = "not-allowed"; - var currFilter = dialogOptions.filter; - //now change the filter to be a method - dialogOptions.filter = function (i) { - //filter out the list view nodes - if (i.metaData.isContainer) { - return true; - } - if (!currFilter) { - return false; - } - //now we need to filter based on what is stored in the pre-vals, this logic duplicates what is in the treepicker.controller, - // but not much we can do about that since members require special filtering. - var filterItem = currFilter.toLowerCase().split(','); - // NOTE: when used in a mini list view, the item content type alias is metaData.ContentTypeAlias (in regular views it's metaData.contentType) - var itemContentType = i.metaData.contentType || i.metaData.ContentTypeAlias; - var found = filterItem.indexOf(itemContentType.toLowerCase()) >= 0; - if (!currFilter.startsWith("!") && !found || currFilter.startsWith("!") && found) { - return true; - } + function initDialogOptions() { + //We need to manually handle the filter for members here since the tree displayed is different and only contains + // searchable list views + if (entityType === "Member") { + //first change the not allowed filter css class + dialogOptions.filterCssClass = "not-allowed"; + var currFilter = dialogOptions.filter; + //now change the filter to be a method + dialogOptions.filter = function (i) { + //filter out the list view nodes + if (i.metaData.isContainer) { + return true; + } + if (!currFilter) { + return false; + } + //now we need to filter based on what is stored in the pre-vals, this logic duplicates what is in the treepicker.controller, + // but not much we can do about that since members require special filtering. + var filterItem = currFilter.toLowerCase().split(','); + // NOTE: when used in a mini list view, the item content type alias is metaData.ContentTypeAlias (in regular views it's metaData.contentType) + var itemContentType = i.metaData.contentType || i.metaData.ContentTypeAlias; + var found = filterItem.indexOf(itemContentType.toLowerCase()) >= 0; + if (!currFilter.startsWith("!") && !found || currFilter.startsWith("!") && found) { + return true; + } - return false; - } - } - if ($routeParams.section === "settings" && $routeParams.tree === "documentTypes") { - //if the content-picker is being rendered inside the document-type editor, we don't need to process the startnode query - dialogOptions.startNodeId = -1; - } - else if ($scope.model.config.startNode.query) { - entityResource.getByXPath( - $scope.model.config.startNode.query, - editorState.current.id, - editorState.current.parentId, - "Document" - ).then(function (ent) { - dialogOptions.startNodeId = ($scope.model.config.idType === "udi" ? ent.udi : ent.id).toString(); - }); - } - else if ($scope.model.config.startNode.dynamicRoot) { - - entityResource.getDynamicRoot( - JSON.stringify($scope.model.config.startNode.dynamicRoot), - editorState.current.id, - editorState.current.parentId, - $scope.model.culture, - $scope.model.segment - ).then(function (ent) { - if(ent) { - dialogOptions.startNodeId = ($scope.model.config.idType === "udi" ? ent.udi : ent.id).toString(); - } else { - console.error("The Dynamic Root query did not find any valid results"); - $scope.invalidStartNode = true; + return false; } - }); - } + } + if ($routeParams.section === "settings" && $routeParams.tree === "documentTypes") { + //if the content-picker is being rendered inside the document-type editor, we don't need to process the startnode query + dialogOptions.startNodeId = -1; + } + else if ($scope.model.config.startNode.query) { + entityResource.getByXPath( + $scope.model.config.startNode.query, + editorState.current.id, + editorState.current.parentId, + "Document" + ).then(function (ent) { + dialogOptions.startNodeId = ($scope.model.config.idType === "udi" ? ent.udi : ent.id).toString(); + }); + } + else if ($scope.model.config.startNode.dynamicRoot) { + $scope.invalidStartNode = false; + entityResource.getDynamicRoot( + JSON.stringify($scope.model.config.startNode.dynamicRoot), + editorState.current.id, + editorState.current.parentId, + $scope.model.culture, + $scope.model.segment + ).then(function (ent) { + if(ent) { + dialogOptions.startNodeId = ($scope.model.config.idType === "udi" ? ent.udi : ent.id).toString(); + } else { + console.error("The Dynamic Root query did not find any valid results"); + $scope.invalidStartNode = true; + } + }); + } - else { - dialogOptions.startNodeId = $scope.model.config.startNode.id; + else { + dialogOptions.startNodeId = $scope.model.config.startNode.id; + } } + initDialogOptions(); + //dialog $scope.openCurrentPicker = function () { if($scope.invalidStartNode) { @@ -426,6 +438,9 @@ function contentPickerController($scope, $q, $routeParams, $location, entityReso if (unsubscribe) { unsubscribe(); } + if (savedEventUnsubscribe) { + savedEventUnsubscribe(); + } }); function setDirty() { From 4be183a20d36e1ddb02627a80fb32cde7e8e601e Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 21 Oct 2024 09:49:34 +0200 Subject: [PATCH 049/167] Do not rely on NuCache to do key/id lookups (#17291) * Fixes #17182 * Ensure wait-on is installed --- build/azure-pipelines.yml | 4 ++++ .../UmbracoBuilderExtensions.cs | 18 +----------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index dc5ef96bde56..2ec84196b002 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -506,6 +506,10 @@ stages: condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) workingDirectory: $(Agent.BuildDirectory)/app + # Ensures we have the package wait-on installed + - pwsh: npm install wait-on + displayName: Install wait-on package + # Wait for application to start responding to requests - pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS) displayName: Wait for application diff --git a/src/Umbraco.PublishedCache.NuCache/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.PublishedCache.NuCache/DependencyInjection/UmbracoBuilderExtensions.cs index 0c1042c3ffe4..862bbb9abc93 100644 --- a/src/Umbraco.PublishedCache.NuCache/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.PublishedCache.NuCache/DependencyInjection/UmbracoBuilderExtensions.cs @@ -37,23 +37,7 @@ public static IUmbracoBuilder AddNuCache(this IUmbracoBuilder builder) builder.Services.TryAddSingleton(); builder.Services.TryAddTransient(); - // replace this service since we want to improve the content/media - // mapping lookups if we are using nucache. - // TODO: Gotta wonder how much this does actually improve perf? It's a lot of weird code to make this happen so hope it's worth it - builder.Services.AddUnique(factory => - { - var idkSvc = new IdKeyMap( - factory.GetRequiredService(), - factory.GetRequiredService()); - if (factory.GetRequiredService() is PublishedSnapshotService - publishedSnapshotService) - { - idkSvc.SetMapper(UmbracoObjectTypes.Document, id => publishedSnapshotService.GetDocumentUid(id), uid => publishedSnapshotService.GetDocumentId(uid)); - idkSvc.SetMapper(UmbracoObjectTypes.Media, id => publishedSnapshotService.GetMediaUid(id), uid => publishedSnapshotService.GetMediaId(uid)); - } - - return idkSvc; - }); + builder.Services.AddUnique(); builder.AddNuCacheNotifications(); From 1e32d59ecbfc2745f598946639f23a7d928f8b03 Mon Sep 17 00:00:00 2001 From: Justin Neville <67802060+justin-nevitech@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:53:17 +0100 Subject: [PATCH 050/167] Query for media using the full file path as well as the original file path for files that contain the sizes in the file name (i.e. image_200x200.jpg) (#17314) --- .../Persistence/Repositories/Implement/MediaRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs index 73cb42383723..ca488f8cc203 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs @@ -305,20 +305,20 @@ public override IEnumerable GetAllVersions(int nodeId) public IMedia? GetMediaByPath(string mediaPath) { - var umbracoFileValue = mediaPath; const string pattern = ".*[_][0-9]+[x][0-9]+[.].*"; var isResized = Regex.IsMatch(mediaPath, pattern); + var originalMediaPath = string.Empty; // If the image has been resized we strip the "_403x328" of the original "/media/1024/koala_403x328.jpg" URL. if (isResized) { var underscoreIndex = mediaPath.LastIndexOf('_'); var dotIndex = mediaPath.LastIndexOf('.'); - umbracoFileValue = string.Concat(mediaPath.Substring(0, underscoreIndex), mediaPath.Substring(dotIndex)); + originalMediaPath = string.Concat(mediaPath.Substring(0, underscoreIndex), mediaPath.Substring(dotIndex)); } Sql sql = GetBaseQuery(QueryType.Single, joinMediaVersion: true) - .Where(x => x.Path == umbracoFileValue) + .Where(x => x.Path == mediaPath || (isResized && x.Path == originalMediaPath)) .SelectTop(1); ContentDto? dto = Database.Fetch(sql).FirstOrDefault(); From 11270eaaf5f9bf2cca9bd5298c6211ce730fb0fd Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:00:47 +0200 Subject: [PATCH 051/167] Updated message pack (#17320) --- src/Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 4d6bf155d351..643c331edb64 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -13,7 +13,7 @@ - + From 8a22672c7f31c0757c71cfaf5c4e516fbb76d8e4 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:15:59 +0200 Subject: [PATCH 052/167] Updated version of messagepack (#17321) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 43435394c1ee..b70236ab8068 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -51,7 +51,7 @@ - + From 6399f235f2705a728ce3a7c0838d0a987ecdf95a Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:15:59 +0200 Subject: [PATCH 053/167] Updated version of messagepack (#17321) (cherry picked from commit 8a22672c7f31c0757c71cfaf5c4e516fbb76d8e4) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1096af77d670..027876da6fcf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -52,7 +52,7 @@ - + From edd0a4a4a926e6ff16d4978eb45dbca83bc8e0a8 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:00:47 +0200 Subject: [PATCH 054/167] Updated message pack (#17320) (cherry picked from commit 11270eaaf5f9bf2cca9bd5298c6211ce730fb0fd) --- src/Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 0ea425c69ae7..97fd24618cdc 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -13,7 +13,7 @@ - + From 97d74f39e75fb2b81f2325e31248a58ff59283f8 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:15:59 +0200 Subject: [PATCH 055/167] Updated version of messagepack (#17321) (cherry picked from commit 8a22672c7f31c0757c71cfaf5c4e516fbb76d8e4) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index fb5de6c69872..656325376c56 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -51,7 +51,7 @@ - + From 6caf53ed2e62762ae07f2b8a73403f30594b42fa Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:15:59 +0200 Subject: [PATCH 056/167] Updated version of messagepack (#17321) (cherry picked from commit 8a22672c7f31c0757c71cfaf5c4e516fbb76d8e4) (cherry picked from commit 6399f235f2705a728ce3a7c0838d0a987ecdf95a) --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 1096af77d670..027876da6fcf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -52,7 +52,7 @@ - + From 67a71f8f823b2b8c2c62f89193ebb96bc883a091 Mon Sep 17 00:00:00 2001 From: Elitsa Date: Wed, 21 Aug 2024 14:41:14 +0200 Subject: [PATCH 057/167] Make sure that the client shows the login screen as close to the server's timout time as possible --- .../src/common/services/user.service.js | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js index ee9aa0864f37..943141878abc 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js @@ -3,6 +3,7 @@ angular.module('umbraco.services') var currentUser = null; var lastUserId = null; + var countdownCounter = null; //this tracks the last date/time that the user's remainingAuthSeconds was updated from the server // this is used so that we know when to go and get the user's remaining seconds directly. @@ -43,6 +44,10 @@ angular.module('umbraco.services') } currentUser = usr; lastServerTimeoutSet = new Date(); + //don't start the timer if it is already going + if (countdownCounter) { + return; + } //start the timer countdownUserTimeout(); } @@ -54,7 +59,7 @@ angular.module('umbraco.services') */ function countdownUserTimeout() { - $timeout(function () { + countdownCounter = $timeout(function () { if (currentUser) { //countdown by 5 seconds since that is how long our timer is for. @@ -95,15 +100,20 @@ angular.module('umbraco.services') if (Umbraco.Sys.ServerVariables.umbracoSettings.keepUserLoggedIn !== true) { //NOTE: the safeApply because our timeout is set to not run digests (performance reasons) angularHelper.safeApply($rootScope, function () { - try { - //NOTE: We are calling this again so that the server can create a log that the timeout has expired, we - // don't actually care about this result. - authResource.getRemainingTimeoutSeconds(); - } - finally { - userAuthExpired(); - } + //NOTE: We are calling this again so that the server can create a log that the timeout has expired + //and we will show the login screen as close to the server's timout time as possible + authResource.getRemainingTimeoutSeconds().then(function (result) { + setUserTimeoutInternal(result); + + //the client auth can expire a second earlier as the client internal clock is behind + if (result < 1) { + userAuthExpired(); + } + }); }); + + //recurse the countdown! + countdownUserTimeout(); } else { //we've got less than 30 seconds remaining so let's check the server @@ -155,6 +165,7 @@ angular.module('umbraco.services') lastServerTimeoutSet = null; currentUser = null; + countdownCounter = null; openLoginDialog(isLogout === undefined ? true : !isLogout); } From c9021ab2d2c02f23ad5d9bcff3ccb0f5e283d914 Mon Sep 17 00:00:00 2001 From: Elitsa Date: Wed, 21 Aug 2024 14:44:09 +0200 Subject: [PATCH 058/167] Reduce the time when getRemainingTimeoutSeconds request is made from 30s to 20s, so fewer calls are made --- .../src/common/services/user.service.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js index 943141878abc..bb56b7cc203f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js @@ -65,17 +65,17 @@ angular.module('umbraco.services') //countdown by 5 seconds since that is how long our timer is for. currentUser.remainingAuthSeconds -= 5; - //if there are more than 30 remaining seconds, recurse! - if (currentUser.remainingAuthSeconds > 30) { + //if there are more than 20 remaining seconds, recurse! + if (currentUser.remainingAuthSeconds > 20) { //we need to check when the last time the timeout was set from the server, if - // it has been more than 30 seconds then we'll manually go and retrieve it from the + // it has been more than 20 seconds then we'll manually go and retrieve it from the // server - this helps to keep our local countdown in check with the true timeout. if (lastServerTimeoutSet != null) { var now = new Date(); var seconds = (now.getTime() - lastServerTimeoutSet.getTime()) / 1000; - if (seconds > 30) { + if (seconds > 20) { //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we // wait for a response from the server otherwise we'll be making double/triple/etc... calls while we wait. @@ -116,7 +116,7 @@ angular.module('umbraco.services') countdownUserTimeout(); } else { - //we've got less than 30 seconds remaining so let's check the server + //we've got less than 20 seconds remaining so let's check the server if (lastServerTimeoutSet != null) { //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we From 8c1128c85b8f84fee6891e19967d87aaa8ba80ed Mon Sep 17 00:00:00 2001 From: Elitsa Date: Tue, 20 Aug 2024 10:15:37 +0200 Subject: [PATCH 059/167] Update the HttpContext's user with the authenticated user's principal --- .../Extensions/HttpContextExtensions.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs b/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs index 226755039e8a..2a6bbc99d4db 100644 --- a/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs @@ -59,6 +59,14 @@ public static async Task AuthenticateBackOfficeAsync(this Ht await httpContext.AuthenticateAsync(Constants.Security.BackOfficeExternalAuthenticationType); } + // Update the HttpContext's user with the authenticated user's principal to ensure + // that subsequent requests within the same context will recognize the user + // as authenticated. + if (result.Succeeded) + { + httpContext.User = result.Principal; + } + return result; } From 35c51a029a16435109b3462f5db4cbdeb9189408 Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Mon, 12 Aug 2024 14:48:32 +0100 Subject: [PATCH 060/167] Prevents XSS when viewing an uploaded SVG from the media-info and image-preview components. --- .../media/umbmedianodeinfo.directive.js | 10 +------ .../common/services/mediahelper.service.js | 26 +++++++++++++++++-- .../umbimagepreview/umb-image-preview.html | 2 +- .../umbimagepreview.controller.js | 26 +++++++++---------- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js index 2a65c67a8d34..32abdc2a4854 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js @@ -69,15 +69,7 @@ editorService.mediaTypeEditor(editor); }; - scope.openSVG = () => { - var popup = window.open('', '_blank'); - var html = '' + - ''; - - popup.document.open(); - popup.document.write(html); - popup.document.close(); - } + scope.openSVG = () => mediaHelper.openSVG(scope.nodeUrl); // watch for content updates - reload content when node is saved, published etc. scope.$watch('node.updateDate', function(newValue, oldValue){ diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js index e98a597e764b..734dd29cba30 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js @@ -3,7 +3,7 @@ * @name umbraco.services.mediaHelper * @description A helper object used for dealing with media items **/ -function mediaHelper(umbRequestHelper, $http, $log) { +function mediaHelper(umbRequestHelper, $http, $log, $location) { //container of fileresolvers var _mediaFileResolvers = {}; @@ -449,7 +449,29 @@ function mediaHelper(umbRequestHelper, $http, $log) { cropY2: options.crop ? options.crop.y2 : null })), "Failed to retrieve processed image URL for image: " + imagePath); - } + }, + + /** + * @ngdoc function + * @name umbraco.services.mediaHelper#openSVG + * @methodOf umbraco.services.mediaHelper + * @function + * + * @description + * Opens an SVG file in a new window as an image file, to prevent any potential XSS exploits. + * + * @param {string} imagePath File path, ex /media/1234/my-image.svg + */ + openSVG: function (imagePath) { + var popup = window.open('', '_blank'); + var html = '' + + '' + + ''; + + popup.document.open(); + popup.document.write(html); + popup.document.close(); + } }; } angular.module('umbraco.services').factory('mediaHelper', mediaHelper); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html index 989f8ef09325..0918f6dc5b74 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html @@ -1,6 +1,6 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js index 36eb3958e213..d1f32fb6b578 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js @@ -1,18 +1,16 @@ - - - - angular.module("umbraco") - .controller("umbImagePreviewController", - function (mediaHelper) { + .controller("umbImagePreviewController", + function (mediaHelper) { + + var vm = this; - var vm = this; + vm.getThumbnail = function (source) { + return mediaHelper.getThumbnailFromPath(source) || source; + } - vm.getThumbnail = function(source) { - return mediaHelper.getThumbnailFromPath(source) || source; - } - vm.getClientSideUrl = function(sourceData) { - return URL.createObjectURL(sourceData); - } + vm.getClientSideUrl = function (sourceData) { + return URL.createObjectURL(sourceData); + } - }); + vm.openSVG = (source) => mediaHelper.openSVG(source); + }); From 2ad5ecd5d508ee4404ef604f6e232cdfd65a6a10 Mon Sep 17 00:00:00 2001 From: Elitsa Date: Wed, 21 Aug 2024 14:41:14 +0200 Subject: [PATCH 061/167] Make sure that the client shows the login screen as close to the server's timout time as possible --- .../src/common/services/user.service.js | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js index 71141106bf30..9fbee2fa9288 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js @@ -3,6 +3,7 @@ angular.module('umbraco.services') var currentUser = null; var lastUserId = null; + var countdownCounter = null; //this tracks the last date/time that the user's remainingAuthSeconds was updated from the server // this is used so that we know when to go and get the user's remaining seconds directly. @@ -43,6 +44,10 @@ angular.module('umbraco.services') } currentUser = usr; lastServerTimeoutSet = new Date(); + //don't start the timer if it is already going + if (countdownCounter) { + return; + } //start the timer countdownUserTimeout(); } @@ -54,7 +59,7 @@ angular.module('umbraco.services') */ function countdownUserTimeout() { - $timeout(function () { + countdownCounter = $timeout(function () { if (currentUser) { //countdown by 5 seconds since that is how long our timer is for. @@ -95,15 +100,20 @@ angular.module('umbraco.services') if (Umbraco.Sys.ServerVariables.umbracoSettings.keepUserLoggedIn !== true) { //NOTE: the safeApply because our timeout is set to not run digests (performance reasons) angularHelper.safeApply($rootScope, function () { - try { - //NOTE: We are calling this again so that the server can create a log that the timeout has expired, we - // don't actually care about this result. - authResource.getRemainingTimeoutSeconds(); - } - finally { - userAuthExpired(); - } + //NOTE: We are calling this again so that the server can create a log that the timeout has expired + //and we will show the login screen as close to the server's timout time as possible + authResource.getRemainingTimeoutSeconds().then(function (result) { + setUserTimeoutInternal(result); + + //the client auth can expire a second earlier as the client internal clock is behind + if (result < 1) { + userAuthExpired(); + } + }); }); + + //recurse the countdown! + countdownUserTimeout(); } else { //we've got less than 30 seconds remaining so let's check the server @@ -155,6 +165,7 @@ angular.module('umbraco.services') lastServerTimeoutSet = null; currentUser = null; + countdownCounter = null; if (!isLogout) { openLoginDialog(true); From d83daf44d3642df0d102eb4a90aa6b6b17c9311e Mon Sep 17 00:00:00 2001 From: Elitsa Date: Wed, 21 Aug 2024 14:44:09 +0200 Subject: [PATCH 062/167] Reduce the time when getRemainingTimeoutSeconds request is made from 30s to 20s, so fewer calls are made --- .../src/common/services/user.service.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js index 9fbee2fa9288..41965d5b3e88 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/user.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/user.service.js @@ -65,17 +65,17 @@ angular.module('umbraco.services') //countdown by 5 seconds since that is how long our timer is for. currentUser.remainingAuthSeconds -= 5; - //if there are more than 30 remaining seconds, recurse! - if (currentUser.remainingAuthSeconds > 30) { + //if there are more than 20 remaining seconds, recurse! + if (currentUser.remainingAuthSeconds > 20) { //we need to check when the last time the timeout was set from the server, if - // it has been more than 30 seconds then we'll manually go and retrieve it from the + // it has been more than 20 seconds then we'll manually go and retrieve it from the // server - this helps to keep our local countdown in check with the true timeout. if (lastServerTimeoutSet != null) { var now = new Date(); var seconds = (now.getTime() - lastServerTimeoutSet.getTime()) / 1000; - if (seconds > 30) { + if (seconds > 20) { //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we // wait for a response from the server otherwise we'll be making double/triple/etc... calls while we wait. @@ -116,7 +116,7 @@ angular.module('umbraco.services') countdownUserTimeout(); } else { - //we've got less than 30 seconds remaining so let's check the server + //we've got less than 20 seconds remaining so let's check the server if (lastServerTimeoutSet != null) { //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we From 1bc5466a8ded0ec87e06a9d9da35f49d62fe080b Mon Sep 17 00:00:00 2001 From: Elitsa Date: Tue, 20 Aug 2024 10:15:37 +0200 Subject: [PATCH 063/167] Update the HttpContext's user with the authenticated user's principal --- .../Extensions/HttpContextExtensions.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs b/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs index 0f2da0ac4e50..0a84f318f6f1 100644 --- a/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/HttpContextExtensions.cs @@ -59,6 +59,14 @@ public static async Task AuthenticateBackOfficeAsync(this Ht await httpContext.AuthenticateAsync(Constants.Security.BackOfficeExternalAuthenticationType); } + // Update the HttpContext's user with the authenticated user's principal to ensure + // that subsequent requests within the same context will recognize the user + // as authenticated. + if (result.Succeeded) + { + httpContext.User = result.Principal; + } + return result; } From 3431f763201b0befcd74e26686e9c41ef766e1de Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Mon, 12 Aug 2024 15:25:05 +0100 Subject: [PATCH 064/167] Prevents XSS when viewing an uploaded SVG from the media-info and image-preview components. --- .../media/umbmedianodeinfo.directive.js | 10 +------ .../common/services/mediahelper.service.js | 26 +++++++++++++++++-- .../umbimagepreview/umb-image-preview.html | 2 +- .../umbimagepreview.controller.js | 26 +++++++++---------- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js index 30bb2b6f3f50..e752044ddc2f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js @@ -136,15 +136,7 @@ editorService.mediaTypeEditor(editor); }; - scope.openSVG = () => { - var popup = window.open('', '_blank'); - var html = '' + - ''; - - popup.document.open(); - popup.document.write(html); - popup.document.close(); - } + scope.openSVG = () => mediaHelper.openSVG(scope.nodeUrl); // watch for content updates - reload content when node is saved, published etc. scope.$watch('node.updateDate', function(newValue, oldValue){ diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js index 14de3bb1c4a7..b9e6560f81bf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js @@ -3,7 +3,7 @@ * @name umbraco.services.mediaHelper * @description A helper object used for dealing with media items **/ -function mediaHelper(umbRequestHelper, $http, $log) { +function mediaHelper(umbRequestHelper, $http, $log, $location) { //container of fileresolvers var _mediaFileResolvers = {}; @@ -449,7 +449,29 @@ function mediaHelper(umbRequestHelper, $http, $log) { cropY2: options.crop ? options.crop.y2 : null })), "Failed to retrieve processed image URL for image: " + imagePath); - } + }, + + /** + * @ngdoc function + * @name umbraco.services.mediaHelper#openSVG + * @methodOf umbraco.services.mediaHelper + * @function + * + * @description + * Opens an SVG file in a new window as an image file, to prevent any potential XSS exploits. + * + * @param {string} imagePath File path, ex /media/1234/my-image.svg + */ + openSVG: function (imagePath) { + var popup = window.open('', '_blank'); + var html = '' + + '' + + ''; + + popup.document.open(); + popup.document.write(html); + popup.document.close(); + } }; } angular.module('umbraco.services').factory('mediaHelper', mediaHelper); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html index 989f8ef09325..0918f6dc5b74 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html @@ -1,6 +1,6 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js index 36eb3958e213..d1f32fb6b578 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js @@ -1,18 +1,16 @@ - - - - angular.module("umbraco") - .controller("umbImagePreviewController", - function (mediaHelper) { + .controller("umbImagePreviewController", + function (mediaHelper) { + + var vm = this; - var vm = this; + vm.getThumbnail = function (source) { + return mediaHelper.getThumbnailFromPath(source) || source; + } - vm.getThumbnail = function(source) { - return mediaHelper.getThumbnailFromPath(source) || source; - } - vm.getClientSideUrl = function(sourceData) { - return URL.createObjectURL(sourceData); - } + vm.getClientSideUrl = function (sourceData) { + return URL.createObjectURL(sourceData); + } - }); + vm.openSVG = (source) => mediaHelper.openSVG(source); + }); From e36dc1f554ca86f4a0fec8211e77c4cd7cc47dc4 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:26:59 +0700 Subject: [PATCH 065/167] V14 QA Added the acceptance tests for rendering content with different value (#17293) * Added tests for rendering content with numeric * Added tests for rendering content with textarea * Added tests for rendering content with approved color * Added tests for rendering content with numeric * Added tests for rendering content with tags * Added tests for rendering content with textarea * Updated tests for rendering content with textstring due to test helper changes * Added tests for rendering content with truefalse * Bumped version of test helper * Make all tests for rendering content run in the pipeline * Fixed comments * Removed blank lines * Fixed name * Make all smoke tests run in the pipeline --- .../package-lock.json | 16 +++---- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../RenderingContentWithApprovedColor.spec.ts | 48 +++++++++++++++++++ .../RenderingContentWithNumeric.spec.ts | 40 ++++++++++++++++ .../RenderingContentWithTags.spec.ts | 43 +++++++++++++++++ .../RenderingContentWithTextarea.spec.ts | 44 +++++++++++++++++ .../RenderingContentWithTextstring.spec.ts | 11 +++-- .../RenderingContentWithTrueFalse.spec.ts | 39 +++++++++++++++ 8 files changed, 229 insertions(+), 14 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 4ce3aee211b1..759237a0742f 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "dependencies": { "@umbraco/json-models-builders": "^2.0.21", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.90", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.91", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -55,19 +55,19 @@ } }, "node_modules/@umbraco/json-models-builders": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.21.tgz", - "integrity": "sha512-/8jf444B8XjYMJ4mdun6Nc1GD6z4VTOAMi/foRKNwDu6H+UEVx8KcFfwel+M1rQOz1OULyIsf+XJDYc7TMujOA==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.22.tgz", + "integrity": "sha512-5GQT170ViEj9IBov3PvNU7qSJkCkNCTfE/5iXiDBKFsFnMH5XLG6qbgGf5xPYtg/GZ1uKJYgP5Ahq15YUf/DpA==", "dependencies": { "camelize": "^1.0.1" } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.90", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.90.tgz", - "integrity": "sha512-H55F9gttpQR8Fah77gxWxX3S/PY539r82tQRDbo6GgPHeilSVmLXcgesZ+2cgLaAQ406D6JGDvJVqIZukmEzuQ==", + "version": "2.0.0-beta.91", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.91.tgz", + "integrity": "sha512-8oxr8N5rP3JkIVLH9fRNCoQpaRaolwiCZtogS1kn2vHHiTvnZznOI+UYCthA4LzbA9SYA1hSqofLSLfDTO/9lA==", "dependencies": { - "@umbraco/json-models-builders": "2.0.21", + "@umbraco/json-models-builders": "2.0.22", "node-fetch": "^2.6.7" } }, diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index f41b929af2b5..951329447d13 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -19,7 +19,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.21", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.90", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.91", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts new file mode 100644 index 000000000000..63ae1dfd85ce --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts @@ -0,0 +1,48 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const customDataTypeName = 'Custom Approved Color'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Approved Color'; +const colorValue = {label: "Test Label", value: "038c33"}; +let dataTypeId = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeId = await umbracoApi.dataType.createApprovedColorDataTypeWithOneItem(customDataTypeName, colorValue.label, colorValue.value); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +test('can render content with an approved color with label', async ({umbracoApi, umbracoUi}) => { + // Arrange + const templateId = await umbracoApi.template.createTemplateWithDisplayingApprovedColorValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, colorValue, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(colorValue.label); +}); + +test('can render content with an approved color without label', async ({umbracoApi, umbracoUi}) => { + // Arrange + const templateId = await umbracoApi.template.createTemplateWithDisplayingApprovedColorValue(templateName, AliasHelper.toAlias(propertyName), false); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, colorValue, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(colorValue.value); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts new file mode 100644 index 000000000000..d541317e5322 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts @@ -0,0 +1,40 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'Numeric'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Numeric'; +let dataTypeData = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const numerics = [ + {type: 'a positive integer', value: '1234567890'}, + {type: 'a negative integer', value: '-1234567890'}, +]; + +for (const numeric of numerics) { + test(`can render content with ${numeric.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const numericValue = numeric.value; + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, numericValue, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(numericValue); + }); +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts new file mode 100644 index 000000000000..08f7f9bf4c8c --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts @@ -0,0 +1,43 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'Tags'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Tags'; +let dataTypeData = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const tags = [ + {type: 'an empty tag', value: []}, + {type: 'a non-empty tag', value: ['test tag']}, + {type: 'multiple tags', value: ['test tag 1', 'test tag 2']}, +]; + +for (const tag of tags) { + test(`can render content with ${tag.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const tagValue = tag.value; + const templateId = await umbracoApi.template.createTemplateWithDisplayingTagsValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, tagValue, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + tagValue.forEach(async value => { + await umbracoUi.contentRender.doesContentRenderValueHaveText(value); + }); + }); +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts new file mode 100644 index 000000000000..ab2c86f90184 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts @@ -0,0 +1,44 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'Textarea'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Textarea'; +let dataTypeData = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const textareas = [ + {type: 'an empty textarea', value: ''}, + {type: 'a non-empty textarea', value: 'Welcome to Umbraco site'}, + {type: 'a textarea that contains special characters', value: '@#^&*()_+[]{};:"<>,./?'}, + {type: 'a textarea that contains multiple lines', value: 'First line\n Second line\n Third line'}, + {type: 'a textarea that contains an SQL injection', value: "' OR '1'='1'; --"}, + {type: 'a textarea that contains cross-site scripting', value: ""} +]; + +for (const textarea of textareas) { + test(`can render content with ${textarea.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const textareaValue = textarea.value; + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, textareaValue, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(textareaValue); + }); +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts index 9a394ffd07cb..1ccdaec91ede 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts @@ -1,10 +1,11 @@ -import {test} from '@umbraco/playwright-testhelpers'; +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; const contentName = 'Test Rendering Content'; const documentTypeName = 'TestDocumentTypeForContent'; const dataTypeName = 'Textstring'; const templateName = 'TestTemplateForContent'; -let dataTypeData; +const propertyName = 'Test Textstring'; +let dataTypeData = null; test.beforeEach(async ({umbracoApi}) => { dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); @@ -29,7 +30,8 @@ for (const textstring of textstrings) { test(`can render content with ${textstring.type}`, async ({umbracoApi, umbracoUi}) => { // Arrange const textstringValue = textstring.value; - await umbracoApi.document.createPublishedDocumentWithValue(contentName, textstringValue, dataTypeData.id, documentTypeName, templateName); + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, textstringValue, dataTypeData.id, templateId, propertyName, documentTypeName); const contentData = await umbracoApi.document.getByName(contentName); const contentURL = contentData.urls[0].url; @@ -39,5 +41,4 @@ for (const textstring of textstrings) { // Assert await umbracoUi.contentRender.doesContentRenderValueHaveText(textstringValue); }); -} - +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts new file mode 100644 index 000000000000..207da6bff4fb --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts @@ -0,0 +1,39 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'True/false'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test TrueFalse'; +let dataTypeData = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const trueFalseValues = [ + {type: 'true value ', value: true, expectedValue: 'True'}, + {type: 'false value', value: false, expectedValue: 'False'}, +]; + +for (const trueFalse of trueFalseValues) { + test(`can render content with ${trueFalse.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, trueFalse.value, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveText(trueFalse.expectedValue); + }); +} \ No newline at end of file From 728dc899094944cbef9557703de20ea2ae3d0734 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:12:42 +0200 Subject: [PATCH 066/167] V14 QA Skip Users tests on Sqlite (#17330) * Split sqlite test because we run into db locks * Uses the new command --- build/azure-pipelines.yml | 2 +- build/nightly-E2E-test-pipelines.yml | 4 ++-- tests/Umbraco.Tests.AcceptanceTest/package.json | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index faa31ae51103..2d6606c2c3da 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -517,7 +517,7 @@ stages: workingDirectory: tests/Umbraco.Tests.AcceptanceTest # Test - - pwsh: npm run smokeTest --ignore-certificate-errors + - pwsh: npm run smokeTestSqlite --ignore-certificate-errors displayName: Run Playwright tests continueOnError: true workingDirectory: tests/Umbraco.Tests.AcceptanceTest diff --git a/build/nightly-E2E-test-pipelines.yml b/build/nightly-E2E-test-pipelines.yml index 6a069ef38cb5..38bd28885990 100644 --- a/build/nightly-E2E-test-pipelines.yml +++ b/build/nightly-E2E-test-pipelines.yml @@ -207,9 +207,9 @@ stages: # Test - ${{ if eq(parameters.runSmokeTests, true) }}: - pwsh: npm run smokeTest --ignore-certificate-errors + pwsh: npm run smokeTestSqlite --ignore-certificate-errors ${{ else }}: - pwsh: npm run test --ignore-certificate-errors + pwsh: npm run testSqlite --ignore-certificate-errors displayName: Run Playwright tests continueOnError: true workingDirectory: tests/Umbraco.Tests.AcceptanceTest diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 951329447d13..5170f824e10a 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -6,9 +6,11 @@ "config": "node config.js", "ui": "npx playwright test --headed DefaultConfig", "test": "npx playwright test DefaultConfig", + "testSqlite": "npx playwright test DefaultConfig --grep-invert \"Users\"", "all": "npx playwright test", "createTest": "node createTest.js", - "smokeTest": "npx playwright test DefaultConfig --grep \"@smoke\"" + "smokeTest": "npx playwright test DefaultConfig --grep \"@smoke\"", + "smokeTestSqlite": "npx playwright test DefaultConfig --grep \"@smoke\" --grep-invert \"Users\"" }, "devDependencies": { "@playwright/test": "^1.43", From aa1f3df76b0aa9e78156407585830b496362e72f Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 23 Oct 2024 08:37:24 +0200 Subject: [PATCH 067/167] Updated to match locator (#17334) --- .../tests/DefaultConfig/Login/login.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts index 64dfb64dca11..bb1016b502a7 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts @@ -18,8 +18,8 @@ test.describe('Login', () => { await expect(error).toBeHidden(); // Action - await page.fill('#username-input input', process.env.UMBRACO_USER_LOGIN); - await page.fill('#password-input input', process.env.UMBRACO_USER_PASSWORD); + await page.fill('#username-input', process.env.UMBRACO_USER_LOGIN); + await page.fill('#password-input', process.env.UMBRACO_USER_PASSWORD); await page.locator('#umb-login-button').click(); await page.waitForURL(process.env.URL + '/umbraco#/content'); @@ -37,8 +37,8 @@ test.describe('Login', () => { await expect(error).toBeHidden(); // Action - await page.fill('#username-input input', username); - await page.fill('#password-input input', password); + await page.fill('#username-input', username); + await page.fill('#password-input', password); await page.locator('#umb-login-button').click(); // Assert @@ -58,8 +58,8 @@ test.describe('Login', () => { await expect(error).toBeHidden(); // Action - await page.fill('#username-input input', username); - await page.fill('#password-input input', password); + await page.fill('#username-input', username); + await page.fill('#password-input', password); await page.locator('#umb-login-button').click(); // Assert From 73d70ba9fc39535af39af98c3284381dd3e5d54d Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 24 Oct 2024 09:45:59 +0200 Subject: [PATCH 068/167] Swap to windows vm for build (#17348) (cherry picked from commit 199a2f4619b26170376708446e46ffd4f8075d98) --- build/azure-pipelines.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 61ae46a2b322..752f18fd0db5 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -75,7 +75,7 @@ stages: - job: A displayName: Build Umbraco CMS pool: - vmImage: 'ubuntu-latest' + vmImage: 'windows-latest' steps: - checkout: self submodules: true From aa9f194d7611bb830a8fc3b80295c8115fb5b2d6 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:45:23 +0200 Subject: [PATCH 069/167] Format sql statement (#17354) --- .../SyntaxProvider/SqlServerSyntaxProviderTests.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs index be90d8695bbf..7e1d1f163f8f 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs @@ -68,12 +68,8 @@ string c(string x) } Assert.AreEqual( - @$"DELETE FROM {t("cmsContentNu")} WHERE {c("nodeId")} IN (SELECT {c("nodeId")} FROM (SELECT DISTINCT cmsContentNu.nodeId -FROM {t("cmsContentNu")} -INNER JOIN {t("umbracoNode")} -ON {t("cmsContentNu")}.{c("nodeId")} = {t("umbracoNode")}.{c("id")} -WHERE (({t("umbracoNode")}.{c("nodeObjectType")} = @0))) x)".Replace(Environment.NewLine, " ").Replace("\n", " ") - .Replace("\r", " "), + @$"DELETE FROM {t("cmsContentNu")} WHERE {c("nodeId")} IN (SELECT {c("nodeId")} FROM (SELECT DISTINCT cmsContentNu.nodeId FROM {t("cmsContentNu")} INNER JOIN {t("umbracoNode")} ON {t("cmsContentNu")}.{c("nodeId")} = {t("umbracoNode")}.{c("id")} WHERE (({t("umbracoNode")}.{c("nodeObjectType")} = @0))) x)".Replace(Environment.NewLine, " ") + .Replace("\n", " ").Replace("\r", " "), sqlOutput.SQL.Replace(Environment.NewLine, " ").Replace("\n", " ").Replace("\r", " ")); Assert.AreEqual(1, sqlOutput.Arguments.Length); From 11ccafeb97997794e05ce79be8d108e30ee67362 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:16:28 +0700 Subject: [PATCH 070/167] V14 QA Added tests for rendering content with checkboxlist and date picker (#17332) * Added tests for rendering content with numeric * Added tests for rendering content with textarea * Added tests for rendering content with approved color * Added tests for rendering content with numeric * Added tests for rendering content with tags * Added tests for rendering content with textarea * Updated tests for rendering content with textstring due to test helper changes * Added tests for rendering content with truefalse * Added tests for rendering content with checkbox list * Added tests for rendering content with date picker - not done * Updated tests for rendering content with date picker * Updated tests for rendering content due to ui helper changes * Bumped version * Removed blank lines * Make Rendering Content tests run in the pipeline * Changed method name due to test helper changes * Reverted --- .../package-lock.json | 10 ++--- .../Umbraco.Tests.AcceptanceTest/package.json | 4 +- .../RenderingContentWithApprovedColor.spec.ts | 6 +-- .../RenderingContentWithCheckboxList.spec.ts | 40 +++++++++++++++++++ .../RenderingContentWithDatePicker.spec.ts | 35 ++++++++++++++++ .../RenderingContentWithNumeric.spec.ts | 4 +- .../RenderingContentWithTags.spec.ts | 4 +- .../RenderingContentWithTextarea.spec.ts | 4 +- .../RenderingContentWithTextstring.spec.ts | 2 +- .../RenderingContentWithTrueFalse.spec.ts | 4 +- 10 files changed, 94 insertions(+), 19 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDatePicker.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 759237a0742f..def3e8bdb554 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^2.0.21", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.91", + "@umbraco/json-models-builders": "^2.0.22", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.92", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -63,9 +63,9 @@ } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.91", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.91.tgz", - "integrity": "sha512-8oxr8N5rP3JkIVLH9fRNCoQpaRaolwiCZtogS1kn2vHHiTvnZznOI+UYCthA4LzbA9SYA1hSqofLSLfDTO/9lA==", + "version": "2.0.0-beta.92", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.92.tgz", + "integrity": "sha512-qfmuaT+J3PFnUUAeW04O8txxPY+eWc6Ue/2OvM6my0P2j//V5ACFtBxdnWtEylx6D83ga6uIphSHFsLJb0sy3g==", "dependencies": { "@umbraco/json-models-builders": "2.0.22", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 5170f824e10a..f25f0abc716b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -20,8 +20,8 @@ "typescript": "^4.8.3" }, "dependencies": { - "@umbraco/json-models-builders": "^2.0.21", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.91", + "@umbraco/json-models-builders": "^2.0.22", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.92", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts index 63ae1dfd85ce..ba7fa533850b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts @@ -30,7 +30,7 @@ test('can render content with an approved color with label', async ({umbracoApi, await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(colorValue.label); + await umbracoUi.contentRender.doesContentRenderValueContainText(colorValue.label); }); test('can render content with an approved color without label', async ({umbracoApi, umbracoUi}) => { @@ -44,5 +44,5 @@ test('can render content with an approved color without label', async ({umbracoA await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(colorValue.value); -}); \ No newline at end of file + await umbracoUi.contentRender.doesContentRenderValueContainText(colorValue.value); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts new file mode 100644 index 000000000000..7f901fcd87f2 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts @@ -0,0 +1,40 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const customDataTypeName = 'Custom Checkbox List'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Checkbox List'; + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +const checkboxList = [ + {type: 'an empty list of checkboxes', value: []}, + {type: 'one checkbox', value: ['Test checkbox']}, + {type: 'multiple checkboxes', value: ['Test checkbox 1', 'Test checkbox 2', 'Test checkbox 3']}, +]; + +for (const checkbox of checkboxList) { + test(`can render content with ${checkbox.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const checkboxValue = checkbox.value; + const dataTypeId = await umbracoApi.dataType.createCheckboxListDataType(customDataTypeName, checkboxValue); + const templateId = await umbracoApi.template.createTemplateWithDisplayingCheckboxListValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, checkboxValue, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + checkboxValue.forEach(async value => { + await umbracoUi.contentRender.doesContentRenderValueContainText(value); + }); + }); +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDatePicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDatePicker.spec.ts new file mode 100644 index 000000000000..52e49aeb31c0 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDatePicker.spec.ts @@ -0,0 +1,35 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Date Picker'; + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +const dateTimes = [ + {type: 'with AM time', value: '2024-10-29 09:09:09', expectedValue: '10/29/2024 9:09:09 AM', dataTypeName: 'Date Picker with time'}, + {type: 'with PM time', value: '2024-10-29 21:09:09', expectedValue: '10/29/2024 9:09:09 PM', dataTypeName: 'Date Picker with time'}, + // TODO: Uncomment this when the front-end is ready. Currently the time still be rendered. + //{type: 'without time', value: '2024-10-29 00:00:00', expectedValue: '10/29/2024', dataTypeName: 'Date Picker'} +]; + +for (const dateTime of dateTimes) { + test(`can render content with a date ${dateTime.type}`, async ({umbracoApi, umbracoUi}) => { + const dataTypeData = await umbracoApi.dataType.getByName(dateTime.dataTypeName); + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, dateTime.value, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueContainText(dateTime.expectedValue, true); + }); +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts index d541317e5322..8a60b518f47e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithNumeric.spec.ts @@ -35,6 +35,6 @@ for (const numeric of numerics) { await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(numericValue); + await umbracoUi.contentRender.doesContentRenderValueContainText(numericValue); }); -} \ No newline at end of file +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts index 08f7f9bf4c8c..f1cd346b6606 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts @@ -37,7 +37,7 @@ for (const tag of tags) { // Assert tagValue.forEach(async value => { - await umbracoUi.contentRender.doesContentRenderValueHaveText(value); + await umbracoUi.contentRender.doesContentRenderValueContainText(value); }); }); -} \ No newline at end of file +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts index ab2c86f90184..e4f43e51e434 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextarea.spec.ts @@ -39,6 +39,6 @@ for (const textarea of textareas) { await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(textareaValue); + await umbracoUi.contentRender.doesContentRenderValueContainText(textareaValue); }); -} \ No newline at end of file +} diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts index 1ccdaec91ede..b0fd459563ce 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTextstring.spec.ts @@ -39,6 +39,6 @@ for (const textstring of textstrings) { await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(textstringValue); + await umbracoUi.contentRender.doesContentRenderValueContainText(textstringValue); }); } \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts index 207da6bff4fb..9c4164f3213d 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTrueFalse.spec.ts @@ -34,6 +34,6 @@ for (const trueFalse of trueFalseValues) { await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); // Assert - await umbracoUi.contentRender.doesContentRenderValueHaveText(trueFalse.expectedValue); + await umbracoUi.contentRender.doesContentRenderValueContainText(trueFalse.expectedValue); }); -} \ No newline at end of file +} From 76fcf19b152e2757024d65c935401dbaa94ec980 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:19:53 +0700 Subject: [PATCH 071/167] V14 QA Added acceptance tests for rendering content with Dropdown, Radiobutton and ImageCropper (#17357) * Added tests for rendering content with numeric * Added tests for rendering content with textarea * Added tests for rendering content with approved color * Added tests for rendering content with numeric * Added tests for rendering content with tags * Added tests for rendering content with textarea * Updated tests for rendering content with textstring due to test helper changes * Added tests for rendering content with truefalse * Bumped version of test helper * Make all tests for rendering content run in the pipeline * Fixed comments * Removed blank lines * Fixed name * Make all smoke tests run in the pipeline * Added tests for rendering content with dropdown * Added tests for rendering content with Image Cropper - not done * Updated tests for rendering content due to ui helper changes * Updated tests for rendering content with image cropper * Updated tests due to the api helper changes * Bumped version of test helper * Make all the tests for rendering content run in the pipeline * Removed blank lines * Format code * Fixed test name * Reverted --- .../package-lock.json | 18 ++++---- .../Umbraco.Tests.AcceptanceTest/package.json | 4 +- .../RenderingContentWithApprovedColor.spec.ts | 2 +- .../RenderingContentWithCheckboxList.spec.ts | 4 +- .../RenderingContentWithDropdown.spec.ts | 44 +++++++++++++++++++ .../RenderingContentWithImageCropper.spec.ts | 36 +++++++++++++++ .../RenderingContentWithRadiobox.spec.ts | 36 +++++++++++++++ .../RenderingContentWithTags.spec.ts | 2 +- 8 files changed, 131 insertions(+), 15 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDropdown.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithImageCropper.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithRadiobox.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index def3e8bdb554..ce584dba6fd7 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^2.0.22", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.92", + "@umbraco/json-models-builders": "^2.0.23", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.95", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -55,19 +55,19 @@ } }, "node_modules/@umbraco/json-models-builders": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.22.tgz", - "integrity": "sha512-5GQT170ViEj9IBov3PvNU7qSJkCkNCTfE/5iXiDBKFsFnMH5XLG6qbgGf5xPYtg/GZ1uKJYgP5Ahq15YUf/DpA==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.23.tgz", + "integrity": "sha512-48TgQnrdxQ2Oi/NintzgYvVRnlX3JXKq505leuWATo9AH3ffuzR+g7hXoTC/Us9ms5BjTTXssLBwzlgCyHJTJQ==", "dependencies": { "camelize": "^1.0.1" } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.92", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.92.tgz", - "integrity": "sha512-qfmuaT+J3PFnUUAeW04O8txxPY+eWc6Ue/2OvM6my0P2j//V5ACFtBxdnWtEylx6D83ga6uIphSHFsLJb0sy3g==", + "version": "2.0.0-beta.95", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.95.tgz", + "integrity": "sha512-9pJrC/4d4O/TKSyHk0n12ZBFi3lRJd6+kRsngK1eCqcHjVqB7HTDWjsL7KS+1bWzVqFvJgbCVezt2eR+GiWBEA==", "dependencies": { - "@umbraco/json-models-builders": "2.0.22", + "@umbraco/json-models-builders": "2.0.23", "node-fetch": "^2.6.7" } }, diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index f25f0abc716b..85ef6be6d729 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -20,8 +20,8 @@ "typescript": "^4.8.3" }, "dependencies": { - "@umbraco/json-models-builders": "^2.0.22", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.92", + "@umbraco/json-models-builders": "^2.0.23", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.95", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts index ba7fa533850b..7e73452b4e38 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithApprovedColor.spec.ts @@ -45,4 +45,4 @@ test('can render content with an approved color without label', async ({umbracoA // Assert await umbracoUi.contentRender.doesContentRenderValueContainText(colorValue.value); -}); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts index 7f901fcd87f2..cc48bf55c30a 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithCheckboxList.spec.ts @@ -24,7 +24,7 @@ for (const checkbox of checkboxList) { // Arrange const checkboxValue = checkbox.value; const dataTypeId = await umbracoApi.dataType.createCheckboxListDataType(customDataTypeName, checkboxValue); - const templateId = await umbracoApi.template.createTemplateWithDisplayingCheckboxListValue(templateName, AliasHelper.toAlias(propertyName)); + const templateId = await umbracoApi.template.createTemplateWithDisplayingMulitpleStringValue(templateName, AliasHelper.toAlias(propertyName)); await umbracoApi.document.createPublishedDocumentWithValue(contentName, checkboxValue, dataTypeId, templateId, propertyName, documentTypeName); const contentData = await umbracoApi.document.getByName(contentName); const contentURL = contentData.urls[0].url; @@ -37,4 +37,4 @@ for (const checkbox of checkboxList) { await umbracoUi.contentRender.doesContentRenderValueContainText(value); }); }); -} +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDropdown.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDropdown.spec.ts new file mode 100644 index 000000000000..73381004f366 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithDropdown.spec.ts @@ -0,0 +1,44 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const customDataTypeName = 'Custom Dropdown'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Dropdown'; + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +const dropdownValues = [ + {type: 'an empty dropdown list', value: [], isMultiple: false}, + {type: 'a single dropdown value', value: ['Test checkbox'], isMultiple: false}, + {type: 'multiple dropdown values', value: ['Test option 1', 'Test option 2'], isMultiple: true} +]; + +for (const dropdown of dropdownValues) { + test(`can render content with ${dropdown.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const dataTypeId = await umbracoApi.dataType.createDropdownDataType(customDataTypeName, dropdown.isMultiple, dropdown.value); + let templateId = ''; + if (dropdown.isMultiple) { + templateId = await umbracoApi.template.createTemplateWithDisplayingMulitpleStringValue(templateName, AliasHelper.toAlias(propertyName)); + } else { + templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + } + await umbracoApi.document.createPublishedDocumentWithValue(contentName, dropdown.value, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + dropdown.value.forEach(async value => { + await umbracoUi.contentRender.doesContentRenderValueContainText(value); + }); + }); +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithImageCropper.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithImageCropper.spec.ts new file mode 100644 index 000000000000..b428f16530de --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithImageCropper.spec.ts @@ -0,0 +1,36 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const customDataTypeName = 'Custom Image Cropper'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Image Cropper'; +const cropLabel = 'Test Crop'; +const cropValue = {label: cropLabel, alias: AliasHelper.toAlias(cropLabel), width: 500, height: 700}; +let dataTypeId = null; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeId = await umbracoApi.dataType.createImageCropperDataTypeWithOneCrop(customDataTypeName, cropValue.label, cropValue.width, cropValue.height); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +test('can render content with an image cropper', async ({umbracoApi, umbracoUi}) => { + // Arrange + const templateId = await umbracoApi.template.createTemplateWithDisplayingImageCropperValue(templateName, AliasHelper.toAlias(propertyName), AliasHelper.toAlias(cropValue.label)); + await umbracoApi.document.createPublishedDocumentWithImageCropper(contentName, cropValue, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + const imageSrc = contentData.values[0].value.src; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueHaveImage(imageSrc, cropValue.width, cropValue.height); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithRadiobox.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithRadiobox.spec.ts new file mode 100644 index 000000000000..280a8ad72745 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithRadiobox.spec.ts @@ -0,0 +1,36 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const customDataTypeName = 'Custom Radiobox'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Radiobox'; + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +const radioboxValues = [ + {type: 'an empty radiobox', value: ''}, + {type: 'a radiobox value', value: 'Test radiobox option'} +]; + +for (const radiobox of radioboxValues) { + test(`can render content with ${radiobox.type}`, async ({umbracoApi, umbracoUi}) => { + // Arrange + const dataTypeId = await umbracoApi.dataType.createRadioboxDataType(customDataTypeName, [radiobox.value]); + const templateId = await umbracoApi.template.createTemplateWithDisplayingStringValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, radiobox.value, dataTypeId, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueContainText(radiobox.value); + }); +} \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts index f1cd346b6606..6fe6e5b33311 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithTags.spec.ts @@ -27,7 +27,7 @@ for (const tag of tags) { test(`can render content with ${tag.type}`, async ({umbracoApi, umbracoUi}) => { // Arrange const tagValue = tag.value; - const templateId = await umbracoApi.template.createTemplateWithDisplayingTagsValue(templateName, AliasHelper.toAlias(propertyName)); + const templateId = await umbracoApi.template.createTemplateWithDisplayingMulitpleStringValue(templateName, AliasHelper.toAlias(propertyName)); await umbracoApi.document.createPublishedDocumentWithValue(contentName, tagValue, dataTypeData.id, templateId, propertyName, documentTypeName); const contentData = await umbracoApi.document.getByName(contentName); const contentURL = contentData.urls[0].url; From 41da2e2cf3b5d8503a20dd39ece16c5c08d140c9 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Mon, 28 Oct 2024 10:53:33 +0700 Subject: [PATCH 072/167] V14 Added acceptance tests for the List View Media and custom data type in Content section (#17025) * Added Content tests with custom data type * Added tests for List View Media data type in Media section * Updated method name due to api helper changes * Updated the assertion of Content tests with custom data type * Bumped version of test helper * Make all Content tests run in the pipeline * Skipped test for code editor as it is removed * Fixed comment * Make Media tests running in the pipeline * Bumped version * Updated code due to ui helper changes * Bumped version of test helper * Updated tests for bulk trash in the media section * Fixed notification message * Make Content tests and Media tests run in the pipeline * Added more waits * Reverted --- .../Content/ContentWithCustomDataType.spec.ts | 317 ++++++++++++++++++ .../DefaultConfig/Media/ListViewMedia.spec.ts | 160 +++++++++ .../tests/DefaultConfig/Media/Media.spec.ts | 4 +- 3 files changed, 479 insertions(+), 2 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithCustomDataType.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithCustomDataType.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithCustomDataType.spec.ts new file mode 100644 index 000000000000..228275de0872 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/ContentWithCustomDataType.spec.ts @@ -0,0 +1,317 @@ +import {ConstantHelper, test, AliasHelper} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const contentName = 'TestContent'; +const documentTypeName = 'TestDocumentTypeForContent'; +let customDataTypeName = ''; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentName); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.dataType.ensureNameNotExists(customDataTypeName); +}); + +test('can create content with the custom data type with email address property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Email Address'; + const customDataTypeId = await umbracoApi.dataType.createEmailAddressDataType(customDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can add text to the email address in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Email Address'; + const emailAddress = 'test@acceptance.test'; + const customDataTypeId = await umbracoApi.dataType.createEmailAddressDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.enterTextstring(emailAddress); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual(emailAddress); +}); + +test('can create content with the custom data type with decimal property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Decimal'; + const customDataTypeId = await umbracoApi.dataType.createDecimalDataType(customDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can add decimal number to the decimal in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Decimal'; + const decimal = 3.9; + const customDataTypeId = await umbracoApi.dataType.createDecimalDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.enterNumeric(decimal); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual(decimal); +}); + +// Skip this test as currently there is no code editor property editor available. +test.skip('can create content with the custom data type with code editor property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Code Editor'; + const customDataTypeId = await umbracoApi.dataType.createCodeEditorDataType(customDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can add javascript code to the code editor in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Code Editor'; + const javascriptCode = 'const test = \'This is the acceptance test\';'; + const customDataTypeId = await umbracoApi.dataType.createCodeEditorDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.enterCodeEditorValue(javascriptCode); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual(javascriptCode); +}); + +test('can create content with the custom data type with markdown editor property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Markdown Editor'; + const customDataTypeId = await umbracoApi.dataType.createMarkdownEditorDataType(customDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can add code to the markdown editor in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Markdown Editor'; + const inputText = '# This is test heading\r\n> This is test quote'; + const customDataTypeId = await umbracoApi.dataType.createMarkdownEditorDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.enterMarkdownEditorValue(inputText); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual(inputText); +}); + +test('can create content with the custom data type with multiple text string property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Multiple Text String'; + const customDataTypeId = await umbracoApi.dataType.createMultipleTextStringDataType(customDataTypeName); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can add string to the multiple text string in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Multiple Text String'; + const multipleTextStringValue = 'Test text string item'; + const customDataTypeId = await umbracoApi.dataType.createMultipleTextStringDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.addMultipleTextStringItem(multipleTextStringValue); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual([multipleTextStringValue]); +}); + +test('can create content with the custom data type with slider property editor', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Slider'; + const customDataTypeId = await umbracoApi.dataType.createSliderDataTyper(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(contentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values).toEqual([]); +}); + +test('can change slider value in the content section', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Slider'; + const sliderValue = 10; + const expectedValue = { + "from": sliderValue, + "to": sliderValue + } + const customDataTypeId = await umbracoApi.dataType.createSliderDataTyper(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + + // Act + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.changeSliderValue(sliderValue.toString()); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); + expect(await umbracoApi.document.doesNameExist(contentName)).toBeTruthy(); + const contentData = await umbracoApi.document.getByName(contentName); + expect(contentData.values[0].alias).toEqual(AliasHelper.toAlias(customDataTypeName)); + expect(contentData.values[0].value).toEqual(expectedValue); +}); + +test('can save content after changing the property editor of the custom data type', async ({umbracoApi, umbracoUi}) => { + // Arrange + customDataTypeName = 'Custom Text String'; + const inputText = 'Test textstring'; + const customDataTypeId = await umbracoApi.dataType.createTextstringDataType(customDataTypeName); + const documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, customDataTypeName, customDataTypeId); + await umbracoApi.document.createDefaultDocument(contentName, documentTypeId); + + // Act + // Update the property editor of the custom data type + const customDataTypeData = await umbracoApi.dataType.getByName(customDataTypeName); + customDataTypeData.editorAlias = 'Umbraco.MultipleTextstring'; + customDataTypeData.editorUiAlias = 'Umb.PropertyEditorUi.MultipleTextString'; + await umbracoApi.dataType.update(customDataTypeId, customDataTypeData); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content); + await umbracoUi.content.goToContentWithName(contentName); + await umbracoUi.content.addMultipleTextStringItem(inputText); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.isSuccessNotificationVisible(); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts new file mode 100644 index 000000000000..37fef60b9f4a --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/ListViewMedia.spec.ts @@ -0,0 +1,160 @@ +import {expect} from '@playwright/test'; +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const dataTypeName = 'List View - Media'; +let dataTypeDefaultData = null; +const firstMediaFileName = 'FirstMediaFile'; +const secondMediaFileName = 'SecondMediaFile'; + +test.beforeEach(async ({umbracoUi, umbracoApi}) => { + dataTypeDefaultData = await umbracoApi.dataType.getByName(dataTypeName); + await umbracoApi.media.ensureNameNotExists(firstMediaFileName); + await umbracoApi.media.createDefaultMediaFile(firstMediaFileName); + await umbracoApi.media.ensureNameNotExists(secondMediaFileName); + await umbracoApi.media.createDefaultMediaFile(secondMediaFileName); + await umbracoUi.goToBackOffice(); +}); + +test.afterEach(async ({umbracoApi}) => { + if (dataTypeDefaultData !== null) { + await umbracoApi.dataType.update(dataTypeDefaultData.id, dataTypeDefaultData); + } + await umbracoApi.media.ensureNameNotExists(firstMediaFileName); + await umbracoApi.media.ensureNameNotExists(secondMediaFileName); + await umbracoApi.media.emptyRecycleBin(); +}); + +test('can change the the default sort order for the list in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const sortOrder = 'creator'; + const expectedMediaValues = await umbracoApi.media.getAllMediaNames(sortOrder); + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('orderBy', sortOrder); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + await umbracoUi.media.changeToListView(); + await umbracoUi.waitForTimeout(500); + + // Assert + await umbracoUi.media.isMediaListViewVisible(); + await umbracoUi.media.doesMediaListNameValuesMatch(expectedMediaValues); +}); + +test('can change the the order direction for the list in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedMediaValues = await umbracoApi.media.getAllMediaNames('updateDate', 'Ascending'); + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('orderDirection', 'asc'); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + + // Assert + await umbracoUi.media.isMediaGridViewVisible(); + await umbracoUi.media.doesMediaGridValuesMatch(expectedMediaValues); + await umbracoUi.media.changeToListView(); + await umbracoUi.waitForTimeout(500); + await umbracoUi.media.isMediaListViewVisible(); + await umbracoUi.media.doesMediaListNameValuesMatch(expectedMediaValues); +}); + +test('can add more columns to the list in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const expectedColumns = ['Name', 'Last edited', 'Updated by', 'Size']; + const updatedValue = [ + {"alias": "updateDate", "header": "Last edited", "isSystem": true}, + {"alias": "creator", "header": "Updated by", "isSystem": true}, + {"alias": "umbracoBytes", "header": "Size", "isSystem": 0} + ]; + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('includeProperties', updatedValue); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + await umbracoUi.media.changeToListView(); + await umbracoUi.waitForTimeout(500); + + // Assert + await umbracoUi.media.isMediaListViewVisible(); + await umbracoUi.media.doesMediaListHeaderValuesMatch(expectedColumns); +}); + +test('can disable one view in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const updatedValue = [ + { + "name": "List", + "collectionView": "Umb.CollectionView.Media.Table", + "icon": "icon-list", + "isSystem": true, + "selected": true + } + ]; + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('layouts', updatedValue); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + + // Assert + await umbracoUi.media.isViewBundleButtonVisible(false); + await umbracoUi.media.isMediaListViewVisible(); + await umbracoUi.media.isMediaGridViewVisible(false); +}); + +test('can allow bulk trash in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const updatedValue = { + "allowBulkPublish": false, + "allowBulkUnpublish": false, + "allowBulkCopy": false, + "allowBulkDelete": true, + "allowBulkMove": false + }; + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('bulkActionPermissions', updatedValue); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + await umbracoUi.media.selectMediaByName(firstMediaFileName); + await umbracoUi.media.selectMediaByName(secondMediaFileName); + await umbracoUi.media.clickBulkTrashButton(); + await umbracoUi.media.clickConfirmTrashButton(); + + // Assert + await umbracoUi.media.reloadMediaTree(); + expect(await umbracoApi.media.doesNameExist(firstMediaFileName)).toBeFalsy(); + expect(await umbracoApi.media.doesNameExist(secondMediaFileName)).toBeFalsy(); + expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(firstMediaFileName)).toBeTruthy(); + expect(await umbracoApi.media.doesMediaItemExistInRecycleBin(secondMediaFileName)).toBeTruthy(); + await umbracoUi.media.isItemVisibleInRecycleBin(firstMediaFileName); + await umbracoUi.media.isItemVisibleInRecycleBin(secondMediaFileName, true, false); +}); + +test('can allow bulk move in the media section', async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaFolderName = 'Test Folder Name'; + const updatedValue = { + "allowBulkPublish": false, + "allowBulkUnpublish": false, + "allowBulkCopy": false, + "allowBulkDelete": false, + "allowBulkMove": true + }; + await umbracoApi.media.ensureNameNotExists(mediaFolderName); + const mediaFolderId = await umbracoApi.media.createDefaultMediaFolder(mediaFolderName); + + // Act + await umbracoApi.dataType.updateListViewMediaDataType('bulkActionPermissions', updatedValue); + await umbracoUi.media.goToSection(ConstantHelper.sections.media); + await umbracoUi.media.selectMediaByName(firstMediaFileName); + await umbracoUi.media.selectMediaByName(secondMediaFileName); + await umbracoUi.media.clickBulkMoveToButton(); + await umbracoUi.media.clickCaretButtonForName('Media'); + await umbracoUi.media.clickModalTextByName(mediaFolderName); + await umbracoUi.media.clickChooseModalButton(); + + // Assert + await umbracoUi.media.isSuccessNotificationVisible(); + expect(await umbracoApi.media.doesMediaItemHaveChildName(mediaFolderId, firstMediaFileName)).toBeTruthy(); + expect(await umbracoApi.media.doesMediaItemHaveChildName(mediaFolderId, secondMediaFileName)).toBeTruthy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaFolderName); +}); \ No newline at end of file diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts index ea45f76b42c7..3e25adf75479 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Media/Media.spec.ts @@ -110,7 +110,7 @@ test('can create a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); await umbracoUi.media.isTreeItemVisible(folderName); expect(await umbracoApi.media.doesNameExist(folderName)).toBeTruthy(); @@ -152,7 +152,7 @@ test('can create a folder in a folder', async ({umbracoApi, umbracoUi}) => { await umbracoUi.media.clickSaveButton(); // Assert - await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.folderCreated); + await umbracoUi.media.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); await umbracoUi.media.isTreeItemVisible(parentFolderName); await umbracoUi.media.clickMediaCaretButtonForName(parentFolderName); await umbracoUi.media.isTreeItemVisible(folderName); From b1d9085c8316cf2b7c5437d8e89fbfe37223235a Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:11:28 +0100 Subject: [PATCH 073/167] V14 QA Added user groups acceptance tests (#17344) * Added tests for userGroup * Clean up * Updated userGroup tests * Updated tests * Updated tests * Cleane up * Cleaned up * Bumped versions * Run user tests * Cleaned up * Added method for checking if the document tree is empty * Bumped version * Reverted --- .../{ => User}/ContentStartNodes.spec.ts | 32 +- .../{ => User}/MediaStartNodes.spec.ts | 9 +- .../Permissions/{ => User}/UICulture.spec.ts | 9 +- .../UserGroup/ContentStartNodes.spec.ts | 92 ++++ .../Permissions/UserGroup/Languages.spec.ts | 135 +++++ .../Permissions/UserGroup/Sections.spec.ts | 51 ++ .../tests/DefaultConfig/Users/User.spec.ts | 7 +- .../DefaultConfig/Users/UserGroups.spec.ts | 474 ++++++++++++++++++ 8 files changed, 772 insertions(+), 37 deletions(-) rename tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/{ => User}/ContentStartNodes.spec.ts (85%) rename tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/{ => User}/MediaStartNodes.spec.ts (97%) rename tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/{ => User}/UICulture.spec.ts (93%) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentStartNodes.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Languages.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Sections.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/ContentStartNodes.spec.ts similarity index 85% rename from tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts rename to tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/ContentStartNodes.spec.ts index 24b50a707e3f..e4ab49947991 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/ContentStartNodes.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/ContentStartNodes.spec.ts @@ -1,29 +1,21 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -import {expect} from '@playwright/test'; -const testUser = { - name: 'Test User', - email: 'verySecureEmail@123.test', - password: 'verySecurePassword123', -}; +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; const userGroupName = 'TestUserGroup'; +let userGroupId = null; const rootDocumentTypeName = 'RootDocumentType'; const childDocumentTypeOneName = 'ChildDocumentTypeOne'; const childDocumentTypeTwoName = 'ChildDocumentTypeTwo'; let childDocumentTypeOneId = null; let rootDocumentTypeId = null; - -let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; - -let rootDocumentId = null; -let childDocumentOneId = null; const rootDocumentName = 'RootDocument'; const childDocumentOneName = 'ChildDocumentOne'; const childDocumentTwoName = 'ChildDocumentTwo'; - -let userGroupId = null; +let rootDocumentId = null; +let childDocumentOneId = null; test.beforeEach(async ({umbracoApi}) => { await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); @@ -59,10 +51,10 @@ test('can see root start node and children', async ({umbracoApi, umbracoUi}) => await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); // Assert - await umbracoUi.content.isContentVisible(rootDocumentName); + await umbracoUi.content.isContentInTreeVisible(rootDocumentName); await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); - await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentOneName); - await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentTwoName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentTwoName); }); test('can see parent of start node but not access it', async ({umbracoApi, umbracoUi}) => { @@ -75,12 +67,12 @@ test('can see parent of start node but not access it', async ({umbracoApi, umbra await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); // Assert - await umbracoUi.content.isContentVisible(rootDocumentName); + await umbracoUi.content.isContentInTreeVisible(rootDocumentName); await umbracoUi.content.goToContentWithName(rootDocumentName); await umbracoUi.content.isTextWithMessageVisible('The authenticated user do not have access to this resource'); await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); - await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentOneName); - await umbracoUi.content.isChildContentVisible(rootDocumentName, childDocumentTwoName, false); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentTwoName, false); }); test('can not see any content when no start nodes specified', async ({umbracoApi, umbracoUi}) => { @@ -93,5 +85,5 @@ test('can not see any content when no start nodes specified', async ({umbracoApi await umbracoUi.user.goToSection(ConstantHelper.sections.content, false); // Assert - await umbracoUi.content.isContentVisible(rootDocumentName, false); + await umbracoUi.content.isDocumentTreeEmpty(); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts similarity index 97% rename from tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts rename to tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts index f9dec390200b..573750f08b78 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/MediaStartNodes.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts @@ -1,16 +1,11 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -const testUser = { - name: 'Test User', - email: 'verySecureEmail@123.test', - password: 'verySecurePassword123', -}; +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; const userGroupName = 'TestUserGroup'; let userGroupId = null; -let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; - let rootFolderId = null; let childFolderOneId = null; const rootFolderName = 'RootFolder'; diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/UICulture.spec.ts similarity index 93% rename from tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts rename to tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/UICulture.spec.ts index 5d94160d4a53..ceac7890f78b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UICulture.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/UICulture.spec.ts @@ -1,14 +1,9 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -const testUser = { - name: 'Test User', - email: 'verySecureEmail@123.test', - password: 'verySecurePassword123', -}; +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; const userGroupName = 'TestUserGroup'; - -let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; let userGroupId = null; test.beforeEach(async ({umbracoApi}) => { diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentStartNodes.spec.ts new file mode 100644 index 000000000000..df20ec0397d9 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentStartNodes.spec.ts @@ -0,0 +1,92 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +const rootDocumentTypeName = 'RootDocumentType'; +const childDocumentTypeOneName = 'ChildDocumentTypeOne'; +const childDocumentTypeTwoName = 'ChildDocumentTypeTwo'; +let childDocumentTypeOneId = null; +let childDocumentTypeTwoId = null; +let rootDocumentTypeId = null; +const rootDocumentName = 'RootDocument'; +const childDocumentOneName = 'ChildDocumentOne'; +const childDocumentTwoName = 'ChildDocumentTwo'; +let rootDocumentId = null; +let childDocumentOneId = null; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + childDocumentTypeOneId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeOneName); + childDocumentTypeTwoId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeTwoName); + rootDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedTwoChildNodes(rootDocumentTypeName, childDocumentTypeOneId, childDocumentTypeTwoId); + rootDocumentId = await umbracoApi.document.createDefaultDocument(rootDocumentName, rootDocumentTypeId); + childDocumentOneId = await umbracoApi.document.createDefaultDocumentWithParent(childDocumentOneName, childDocumentTypeOneId, rootDocumentId); + await umbracoApi.document.createDefaultDocumentWithParent(childDocumentTwoName, childDocumentTypeTwoId, rootDocumentId); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can see root start node and children', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDocumentStartNode(userGroupName, rootDocumentId); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isContentInTreeVisible(rootDocumentName); + await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentTwoName); +}); + +test('can see parent of start node but not access it', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDocumentStartNode(userGroupName, childDocumentOneId); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isContentInTreeVisible(rootDocumentName); + await umbracoUi.content.goToContentWithName(rootDocumentName); + await umbracoUi.content.isTextWithMessageVisible('The authenticated user do not have access to this resource'); + await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentOneName); + await umbracoUi.content.isChildContentInTreeVisible(rootDocumentName, childDocumentTwoName, false); +}); + +test('can not see any content when no start nodes specified', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isDocumentTreeEmpty(); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Languages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Languages.spec.ts new file mode 100644 index 000000000000..7b535fb067bc --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Languages.spec.ts @@ -0,0 +1,135 @@ +import {AliasHelper, ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +const documentTypeName = 'TestDocumentType'; +const documentName = 'TestDocument'; +const englishDocumentName = 'EnglishDocument'; +const danishDocumentName = 'DanishDocument'; +const vietnameseDocumentName = 'VietnameseDocument'; +let documentTypeId = null; + +const dataTypeName = 'Textstring'; +let dataTypeId = null; + +const englishIsoCode = 'en-US'; +const danishIsoCode = 'da'; +const vietnameseIsoCode = 'vi'; +const englishLanguageName = 'English (United States)'; +const danishLanguageName = 'Danish'; +const vietnameseLanguageName = 'Vietnamese'; +const cultureVariants = [ + { + isoCode: englishIsoCode, + name: englishDocumentName, + value: 'EnglishValue', + }, + { + isoCode: danishIsoCode, + name: danishDocumentName, + value: 'DanishValue', + }, + { + isoCode: vietnameseIsoCode, + name: vietnameseDocumentName, + value: 'VietnameseValue', + } +]; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.language.ensureIsoCodeNotExists(danishIsoCode); + await umbracoApi.language.ensureIsoCodeNotExists(vietnameseIsoCode); + await umbracoApi.language.createDanishLanguage(); + await umbracoApi.language.createVietnameseLanguage(); + const dataType = await umbracoApi.dataType.getByName(dataTypeName); + dataTypeId = dataType.id; + documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeId, 'TestGroup', true); + await umbracoApi.document.createDocumentWithMultipleVariants(documentName, documentTypeId, AliasHelper.toAlias(dataTypeName), cultureVariants); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.language.ensureIsoCodeNotExists(danishIsoCode); + await umbracoApi.language.ensureIsoCodeNotExists(vietnameseIsoCode); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can rename content with language set in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + const updatedContentName = 'UpdatedContentName'; + userGroupId = await umbracoApi.userGroup.createUserGroupWithLanguageAndContentSection(userGroupName, englishIsoCode); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], false, [], false, englishIsoCode); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + await umbracoUi.content.goToContentWithName(englishDocumentName); + + // Act + await umbracoUi.content.isDocumentReadOnly(false); + await umbracoUi.content.enterContentName(updatedContentName); + await umbracoUi.content.clickSaveButton(); + await umbracoUi.content.clickSaveAndCloseButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.content.isContentInTreeVisible(updatedContentName); +}); + +test('can not rename content with language not set in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithLanguageAndContentSection(userGroupName, englishIsoCode); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], false, [], false, englishIsoCode); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + await umbracoUi.content.doesDocumentSectionHaveLanguageSelected(englishLanguageName); + await umbracoUi.content.changeDocumentSectionLanguage(danishLanguageName); + + // Act + await umbracoUi.content.goToContentWithName(danishDocumentName); + + // Assert + await umbracoUi.content.isDocumentReadOnly(); + await umbracoUi.content.isDocumentNameInputEditable(false); +}); + +test('can update content property with language set in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithLanguageAndContentSection(userGroupName, englishIsoCode); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + await umbracoUi.content.doesDocumentSectionHaveLanguageSelected(englishLanguageName); + + // Act + await umbracoUi.content.goToContentWithName(englishDocumentName); + + // Assert + await umbracoUi.content.isDocumentPropertyEditable(dataTypeName, true); +}); + +test('can not update content property with language not set in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithLanguageAndContentSection(userGroupName, englishIsoCode); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + await umbracoUi.content.doesDocumentSectionHaveLanguageSelected(englishLanguageName); + await umbracoUi.content.changeDocumentSectionLanguage(vietnameseLanguageName); + + // Act + await umbracoUi.content.goToContentWithName(vietnameseDocumentName); + + // Assert + await umbracoUi.content.isDocumentPropertyEditable(dataTypeName, false); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Sections.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Sections.spec.ts new file mode 100644 index 000000000000..0932ab7f622b --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/Sections.spec.ts @@ -0,0 +1,51 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can go to section defined in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + + // Act + await umbracoUi.goToBackOffice(); + + // Assert + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.content); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); +}); + +test('can not see section that is not defined in userGroup', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + + // Act + await umbracoUi.goToBackOffice(); + + // Assert + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.content); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.media, false); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.settings, false); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.users, false); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.members, false); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.dictionary, false); + await umbracoUi.content.isSectionWithNameVisible(ConstantHelper.sections.packages, false); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts index 61977241e7e4..427693c8a8dc 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/User.spec.ts @@ -424,7 +424,7 @@ test('can disable a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickConfirmDisableButton(); // Assert - await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.userDisabled); expect(umbracoUi.user.isUserDisabledTextVisible()).toBeTruthy(); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.state).toBe(disabledStatus); @@ -444,7 +444,8 @@ test('can enable a user', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickConfirmEnableButton(); // Assert - await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.userDisabled); + // TODO: Unskip when it shows userEnabled/userInactive instead of userDisabled + // await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.userEnabled); await umbracoUi.user.isUserActiveTextVisible(); // The state of the user is not enabled. The reason for this is that the user has not logged in, resulting in the state Inactive. const userData = await umbracoApi.user.getByName(nameOfTheUser); @@ -480,7 +481,7 @@ test('can remove an avatar from a user', async ({umbracoApi, umbracoUi}) => { await umbracoUi.user.clickRemovePhotoButton(); // Assert - await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.user.doesSuccessNotificationHaveText(NotificationConstantHelper.success.avatarDeleted); const userData = await umbracoApi.user.getByName(nameOfTheUser); expect(userData.avatarUrls).toHaveLength(0); }); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts new file mode 100644 index 000000000000..dd5676cab033 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts @@ -0,0 +1,474 @@ +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const allPermissions = { + uiPermission: + ['Browse Node', + 'Create Document Blueprint', + 'Delete', + 'Create', + 'Notifications', + 'Publish', + 'Set permissions', + 'Unpublish', + 'Update', + 'Duplicate', + 'Move to', + 'Sort children', + 'Culture and Hostnames', + 'Public Access', + 'Rollback'], + verbPermission: [ + 'Umb.Document.Read', + 'Umb.Document.CreateBlueprint', + 'Umb.Document.Delete', + 'Umb.Document.Create', + 'Umb.Document.Notifications', + 'Umb.Document.Publish', + 'Umb.Document.Permissions', + 'Umb.Document.Unpublish', + 'Umb.Document.Update', + 'Umb.Document.Duplicate', + 'Umb.Document.Move', + 'Umb.Document.Sort', + 'Umb.Document.CultureAndHostnames', + 'Umb.Document.PublicAccess', + 'Umb.Document.Rollback' + ] +}; + +const englishLanguage = 'English (United States)'; + +const userGroupName = 'TestUserGroupName'; + +test.beforeEach(async ({umbracoUi, umbracoApi}) => { + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.users); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can create an empty user group', async ({umbracoApi, umbracoUi}) => { + // Act + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickCreateUserGroupButton(); + await umbracoUi.userGroup.enterUserGroupName(userGroupName); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); + expect(await umbracoApi.userGroup.doesNameExist(userGroupName)).toBeTruthy(); + // Checks if the user group was created in the UI as well + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.isUserGroupWithNameVisible(userGroupName); +}) + +test('can rename a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + const oldUserGroupName = 'OldUserGroupName'; + await umbracoApi.userGroup.ensureNameNotExists(oldUserGroupName); + await umbracoApi.userGroup.createEmptyUserGroup(oldUserGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(oldUserGroupName); + + // Act + await umbracoUi.userGroup.enterUserGroupName(userGroupName); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesNameExist(userGroupName)).toBeTruthy(); + // Checks if the user group was created in the UI as well + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.isUserGroupWithNameVisible(userGroupName); + await umbracoUi.userGroup.isUserGroupWithNameVisible(oldUserGroupName, false); +}); + +test('can update a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickPermissionsByName([allPermissions.uiPermission[0]]); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.doesUserGroupHavePermission(allPermissions.uiPermission[0]); + const userGroupData = await umbracoApi.userGroup.getByName(userGroupName); + expect(userGroupData.fallbackPermissions).toContain(allPermissions.verbPermission[0]); +}); + +test('can delete a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickDeleteButton(); + await umbracoUi.userGroup.clickConfirmToDeleteButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.deleted); + expect(await umbracoApi.userGroup.doesNameExist(userGroupName)).toBeFalsy(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.isUserGroupWithNameVisible(userGroupName, false); +}); + +test('can add a section to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.addSectionWithNameToUserGroup('Content'); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.doesUserGroupHaveSection(userGroupName, 'Content'); +}) + +test('can add multiple sections to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.addSectionWithNameToUserGroup('Media'); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.doesUserGroupHaveSection(userGroupName, 'Content'); + await umbracoUi.userGroup.doesUserGroupHaveSection(userGroupName, 'Media'); +}); + +test('can remove a section from a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createSimpleUserGroupWithContentSection(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickRemoveSectionFromUserGroup('Content'); + await umbracoUi.userGroup.clickConfirmRemoveButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.doesUserGroupHaveSection(userGroupName, 'Content', false); + const userGroupData = await umbracoApi.userGroup.getByName(userGroupName); + expect(userGroupData.sections).toEqual([]); +}); + +test('can add a language to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.addLanguageToUserGroup(englishLanguage); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.doesUserGroupContainLanguage(englishLanguage); + expect(await umbracoApi.userGroup.doesUserGroupContainLanguage(userGroupName, 'en-US')).toBeTruthy(); +}) + +test('can enable all languages for a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickAllowAccessToAllLanguages(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainAccessToAllLanguages(userGroupName)).toBeTruthy(); +}) + +test('can add multiple languages to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createUserGroupWithLanguage(userGroupName, 'en-US'); + const danishLanguage = 'Danish'; + await umbracoApi.language.ensureNameNotExists(danishLanguage); + await umbracoApi.language.createDanishLanguage(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.addLanguageToUserGroup(danishLanguage); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.doesUserGroupContainLanguage(englishLanguage); + await umbracoUi.userGroup.doesUserGroupContainLanguage(danishLanguage); + expect(await umbracoApi.userGroup.doesUserGroupContainLanguage(userGroupName, 'en-US')).toBeTruthy(); + expect(await umbracoApi.userGroup.doesUserGroupContainLanguage(userGroupName, 'da')).toBeTruthy(); + + // Clean + await umbracoApi.language.ensureNameNotExists(danishLanguage); +}) + +test('can remove language from a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createUserGroupWithLanguage(userGroupName, 'en-US'); + expect(await umbracoApi.userGroup.doesUserGroupContainLanguage(userGroupName, 'en-US')).toBeTruthy(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickRemoveLanguageFromUserGroup(englishLanguage); + await umbracoUi.userGroup.clickConfirmRemoveButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.doesUserGroupContainLanguage(englishLanguage, false); + expect(await umbracoApi.userGroup.doesUserGroupContainLanguage(userGroupName, 'en-US')).toBeFalsy(); +}) + +test('can add a content start node to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickChooseContentStartNodeButton(); + await umbracoUi.userGroup.clickLabelWithName(documentName); + await umbracoUi.userGroup.clickChooseContainerButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainContentStartNodeId(userGroupName, documentId)).toBeTruthy(); + + // Clean + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can remove a content start node from a user group ', async ({umbracoApi, umbracoUi}) => { + // Arrange + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoApi.userGroup.createUserGroupWithDocumentStartNode(userGroupName, documentId); + expect(await umbracoApi.userGroup.doesUserGroupContainContentStartNodeId(userGroupName, documentId)).toBeTruthy(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickRemoveContentStartNodeFromUserGroup(documentName); + await umbracoUi.userGroup.clickConfirmRemoveButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainContentStartNodeId(userGroupName, documentId)).toBeFalsy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentTypeName); +}); + +test('can enable access to all content from a user group ', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickAllowAccessToAllDocuments(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainDocumentRootAccess(userGroupName)).toBeTruthy(); +}); + +test('can add a media start node to a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + const mediaName = 'TestMedia'; + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMediaFile(mediaName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickChooseMediaStartNodeButton(); + await umbracoUi.userGroup.clickMediaCardWithName(mediaName); + await umbracoUi.userGroup.clickSubmitButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainMediaStartNodeId(userGroupName, mediaId)).toBeTruthy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); +}); + +test('can remove a media start node from a user group ', async ({umbracoApi, umbracoUi}) => { + // Arrange + const mediaName = 'TestMedia'; + await umbracoApi.media.ensureNameNotExists(mediaName); + const mediaId = await umbracoApi.media.createDefaultMediaFile(mediaName); + await umbracoApi.userGroup.createUserGroupWithMediaStartNode(userGroupName, mediaId); + expect(await umbracoApi.userGroup.doesUserGroupContainMediaStartNodeId(userGroupName, mediaId)).toBeTruthy(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickRemoveMediaStartNodeFromUserGroup(mediaName); + await umbracoUi.userGroup.clickConfirmRemoveButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainMediaStartNodeId(userGroupName, mediaId)).toBeFalsy(); + + // Clean + await umbracoApi.media.ensureNameNotExists(mediaName); +}); + +test('can enable access to all media in a user group ', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickAllowAccessToAllMedia(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainMediaRootAccess(userGroupName)).toBeTruthy(); +}); + +test('can enable all permissions for a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + + // Act + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + await umbracoUi.userGroup.clickPermissionsByName(allPermissions.uiPermission); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.doesUserGroupHavePermissionEnabled(allPermissions.uiPermission); + const userGroupData = await umbracoApi.userGroup.getByName(userGroupName); + expect(userGroupData.fallbackPermissions).toEqual(allPermissions.verbPermission); +}); + +test('can add granular permission to a specific document for a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickAddGranularPermission(); + await umbracoUi.userGroup.clickLabelWithName(documentName); + await umbracoUi.userGroup.clickGranularPermissionsByName([allPermissions.uiPermission[0]]); + await umbracoUi.userGroup.clickConfirmButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainGranularPermissionsForDocument(userGroupName, documentId, [allPermissions.verbPermission[0]])).toBeTruthy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentTypeName); +}); + +test('can add all granular permissions to a specific document for a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoApi.userGroup.createEmptyUserGroup(userGroupName); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickAddGranularPermission(); + await umbracoUi.userGroup.clickLabelWithName(documentName); + await umbracoUi.userGroup.clickGranularPermissionsByName(allPermissions.uiPermission); + await umbracoUi.userGroup.clickConfirmButton(); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.reloadPage(); + await umbracoUi.userGroup.clickGranularPermissionWithName(documentName); + await umbracoUi.userGroup.doesUserGroupHavePermissionEnabled(allPermissions.uiPermission); + expect(await umbracoApi.userGroup.doesUserGroupContainGranularPermissionsForDocument(userGroupName, documentId, allPermissions.verbPermission)).toBeTruthy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentTypeName); +}); + +test('can remove granular permission to a specific document for a user group', async ({umbracoApi, umbracoUi}) => { + // Arrange + const documentTypeName = 'TestDocumentType'; + const documentName = 'TestDocument'; + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + const documentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(documentTypeName); + const documentId = await umbracoApi.document.createDefaultDocument(documentName, documentTypeId); + await umbracoApi.userGroup.createUserGroupWithPermissionsForSpecificDocumentWithBrowseNode(userGroupName, documentId); + expect(await umbracoApi.userGroup.doesUserGroupContainGranularPermissionsForDocument(userGroupName, documentId, [allPermissions.verbPermission[0]])).toBeTruthy(); + await umbracoUi.userGroup.clickUserGroupsTabButton(); + await umbracoUi.userGroup.clickUserGroupWithName(userGroupName); + + // Act + await umbracoUi.userGroup.clickRemoveGranularPermissionWithName(documentName); + await umbracoUi.userGroup.clickSaveButton(); + + // Assert + await umbracoUi.userGroup.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.userGroup.doesUserGroupContainGranularPermissionsForDocument(userGroupName, documentId, [allPermissions.verbPermission[0]])).toBeFalsy(); + + // Clean + await umbracoApi.document.ensureNameNotExists(documentTypeName); +}); From 2d027ce9a1e1a4a868f2bf2995af511e8dff44b5 Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:09:37 +0700 Subject: [PATCH 074/167] V14 QA Added acceptance tests for rendering content with content picker (#17378) * Added tests for rendering content with content picker * Bumped version * Make all the tests for rendering content run in the pipeline * Reverted --- .../package-lock.json | 8 ++-- .../Umbraco.Tests.AcceptanceTest/package.json | 2 +- .../RenderingContentWithContentPicker.spec.ts | 41 +++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithContentPicker.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index ce584dba6fd7..75883bf48c0b 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "dependencies": { "@umbraco/json-models-builders": "^2.0.23", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.95", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.96", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -63,9 +63,9 @@ } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.95", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.95.tgz", - "integrity": "sha512-9pJrC/4d4O/TKSyHk0n12ZBFi3lRJd6+kRsngK1eCqcHjVqB7HTDWjsL7KS+1bWzVqFvJgbCVezt2eR+GiWBEA==", + "version": "2.0.0-beta.96", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.96.tgz", + "integrity": "sha512-kij2xWXWgrwnqa3dU8ErWd7tFAisewFpVRGHM6tI1LSa/z6/OhGmHJqhk3rIm2bCb/eh2WMQH40x6t5OC8YpOw==", "dependencies": { "@umbraco/json-models-builders": "2.0.23", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 85ef6be6d729..1696dafbee01 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@umbraco/json-models-builders": "^2.0.23", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.95", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.96", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithContentPicker.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithContentPicker.spec.ts new file mode 100644 index 000000000000..0c87cb99110d --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/RenderingContent/RenderingContentWithContentPicker.spec.ts @@ -0,0 +1,41 @@ +import {AliasHelper, test} from '@umbraco/playwright-testhelpers'; + +const contentName = 'Test Rendering Content'; +const documentTypeName = 'TestDocumentTypeForContent'; +const dataTypeName = 'Content Picker'; +const templateName = 'TestTemplateForContent'; +const propertyName = 'Test Content Picker'; +const contentPickerDocumentTypeName = 'DocumentTypeForContentPicker'; +const contentPickerName = 'TestContentPickerName'; +let dataTypeData = null; +let contentPickerDocumentTypeId = ''; +let contentPickerId = ''; + +test.beforeEach(async ({umbracoApi}) => { + dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); + contentPickerDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentTypeWithAllowAsRoot(contentPickerDocumentTypeName); + contentPickerId = await umbracoApi.document.createDefaultDocument(contentPickerName, contentPickerDocumentTypeId); + await umbracoApi.document.publish(contentPickerId); +}); + +test.afterEach(async ({umbracoApi}) => { + await umbracoApi.document.ensureNameNotExists(contentName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); + await umbracoApi.document.ensureNameNotExists(contentPickerName); + await umbracoApi.documentType.ensureNameNotExists(contentPickerDocumentTypeName); + await umbracoApi.template.ensureNameNotExists(templateName); +}); + +test('can render content with content picker value', async ({umbracoApi, umbracoUi}) => { + // Arrange + const templateId = await umbracoApi.template.createTemplateWithDisplayingContentPickerValue(templateName, AliasHelper.toAlias(propertyName)); + await umbracoApi.document.createPublishedDocumentWithValue(contentName, contentPickerId, dataTypeData.id, templateId, propertyName, documentTypeName); + const contentData = await umbracoApi.document.getByName(contentName); + const contentURL = contentData.urls[0].url; + + // Act + await umbracoUi.contentRender.navigateToRenderedContentPage(contentURL); + + // Assert + await umbracoUi.contentRender.doesContentRenderValueContainText(contentPickerName); +}); From 2d4230c001777ea51851ffcec64b976840132207 Mon Sep 17 00:00:00 2001 From: Mole Date: Fri, 8 Nov 2024 08:58:38 +0100 Subject: [PATCH 075/167] Include create date in audit item (#17447) --- src/Umbraco.Core/Models/AuditItem.cs | 15 ++++++++ .../Repositories/Implement/AuditRepository.cs | 12 +++--- .../Repositories/AuditRepositoryTest.cs | 38 ++++++++++++++++++- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Core/Models/AuditItem.cs b/src/Umbraco.Core/Models/AuditItem.cs index bbfca724aa30..7b4eff86e649 100644 --- a/src/Umbraco.Core/Models/AuditItem.cs +++ b/src/Umbraco.Core/Models/AuditItem.cs @@ -7,6 +7,21 @@ public sealed class AuditItem : EntityBase, IAuditItem /// /// Initializes a new instance of the class. /// + public AuditItem(int objectId, AuditType type, int userId, string? entityType, DateTime createDate, string? comment = null, string? parameters = null) + { + DisableChangeTracking(); + + Id = objectId; + Comment = comment; + AuditType = type; + UserId = userId; + EntityType = entityType; + Parameters = parameters; + CreateDate = createDate; + + EnableChangeTracking(); + } + public AuditItem(int objectId, AuditType type, int userId, string? entityType, string? comment = null, string? parameters = null) { DisableChangeTracking(); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs index f11e17a236ed..09fa3d1029ee 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs @@ -29,7 +29,7 @@ public IEnumerable Get(AuditType type, IQuery query) List? dtos = Database.Fetch(sql); - return dtos.Select(x => new AuditItem(x.NodeId, Enum.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Comment, x.Parameters)).ToList(); + return dtos.Select(x => new AuditItem(x.NodeId, Enum.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Datestamp, x.Comment, x.Parameters)).ToList(); } public void CleanLogs(int maximumAgeOfLogsInMinutes) @@ -104,7 +104,7 @@ public IEnumerable GetPagedResultsByQuery( totalRecords = page.TotalItems; var items = page.Items.Select( - dto => new AuditItem(dto.NodeId, Enum.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Comment, dto.Parameters)).ToList(); + dto => new AuditItem(dto.NodeId, Enum.ParseOrNull(dto.Header) ?? AuditType.Custom, dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Datestamp, dto.Comment, dto.Parameters)).ToList(); // map the DateStamp for (var i = 0; i < items.Count; i++) @@ -144,12 +144,12 @@ protected override void PersistUpdatedItem(IAuditItem entity) => protected override IAuditItem? PerformGet(int id) { Sql sql = GetBaseQuery(false); - sql.Where(GetBaseWhereClause(), new { Id = id }); + sql.Where(GetBaseWhereClause(), new { id = id }); LogDto? dto = Database.First(sql); return dto == null ? null - : new AuditItem(dto.NodeId, Enum.Parse(dto.Header), dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Comment, dto.Parameters); + : new AuditItem(dto.NodeId, Enum.Parse(dto.Header), dto.UserId ?? Constants.Security.UnknownUserId, dto.EntityType, dto.Datestamp, dto.Comment, dto.Parameters); } protected override IEnumerable PerformGetAll(params int[]? ids) => throw new NotImplementedException(); @@ -162,7 +162,7 @@ protected override IEnumerable PerformGetByQuery(IQuery List? dtos = Database.Fetch(sql); - return dtos.Select(x => new AuditItem(x.NodeId, Enum.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Comment, x.Parameters)).ToList(); + return dtos.Select(x => new AuditItem(x.NodeId, Enum.Parse(x.Header), x.UserId ?? Constants.Security.UnknownUserId, x.EntityType, x.Datestamp, x.Comment, x.Parameters)).ToList(); } protected override Sql GetBaseQuery(bool isCount) @@ -184,7 +184,7 @@ protected override Sql GetBaseQuery(bool isCount) return sql; } - protected override string GetBaseWhereClause() => "id = @id"; + protected override string GetBaseWhereClause() => "umbracoLog.id = @id"; protected override IEnumerable GetDeleteClauses() => throw new NotImplementedException(); } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/AuditRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/AuditRepositoryTest.cs index 57f484adf20d..8e7eed1f28cf 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/AuditRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/AuditRepositoryTest.cs @@ -1,11 +1,11 @@ // Copyright (c) Umbraco. // See LICENSE for more details. -using System.Linq; using Microsoft.Extensions.Logging; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Cms.Infrastructure.Persistence.Dtos; using Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement; @@ -24,6 +24,10 @@ public class AuditRepositoryTest : UmbracoIntegrationTest private ILogger _logger; + private IAuditRepository AuditRepository => GetRequiredService(); + + private IAuditItem GetAuditItem(int id) => new AuditItem(id, AuditType.System, -1, UmbracoObjectTypes.Document.GetName(), "This is a System audit trail"); + [Test] public void Can_Add_Audit_Entry() { @@ -40,6 +44,38 @@ public void Can_Add_Audit_Entry() } } + [Test] + public void Has_Create_Date_When_Get_By_Id() + { + using var scope = ScopeProvider.CreateScope(); + + AuditRepository.Save(GetAuditItem(1)); + var auditEntry = AuditRepository.Get(1); + Assert.That(auditEntry.CreateDate, Is.Not.EqualTo(default(DateTime))); + } + + [Test] + public void Has_Create_Date_When_Get_By_Query() + { + using var scope = ScopeProvider.CreateScope(); + + AuditRepository.Save(GetAuditItem(1)); + var auditEntry = AuditRepository.Get(AuditType.System, ScopeProvider.CreateQuery().Where(x => x.Id == 1)).FirstOrDefault(); + Assert.That(auditEntry, Is.Not.Null); + Assert.That(auditEntry.CreateDate, Is.Not.EqualTo(default(DateTime))); + } + + [Test] + public void Has_Create_Date_When_Get_By_Paged_Query() + { + using var scope = ScopeProvider.CreateScope(); + + AuditRepository.Save(GetAuditItem(1)); + var auditEntry = AuditRepository.GetPagedResultsByQuery(ScopeProvider.CreateQuery().Where(x => x.Id == 1),0, 10, out long total, Direction.Ascending, null, null).FirstOrDefault(); + Assert.That(auditEntry, Is.Not.Null); + Assert.That(auditEntry.CreateDate, Is.Not.EqualTo(default(DateTime))); + } + [Test] public void Get_Paged_Items() { From 0acdd2685090b3da362db7e475035e7189f847fb Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Fri, 8 Nov 2024 12:18:13 +0100 Subject: [PATCH 076/167] Made some stylesheet endpoints available for document/media/member related actions (#17442) --- .../Controllers/Stylesheet/CreateStylesheetController.cs | 3 +++ .../Controllers/Stylesheet/DeleteStylesheetController.cs | 3 +++ .../Controllers/Stylesheet/RenameStylesheetController.cs | 3 +++ .../Controllers/Stylesheet/StylesheetControllerBase.cs | 2 +- .../Controllers/Stylesheet/UpdateStylesheetController.cs | 3 +++ .../BackOfficeAuthPolicyBuilderExtensions.cs | 1 + src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs | 1 + 7 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/CreateStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/CreateStylesheetController.cs index 5471af2f1db8..165533f28706 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/CreateStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/CreateStylesheetController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Extensions; @@ -9,10 +10,12 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheets)] public class CreateStylesheetController : StylesheetControllerBase { private readonly IStylesheetService _stylesheetService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs index 51c6ebb3cc5c..3dcdb92bbd91 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs @@ -1,14 +1,17 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Extensions; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheets)] public class DeleteStylesheetController : StylesheetControllerBase { private readonly IStylesheetService _stylesheetService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/RenameStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/RenameStylesheetController.cs index 64806179188d..e1ce77717de9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/RenameStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/RenameStylesheetController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Extensions; @@ -9,10 +10,12 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheets)] public class RenameStylesheetController : StylesheetControllerBase { private readonly IStylesheetService _stylesheetService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/StylesheetControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/StylesheetControllerBase.cs index f36b7074242d..9828cefa10f9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/StylesheetControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/StylesheetControllerBase.cs @@ -11,7 +11,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet; [VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.Stylesheet}")] [ApiExplorerSettings(GroupName = "Stylesheet")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheets)] +[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheetsOrDocumentOrMediaOrMember)] public class StylesheetControllerBase : FileSystemManagementControllerBase { protected IActionResult StylesheetOperationStatusResult(StylesheetOperationStatus status) => diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs index 7c54170b89d7..377fef87d1a2 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Extensions; @@ -9,10 +10,12 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.Stylesheet; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessStylesheets)] public class UpdateStylesheetController : StylesheetControllerBase { private readonly IStylesheetService _stylesheetService; diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs index 3a2c860ade0e..1cc8a95197d8 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs @@ -91,6 +91,7 @@ void AddAllowedApplicationsPolicy(string policyName, params string[] allowedClai AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessRelationTypes, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessScripts, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessStylesheets, Constants.Applications.Settings); + AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessStylesheetsOrDocumentOrMediaOrMember, Constants.Applications.Settings, Constants.Applications.Content, Constants.Applications.Media, Constants.Applications.Members); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessTemplates, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessWebhooks, Constants.Applications.Settings); diff --git a/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs b/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs index 9b54a3912ac9..fd811161c7c5 100644 --- a/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs +++ b/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs @@ -53,6 +53,7 @@ public static class AuthorizationPolicies public const string TreeAccessMediaOrMediaTypes = nameof(TreeAccessMediaOrMediaTypes); public const string TreeAccessDictionaryOrTemplates = nameof(TreeAccessDictionaryOrTemplates); public const string TreeAccessDocumentOrMediaOrContentTypes = nameof(TreeAccessDocumentOrMediaOrContentTypes); + public const string TreeAccessStylesheetsOrDocumentOrMediaOrMember = nameof(TreeAccessStylesheetsOrDocumentOrMediaOrMember); // other public const string DictionaryPermissionByResource = nameof(DictionaryPermissionByResource); From a5479bc96ea3ddb6d2078152d008a10457dcb653 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:43:57 +0100 Subject: [PATCH 077/167] V14 QA members section user tests (#17448) * Added tests for the members * Cleaned up tests * Bumped version * Removed skip --- .../package-lock.json | 20 ++-- .../Umbraco.Tests.AcceptanceTest/package.json | 4 +- .../UserGroup/MemberSection.spec.ts | 95 +++++++++++++++++++ 3 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MemberSection.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 75883bf48c0b..a0d2fbdc7429 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,8 +7,8 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "@umbraco/json-models-builders": "^2.0.23", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.96", + "@umbraco/json-models-builders": "^2.0.25", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.98", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" @@ -55,19 +55,21 @@ } }, "node_modules/@umbraco/json-models-builders": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.23.tgz", - "integrity": "sha512-48TgQnrdxQ2Oi/NintzgYvVRnlX3JXKq505leuWATo9AH3ffuzR+g7hXoTC/Us9ms5BjTTXssLBwzlgCyHJTJQ==", + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@umbraco/json-models-builders/-/json-models-builders-2.0.25.tgz", + "integrity": "sha512-bFO4AuXUlkyRtBolqOnAvlW12B7Zh/cee3DHShAb+KaXdAC9LzvHYCSH33yJRk2Qc9KvK6ECAMamhiBcT1cMWw==", + "license": "MIT", "dependencies": { "camelize": "^1.0.1" } }, "node_modules/@umbraco/playwright-testhelpers": { - "version": "2.0.0-beta.96", - "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.96.tgz", - "integrity": "sha512-kij2xWXWgrwnqa3dU8ErWd7tFAisewFpVRGHM6tI1LSa/z6/OhGmHJqhk3rIm2bCb/eh2WMQH40x6t5OC8YpOw==", + "version": "2.0.0-beta.98", + "resolved": "https://registry.npmjs.org/@umbraco/playwright-testhelpers/-/playwright-testhelpers-2.0.0-beta.98.tgz", + "integrity": "sha512-gOQoLx5aSa5G0U4aFyp3Hd8xGlnM/x1th0Yv6/zYktZNwzBBfWIhMOBWulAzTNhdvfNcKjuBQCg2opQ4ZZNsew==", + "license": "MIT", "dependencies": { - "@umbraco/json-models-builders": "2.0.23", + "@umbraco/json-models-builders": "2.0.25", "node-fetch": "^2.6.7" } }, diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 1696dafbee01..237bf0f3dd2f 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -20,8 +20,8 @@ "typescript": "^4.8.3" }, "dependencies": { - "@umbraco/json-models-builders": "^2.0.23", - "@umbraco/playwright-testhelpers": "^2.0.0-beta.96", + "@umbraco/json-models-builders": "^2.0.25", + "@umbraco/playwright-testhelpers": "^2.0.0-beta.98", "camelize": "^1.0.0", "dotenv": "^16.3.1", "node-fetch": "^2.6.7" diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MemberSection.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MemberSection.spec.ts new file mode 100644 index 000000000000..eb5ee1f20427 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MemberSection.spec.ts @@ -0,0 +1,95 @@ +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +let memberId = ''; +let memberTypeId = ''; +const memberName = 'Test Member'; +const memberTypeName = 'Test Member Type'; +const comment = 'This is test comment'; +const username = 'testmember'; +const email = 'testmember@acceptance.test'; +const password = '0123456789'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.memberType.ensureNameNotExists(memberTypeName); + await umbracoApi.member.ensureNameNotExists(memberName); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.memberType.ensureNameNotExists(memberTypeName); + await umbracoApi.member.ensureNameNotExists(memberName); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); +}); + +test('can access members section with section enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithMemberSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'en-us'); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.member.goToSection(ConstantHelper.sections.members, false); + + // Assert + await umbracoUi.user.isSectionWithNameVisible(ConstantHelper.sections.content, false); + await umbracoUi.member.doesErrorNotificationHaveText(NotificationConstantHelper.error.noAccessToResource, false); +}); + +test('can create member with members section set', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithMemberSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'en-us'); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.member.goToSection(ConstantHelper.sections.members, false); + + // Act + await umbracoUi.member.clickCreateButton(); + await umbracoUi.member.enterMemberName(memberName); + await umbracoUi.member.enterUsername(username); + await umbracoUi.member.enterEmail(email); + await umbracoUi.member.enterPassword(password); + await umbracoUi.member.enterConfirmPassword(password); + await umbracoUi.member.clickDetailsTab(); + await umbracoUi.member.enterComments(comment); + await umbracoUi.member.clickSaveButton(); + + // Assert + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); + await umbracoUi.member.doesErrorNotificationHaveText(NotificationConstantHelper.error.noAccessToResource, false); + expect(await umbracoApi.member.doesNameExist(memberName)).toBeTruthy(); +}); + +test('can update member with members section set', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithMemberSection(userGroupName); + memberTypeId = await umbracoApi.memberType.createDefaultMemberType(memberTypeName); + memberId = await umbracoApi.member.createDefaultMember(memberName, memberTypeId, email, username, password); + const updatedUsername = 'updatedusername'; + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId, [], true, [], false, 'en-us'); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.member.goToSection(ConstantHelper.sections.members, false); + + // Act + await umbracoUi.member.clickMemberLinkByName(memberName); + await umbracoUi.member.enterUsername(updatedUsername); + await umbracoUi.member.clickSaveButton(); + + // Assert + await umbracoUi.member.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + await umbracoUi.member.doesErrorNotificationHaveText(NotificationConstantHelper.error.noAccessToResource, false); + const memberData = await umbracoApi.member.get(memberId); + expect(memberData.username).toBe(updatedUsername); +}); From 6acdf21eabb19457f45abaa5464d9846dab2c48b Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:45:22 +0100 Subject: [PATCH 078/167] V14 QA user groups permissions tests (#17429) * Added tests for userGroup * Clean up * Updated userGroup tests * Updated tests * Updated tests * Cleane up * Cleaned up * Bumped versions * Run user tests * Cleaned up * Added permission tests * Added tests, not done * Updated tests * Fixed tests * Cleaned up * Bumped version * More cleanup * Run user tests * Added wait * Added tests and cleaned up naming * Bumped versions * Reverted smokeTest command --- .../DefaultConfig/Content/Content.spec.ts | 3 +- .../Permissions/User/MediaStartNodes.spec.ts | 2 +- .../DefaultPermissionsInContent.spec.ts | 619 ++++++++++++++++++ .../UserGroup/MediaStartNodes.spec.ts | 85 +++ .../DefaultConfig/Users/UserGroups.spec.ts | 2 +- 5 files changed, 707 insertions(+), 4 deletions(-) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MediaStartNodes.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts index 693762a0ec3a..07f16cab9fb6 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Content/Content.spec.ts @@ -147,8 +147,7 @@ test('can unpublish content', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) = const dataTypeData = await umbracoApi.dataType.getByName(dataTypeName); documentTypeId = await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, dataTypeName, dataTypeData.id); contentId = await umbracoApi.document.createDocumentWithTextContent(contentName, documentTypeId, contentText, dataTypeName); - const publishData = {"publishSchedules":[{"culture":null}]}; - await umbracoApi.document.publish(contentId, publishData); + await umbracoApi.document.publish(contentId); await umbracoUi.goToBackOffice(); await umbracoUi.content.goToSection(ConstantHelper.sections.content); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts index 573750f08b78..cf545b025bc9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/User/MediaStartNodes.spec.ts @@ -21,7 +21,7 @@ test.beforeEach(async ({umbracoApi}) => { rootFolderId = await umbracoApi.media.createDefaultMediaFolder(rootFolderName); childFolderOneId = await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderOneName, rootFolderId); await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderTwoName, rootFolderId); - userGroupId = await umbracoApi.userGroup.createUserGroupWithMediaSection(userGroupName); + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithMediaSection(userGroupName); }); test.afterEach(async ({umbracoApi}) => { diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts new file mode 100644 index 000000000000..900081db82bf --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/DefaultPermissionsInContent.spec.ts @@ -0,0 +1,619 @@ +import {ConstantHelper, NotificationConstantHelper, test} from "@umbraco/playwright-testhelpers"; +import {expect} from "@playwright/test"; + +const rootDocumentTypeName = 'RootDocumentType'; +const childDocumentTypeOneName = 'ChildDocumentTypeOne'; +const childDocumentTypeTwoName = 'ChildDocumentTypeTwo'; +let childDocumentTypeId = null; +let rootDocumentTypeId = null; +const rootDocumentName = 'RootDocument'; +const childDocumentOneName = 'ChildDocumentOne'; +const childDocumentTwoName = 'SecondChildDocument'; +let rootDocumentId = null; + +const dataTypeName = 'Textstring'; +let dataTypeId = null; +const documentText = 'This is test document text'; + +const testDocumentName = 'TestDocument'; +const documentBlueprintName = 'TestBlueprintName'; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.documentBlueprint.ensureNameNotExists(documentBlueprintName); + const dataType = await umbracoApi.dataType.getByName(dataTypeName); + dataTypeId = dataType.id; + childDocumentTypeId = await umbracoApi.documentType.createDefaultDocumentType(childDocumentTypeOneName); + rootDocumentTypeId = await umbracoApi.documentType.createDocumentTypeWithAllowedChildNodeAndDataType(rootDocumentTypeName, childDocumentTypeId, dataTypeName, dataTypeId); + rootDocumentId = await umbracoApi.document.createDocumentWithTextContent(rootDocumentName, rootDocumentTypeId, documentText, dataTypeName); + await umbracoApi.document.createDefaultDocumentWithParent(childDocumentOneName, childDocumentTypeId, rootDocumentId); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.documentType.ensureNameNotExists(rootDocumentTypeName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeOneName); + await umbracoApi.documentType.ensureNameNotExists(childDocumentTypeTwoName); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.documentBlueprint.ensureNameNotExists(documentBlueprintName); +}); + +test('can browse content node with permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithBrowseNodePermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.goToContentWithName(rootDocumentName); + + // Assert + await umbracoUi.content.doesDocumentHaveName(rootDocumentName); +}); + +test('can not browse content node with permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithBrowseNodePermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.userGroup.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.goToContentWithName(rootDocumentName); + + // Assert + await umbracoUi.content.doesErrorNotificationHaveText(NotificationConstantHelper.error.noAccessToResource); +}); + +test('can create document blueprint with permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentBlueprintPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickCreateDocumentBlueprintButton(); + await umbracoUi.content.enterDocumentBlueprintName(documentBlueprintName); + await umbracoUi.content.clickSaveDocumentBlueprintButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.documentBlueprintCreated); +}); + +test('can not create document blueprint with permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentBlueprintPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.documentBlueprint.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can delete content with delete permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickExactTrashButton(); + await umbracoUi.content.clickConfirmTrashButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.movedToRecycleBin); +}); + +test('can not delete content with delete permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can empty recycle bin with delete permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.moveToRecycleBin(rootDocumentId); + userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickRecycleBinButton(); + await umbracoUi.content.clickEmptyRecycleBinButton(); + await umbracoUi.content.clickConfirmEmptyRecycleBinButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.emptiedRecycleBin); +}); + +test('can not empty recycle bin with delete permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.moveToRecycleBin(rootDocumentId); + userGroupId = await umbracoApi.userGroup.createUserGroupWithDeleteDocumentPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForRecycleBinVisible(false); +}); + +test('can create content with create permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(rootDocumentTypeName); + await umbracoUi.content.enterContentName(testDocumentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); +}); + +test('can not create content with create permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCreateDocumentPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +// TODO: Setup SMTP server to test notifications, do this when we test appsettings.json +test.skip('can create notifications with notification permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithNotificationsPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); +}); + +test('can not create notifications with notification permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithNotificationsPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can publish content with publish permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithPublishPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickPublishButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.published); + expect(await umbracoApi.document.isDocumentPublished(rootDocumentId)).toBeTruthy(); +}); + +test('can not publish content with publish permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithPublishPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +// Bug, does nothing in the frontend. +test.skip('can set permissions with set permissions permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithSetPermissionsPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + // await umbracoUi.content.clickSetPermissionsButton(); + // + // // Assert + // await umbracoUi.content.doesDocumentPermissionsDialogExist(); +}); + +test('can not set permissions with set permissions permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithSetPermissionsPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can unpublish content with unpublish permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.publish(rootDocumentId); + expect(await umbracoApi.document.isDocumentPublished(rootDocumentId)).toBeTruthy(); + userGroupId = await umbracoApi.userGroup.createUserGroupWithUnpublishPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickUnpublishButton(); + await umbracoUi.content.clickConfirmToUnpublishButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.unpublished); + expect(await umbracoApi.document.isDocumentPublished(rootDocumentId)).toBeFalsy(); +}); + +test('can not unpublish content with unpublish permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.publish(rootDocumentId); + expect(await umbracoApi.document.isDocumentPublished(rootDocumentId)).toBeTruthy(); + userGroupId = await umbracoApi.userGroup.createUserGroupWithUnpublishPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can update content with update permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithUpdatePermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.goToContentWithName(rootDocumentName); + await umbracoUi.content.isDocumentReadOnly(false); + await umbracoUi.content.enterContentName(testDocumentName); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.saved); + expect(await umbracoApi.document.doesNameExist(testDocumentName)).toBeTruthy(); +}); + +// TODO: the permission for update is not working, it is always enabled. +test.skip('can not update content with update permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithUpdatePermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can duplicate content with duplicate permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const duplicatedContentName = rootDocumentName + ' (1)'; + userGroupId = await umbracoApi.userGroup.createUserGroupWithDuplicatePermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + // Duplicate to root + await umbracoUi.content.clickDuplicateToButton(); + await umbracoUi.content.clickLabelWithName('Content'); + await umbracoUi.content.clickDuplicateButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.duplicated); + expect(await umbracoApi.document.doesNameExist(rootDocumentName)).toBeTruthy(); + expect(await umbracoApi.document.doesNameExist(duplicatedContentName)).toBeTruthy(); + await umbracoUi.content.isContentInTreeVisible(rootDocumentName); + await umbracoUi.content.isContentInTreeVisible(duplicatedContentName); + const rootContent = await umbracoApi.document.getByName(rootDocumentName); + const rootDuplicatedContent = await umbracoApi.document.getByName(duplicatedContentName); + expect(rootContent.values[0].value).toEqual(rootDuplicatedContent.values[0].value); +}); + +test('can not duplicate content with duplicate permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDuplicatePermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can move content with move to permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const moveToDocumentName = 'SecondRootDocument'; + const moveToDocumentId = await umbracoApi.document.createDocumentWithTextContent(moveToDocumentName, rootDocumentTypeId, documentText, dataTypeName); + userGroupId = await umbracoApi.userGroup.createUserGroupWithMoveToPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + await umbracoUi.content.clickActionsMenuForContent(childDocumentOneName); + await umbracoUi.content.clickMoveToButton(); + await umbracoUi.content.moveToContentWithName([], moveToDocumentName); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.moved); + await umbracoUi.content.reloadContentTree(); + await umbracoUi.content.isCaretButtonVisibleForContentName(moveToDocumentName, true); + await umbracoUi.content.clickCaretButtonForContentName(moveToDocumentName); + await umbracoUi.content.isChildContentInTreeVisible(moveToDocumentName, childDocumentOneName, true); + await umbracoUi.content.isCaretButtonVisibleForContentName(rootDocumentName, false); + expect(await umbracoApi.document.getChildrenAmount(rootDocumentId)).toEqual(0); + expect(await umbracoApi.document.getChildrenAmount(moveToDocumentId)).toEqual(1); +}); + +test('can not move content with move to permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + const moveToDocumentName = 'SecondRootDocument'; + await umbracoApi.document.createDocumentWithTextContent(moveToDocumentName, rootDocumentTypeId, documentText, dataTypeName); + userGroupId = await umbracoApi.userGroup.createUserGroupWithMoveToPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can sort children with sort children permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.createDefaultDocumentWithParent(childDocumentTwoName, childDocumentTypeId, rootDocumentId); + userGroupId = await umbracoApi.userGroup.createUserGroupWithSortChildrenPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickSortChildrenButton(); + + // TODO: uncomment when it is not flaky + // const childDocumentOneLocator = await umbracoUi.content.getButtonWithName(childDocumentOneName); + // const childDocumentTwoLocator = await umbracoUi.content.getButtonWithName(childDocumentTwoName) + // await umbracoUi.content.sortChildrenDragAndDrop(childDocumentOneLocator, childDocumentTwoLocator, 10, 0, 10); + await umbracoUi.content.clickSortButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.itemsSorted); + // TODO: uncomment when it is not flaky + // await umbracoUi.content.clickCaretButtonForContentName(rootDocumentName); + // await umbracoUi.content.doesIndexDocumentInTreeContainName(rootDocumentName, childDocumentTwoName, 0); + // await umbracoUi.content.doesIndexDocumentInTreeContainName(rootDocumentName, childDocumentOneName, 1); +}); + +test('can not sort children with sort children permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.document.createDefaultDocumentWithParent(childDocumentTwoName, childDocumentTypeId, rootDocumentId); + userGroupId = await umbracoApi.userGroup.createUserGroupWithSortChildrenPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can set culture and hostnames with culture and hostnames permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCultureAndHostnamesPermission(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickCultureAndHostnamesButton(); + await umbracoUi.content.clickAddNewDomainButton(); + await umbracoUi.content.enterDomain('/en'); + await umbracoUi.content.clickSaveModalButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.culturesAndHostnamesSaved); +}); + +test('can not set culture and hostnames with culture and hostnames permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithCultureAndHostnamesPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +// TODO: Notification is not correct 'Public acccess setting created' should be 'access' +test.skip('can set public access with public access permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithPublicAccessPermission(userGroupName); + const testMemberGroup = 'TestMemberGroup'; + await umbracoApi.memberGroup.ensureNameNotExists(testMemberGroup); + await umbracoApi.memberGroup.create(testMemberGroup) + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + await umbracoUi.content.clickPublicAccessButton(); + await umbracoUi.content.addGroupBasedPublicAccess(testMemberGroup, rootDocumentName); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.publicAccessSettingCreated); +}); + +test('can not set public access with public access permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithPublicAccessPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can rollback content with rollback permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithRollbackPermission(userGroupName); + await umbracoApi.document.publish(rootDocumentId); + const updatedTextStringText = 'This is an updated textString text'; + const content = await umbracoApi.document.get(rootDocumentId); + content.values[0].value = updatedTextStringText; + await umbracoApi.document.update(rootDocumentId, content); + await umbracoApi.document.publish(rootDocumentId); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.goToContentWithName(rootDocumentName); + await umbracoUi.content.doesDocumentPropertyHaveValue(dataTypeName, updatedTextStringText); + await umbracoUi.content.clickInfoTab(); + // Needs to wait for the rollback button to be visible + await umbracoUi.waitForTimeout(500); + await umbracoUi.content.clickRollbackButton(); + await umbracoUi.content.clickLatestRollBackItem(); + await umbracoUi.content.clickRollbackContainerButton(); + + // Assert + await umbracoUi.content.doesDocumentPropertyHaveValue(dataTypeName, documentText); +}); + +test('can not rollback content with rollback permission disabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithRollbackPermission(userGroupName, false); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Assert + await umbracoUi.content.isActionsMenuForNameVisible(rootDocumentName, false); +}); + +test('can not see delete button in content for userGroup with delete permission disabled and create permission enabled', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithDeletePermissionAndCreatePermission(userGroupName, false, true); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + await umbracoUi.content.clickActionsMenuForContent(rootDocumentName); + + // Assert + await umbracoUi.content.isPermissionInActionsMenuVisible('Delete', false); + await umbracoUi.content.isPermissionInActionsMenuVisible('Create', true); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MediaStartNodes.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MediaStartNodes.spec.ts new file mode 100644 index 000000000000..61a99709e3f2 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/MediaStartNodes.spec.ts @@ -0,0 +1,85 @@ +import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +const userGroupName = 'TestUserGroup'; +let userGroupId = null; + +let rootFolderId = null; +let childFolderOneId = null; +const rootFolderName = 'RootFolder'; +const childFolderOneName = 'ChildFolderOne'; +const childFolderTwoName = 'ChildFolderTwo'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.media.ensureNameNotExists(rootFolderName); + await umbracoApi.media.ensureNameNotExists(childFolderOneName); + await umbracoApi.media.ensureNameNotExists(childFolderTwoName); + rootFolderId = await umbracoApi.media.createDefaultMediaFolder(rootFolderName); + childFolderOneId = await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderOneName, rootFolderId); + await umbracoApi.media.createDefaultMediaFolderAndParentId(childFolderTwoName, rootFolderId); +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.userGroup.ensureNameNotExists(userGroupName); + await umbracoApi.media.ensureNameNotExists(rootFolderName); + await umbracoApi.media.ensureNameNotExists(childFolderOneName); + await umbracoApi.media.ensureNameNotExists(childFolderTwoName); +}); + +test('can see root media start node and children', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithMediaStartNode(userGroupName, rootFolderId); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName); + await umbracoUi.media.clickCaretButtonForMediaName(rootFolderName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderOneName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderTwoName); +}); + +test('can see parent of start node but not access it', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createUserGroupWithMediaStartNode(userGroupName, childFolderOneId); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName); + await umbracoUi.waitForTimeout(500); + await umbracoUi.media.goToMediaWithName(rootFolderName); + await umbracoUi.media.isTextWithMessageVisible('The authenticated user do not have access to this resource'); + await umbracoUi.media.clickCaretButtonForMediaName(rootFolderName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderOneName); + await umbracoUi.media.isChildMediaVisible(rootFolderName, childFolderTwoName, false); +}); + +test('can not see any media when no media start nodes specified', async ({umbracoApi, umbracoUi}) => { + // Arrange + userGroupId = await umbracoApi.userGroup.createSimpleUserGroupWithMediaSection(userGroupName); + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + + // Act + await umbracoUi.user.goToSection(ConstantHelper.sections.media, false); + + // Assert + await umbracoUi.media.isMediaVisible(rootFolderName, false); +}); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts index dd5676cab033..502b40eb8fb3 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/UserGroups.spec.ts @@ -64,7 +64,7 @@ test('can create an empty user group', async ({umbracoApi, umbracoUi}) => { // Checks if the user group was created in the UI as well await umbracoUi.userGroup.clickUserGroupsTabButton(); await umbracoUi.userGroup.isUserGroupWithNameVisible(userGroupName); -}) +}); test('can rename a user group', async ({umbracoApi, umbracoUi}) => { // Arrange From 7010ff1d2684b0abf9233a9d0618e7397283df8e Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:47:41 +0100 Subject: [PATCH 079/167] V14 QA added rich text editor with stylesheet test (#17449) * Rte tests * Cleaned up * Bumped version * Added ensure not exists --- .../ContentWithRichTextEditor.spec.ts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentWithRichTextEditor.spec.ts diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentWithRichTextEditor.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentWithRichTextEditor.spec.ts new file mode 100644 index 000000000000..df9655388a71 --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Users/Permissions/UserGroup/ContentWithRichTextEditor.spec.ts @@ -0,0 +1,52 @@ +import {ConstantHelper, NotificationConstantHelper, test} from '@umbraco/playwright-testhelpers'; +import {expect} from "@playwright/test"; + +const testUser = ConstantHelper.testUserCredentials; +let testUserCookieAndToken = {cookie: "", accessToken: "", refreshToken: ""}; + +let userGroupId = null; + +const documentTypeName = 'TestDocumentType'; +const documentName = 'TestDocument'; +const richTextEditorName = 'TestRichTextEditor'; +const stylesheetName = 'TestStylesheet.css'; + +test.beforeEach(async ({umbracoApi}) => { + await umbracoApi.user.ensureNameNotExists(testUser.name); + await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); + const stylesheetPath = await umbracoApi.stylesheet.createStylesheetWithHeaderContent(stylesheetName); + const dataTypeId = await umbracoApi.dataType.createRichTextEditorDataTypeWithStylesheet(richTextEditorName, stylesheetPath); + await umbracoApi.documentType.createDocumentTypeWithPropertyEditor(documentTypeName, richTextEditorName, dataTypeId); + const userGroup = await umbracoApi.userGroup.getByName('Editors'); + userGroupId = userGroup.id; +}); + +test.afterEach(async ({umbracoApi}) => { + // Ensure we are logged in to admin + await umbracoApi.loginToAdminUser(testUserCookieAndToken.cookie, testUserCookieAndToken.accessToken, testUserCookieAndToken.refreshToken); + await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); + await umbracoApi.dataType.ensureNameNotExists(richTextEditorName); + await umbracoApi.documentType.ensureNameNotExists(documentTypeName); +}); + +test('can create content with a rich text editor that has a stylesheet', async ({umbracoApi, umbracoUi}) => { + // Arrange + await umbracoApi.user.setUserPermissions(testUser.name, testUser.email, testUser.password, userGroupId); + testUserCookieAndToken = await umbracoApi.user.loginToUser(testUser.name, testUser.email, testUser.password); + await umbracoUi.goToBackOffice(); + await umbracoUi.content.goToSection(ConstantHelper.sections.content, false); + + // Act + await umbracoUi.content.clickActionsMenuAtRoot(); + await umbracoUi.content.clickCreateButton(); + await umbracoUi.content.chooseDocumentType(documentTypeName); + await umbracoUi.content.enterContentName(documentName); + // Is needed to make sure that the rich text editor is loaded + await umbracoUi.waitForTimeout(500); + await umbracoUi.content.doesErrorNotificationHaveText(NotificationConstantHelper.error.noAccessToResource, false); + await umbracoUi.content.clickSaveButton(); + + // Assert + await umbracoUi.content.doesSuccessNotificationHaveText(NotificationConstantHelper.success.created); + expect(await umbracoApi.document.doesNameExist(documentName)).toBeTruthy(); +}); From 9edd21a3b043384221956d539108e1a58a3aeeba Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Mon, 11 Nov 2024 09:02:56 +0100 Subject: [PATCH 080/167] Made some membertype endpoints available for member related actions (#17440) Co-authored-by: nikolajlauridsen --- .../MemberType/AvailableCompositionMemberTypeController.cs | 3 +++ .../MemberType/CompositionReferenceMemberTypeController.cs | 3 +++ .../MemberType/ConfigurationMemberTypeController.cs | 1 + .../Controllers/MemberType/CopyMemberTypeController.cs | 3 +++ .../Controllers/MemberType/CreateMemberTypeController.cs | 3 +++ .../Controllers/MemberType/DeleteMemberTypeController.cs | 3 +++ .../Controllers/MemberType/MemberTypeControllerBase.cs | 2 +- .../MemberType/Tree/MemberTypeTreeControllerBase.cs | 2 +- .../Controllers/MemberType/UpdateMemberTypeController.cs | 3 +++ .../BackOfficeAuthPolicyBuilderExtensions.cs | 1 + src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs | 1 + 11 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/AvailableCompositionMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/AvailableCompositionMemberTypeController.cs index 277ef4c4f304..a43e662b76c9 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/AvailableCompositionMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/AvailableCompositionMemberTypeController.cs @@ -1,14 +1,17 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.ViewModels.MemberType; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services.ContentTypeEditing; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class AvailableCompositionMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeEditingService _memberTypeEditingService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CompositionReferenceMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CompositionReferenceMemberTypeController.cs index 55df93ef6303..c20037319a8a 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CompositionReferenceMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CompositionReferenceMemberTypeController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.ViewModels.MemberType; @@ -6,10 +7,12 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class CompositionReferenceMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeService _memberTypeService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ConfigurationMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ConfigurationMemberTypeController.cs index 141dbd80ee9e..2dacf50fef45 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ConfigurationMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/ConfigurationMemberTypeController.cs @@ -9,6 +9,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class ConfigurationMemberTypeController : MemberTypeControllerBase { private readonly IConfigurationPresentationFactory _configurationPresentationFactory; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs index b19bfcd3ce86..e0d24d0973c7 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CopyMemberTypeController.cs @@ -1,14 +1,17 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class CopyMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeService _memberTypeService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CreateMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CreateMemberTypeController.cs index 2439118ac712..8ab82ecb07ae 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CreateMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/CreateMemberTypeController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Factories; @@ -9,10 +10,12 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services.ContentTypeEditing; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class CreateMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeEditingPresentationFactory _memberTypeEditingPresentationFactory; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/DeleteMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/DeleteMemberTypeController.cs index bb3e87e7bcb9..a79bb4c2a3ad 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/DeleteMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/DeleteMemberTypeController.cs @@ -1,13 +1,16 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class DeleteMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeService _memberTypeService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs index 73ad7b63748a..7b4395382d7b 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/MemberTypeControllerBase.cs @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [VersionedApiBackOfficeRoute(Constants.UdiEntityType.MemberType)] [ApiExplorerSettings(GroupName = "Member Type")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMembersOrMemberTypes)] public abstract class MemberTypeControllerBase : ManagementApiControllerBase { protected IActionResult OperationStatusResult(ContentTypeOperationStatus status) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs index d2ef0cf0e4d0..ef9e8db235e8 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/Tree/MemberTypeTreeControllerBase.cs @@ -13,7 +13,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.MemberType.Tree; [VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.MemberType}")] [ApiExplorerSettings(GroupName = "Member Type")] -[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMembersOrMemberTypes)] public class MemberTypeTreeControllerBase : NamedEntityTreeControllerBase { private readonly IMemberTypeService _memberTypeService; diff --git a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/UpdateMemberTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/UpdateMemberTypeController.cs index 2915662da335..f3be972803de 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/MemberType/UpdateMemberTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/MemberType/UpdateMemberTypeController.cs @@ -1,4 +1,5 @@ using Asp.Versioning; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Api.Management.Factories; @@ -10,10 +11,12 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.ContentTypeEditing; using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Web.Common.Authorization; namespace Umbraco.Cms.Api.Management.Controllers.MemberType; [ApiVersion("1.0")] +[Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] public class UpdateMemberTypeController : MemberTypeControllerBase { private readonly IMemberTypeEditingPresentationFactory _memberTypeEditingPresentationFactory; diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs index 1cc8a95197d8..c79e64e4f179 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/BackOfficeAuthPolicyBuilderExtensions.cs @@ -87,6 +87,7 @@ void AddAllowedApplicationsPolicy(string policyName, params string[] allowedClai AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessMediaOrMediaTypes, Constants.Applications.Media, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessMemberGroups, Constants.Applications.Members); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessMemberTypes, Constants.Applications.Settings); + AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessMembersOrMemberTypes, Constants.Applications.Settings, Constants.Applications.Members); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessPartialViews, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessRelationTypes, Constants.Applications.Settings); AddAllowedApplicationsPolicy(AuthorizationPolicies.TreeAccessScripts, Constants.Applications.Settings); diff --git a/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs b/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs index fd811161c7c5..b27f4a85b294 100644 --- a/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs +++ b/src/Umbraco.Web.Common/Authorization/AuthorizationPolicies.cs @@ -54,6 +54,7 @@ public static class AuthorizationPolicies public const string TreeAccessDictionaryOrTemplates = nameof(TreeAccessDictionaryOrTemplates); public const string TreeAccessDocumentOrMediaOrContentTypes = nameof(TreeAccessDocumentOrMediaOrContentTypes); public const string TreeAccessStylesheetsOrDocumentOrMediaOrMember = nameof(TreeAccessStylesheetsOrDocumentOrMediaOrMember); + public const string TreeAccessMembersOrMemberTypes = nameof(TreeAccessMembersOrMemberTypes); // other public const string DictionaryPermissionByResource = nameof(DictionaryPermissionByResource); From d7b98a2f00c82b95dd50e5e35160b8929e7dc3b6 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 11 Nov 2024 09:47:07 +0100 Subject: [PATCH 081/167] Use catch all for urls what ends with a path (#17468) (cherry picked from commit 3c0f7a03bae492899e3dab8965726a3e58c4b790) --- .../Controllers/PartialView/ByPathPartialViewController.cs | 2 +- .../Controllers/PartialView/DeletePartialViewController.cs | 2 +- .../PartialView/Folder/ByPathPartialViewFolderController.cs | 2 +- .../PartialView/Folder/DeletePartialViewFolderController.cs | 2 +- .../Controllers/PartialView/UpdatePartialViewController.cs | 2 +- .../Controllers/Script/ByPathScriptController.cs | 2 +- .../Controllers/Script/DeleteScriptController.cs | 2 +- .../Controllers/Script/Folder/ByPathScriptFolderController.cs | 2 +- .../Controllers/Script/Folder/DeleteScriptFolderController.cs | 2 +- .../Controllers/Script/UpdateScriptController.cs | 2 +- .../Controllers/Stylesheet/ByPathStylesheetController.cs | 2 +- .../Controllers/Stylesheet/DeleteStylesheetController.cs | 2 +- .../Stylesheet/Folder/ByPathStylesheetFolderController.cs | 2 +- .../Stylesheet/Folder/DeleteStylesheetFolderController.cs | 2 +- .../Controllers/Stylesheet/UpdateStylesheetController.cs | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/ByPathPartialViewController.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/ByPathPartialViewController.cs index 3fdae52115db..bbf1dec98fcd 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/ByPathPartialViewController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/ByPathPartialViewController.cs @@ -23,7 +23,7 @@ public ByPathPartialViewController( _mapper = mapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PartialViewResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/DeletePartialViewController.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/DeletePartialViewController.cs index a72c8129b581..b44990b41e2c 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/DeletePartialViewController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/DeletePartialViewController.cs @@ -22,7 +22,7 @@ public DeletePartialViewController( _backOfficeSecurityAccessor = backOfficeSecurityAccessor; } - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/ByPathPartialViewFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/ByPathPartialViewFolderController.cs index df15c726b5e8..727f4d1d68d1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/ByPathPartialViewFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/ByPathPartialViewFolderController.cs @@ -22,7 +22,7 @@ public ByPathPartialViewFolderController(IPartialViewFolderService partialViewFo _mapper = mapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PartialViewFolderResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/DeletePartialViewFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/DeletePartialViewFolderController.cs index 121cb1dae7bc..41cf9548d58b 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/DeletePartialViewFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Folder/DeletePartialViewFolderController.cs @@ -15,7 +15,7 @@ public class DeletePartialViewFolderController : PartialViewFolderControllerBase public DeletePartialViewFolderController(IPartialViewFolderService partialViewFolderService) => _partialViewFolderService = partialViewFolderService; - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/UpdatePartialViewController.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/UpdatePartialViewController.cs index a935f87a8065..e460b0adf0ae 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/UpdatePartialViewController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/UpdatePartialViewController.cs @@ -29,7 +29,7 @@ public UpdatePartialViewController( _mapper = mapper; } - [HttpPut("{path}")] + [HttpPut("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/ByPathScriptController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/ByPathScriptController.cs index 67a3b605a70e..60c5fe644a19 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/ByPathScriptController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/ByPathScriptController.cs @@ -23,7 +23,7 @@ public ByPathScriptController( _mapper = mapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(ScriptResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/DeleteScriptController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/DeleteScriptController.cs index 74dc1554e814..94c2e0a1c0ed 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/DeleteScriptController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/DeleteScriptController.cs @@ -22,7 +22,7 @@ public DeleteScriptController( _backOfficeSecurityAccessor = backOfficeSecurityAccessor; } - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/ByPathScriptFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/ByPathScriptFolderController.cs index 84543bffe475..698c94f685a2 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/ByPathScriptFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/ByPathScriptFolderController.cs @@ -22,7 +22,7 @@ public ByPathScriptFolderController(IScriptFolderService scriptFolderService, IU _mapper = mapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(ScriptFolderResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/DeleteScriptFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/DeleteScriptFolderController.cs index b5fd5022b7d6..48d97e9b4b97 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/DeleteScriptFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/Folder/DeleteScriptFolderController.cs @@ -15,7 +15,7 @@ public class DeleteScriptFolderController : ScriptFolderControllerBase public DeleteScriptFolderController(IScriptFolderService scriptFolderService) => _scriptFolderService = scriptFolderService; - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/UpdateScriptController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/UpdateScriptController.cs index 87ff3502bafd..a18f82ebc861 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/UpdateScriptController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/UpdateScriptController.cs @@ -29,7 +29,7 @@ public UpdateScriptController( _backOfficeSecurityAccessor = backOfficeSecurityAccessor; } - [HttpPut("{path}")] + [HttpPut("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/ByPathStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/ByPathStylesheetController.cs index a7e3a6139f36..87aec60133e7 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/ByPathStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/ByPathStylesheetController.cs @@ -23,7 +23,7 @@ public ByPathStylesheetController( _umbracoMapper = umbracoMapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(StylesheetResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs index 3dcdb92bbd91..9996ddeae0e1 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/DeleteStylesheetController.cs @@ -25,7 +25,7 @@ public DeleteStylesheetController( _backOfficeSecurityAccessor = backOfficeSecurityAccessor; } - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/ByPathStylesheetFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/ByPathStylesheetFolderController.cs index d5d0cca84f0f..95c7d853abf4 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/ByPathStylesheetFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/ByPathStylesheetFolderController.cs @@ -24,7 +24,7 @@ public ByPathStylesheetFolderController(IStylesheetFolderService stylesheetFolde _mapper = mapper; } - [HttpGet("{path}")] + [HttpGet("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(StylesheetFolderResponseModel), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/DeleteStylesheetFolderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/DeleteStylesheetFolderController.cs index 38760b34e701..deb38f086594 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/DeleteStylesheetFolderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Folder/DeleteStylesheetFolderController.cs @@ -15,7 +15,7 @@ public class DeleteStylesheetFolderController : StylesheetFolderControllerBase public DeleteStylesheetFolderController(IStylesheetFolderService stylesheetFolderService) => _stylesheetFolderService = stylesheetFolderService; - [HttpDelete("{path}")] + [HttpDelete("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs index 377fef87d1a2..7000ca7b402d 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/UpdateStylesheetController.cs @@ -32,7 +32,7 @@ public UpdateStylesheetController( _backOfficeSecurityAccessor = backOfficeSecurityAccessor; } - [HttpPut("{path}")] + [HttpPut("{*path}")] [MapToApiVersion("1.0")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] From 33eb4dd5a4e14502bd9c87f9a3a6df0b97ec2737 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:30:50 +0100 Subject: [PATCH 082/167] V14 QA updated playwright config (#17544) * Only run windows SQL Server * Updated timeout and retry count * Updated condition * Fixed indentation * Skipped --- build/azure-pipelines.yml | 14 ++++---- .../playwright.config.ts | 4 +-- .../Packages/CreatedPackages.spec.ts | 32 ++++++++++--------- .../Packages/InstalledPackages.spec.ts | 2 +- .../Packages/PackagesPackages.spec.ts | 2 +- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 752f18fd0db5..24c1ac4d1c9b 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -5,8 +5,8 @@ parameters: displayName: Run SQL Server Integration Tests type: boolean default: false - - name: sqlServerAcceptanceTests - displayName: Run SQL Server Acceptance Tests + - name: sqlServerLinuxAcceptanceTests + displayName: Run SQL Server Linux Acceptance Tests type: boolean default: false - name: myGetDeploy @@ -557,17 +557,17 @@ stages: - job: displayName: E2E Tests (SQL Server) - condition: eq(${{parameters.sqlServerAcceptanceTests}}, True) variables: # Connection string CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.SqlClient strategy: matrix: - Linux: - vmImage: 'ubuntu-latest' - SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD) - CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True' + ${{ if eq(parameters.sqlServerLinuxAcceptanceTests, True) }} : + Linux: + vmImage: 'ubuntu-latest' + SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD) + CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True' Windows: vmImage: 'windows-latest' pool: diff --git a/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts b/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts index c0b1d0710713..021c938d028e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/playwright.config.ts @@ -8,7 +8,7 @@ export const STORAGE_STATE = path.join(__dirname, 'playwright/.auth/user.json'); export default defineConfig({ testDir: './tests/', /* Maximum time one test can run for. */ - timeout: 40 * 1000, + timeout: 30 * 1000, expect: { /** * Maximum time expect() should wait for the condition to be met. @@ -19,7 +19,7 @@ export default defineConfig({ /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ - retries: process.env.CI ? 2 : 1, + retries: 1, // We don't want to run parallel, as tests might differ in state workers: 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts index 244aaa3f4bdd..0d9a1f3e2efe 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/CreatedPackages.spec.ts @@ -4,6 +4,8 @@ import * as fs from 'fs'; const packageName = 'TestPackage'; +// TODO: unskip tests when they work, currently we run into a weird issue when the playwright hits the Iframe of the package marketplace. + test.beforeEach(async ({umbracoApi, umbracoUi}) => { await umbracoApi.package.ensureNameNotExists(packageName); await umbracoUi.goToBackOffice(); @@ -15,7 +17,7 @@ test.afterEach(async ({umbracoApi}) => { await umbracoApi.package.ensureNameNotExists(packageName); }); -test('can create a empty package', {tag: '@smoke'}, async ({umbracoUi}) => { +test.skip('can create a empty package', {tag: '@smoke'}, async ({umbracoUi}) => { // Act await umbracoUi.package.clickCreatePackageButton(); await umbracoUi.package.enterPackageName(packageName); @@ -27,7 +29,7 @@ test('can create a empty package', {tag: '@smoke'}, async ({umbracoUi}) => { await umbracoUi.package.isPackageNameVisible(packageName); }); -test('can update package name', async ({umbracoApi, umbracoUi}) => { +test.skip('can update package name', async ({umbracoApi, umbracoUi}) => { // Arrange const wrongPackageName = 'WrongPackageName'; await umbracoApi.package.ensureNameNotExists(wrongPackageName); @@ -48,7 +50,7 @@ test('can update package name', async ({umbracoApi, umbracoUi}) => { expect(umbracoApi.package.doesNameExist(packageName)).toBeTruthy(); }); -test('can delete a package', async ({umbracoApi, umbracoUi}) => { +test.skip('can delete a package', async ({umbracoApi, umbracoUi}) => { // Arrange await umbracoApi.package.createEmptyPackage(packageName); await umbracoUi.reloadPage(); @@ -64,7 +66,7 @@ test('can delete a package', async ({umbracoApi, umbracoUi}) => { expect(await umbracoApi.package.doesNameExist(packageName)).toBeFalsy(); }); -test('can create a package with content', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with content', async ({umbracoApi, umbracoUi}) => { // Arrange const documentTypeName = 'TestDocumentType'; const documentName = 'TestDocument'; @@ -90,7 +92,7 @@ test('can create a package with content', async ({umbracoApi, umbracoUi}) => { await umbracoApi.documentType.ensureNameNotExists(documentTypeName); }); -test('can create a package with media', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with media', async ({umbracoApi, umbracoUi}) => { // Arrange const mediaName = 'TestMedia'; await umbracoApi.media.ensureNameNotExists(mediaName); @@ -114,7 +116,7 @@ test('can create a package with media', async ({umbracoApi, umbracoUi}) => { await umbracoApi.media.ensureNameNotExists(mediaName); }); -test('can create a package with document types', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with document types', async ({umbracoApi, umbracoUi}) => { // Arrange const documentTypeName = 'TestDocumentType'; await umbracoApi.documentType.ensureNameNotExists(documentTypeName); @@ -138,7 +140,7 @@ test('can create a package with document types', async ({umbracoApi, umbracoUi}) await umbracoApi.documentType.ensureNameNotExists(documentTypeName); }); -test('can create a package with media types', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with media types', async ({umbracoApi, umbracoUi}) => { // Arrange const mediaTypeName = 'TestMediaType'; await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); @@ -162,7 +164,7 @@ test('can create a package with media types', async ({umbracoApi, umbracoUi}) => await umbracoApi.mediaType.ensureNameNotExists(mediaTypeName); }); -test('can create a package with languages', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with languages', async ({umbracoApi, umbracoUi}) => { // Arrange await umbracoApi.language.ensureNameNotExists('Danish'); const languageId = await umbracoApi.language.createDanishLanguage(); @@ -187,7 +189,7 @@ test('can create a package with languages', async ({umbracoApi, umbracoUi}) => { await umbracoApi.language.ensureNameNotExists(languageName); }); -test('can create a package with dictionary', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with dictionary', async ({umbracoApi, umbracoUi}) => { // Arrange const dictionaryName = 'TestDictionary'; const dictionaryId = await umbracoApi.dictionary.createDefaultDictionary(dictionaryName); @@ -210,7 +212,7 @@ test('can create a package with dictionary', async ({umbracoApi, umbracoUi}) => await umbracoApi.dictionary.ensureNameNotExists(dictionaryName); }); -test('can create a package with data types', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with data types', async ({umbracoApi, umbracoUi}) => { // Arrange const dataTypeName = 'TestDataType'; await umbracoApi.dataType.ensureNameNotExists(dataTypeName); @@ -234,7 +236,7 @@ test('can create a package with data types', async ({umbracoApi, umbracoUi}) => await umbracoApi.dataType.ensureNameNotExists(dataTypeName); }); -test('can create a package with templates', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with templates', async ({umbracoApi, umbracoUi}) => { // Arrange const templateName = 'TestTemplate'; await umbracoApi.template.ensureNameNotExists(templateName); @@ -258,7 +260,7 @@ test('can create a package with templates', async ({umbracoApi, umbracoUi}) => { await umbracoApi.template.ensureNameNotExists(templateName); }); -test('can create a package with stylesheets', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with stylesheets', async ({umbracoApi, umbracoUi}) => { // Arrange const stylesheetName = 'TestStylesheet.css'; await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); @@ -282,7 +284,7 @@ test('can create a package with stylesheets', async ({umbracoApi, umbracoUi}) => await umbracoApi.stylesheet.ensureNameNotExists(stylesheetName); }); -test('can create a package with scripts', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with scripts', async ({umbracoApi, umbracoUi}) => { // Arrange const scriptName = 'TestScripts.js'; await umbracoApi.script.ensureNameNotExists(scriptName); @@ -306,7 +308,7 @@ test('can create a package with scripts', async ({umbracoApi, umbracoUi}) => { await umbracoApi.script.ensureNameNotExists(scriptName); }); -test('can create a package with partial views', async ({umbracoApi, umbracoUi}) => { +test.skip('can create a package with partial views', async ({umbracoApi, umbracoUi}) => { // Arrange const partialViewName = 'TestPartialView.cshtml'; const partialViewId = await umbracoApi.partialView.createDefaultPartialView(partialViewName); @@ -329,7 +331,7 @@ test('can create a package with partial views', async ({umbracoApi, umbracoUi}) await umbracoApi.partialView.ensureNameNotExists(partialViewName); }); -test('can download a package', async ({umbracoApi, umbracoUi}) => { +test.skip('can download a package', async ({umbracoApi, umbracoUi}) => { // Arrange const packageId = await umbracoApi.package.createEmptyPackage(packageName); await umbracoUi.reloadPage(); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts index 9164b496f5d9..fbd11c8cfd24 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/InstalledPackages.spec.ts @@ -1,6 +1,6 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -test('can see the umbraco package is installed', async ({umbracoUi}) => { +test.skip('can see the umbraco package is installed', async ({umbracoUi}) => { // Arrange await umbracoUi.goToBackOffice(); await umbracoUi.package.goToSection(ConstantHelper.sections.packages); diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts index 6d3c159e9599..eb33d7b20da9 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Packages/PackagesPackages.spec.ts @@ -1,6 +1,6 @@ import {ConstantHelper, test} from '@umbraco/playwright-testhelpers'; -test('can see the marketplace', async ({umbracoUi}) => { +test.skip('can see the marketplace', async ({umbracoUi}) => { // Arrange await umbracoUi.goToBackOffice(); await umbracoUi.package.goToSection(ConstantHelper.sections.packages); From e662468ecc0b0b862294eb02964cd9a0caccf5a8 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Fri, 15 Nov 2024 22:59:42 +0100 Subject: [PATCH 083/167] Set TinyMCE to readonly --- .../src/views/propertyeditors/rte/rte.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js index d499f47a9cc2..f2e6d78a771d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js @@ -276,7 +276,7 @@ // Readonly mode baseLineConfigObj.toolbar = vm.readonly ? false : baseLineConfigObj.toolbar; - baseLineConfigObj.readonly = vm.readonly ? 1 : baseLineConfigObj.readonly; + baseLineConfigObj.readonly = vm.readonly ? true : baseLineConfigObj.readonly; // We need to wait for DOM to have rendered before we can find the element by ID. $timeout(function () { From 1e9182cfa44ec1ed704454de0e1441013ada44d0 Mon Sep 17 00:00:00 2001 From: Mole Date: Tue, 19 Nov 2024 11:14:53 +0100 Subject: [PATCH 084/167] V14: Use decimal in slider property editor (#17568) * Allow SliderPropertyEditor to use decimals * Add tests * Boyscout unittest update --------- Co-authored-by: Sven Geusens --- .../PropertyEditors/SliderPropertyEditor.cs | 13 ++--- .../PropertyEditors/SliderValueEditorTests.cs | 47 ++++++++----------- 2 files changed, 27 insertions(+), 33 deletions(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/SliderPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/SliderPropertyEditor.cs index 832191567710..b67e4af0a2d2 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/SliderPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/SliderPropertyEditor.cs @@ -1,6 +1,7 @@ // Copyright (c) Umbraco. // See LICENSE for more details. +using System.Globalization; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Editors; @@ -51,8 +52,8 @@ public SliderPropertyValueEditor( public override object? ToEditor(IProperty property, string? culture = null, string? segment = null) { - // value is stored as a string - either a single integer value - // or a two integer values separated by comma (for range sliders) + // value is stored as a string - either a single decimal value + // or a two decimal values separated by comma (for range sliders) var value = property.GetValue(culture, segment); if (value is not string stringValue) { @@ -61,7 +62,7 @@ public SliderPropertyValueEditor( var parts = stringValue.Split(Constants.CharArrays.Comma); var parsed = parts - .Select(s => int.TryParse(s, out var i) ? i : (int?)null) + .Select(s => decimal.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var i) ? i : (decimal?)null) .Where(i => i != null) .Select(i => i!.Value) .ToArray(); @@ -78,11 +79,11 @@ public SliderPropertyValueEditor( internal class SliderRange { - public int From { get; set; } + public decimal From { get; set; } - public int To { get; set; } + public decimal To { get; set; } - public override string ToString() => From == To ? $"{From}" : $"{From},{To}"; + public override string ToString() => From == To ? $"{From.ToString(CultureInfo.InvariantCulture)}" : $"{From.ToString(CultureInfo.InvariantCulture)},{To.ToString(CultureInfo.InvariantCulture)}"; } } } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/SliderValueEditorTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/SliderValueEditorTests.cs index 0850422598f6..6ec212c02e49 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/SliderValueEditorTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/SliderValueEditorTests.cs @@ -6,7 +6,6 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Editors; using Umbraco.Cms.Core.PropertyEditors; -using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Serialization; @@ -15,19 +14,11 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.PropertyEditors; [TestFixture] public class SliderValueEditorTests { - // annoyingly we can't use decimals etc. in attributes, so we can't turn these into test cases :( - private List _invalidValues = new(); - - [SetUp] - public void SetUp() => _invalidValues = new List + public static object[] InvalidCaseData = new object[] { 123m, 123, -123, - 123.45d, - "123.45", - "1.234,56", - "1.2.3.4", "something", true, new object(), @@ -36,21 +27,19 @@ public class SliderValueEditorTests new GuidUdi(Constants.UdiEntityType.Document, Guid.NewGuid()) }; - [Test] - public void Can_Handle_Invalid_Values_From_Editor() + [TestCaseSource(nameof(InvalidCaseData))] + public void Can_Handle_Invalid_Values_From_Editor(object value) { - foreach (var value in _invalidValues) - { - var fromEditor = FromEditor(value); - Assert.IsNull(fromEditor, message: $"Failed for: {value}"); - } + var fromEditor = FromEditor(value); + Assert.IsNull(fromEditor); } [TestCase("1", 1)] [TestCase("0", 0)] [TestCase("-1", -1)] [TestCase("123456789", 123456789)] - public void Can_Parse_Single_Value_To_Editor(string value, int expected) + [TestCase("123.45", 123.45)] + public void Can_Parse_Single_Value_To_Editor(string value, decimal expected) { var toEditor = ToEditor(value) as SliderPropertyEditor.SliderPropertyValueEditor.SliderRange; Assert.IsNotNull(toEditor); @@ -62,7 +51,10 @@ public void Can_Parse_Single_Value_To_Editor(string value, int expected) [TestCase("0,0", 0, 0)] [TestCase("-1,-1", -1, -1)] [TestCase("10,123456789", 10, 123456789)] - public void Can_Parse_Range_Value_To_Editor(string value, int expectedFrom, int expectedTo) + [TestCase("1.234,56", 1.234, 56)] + [TestCase("4,6.234", 4, 6.234)] + [TestCase("10.45,15.3", 10.45, 15.3)] + public void Can_Parse_Range_Value_To_Editor(string value, decimal expectedFrom, decimal expectedTo) { var toEditor = ToEditor(value) as SliderPropertyEditor.SliderPropertyValueEditor.SliderRange; Assert.IsNotNull(toEditor); @@ -75,21 +67,22 @@ public void Can_Parse_Range_Value_To_Editor(string value, int expectedFrom, int [TestCase(0, 0, "0")] [TestCase(-10, -10, "-10")] [TestCase(10, 123456789, "10,123456789")] - public void Can_Parse_Valid_Value_From_Editor(int from, int to, string expectedResult) + [TestCase(1.5, 1.5, "1.5")] + [TestCase(0, 0.5, "0,0.5")] + [TestCase(5, 5.4, "5,5.4")] + [TestCase(0.5, 0.6, "0.5,0.6")] + public void Can_Parse_Valid_Value_From_Editor(decimal from, decimal to, string expectedResult) { var value = JsonNode.Parse($"{{\"from\": {from}, \"to\": {to}}}"); var fromEditor = FromEditor(value) as string; Assert.AreEqual(expectedResult, fromEditor); } - [Test] - public void Can_Handle_Invalid_Values_To_Editor() + [TestCaseSource(nameof(InvalidCaseData))] + public void Can_Handle_Invalid_Values_To_Editor(object value) { - foreach (var value in _invalidValues) - { - var toEditor = ToEditor(value); - Assert.IsNull(toEditor, message: $"Failed for: {value}"); - } + var toEditor = ToEditor(value); + Assert.IsNull(toEditor, message: $"Failed for: {value}"); } [Test] From 570005f5e1b4f7ce2d9b5c79787e0796d2c71c4b Mon Sep 17 00:00:00 2001 From: Mole Date: Wed, 20 Nov 2024 08:38:33 +0100 Subject: [PATCH 085/167] Run both cms and package migrations in upgrader (#17575) * Run both cms and package migrations in upgrader * Use correct setting --- .../Install/UnattendedUpgrader.cs | 139 ++++++++++++------ .../Runtime/RuntimeState.cs | 9 +- 2 files changed, 100 insertions(+), 48 deletions(-) diff --git a/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs b/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs index 8ad2b07b2310..9bf5c91eb81a 100644 --- a/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs +++ b/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs @@ -1,5 +1,9 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Configuration; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Exceptions; using Umbraco.Cms.Core.Logging; @@ -23,19 +27,39 @@ public class UnattendedUpgrader : INotificationAsyncHandler unattendedSettings) { _profilingLogger = profilingLogger ?? throw new ArgumentNullException(nameof(profilingLogger)); _umbracoVersion = umbracoVersion ?? throw new ArgumentNullException(nameof(umbracoVersion)); _databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder)); _runtimeState = runtimeState ?? throw new ArgumentNullException(nameof(runtimeState)); _packageMigrationRunner = packageMigrationRunner; + _unattendedSettings = unattendedSettings.Value; + } + + [Obsolete("Use constructor that takes IOptions, this will be removed in V16")] + public UnattendedUpgrader( + IProfilingLogger profilingLogger, + IUmbracoVersion umbracoVersion, + DatabaseBuilder databaseBuilder, + IRuntimeState runtimeState, + PackageMigrationRunner packageMigrationRunner) + : this( + profilingLogger, + umbracoVersion, + databaseBuilder, + runtimeState, + packageMigrationRunner, + StaticServiceProvider.Instance.GetRequiredService>()) + { } public Task HandleAsync(RuntimeUnattendedUpgradeNotification notification, CancellationToken cancellationToken) @@ -46,55 +70,26 @@ public Task HandleAsync(RuntimeUnattendedUpgradeNotification notification, Cance { case RuntimeLevelReason.UpgradeMigrations: { - var plan = new UmbracoPlan(_umbracoVersion); - using (!_profilingLogger.IsEnabled(Core.Logging.LogLevel.Verbose) ? null : _profilingLogger.TraceDuration( - "Starting unattended upgrade.", - "Unattended upgrade completed.")) - { - DatabaseBuilder.Result? result = _databaseBuilder.UpgradeSchemaAndData(plan); - if (result?.Success == false) - { - var innerException = new UnattendedInstallException( - "An error occurred while running the unattended upgrade.\n" + result.Message); - _runtimeState.Configure(RuntimeLevel.BootFailed, RuntimeLevelReason.BootFailedOnException, innerException); - } - - notification.UnattendedUpgradeResult = - RuntimeUnattendedUpgradeNotification.UpgradeResult.CoreUpgradeComplete; - } - } + RunUpgrade(notification); - break; - case RuntimeLevelReason.UpgradePackageMigrations: - { - if (!_runtimeState.StartupState.TryGetValue( - RuntimeState.PendingPackageMigrationsStateKey, - out var pm) - || pm is not IReadOnlyList pendingMigrations) + // If we errored out when upgrading don't do anything. + if (notification.UnattendedUpgradeResult is RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors) { - throw new InvalidOperationException( - $"The required key {RuntimeState.PendingPackageMigrationsStateKey} does not exist in startup state"); + return Task.CompletedTask; } - if (pendingMigrations.Count == 0) + // It's entirely possible that there's both a core upgrade and package migrations to run, so try and run package migrations too. + // but only if upgrade unattended is enabled. + if (_unattendedSettings.PackageMigrationsUnattended) { - throw new InvalidOperationException( - "No pending migrations found but the runtime level reason is " + - RuntimeLevelReason.UpgradePackageMigrations); + RunPackageMigrations(notification); } + } - try - { - _packageMigrationRunner.RunPackagePlans(pendingMigrations); - notification.UnattendedUpgradeResult = RuntimeUnattendedUpgradeNotification.UpgradeResult - .PackageMigrationComplete; - } - catch (Exception ex) - { - SetRuntimeError(ex); - notification.UnattendedUpgradeResult = - RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors; - } + break; + case RuntimeLevelReason.UpgradePackageMigrations: + { + RunPackageMigrations(notification); } break; @@ -106,6 +101,64 @@ public Task HandleAsync(RuntimeUnattendedUpgradeNotification notification, Cance return Task.CompletedTask; } + private void RunPackageMigrations(RuntimeUnattendedUpgradeNotification notification) + { + if (_runtimeState.StartupState.TryGetValue( + RuntimeState.PendingPackageMigrationsStateKey, + out var pm) is false + || pm is not IReadOnlyList pendingMigrations) + { + throw new InvalidOperationException( + $"The required key {RuntimeState.PendingPackageMigrationsStateKey} does not exist in startup state"); + } + + if (pendingMigrations.Count == 0) + { + // If we determined we needed to run package migrations but there are none, this is an error + if (_runtimeState.Reason is RuntimeLevelReason.UpgradePackageMigrations) + { + throw new InvalidOperationException( + "No pending migrations found but the runtime level reason is " + + RuntimeLevelReason.UpgradePackageMigrations); + } + + return; + } + + try + { + _packageMigrationRunner.RunPackagePlans(pendingMigrations); + notification.UnattendedUpgradeResult = RuntimeUnattendedUpgradeNotification.UpgradeResult + .PackageMigrationComplete; + } + catch (Exception ex) + { + SetRuntimeError(ex); + notification.UnattendedUpgradeResult = + RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors; + } + } + + private void RunUpgrade(RuntimeUnattendedUpgradeNotification notification) + { + var plan = new UmbracoPlan(_umbracoVersion); + using (!_profilingLogger.IsEnabled(Core.Logging.LogLevel.Verbose) ? null : _profilingLogger.TraceDuration( + "Starting unattended upgrade.", + "Unattended upgrade completed.")) + { + DatabaseBuilder.Result? result = _databaseBuilder.UpgradeSchemaAndData(plan); + if (result?.Success == false) + { + var innerException = new UnattendedInstallException( + "An error occurred while running the unattended upgrade.\n" + result.Message); + _runtimeState.Configure(RuntimeLevel.BootFailed, RuntimeLevelReason.BootFailedOnException, innerException); + } + + notification.UnattendedUpgradeResult = + RuntimeUnattendedUpgradeNotification.UpgradeResult.CoreUpgradeComplete; + } + } + private void SetRuntimeError(Exception exception) => _runtimeState.Configure( RuntimeLevel.BootFailed, diff --git a/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs index 53eecfc8d334..e353fa55b951 100644 --- a/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs +++ b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs @@ -325,18 +325,17 @@ private UmbracoDatabaseState GetUmbracoDatabaseState(IUmbracoDatabaseFactory dat // All will be prefixed with the same key. IReadOnlyDictionary? keyValues = database.GetFromKeyValueTable(Constants.Conventions.Migrations.KeyValuePrefix); - // This could need both an upgrade AND package migrations to execute but - // we will process them one at a time, first the upgrade, then the package migrations. + // This could need both an upgrade AND package migrations to execute, so always add any pending package migrations + IReadOnlyList packagesRequiringMigration = _packageMigrationState.GetPendingPackageMigrations(keyValues); + _startupState[PendingPackageMigrationsStateKey] = packagesRequiringMigration; + if (DoesUmbracoRequireUpgrade(keyValues)) { return UmbracoDatabaseState.NeedsUpgrade; } - IReadOnlyList packagesRequiringMigration = _packageMigrationState.GetPendingPackageMigrations(keyValues); if (packagesRequiringMigration.Count > 0) { - _startupState[PendingPackageMigrationsStateKey] = packagesRequiringMigration; - return UmbracoDatabaseState.NeedsPackageMigration; } } From ec8e10f406a6d9f993aa371f772ffa565f61e232 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Thu, 21 Nov 2024 08:53:59 +0100 Subject: [PATCH 086/167] Fix RTE console error when blocks are not available (#17582) --- .../src/views/propertyeditors/rte/rte.component.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js index f2e6d78a771d..4c552b19b5a4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js @@ -349,8 +349,8 @@ if(modelObject) { modelObject.update(vm.model.value.blocks, $scope); vm.tinyMceEditor.fire('updateBlocks'); + onLoaded(); } - onLoaded(); } function ensurePropertyValue(newVal) { From 9febbc7db189d297a2b6a2fc6cb695982c908ea7 Mon Sep 17 00:00:00 2001 From: Sven Geusens Date: Thu, 21 Nov 2024 09:07:22 +0100 Subject: [PATCH 087/167] Distinguish between default zero and intentional zero sort order for new documents (#17517) * Distinguish between default value and initial zero * Update special value comment documentation * Redid solution with dirty/new entity tracking * rework copy branch sortorder fix * Change == false to is false --------- Co-authored-by: Mole --- src/Umbraco.Core/Services/ContentService.cs | 3 +++ .../Persistence/Repositories/Implement/DocumentRepository.cs | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 8bdaba271ecf..59656de6b597 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -2760,6 +2760,9 @@ public bool RecycleBinSmells() descendantCopy.CreatorId = userId; descendantCopy.WriterId = userId; + // since the repository relies on the dirty state to figure out whether it needs to update the sort order, we mark it dirty here + descendantCopy.SortOrder = descendantCopy.SortOrder; + // save and flush (see above) _documentRepository.Save(descendantCopy); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs index 3951ffba6928..90c12c994aa0 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/DocumentRepository.cs @@ -900,9 +900,10 @@ protected override void PersistNewItem(IContent entity) NodeDto parent = GetParentNodeDto(entity.ParentId); var level = parent.Level + 1; - var sortOrderExists = SortorderExists(entity.ParentId, entity.SortOrder); + var calculateSortOrder = (entity is { HasIdentity: false, SortOrder: 0 } && entity.IsPropertyDirty(nameof(entity.SortOrder)) is false) // SortOrder was not updated from it's default value + || SortorderExists(entity.ParentId, entity.SortOrder); // if the sortorder of the entity already exists get a new one, else use the sortOrder of the entity - var sortOrder = sortOrderExists ? GetNewChildSortOrder(entity.ParentId, 0) : entity.SortOrder; + var sortOrder = calculateSortOrder ? GetNewChildSortOrder(entity.ParentId, 0) : entity.SortOrder; // persist the node dto NodeDto nodeDto = dto.ContentDto.NodeDto; From c7014e159b93a177b19077cdedcddee93faf180b Mon Sep 17 00:00:00 2001 From: Matt Brailsford Date: Thu, 21 Nov 2024 16:19:48 +0100 Subject: [PATCH 088/167] Sort manifest file paths alphabetically (#14466) * Sort manifest file paths alphabetically * Update src/Umbraco.Infrastructure/Manifest/ManifestParser.cs Co-authored-by: Ronald Barendse --------- Co-authored-by: Ronald Barendse --- src/Umbraco.Infrastructure/Manifest/ManifestParser.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Manifest/ManifestParser.cs b/src/Umbraco.Infrastructure/Manifest/ManifestParser.cs index 4dbd6abd4066..f43f6852a62b 100644 --- a/src/Umbraco.Infrastructure/Manifest/ManifestParser.cs +++ b/src/Umbraco.Infrastructure/Manifest/ManifestParser.cs @@ -250,6 +250,11 @@ private IEnumerable GetManifestFiles() return Array.Empty(); } - return Directory.GetFiles(_path, "package.manifest", SearchOption.AllDirectories); + var files = Directory.GetFiles(_path, "package.manifest", SearchOption.AllDirectories); + + // Ensure a consistent, alphabetical sorting of paths, because this is not guaranteed to be the same between file systems or OSes + Array.Sort(files); + + return files; } } From cbd4dc6e0dca40d5acde47fc43b280a3c1e3a9c5 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Fri, 22 Nov 2024 09:06:10 +0100 Subject: [PATCH 089/167] Handle "all slashes" routes (#17596) --- src/Umbraco.Core/Routing/UriUtility.cs | 6 ++++++ .../Umbraco.Core/Routing/UriUtilityTests.cs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/Umbraco.Core/Routing/UriUtility.cs b/src/Umbraco.Core/Routing/UriUtility.cs index fb59ada249be..1869641fb5aa 100644 --- a/src/Umbraco.Core/Routing/UriUtility.cs +++ b/src/Umbraco.Core/Routing/UriUtility.cs @@ -111,6 +111,12 @@ public Uri UriToUmbraco(Uri uri) if (path != "/") { path = path.TrimEnd(Constants.CharArrays.ForwardSlash); + + // perform fallback to root if the path was all slashes (i.e. https://some.where//////) + if (path == string.Empty) + { + path = "/"; + } } return uri.Rewrite(path); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UriUtilityTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UriUtilityTests.cs index 906ee0e80834..6f0c00f8db79 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UriUtilityTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UriUtilityTests.cs @@ -23,7 +23,9 @@ public class UriUtilityTests // test that the trailing slash goes but not on hostname [TestCase("http://LocalHost/", "http://localhost/")] + [TestCase("http://LocalHost/////", "http://localhost/")] [TestCase("http://LocalHost/Home/", "http://localhost/home")] + [TestCase("http://LocalHost/Home/////", "http://localhost/home")] [TestCase("http://LocalHost/Home/?x=y", "http://localhost/home?x=y")] [TestCase("http://LocalHost/Home/Sub1/", "http://localhost/home/sub1")] [TestCase("http://LocalHost/Home/Sub1/?x=y", "http://localhost/home/sub1?x=y")] From 4a19d899ddc969dd163413a9300d0eb0b7fdb33a Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:30:43 +0100 Subject: [PATCH 090/167] V15: Update navigation references in Partial Views (#17613) * Inject and pass-in parameters to use the respective PublishedContentExtensions methods * Fix view comments * Other fixes --- .../EmbeddedResources/Snippets/Breadcrumb.cshtml | 9 ++++++--- .../Snippets/ListAncestorsFromCurrentPage.cshtml | 9 ++++++--- .../Snippets/ListChildPagesFromCurrentPage.cshtml | 9 ++++++--- .../Snippets/ListChildPagesOrderedByDate.cshtml | 9 ++++++--- .../Snippets/ListChildPagesOrderedByName.cshtml | 11 +++++++---- .../Snippets/ListChildPagesWithDoctype.cshtml | 8 +++++--- .../EmbeddedResources/Snippets/Navigation.cshtml | 9 ++++++--- .../EmbeddedResources/Snippets/SiteMap.cshtml | 6 +++--- .../Services/Importing/StandardMvc-Package.xml | 6 +++--- 9 files changed, 48 insertions(+), 28 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/Breadcrumb.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/Breadcrumb.cshtml index 612c80948779..e609ac7c684a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/Breadcrumb.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/Breadcrumb.cshtml @@ -1,16 +1,19 @@ +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedUrlProvider PublishedUrlProvider @* This snippet makes a breadcrumb of parents using an unordered HTML list. How it works: - - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back + - It uses the Ancestors method to get all parents and then generates links so the visitor can go back - Finally it outputs the name of the current page (without a link) *@ -@{ var selection = Model?.Content.Ancestors().ToArray(); } +@{ var selection = Model?.Content.Ancestors(PublishedContentCache, DocumentNavigationQueryService).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/ListAncestorsFromCurrentPage.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/ListAncestorsFromCurrentPage.cshtml index a0056976666d..1ab6c7fb1d08 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/ListAncestorsFromCurrentPage.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/ListAncestorsFromCurrentPage.cshtml @@ -1,16 +1,19 @@ +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedUrlProvider PublishedUrlProvider @* This snippet makes a list of links to the of parents of the current page using an unordered HTML list. How it works: - - It uses the Ancestors() method to get all parents and then generates links so the visitor can go back + - It uses the Ancestors method to get all parents and then generates links so the visitor can go back - Finally it outputs the name of the current page (without a link) *@ -@{ var selection = Model?.Content.Ancestors().ToArray(); } +@{ var selection = Model?.Content.Ancestors(PublishedContentCache, DocumentNavigationQueryService).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesFromCurrentPage.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesFromCurrentPage.cshtml index 2a88e4766047..39cd12665b51 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesFromCurrentPage.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesFromCurrentPage.cshtml @@ -1,8 +1,11 @@ -@using Umbraco.Cms.Core @using Umbraco.Cms.Core.Models.PublishedContent +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IVariationContextAccessor VariationContextAccessor +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedValueFallback PublishedValueFallback @inject IPublishedUrlProvider PublishedUrlProvider @* @@ -13,7 +16,7 @@ - It then generates links so the visitor can go to each page *@ -@{ var selection = Model?.Content.Children.Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } +@{ var selection = Model?.Content.Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService).Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByDate.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByDate.cshtml index 168e9b63acf0..9b6796096ca2 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByDate.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByDate.cshtml @@ -1,8 +1,11 @@ -@using Umbraco.Cms.Core @using Umbraco.Cms.Core.Models.PublishedContent +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IVariationContextAccessor VariationContextAccessor +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedValueFallback PublishedValueFallback @inject IPublishedUrlProvider PublishedUrlProvider @* @@ -14,7 +17,7 @@ - It then generates links so the visitor can go to each page *@ -@{ var selection = Model?.Content.Children.Where(x => x.IsVisible(PublishedValueFallback)).OrderByDescending(x => x.CreateDate).ToArray(); } +@{ var selection = Model?.Content.Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService).Where(x => x.IsVisible(PublishedValueFallback)).OrderByDescending(x => x.CreateDate).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByName.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByName.cshtml index aed9085a76de..575ecae74d3c 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByName.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesOrderedByName.cshtml @@ -1,8 +1,11 @@ -@using Umbraco.Cms.Core @using Umbraco.Cms.Core.Models.PublishedContent +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IVariationContextAccessor VariationContextAccessor +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedValueFallback PublishedValueFallback @inject IPublishedUrlProvider PublishedUrlProvider @* @@ -14,14 +17,14 @@ - It then generates links so the visitor can go to each page *@ -@{ var selection = Model?.Content.Children.Where(x => x.IsVisible(PublishedValueFallback)).OrderBy(x => x.Name).ToArray(); } +@{ var selection = Model?.Content.Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService).Where(x => x.IsVisible(PublishedValueFallback)).OrderBy(x => x.Name).ToArray(); } @if (selection?.Length > 0) { } diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesWithDoctype.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesWithDoctype.cshtml index 95a65d0af902..9b7b24abc000 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesWithDoctype.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/ListChildPagesWithDoctype.cshtml @@ -1,9 +1,11 @@ -@using Umbraco.Cms.Core @using Umbraco.Cms.Core.Models.PublishedContent +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @inject IVariationContextAccessor VariationContextAccessor +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedValueFallback PublishedValueFallback @inject IPublishedUrlProvider PublishedUrlProvider @* @@ -13,7 +15,7 @@ (You can find the alias of your Document Type by editing it in the Settings section) *@ -@{ var selection = Model?.Content.Children(VariationContextAccessor).Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } +@{ var selection = Model?.Content.Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService).Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/Navigation.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/Navigation.cshtml index 75397076702e..3b737ad9b616 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/Navigation.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/Navigation.cshtml @@ -1,8 +1,11 @@ -@using Umbraco.Cms.Core @using Umbraco.Cms.Core.Models.PublishedContent +@using Umbraco.Cms.Core.PublishedCache @using Umbraco.Cms.Core.Routing -@using Umbraco.Extensions +@using Umbraco.Cms.Core.Services.Navigation @inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage +@inject IVariationContextAccessor VariationContextAccessor +@inject IPublishedContentCache PublishedContentCache +@inject IDocumentNavigationQueryService DocumentNavigationQueryService @inject IPublishedValueFallback PublishedValueFallback @inject IPublishedUrlProvider PublishedUrlProvider @* @@ -11,7 +14,7 @@ It also highlights the current active page/section in the navigation with the CSS class "current". *@ -@{ var selection = Model?.Content.Root().Children.Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } +@{ var selection = Model?.Content.Root(PublishedContentCache, DocumentNavigationQueryService).Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService).Where(x => x.IsVisible(PublishedValueFallback)).ToArray(); } @if (selection?.Length > 0) { diff --git a/src/Umbraco.Core/EmbeddedResources/Snippets/SiteMap.cshtml b/src/Umbraco.Core/EmbeddedResources/Snippets/SiteMap.cshtml index 20b31b6dcbf8..9f2c1c419382 100644 --- a/src/Umbraco.Core/EmbeddedResources/Snippets/SiteMap.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/Snippets/SiteMap.cshtml @@ -17,7 +17,7 @@ - It uses a local method called Traverse() to select and display the markup and links. *@ -@{ var selection = Model?.Content.Root(); } +@{ var selection = Model?.Content.Root(PublishedContentCache, DocumentNavigationQueryService); }
@* Render the sitemap by passing the root node to the traverse method, below *@ @@ -26,13 +26,13 @@ @* Helper method to traverse through all descendants *@ @{ - void Traverse(IPublishedContent? node) + void Traverse(IPublishedContent node) { //Update the level to reflect how deep you want the sitemap to go const int maxLevelForSitemap = 4; @* Select visible children *@ - var selection = node? + var selection = node .Children(VariationContextAccessor, PublishedContentCache, DocumentNavigationQueryService) .Where(x => x.IsVisible(PublishedValueFallback) && x.Level <= maxLevelForSitemap) .ToArray(); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml index 5bba7cfa4ec5..f3780e1df80f 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml @@ -927,7 +927,7 @@ /* This is your basic query to select the nodes you want */ - var nodes = Model.Content.Children.Where(x => x.DocumentTypeAlias == "NewsArticle").OrderBy(x=>x.CreateDate); + var nodes = Model.Content.Children().Where(x => x.DocumentTypeAlias == "NewsArticle").OrderBy(x=>x.CreateDate); int totalNodes = nodes.Count(); int totalPages = (int)Math.Ceiling((double)totalNodes / (double)pageSize); @@ -1023,7 +1023,7 @@ x.IsVisible() && x.TemplateId > 0 && Umbraco.MemberHasAccess(x.Id, x.Path)); + var pages = Model.Content.Children().Where(x => x.IsVisible() && x.TemplateId > 0 && Umbraco.MemberHasAccess(x.Id, x.Path)); }
@@ -1347,7 +1347,7 @@ @helper traverse(IPublishedContent node) { - var cc = node.Children.Where(x=>x.IsVisible() && x.TemplateId > 0); + var cc = node.Children().Where(x=>x.IsVisible() && x.TemplateId > 0); if (cc.Count()>0) {
    From ef470ed7577c62dad1ed5cf864b764c33a83bc58 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 25 Nov 2024 13:17:43 +0100 Subject: [PATCH 091/167] Fix: bump uui version (#17626) --- src/Umbraco.Web.UI.Client/package-lock.json | 954 ++++++++++---------- src/Umbraco.Web.UI.Client/package.json | 4 +- 2 files changed, 479 insertions(+), 479 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 8423f3ccb5eb..4d4a13cc8b01 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -29,8 +29,8 @@ "@types/diff": "^5.2.1", "@types/dompurify": "^3.0.5", "@types/uuid": "^10.0.0", - "@umbraco-ui/uui": "^1.12.0", - "@umbraco-ui/uui-css": "^1.12.0", + "@umbraco-ui/uui": "^1.12.1", + "@umbraco-ui/uui-css": "^1.12.1", "base64-js": "^1.5.1", "diff": "^5.2.0", "dompurify": "^3.1.6", @@ -4444,814 +4444,814 @@ "link": true }, "node_modules/@umbraco-ui/uui": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.12.0.tgz", - "integrity": "sha512-MZ2OrOSlYlF02x6BHqMFRH2Awkk92nf+LLdLqixaWtsEmYdP8V3/T3Ytpshwy7f5RHmzuhPRsSux7rWmMKU3yA==", - "dependencies": { - "@umbraco-ui/uui-action-bar": "1.12.0", - "@umbraco-ui/uui-avatar": "1.12.0", - "@umbraco-ui/uui-avatar-group": "1.12.0", - "@umbraco-ui/uui-badge": "1.12.0", - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-boolean-input": "1.12.0", - "@umbraco-ui/uui-box": "1.12.0", - "@umbraco-ui/uui-breadcrumbs": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-button-group": "1.12.0", - "@umbraco-ui/uui-button-inline-create": "1.12.0", - "@umbraco-ui/uui-card": "1.12.0", - "@umbraco-ui/uui-card-block-type": "1.12.0", - "@umbraco-ui/uui-card-content-node": "1.12.0", - "@umbraco-ui/uui-card-media": "1.12.0", - "@umbraco-ui/uui-card-user": "1.12.0", - "@umbraco-ui/uui-caret": "1.12.0", - "@umbraco-ui/uui-checkbox": "1.12.0", - "@umbraco-ui/uui-color-area": "1.12.0", - "@umbraco-ui/uui-color-picker": "1.12.0", - "@umbraco-ui/uui-color-slider": "1.12.0", - "@umbraco-ui/uui-color-swatch": "1.12.0", - "@umbraco-ui/uui-color-swatches": "1.12.0", - "@umbraco-ui/uui-combobox": "1.12.0", - "@umbraco-ui/uui-combobox-list": "1.12.0", - "@umbraco-ui/uui-css": "1.12.0", - "@umbraco-ui/uui-dialog": "1.12.0", - "@umbraco-ui/uui-dialog-layout": "1.12.0", - "@umbraco-ui/uui-file-dropzone": "1.12.0", - "@umbraco-ui/uui-file-preview": "1.12.0", - "@umbraco-ui/uui-form": "1.12.0", - "@umbraco-ui/uui-form-layout-item": "1.12.0", - "@umbraco-ui/uui-form-validation-message": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-icon-registry": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0", - "@umbraco-ui/uui-input": "1.12.0", - "@umbraco-ui/uui-input-file": "1.12.0", - "@umbraco-ui/uui-input-lock": "1.12.0", - "@umbraco-ui/uui-input-password": "1.12.0", - "@umbraco-ui/uui-keyboard-shortcut": "1.12.0", - "@umbraco-ui/uui-label": "1.12.0", - "@umbraco-ui/uui-loader": "1.12.0", - "@umbraco-ui/uui-loader-bar": "1.12.0", - "@umbraco-ui/uui-loader-circle": "1.12.0", - "@umbraco-ui/uui-menu-item": "1.12.0", - "@umbraco-ui/uui-modal": "1.12.0", - "@umbraco-ui/uui-pagination": "1.12.0", - "@umbraco-ui/uui-popover": "1.12.0", - "@umbraco-ui/uui-popover-container": "1.12.0", - "@umbraco-ui/uui-progress-bar": "1.12.0", - "@umbraco-ui/uui-radio": "1.12.0", - "@umbraco-ui/uui-range-slider": "1.12.0", - "@umbraco-ui/uui-ref": "1.12.0", - "@umbraco-ui/uui-ref-list": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0", - "@umbraco-ui/uui-ref-node-data-type": "1.12.0", - "@umbraco-ui/uui-ref-node-document-type": "1.12.0", - "@umbraco-ui/uui-ref-node-form": "1.12.0", - "@umbraco-ui/uui-ref-node-member": "1.12.0", - "@umbraco-ui/uui-ref-node-package": "1.12.0", - "@umbraco-ui/uui-ref-node-user": "1.12.0", - "@umbraco-ui/uui-scroll-container": "1.12.0", - "@umbraco-ui/uui-select": "1.12.0", - "@umbraco-ui/uui-slider": "1.12.0", - "@umbraco-ui/uui-symbol-expand": "1.12.0", - "@umbraco-ui/uui-symbol-file": "1.12.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.12.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.12.0", - "@umbraco-ui/uui-symbol-folder": "1.12.0", - "@umbraco-ui/uui-symbol-lock": "1.12.0", - "@umbraco-ui/uui-symbol-more": "1.12.0", - "@umbraco-ui/uui-symbol-sort": "1.12.0", - "@umbraco-ui/uui-table": "1.12.0", - "@umbraco-ui/uui-tabs": "1.12.0", - "@umbraco-ui/uui-tag": "1.12.0", - "@umbraco-ui/uui-textarea": "1.12.0", - "@umbraco-ui/uui-toast-notification": "1.12.0", - "@umbraco-ui/uui-toast-notification-container": "1.12.0", - "@umbraco-ui/uui-toast-notification-layout": "1.12.0", - "@umbraco-ui/uui-toggle": "1.12.0", - "@umbraco-ui/uui-visually-hidden": "1.12.0" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.12.1.tgz", + "integrity": "sha512-wNx+ibT98rH8RxBBDfe3Y5YjClpxunTovuyTaY3BU6uVmC8UfxaW7qSggyeSvl+vthk30gg8u7pxzCuuv88xYw==", + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.12.1", + "@umbraco-ui/uui-avatar": "1.12.1", + "@umbraco-ui/uui-avatar-group": "1.12.1", + "@umbraco-ui/uui-badge": "1.12.1", + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-boolean-input": "1.12.1", + "@umbraco-ui/uui-box": "1.12.1", + "@umbraco-ui/uui-breadcrumbs": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-button-group": "1.12.1", + "@umbraco-ui/uui-button-inline-create": "1.12.1", + "@umbraco-ui/uui-card": "1.12.1", + "@umbraco-ui/uui-card-block-type": "1.12.1", + "@umbraco-ui/uui-card-content-node": "1.12.1", + "@umbraco-ui/uui-card-media": "1.12.1", + "@umbraco-ui/uui-card-user": "1.12.1", + "@umbraco-ui/uui-caret": "1.12.1", + "@umbraco-ui/uui-checkbox": "1.12.1", + "@umbraco-ui/uui-color-area": "1.12.1", + "@umbraco-ui/uui-color-picker": "1.12.1", + "@umbraco-ui/uui-color-slider": "1.12.1", + "@umbraco-ui/uui-color-swatch": "1.12.1", + "@umbraco-ui/uui-color-swatches": "1.12.1", + "@umbraco-ui/uui-combobox": "1.12.1", + "@umbraco-ui/uui-combobox-list": "1.12.1", + "@umbraco-ui/uui-css": "1.12.1", + "@umbraco-ui/uui-dialog": "1.12.1", + "@umbraco-ui/uui-dialog-layout": "1.12.1", + "@umbraco-ui/uui-file-dropzone": "1.12.1", + "@umbraco-ui/uui-file-preview": "1.12.1", + "@umbraco-ui/uui-form": "1.12.1", + "@umbraco-ui/uui-form-layout-item": "1.12.1", + "@umbraco-ui/uui-form-validation-message": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-icon-registry": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1", + "@umbraco-ui/uui-input": "1.12.1", + "@umbraco-ui/uui-input-file": "1.12.1", + "@umbraco-ui/uui-input-lock": "1.12.1", + "@umbraco-ui/uui-input-password": "1.12.1", + "@umbraco-ui/uui-keyboard-shortcut": "1.12.1", + "@umbraco-ui/uui-label": "1.12.1", + "@umbraco-ui/uui-loader": "1.12.1", + "@umbraco-ui/uui-loader-bar": "1.12.1", + "@umbraco-ui/uui-loader-circle": "1.12.1", + "@umbraco-ui/uui-menu-item": "1.12.1", + "@umbraco-ui/uui-modal": "1.12.1", + "@umbraco-ui/uui-pagination": "1.12.1", + "@umbraco-ui/uui-popover": "1.12.1", + "@umbraco-ui/uui-popover-container": "1.12.1", + "@umbraco-ui/uui-progress-bar": "1.12.1", + "@umbraco-ui/uui-radio": "1.12.1", + "@umbraco-ui/uui-range-slider": "1.12.1", + "@umbraco-ui/uui-ref": "1.12.1", + "@umbraco-ui/uui-ref-list": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1", + "@umbraco-ui/uui-ref-node-data-type": "1.12.1", + "@umbraco-ui/uui-ref-node-document-type": "1.12.1", + "@umbraco-ui/uui-ref-node-form": "1.12.1", + "@umbraco-ui/uui-ref-node-member": "1.12.1", + "@umbraco-ui/uui-ref-node-package": "1.12.1", + "@umbraco-ui/uui-ref-node-user": "1.12.1", + "@umbraco-ui/uui-scroll-container": "1.12.1", + "@umbraco-ui/uui-select": "1.12.1", + "@umbraco-ui/uui-slider": "1.12.1", + "@umbraco-ui/uui-symbol-expand": "1.12.1", + "@umbraco-ui/uui-symbol-file": "1.12.1", + "@umbraco-ui/uui-symbol-file-dropzone": "1.12.1", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.12.1", + "@umbraco-ui/uui-symbol-folder": "1.12.1", + "@umbraco-ui/uui-symbol-lock": "1.12.1", + "@umbraco-ui/uui-symbol-more": "1.12.1", + "@umbraco-ui/uui-symbol-sort": "1.12.1", + "@umbraco-ui/uui-table": "1.12.1", + "@umbraco-ui/uui-tabs": "1.12.1", + "@umbraco-ui/uui-tag": "1.12.1", + "@umbraco-ui/uui-textarea": "1.12.1", + "@umbraco-ui/uui-toast-notification": "1.12.1", + "@umbraco-ui/uui-toast-notification-container": "1.12.1", + "@umbraco-ui/uui-toast-notification-layout": "1.12.1", + "@umbraco-ui/uui-toggle": "1.12.1", + "@umbraco-ui/uui-visually-hidden": "1.12.1" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.12.0.tgz", - "integrity": "sha512-ycCCwmq+J6KGTlc0lcQ50FUWuqXScuWHzq0AsPES9FO9WwSKMrZxhPq8JZj0SZ1fACvRpNlpIuST+00q4siiDw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.12.1.tgz", + "integrity": "sha512-MQBa8P8djO5SCy9BaAwHGHXBLe1MxEiGgAEln5FrkjAWJiV7x+9F8k/2MIuowmEJ/+6X38M9/bzDi3625TN7eA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button-group": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button-group": "1.12.1" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.12.0.tgz", - "integrity": "sha512-4dnsud55w37Su01kLRSsPZfvEaVFPHUiFoTTljhyF79fE8/9In0omM5uz9t51fuONMByavzJtlDlGAc0Jr2zoA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.12.1.tgz", + "integrity": "sha512-W3RW8pIwuhIiF/vy5GFdLQ3upmyT0nh/XD9yx0B7aOwZKYvNWo2pUAG0DeuK4Dw8NzyWew+jJx4rY+X49xDgEg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.12.0.tgz", - "integrity": "sha512-0I//OiHtQo5b1ztxhgDOUL5IA8QhF/fpxnCKaHA/iOR9EKVQ1twsvjoisqFmxyw/WjuEkNwcdlafA5+EKzFtsQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.12.1.tgz", + "integrity": "sha512-sRdXCtfy0h1U+OBljtDiBFzN41A7umnHQKrfgGdjXVVGLsNzxACROkenRKPNnfae/TVmfF39Bi0wBiTdJRE7Sw==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.12.0", - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-avatar": "1.12.1", + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-badge": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.12.0.tgz", - "integrity": "sha512-+1wEsHSvSkdXHUblBa1uhLw6hb55/5j/QKXMdjw2IgkKXSjG3MWmW4g5ZA2+5ilZIioln64dUg3WIGVLyEAEUQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.12.1.tgz", + "integrity": "sha512-LlffQ5M9019QyZSkYRUW2ju4ZWXsVhFvesbS+zJC/devVxNXejkEfUW/yeROVAwrGWMbqQWvy2NkdcEI8oSKwg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.12.0.tgz", - "integrity": "sha512-HqvuIDx3APuPdAvNFcO1uTK8B8ZDbEJUSX6IfiU//fBc6FDLHIhbG7ByR9iFaVDaxwiazEpM6txaWHFiu3Mk7Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.12.1.tgz", + "integrity": "sha512-0KMlkaiJxu9yIaMJPb/i16XkHkbiQYcDmflJ2BaGyZQyL1cZilyvsUofid31PsAFLHpUTOLAOWFsaB0lBHtu/Q==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.12.0.tgz", - "integrity": "sha512-PFWZK72itp2CJIweUNLldRKLwx51FZDTEM5VmkbPJSe7IDRQvOK7AlMHS3DL3gnjfYwVdpmXt43N8hK6vd1aCA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.12.1.tgz", + "integrity": "sha512-mqrRaWcpgHbx8ExiDcJs+ycyzKbTTRJb2drFK61jd1C4qIfwjOjWTng30ruDlNubwL2i8yryBHMMjsSPJ7xMNQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.12.0.tgz", - "integrity": "sha512-OZIiQPISjFIZsk6XBDoDakIiSAjfBn0T/ct/cwJyMzjVc6YlfrouByDx5+9/nzvQzUIKIhGtRIEftdDbCDzAYQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.12.1.tgz", + "integrity": "sha512-A5aD7qVCgc21lMHCr81Q9kvxyLBBwZTUesRj/D4yJCwD98bI9ZQan4Sy/q+JzHntJwzCkDLBou3SVWgJquSI3w==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-css": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-css": "1.12.1" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.12.0.tgz", - "integrity": "sha512-1KXKaSVAXCrpBdG8xwj11omrb5yQnWT342NDHET9ltC9tpHhNlbFxi4Lkz5OJXgI0oLkWJLTT2aFY0u7kd4wmA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.12.1.tgz", + "integrity": "sha512-dpEDnOVnOXXBFlHl9RUCXWZLFMgo641o1fUi5j27bCRRvfcflqu4/WmwmQcrqUPnKQntDgwzoQTa2Vj4MEL3Yw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-button": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.12.0.tgz", - "integrity": "sha512-Zi9VqPB073n5BsotQLbDeVfVVr72Yv2tP8Qy/xfZJQCzmW80g79hUukstzVMTkQ9SB0ubNIy8h+XfPA72OxK4w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.12.1.tgz", + "integrity": "sha512-S4DgX4AdT/vTwtXS8/ALQVn7MIfGhcyk0oEhnHWyB1eHKpOBMXU3q+GZUjoYZ33wHQvEh4pIJCGkTfBtzGLIKg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1" } }, "node_modules/@umbraco-ui/uui-button-group": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.12.0.tgz", - "integrity": "sha512-cdgLjnLWAXaKA4hih02Pw+hCDV/0kE8Pn5EUl6voeh1+47z/ugnRzT76Fz1B1UDmEDM8hvkSQblOzuJlgTwPng==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.12.1.tgz", + "integrity": "sha512-MMH9xju42Glee2htq2ZMAYgFZTksIs3aLLRusj9+l4Thiij8mkdoLVTCAWHPaEFEioy1AJyDxtemtcwayQHSJw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.12.0.tgz", - "integrity": "sha512-vOL+d90i1bM3d+DcI3rUSWibPMWWc0CNxpVx46UBhsX5C6yyUuyKre/nsybCJBwzgpqqxJvHMFquHGrjz2kBxQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.12.1.tgz", + "integrity": "sha512-T1ZcB87wUhg4dDJ8/zDctvyyuodqIBJlLgq7BgjrZCukfyO68mkI1jvRaixL5V/K0EFNUGvmTsSbfE5jA7OisA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.12.0.tgz", - "integrity": "sha512-TTRnVb1ayhDuk02XSPx8t0uMN8lnrT7ut/KxiAPmhQWbRPKTGXpt4FgYHsns9QvuV+8FQER6MRxBATNXWs1vXQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.12.1.tgz", + "integrity": "sha512-1+QnOF03qYAj6lTF6Ens9Q922x5kDx/P/Rp3nfEdduWVv+opuzPM9bjkoRBVfb2Udd8Kt2aNFujwX7H5r2oWJg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-card-block-type": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.12.0.tgz", - "integrity": "sha512-GPVGp/kv16o7hzT2FmVNd8Es0NjQ4GpYN+ni2BIYd2z4D2MOLgrVRmsfzJmve0SieVxWFG+ukW3VZ/6t/RZwNw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.12.1.tgz", + "integrity": "sha512-Tx5f3ucchl1+90KE+srWtz0iI/VR3nKa0mJxAZJElfwQ2yZF3flAFJB2V+aajjKEeBu67DK5Q+27yYo9mUn2gQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-card": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-card": "1.12.1" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.12.0.tgz", - "integrity": "sha512-poUGVfl3g2+QEw2M6wEmfpRZvVIZQAa/RoJbbBYV047rmQVerUOTiRwA5XjHQZvsuwo2kwoQ/+Sikazex2Q7Qw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.12.1.tgz", + "integrity": "sha512-TJjUkzXR+wko4sSl6FVgsOSqBahYSToIqgoKsg8oFU11d5F/MiylJ1aBg0IXR8IY0pZWjXvWDUWrSmbsmeHtlg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-card": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-card": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1" } }, "node_modules/@umbraco-ui/uui-card-media": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.12.0.tgz", - "integrity": "sha512-ila8l7jS2HsVJwN/m/H2xFnU7qParpf2RaJ5N3FMBRT9fOYWjUPDWoQRUGVTx9UCYza+pyADgFVimDKm8c61PQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.12.1.tgz", + "integrity": "sha512-Zi2H3mzOfjfczF97SPS3d2sp8YNNj7amq3F3tJZxT0UWN/RENzAoMfFniLnxxOja7wuIM2rxGLIkeDJB6U7/Iw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-card": "1.12.0", - "@umbraco-ui/uui-symbol-file": "1.12.0", - "@umbraco-ui/uui-symbol-folder": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-card": "1.12.1", + "@umbraco-ui/uui-symbol-file": "1.12.1", + "@umbraco-ui/uui-symbol-folder": "1.12.1" } }, "node_modules/@umbraco-ui/uui-card-user": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.12.0.tgz", - "integrity": "sha512-ZyYyGdXwt6Z/kWah5wntybiOTXCCZJsuqCmmS26sNr2F9Wi0GXGobEkAR5+deUKBYuGWVMkjqy1nSN2vIEg8bQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.12.1.tgz", + "integrity": "sha512-24r/t5y0nZwcMb6zJWKBXQ+PTtnoinyPTmbOAo+CBuR+E4K0fjO7VwGsKW2VndB0wzhEgLeEfN3X7MsQdAtkHg==", "dependencies": { - "@umbraco-ui/uui-avatar": "1.12.0", - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-card": "1.12.0" + "@umbraco-ui/uui-avatar": "1.12.1", + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-card": "1.12.1" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.12.0.tgz", - "integrity": "sha512-XfBjS4bgr+sduFkvbiTwfTuzpkF0Lh6hfhArvZztT3P8/6+seM1as6fvB1uLUZif8BjA0Iys+1oGaClgnnFvDw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.12.1.tgz", + "integrity": "sha512-arVHbjy549nnTNA85rOoDYsPo8cZH2vhW8i6cQo5wfYcYHJDIkSGP6/jEyMSGAXb8akCgN1CUdW1yg0T2K2bNg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.12.0.tgz", - "integrity": "sha512-VTsz42tgp5DtvinEEZMmc7z8Lv3S4nQybW7Rdh/1VUnZoIIyUH0MgA84vPoJaorl6PZM1O62cMWQMXTlbxzSSA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.12.1.tgz", + "integrity": "sha512-qCQJwAYI8wd1o4HzPkdCrZbsg1HwCk2lpf0tJHovgLeZ7wdJhszRS0DPk/KXHmbQNpTqtmDvjZWoJrcnxY7V3w==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-boolean-input": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-boolean-input": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1" } }, "node_modules/@umbraco-ui/uui-color-area": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.12.0.tgz", - "integrity": "sha512-qP1EXx4JpZyi7T2n5JmSsd/4jXfk06Lr6jSLoFMOD8KdHW1KCLXzscmLTHCtG25KILTi9Mxr3NcuV2pvF5gWEg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.12.1.tgz", + "integrity": "sha512-PTY/qseL3QfSqx/5LQg+QqO0hEAy0loH+lYpsHQxoBSoE7tIZmo923WjJ0UJA6rzBtfc7WYe9JRPeI0iLtEOCA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", + "@umbraco-ui/uui-base": "1.12.1", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.12.0.tgz", - "integrity": "sha512-B3Lt3xaY89bE1p8xH9dXUawamaE6bhELt9P2QdPDMj8wIMFzPOU8z3Lgv6BKLJH/TUR1QNRiRqlDSHdV1/dcHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.12.1.tgz", + "integrity": "sha512-BCf+1t53RYRzfJ5SVBtaPJGT+3a+96IV1mXjpbnzG13SW2ecAXQUwnK7VeEFScrY1wy2f4QWDIsL/wVkiLxSMw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-popover-container": "1.12.0", + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-popover-container": "1.12.1", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.12.0.tgz", - "integrity": "sha512-NNBPsDd4xpdg5UKFuD4LU165GueHeGb5d+07OAMArgYw1uKHo+G+yYRYj11tkT2nsnBvUurBVT6DT7J0ZMh6/Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.12.1.tgz", + "integrity": "sha512-cUY5lD3E+Jl41we0IlFIqpts65/BoXuVq03+o4cjr2Mn2VgOKekxMi2IpFYRnDhLDf0WHAv6yjfIO0S7dR8+sw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.12.0.tgz", - "integrity": "sha512-NCRncEYdDa/moUPUTRXEoBqwLxm7b5IFc14xjUKhGU0uNUDhBoh3RyjX5UQzdKXiuXwLAjFhB4ks7gXol0xfHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.12.1.tgz", + "integrity": "sha512-Zs0JgyolV5Dyo19lMQJDGxebi5Mv2eD7Ei8TnUUhs339SB3omHELpy47DRB2uknQFdZGa79hy63qfpwSvUkpBA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0", + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.12.0.tgz", - "integrity": "sha512-7WtDkNvCW5j/RorTGdlbRjhPHq4SeFQh1JGDhT8xh1IKnPPWXzx5T3WZKV0UEXVfhoDW8GyJ5Q6iM5ejJkKmEQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.12.1.tgz", + "integrity": "sha512-PzPKTiUCx1ngL6i2NyAbZ5ze3fDOa+OY2XV7rGCuYPA91820CwWVHquD0fB2WHEjohL8F31zOo3aNohYDJxsdg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-color-swatch": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-color-swatch": "1.12.1" } }, "node_modules/@umbraco-ui/uui-combobox": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.12.0.tgz", - "integrity": "sha512-0JSp7YWYqfyhjkMggpLYVHPmliX9b5xR4vZDOEf8w71QrzrPwJ86ExnID5Yg/n9t/b1Trc7YgNI4W34lw9dqFQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.12.1.tgz", + "integrity": "sha512-3tb4SXEjWDu23ZGNtdDeoJVtDdaOJ/VPv8Vvh9u/6Qpdfw5k8W2Wbl98fYYsuh7AYmKOHSO4aIE3WQRmqWwvlA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-combobox-list": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-popover-container": "1.12.0", - "@umbraco-ui/uui-scroll-container": "1.12.0", - "@umbraco-ui/uui-symbol-expand": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-combobox-list": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-popover-container": "1.12.1", + "@umbraco-ui/uui-scroll-container": "1.12.1", + "@umbraco-ui/uui-symbol-expand": "1.12.1" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.12.0.tgz", - "integrity": "sha512-PDk+6s7BTNo3rqWtmYV4whct0042xfQP/8ITzAkMHwkAdJEcBSDYsGRF5W4BKVRvs5g2x6sqqqLdZvUqykWoJw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.12.1.tgz", + "integrity": "sha512-WWVfmbT/ewlaO9qYePDiPWTtdEyd6gqMyEWEunu4WAEX2fLJ0496cMZtYVNrj7xqZUkpnDoP218fc4tdtMqKaA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-css": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.12.0.tgz", - "integrity": "sha512-n+rTyNZwhjxwAHShs5ZQGZ7k051Rr6UTawzVq1TCUQMDw1hDeXj8wGrKBjZJbM+DJrDsphgAnSL/TMgaLY03/A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.12.1.tgz", + "integrity": "sha512-cWdoJw3OjdZ5QUoXhUufp/8mdGkVJ4DiI7/NgPaU2GrMbo+c1Q2cx4ST2/K0Q7nY6qa4P4WCSLMoFGyFoOwLKQ==", "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.12.0.tgz", - "integrity": "sha512-0P56Xj+cpQJvWAmjdDhy+OekSOumYvHJmzJdjyupxWfDY15q6x1fTk4EISHdRCakBixMvgcvsu20DPTEg4RftA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.12.1.tgz", + "integrity": "sha512-ek16mmx4YSlsyTi+8VAmtsbY2Zg4503dAs1tIehtQhF8oqeKCB8iAILkvLghL94dhdcovRMXPU14PUR6Ex9Ugg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-css": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-css": "1.12.1" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.12.0.tgz", - "integrity": "sha512-ieLgK5lSCKVioQNccRtpBn3o/wXyuiaO5/Fga5gikZdKr+t87EmagNMuqBlglM3qdr8Kdz4yfH38xqFN0eLfYA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.12.1.tgz", + "integrity": "sha512-ZXI+TUbYxU9NDGwyxdLVaEzaYUyQV97UT3ZxRvrT5LT84ezdnmAy+C5gyvrcb4/tLTrINg/AnYR1GXq5b/FsRA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.12.0.tgz", - "integrity": "sha512-Y8IQTisERSca+2lsi8TB5Wct43CvpWQF98LDQMtERIwIGs20IVyHfmCTuhBvR6XHzHgmL3BCkLSe8OxFcVoGwA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.12.1.tgz", + "integrity": "sha512-gDOhW9GESI/2r+q9RlY5/1NLcsFA7FD63DFqVhTW64uywkhQ+/XE0sGcwvO74j1rQ+OJr85Mh1WnZEUpySdHlQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-symbol-file-dropzone": "1.12.1" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.12.0.tgz", - "integrity": "sha512-M+Y9vaiya9P6RAPsgPRS55Yqyl0A/KCFHunQlquXu9Yk/clrYIF6q4susyphJc1wBGABtIaPQNBpartqr5Y9wQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.12.1.tgz", + "integrity": "sha512-6I1WhmdJ0Y1IlhaHkCEiTPQZ8CwaJQT3NxspNSXCCg/tkjgiFdwIwWXNDOeRz4sIMdINuT9N63+DwURqOeRpdQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-symbol-file": "1.12.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.12.0", - "@umbraco-ui/uui-symbol-folder": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-symbol-file": "1.12.1", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.12.1", + "@umbraco-ui/uui-symbol-folder": "1.12.1" } }, "node_modules/@umbraco-ui/uui-form": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.12.0.tgz", - "integrity": "sha512-tATof2Opbb1iZ7pXDylmIM5VVTWoyaFebAEWLVU2EWa4XeVQIQTlLv4TXuMmle65rkgxBfI32xEOAde8cuTnrQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.12.1.tgz", + "integrity": "sha512-m9pRXUUFF0VsEKpJrFIbpjDEWea91+LhWKwP6UoZf71Ae3EXVJdmm7KcaDSAKeFHyIe9/HfoGJ03A6iUQUBmKA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.12.0.tgz", - "integrity": "sha512-NrnjP26Yyyrat+5lfaAGksN6YZlzAtbMNGhFhUVIBI7wgtPApF3qoOFfwlEM9Cf46JWfjP1Ib38vLeTPQG3CCg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.12.1.tgz", + "integrity": "sha512-JZYaX196VeC5nRad4xc0+IFTEp2+bAOT4NRp/J4NVqdeu6kxA6BHoxbkSX2umjGVGODceiIy6g2X6dZKircvMQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-form-validation-message": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-form-validation-message": "1.12.1" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.12.0.tgz", - "integrity": "sha512-bZghiBDkfOxXMOAElMqq3sL3a2JcBdzsTovQx7uXOgCW8QYNLFQKd/+q7R7wpsVZrf+OXzdVWZNJCV9pOcIv5Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.12.1.tgz", + "integrity": "sha512-iu8ZzQwqjTj6S4hKb/q8AkWz/GVOTpqFiYPZN/7SOa9Gc6eDfSCtHq/PgAIs+F/13b8iSthOsmcBucYwA6CMAA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.12.0.tgz", - "integrity": "sha512-/wG5gMnV1BDDACPjaBvn3gIBXFhL32J1yHFj10h4Mk54vqHZq8H4CNtHLJ1UrHXACFOiljGWMjxE/1zYZms1FA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.12.1.tgz", + "integrity": "sha512-1leD+vxIh6/9LaU8ZXUKy2BUutGTWm8gBeGkDT2oGpinhKAx0KlHd0wgH0Rlrj/Mg3jv98sJpNCBlzsaphGP6w==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.12.0.tgz", - "integrity": "sha512-ycUPGL5G+xrpxElX0mhv4/T9xQvzXQfXVlQ81BKNKgTgOcEgYPIFKNMg7Vxhm/pVkMsCeMCG3QaZopNH/Sp81Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.12.1.tgz", + "integrity": "sha512-micVlV7Fq8Nu9c1oDQjZkBJUnCyqEYFHifLjTayZK9GTiVl6aC33nvAk4SdBaTaS8pz01Uk6Ip8Drp39KRLB/Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.12.0.tgz", - "integrity": "sha512-WofNeW5ahIPrvXP0ZHpDgvmfiKNYo62pP+RUzHPZm85CCDJZfpMKXwUwsmaqN6Yf7aMad8piy5vk6BbDF6laLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.12.1.tgz", + "integrity": "sha512-GoSw6Hge+4E0vjQvdRAsUWjpylURYcmOQK6zBgKN/pEHeX1lhXJchi3ivGzD4cb+dVLlYDLztfcKRT2fSWn7pg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon-registry": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon-registry": "1.12.1" } }, "node_modules/@umbraco-ui/uui-input": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.12.0.tgz", - "integrity": "sha512-ZiGZPwf1QB+SIijeaOUNsIJxL4n7h6Q9wwYyAzB3jkWjcSqJ0l3sFGL7L4tQMkeTIjFb0AzhGLb4NYRdaQPPCA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.12.1.tgz", + "integrity": "sha512-joy0nUKui8LJzljDVeXb8LFLxGhpSAWvEg9EjsIin7I1bZemE3GtIt+q0+lN2Mqto6ixeCgOpqyEe4C+RnAGpQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-input-file": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.12.0.tgz", - "integrity": "sha512-i8u4sv46IB5/Pt2Yz0lSvxnaHJrkL4+cJFyTavIeVwzTinsPInzG6ublJzvRY+vmkB2Sim/uLvBnotwgEbYjrA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.12.1.tgz", + "integrity": "sha512-LgmPVzaRLFDati/Q9RgYA7c15B2DS8kIsdIbmJkxWbJk/Iaz8hgTQviB2QZ2SjP8g7K7ix0a/webS61J+wF4hw==", "dependencies": { - "@umbraco-ui/uui-action-bar": "1.12.0", - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-file-dropzone": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0" + "@umbraco-ui/uui-action-bar": "1.12.1", + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-file-dropzone": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.12.0.tgz", - "integrity": "sha512-rqHMCpbIz+MOfNYYNzguA+ri3HNoDT3D4JNXVXV1wZ7X3nz824rkZDtsPQEwVF0L1jpWL6hPWy9lEoqq+30WLg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.12.1.tgz", + "integrity": "sha512-ZovdaOZWucorfXDAe+c4DAtFTTPl8UyagXkBnTVTIW86T0kJ4f7HRTnHbG+jymEspwLq78FIkkk6oJYVXov8IQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-input": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-input": "1.12.1" } }, "node_modules/@umbraco-ui/uui-input-password": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.12.0.tgz", - "integrity": "sha512-i+7tAnvQ19MP+mXoUldF1iiTwLzAWzGM1fojQyAVZA89jexdkzB9kL3CHZtFa9XCWRT3n/UUQhU+INX8mjOmlw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.12.1.tgz", + "integrity": "sha512-pZeXU1p8762x6nquBfUOF5fQNPk3U2FRxpfIsQvLA49x6TQ7L9y9mfrSzQ1mdwNoLyyNqaHKDr+VNqNwdCCEXg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0", - "@umbraco-ui/uui-input": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1", + "@umbraco-ui/uui-input": "1.12.1" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.12.0.tgz", - "integrity": "sha512-LIjqf5UDfre8nz/FRMIRgnXGrrl9mc5MfBCNpegcWadSC1Yje/qclGJrEE6U4f26+6iz+vtX6NSUiky7M0tirA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.12.1.tgz", + "integrity": "sha512-AbhVL5+1kCckdxiCrd6ncX3pS9XjPJxntVRtBiD6BESKrxSpt6V5MDJ7P/lnhHgHscalfjiwVrWAnbiR3zBeng==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.12.0.tgz", - "integrity": "sha512-GZ+onC6vkhH62N9742Bbu7Dj6XSOQfoFrF+dV9S4ERUNd1PL8Pm+WouJ9pWDJeE01HfEaOFO9HuHXyC3qkuxsg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.12.1.tgz", + "integrity": "sha512-pQ8Z6oW6dBEG6xdKIGbGWXma16wmFDbOdmsL9L007Z2Bw4uJbW6yU4uXdi2YZC3AkIeb0AdIkLwYeKa/dwa69Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-loader": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.12.0.tgz", - "integrity": "sha512-bck6FW87yoSrWTSyt9ZD0GIhSb0Boio4aXhZFbc1PLNygWUpw0xOEwt5HMxVvf1Sy/7Scl2hri5aFtoAhbSMrA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.12.1.tgz", + "integrity": "sha512-FTonOLAqO95b8RDJDrdLcNsXS0pL+WKZYt8u6/DGV8YYg8fQymU5OA/YzNX4xi0OWOpVH7Ozto+F6j3/AzFOCA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.12.0.tgz", - "integrity": "sha512-K6qUp0sOM7xvFcRNkabwZqmp+5EfDp4N2l+8skNksB7b+XPhY5ILz9mrvFKAv8jPmGcfZLWcoVTx/e2EB/kpLQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.12.1.tgz", + "integrity": "sha512-wd63QeW9wXQeEjwOID93ki/fPSlA2AqzdaCq0CvcVTR60FxJ7BUTxe6pPtP3aFC7ylcEllOof5R8pHn6L3wx2Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.12.0.tgz", - "integrity": "sha512-lm9NxHyO+tyKowrgL5kCom+yJzbJWjBi0XCdJybfZ5GbR16s/+Q/4De/Gjx8itHnGp3HKUGXAZ5PqDcdp9YDWQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.12.1.tgz", + "integrity": "sha512-itjl1UAvoSNs1jWzRLtcQLh56OgeJKoly4CnOmwkc/ftlPOmMLqVaUJt21vRMBaPtl0UIljkCbWDDGkPtexy2Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.12.0.tgz", - "integrity": "sha512-byUKYCse9DyALsOM4D7G45HgfOPx1NK/T5h1sdIK5NlOqgGtnKWeWbkHyJk6bgwnOqUtE5qUEznAiyD83xPe0Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.12.1.tgz", + "integrity": "sha512-w8kaWACizS0y1DP8xVQShcsZlZ+/OGoYQaFL7r6eN1YqSDDkEV+LkL8p/Wqrjxz1EmnTaYrdj8oqcqFDz2Gc/g==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-loader-bar": "1.12.0", - "@umbraco-ui/uui-symbol-expand": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-loader-bar": "1.12.1", + "@umbraco-ui/uui-symbol-expand": "1.12.1" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.12.0.tgz", - "integrity": "sha512-zUcdYXZHDYs5sYcD1fRj+nssA1sYXnUeL1H6ENd1oeDeSx0nFXyslxqT3hG0Yizp5oKJ9QRaUe/i0X3ZZ9mzCA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.12.1.tgz", + "integrity": "sha512-Yfcf/ybcYAlYOd7NwYzH44hX8wM0hE5L3cypmstT/wI0f0n3kGk7AP89dBROPcctBwap6mycSspVc9FfVJzhfg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.12.0.tgz", - "integrity": "sha512-wAgrLRLbT9YEOoLT3nN20tlrOwKB4Sk5krKHKy8HbFYcxE6pipg/6Pjzz31JjTEDR+nUMir9LR/YvKonTPtnpg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.12.1.tgz", + "integrity": "sha512-3GDh7WXkqcqgiwfDJiBUgm1btPmxOzEETeuzpTx8H9jaK8d5CHTQ8+uM8VIXxFCmKtUyA8JLuvS4w2GvpXGK4w==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-button-group": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-button-group": "1.12.1" } }, "node_modules/@umbraco-ui/uui-popover": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.12.0.tgz", - "integrity": "sha512-dzIVMcHlLRcrw0rTHdBmNAQrD+zP3TquY6RKWdHKwjRMFTVjX86YPFUgLTfwXBL0MsbV0H2BVp+4jSZJTc60XQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.12.1.tgz", + "integrity": "sha512-XwvT3zieIJtBjK5Y3ithWCYH7b1jYEhmXI4HhHsakoUvmptaWM37c9ju2MGwghlfkhJg4DjBDI6xHQPopXbGpQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.12.0.tgz", - "integrity": "sha512-AdYWqnAu80gzR8h2mnYCb5WbptRBZXt19yyCv4VbLIWqvONka/pu6h3hkLs/fApIUxAcp1h2DOH3w0ZPENo1eA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.12.1.tgz", + "integrity": "sha512-coNy6smdCLzPMgOD1IGylkT7Dj7X9DhA0nA5R0uSLUOiYgFi3PE4ziaksxIRjr6iVl+MgvzAB3pqyHKB1srv6g==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.12.0.tgz", - "integrity": "sha512-A9d0U67ek0oONtenxOlledmDzzMr+jU8T/5YoSWgqLW7xJQK9PM6QjW0kp2Ea29FvKzeQBD4OUEx/xrAxbsYDg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.12.1.tgz", + "integrity": "sha512-6WQd75DV5btJjYlybzMUkCUrapD9S/wJAraKVS0c5UvmfUs+pmMZEVnx6TypO4dllk6rHCOQQ79SuyZRft6NCA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-radio": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.12.0.tgz", - "integrity": "sha512-XA9EEXHeIdvLelLaZsq2XMKXlxh2jGVtzYWU+13KTMHJf8mELGAz4/yxo57tDWdOzztVqnMIvPdtRrd5LsyYIA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.12.1.tgz", + "integrity": "sha512-H28rLbALI8zdDlW8l/8TUQm8E4kiHkNlKOuz98WSYW+J0jl6gyiTOUWN6N4p8RsE9rHTS7d//IisOioFTErphQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.12.0.tgz", - "integrity": "sha512-i758eBVQ7b+MTJFNEJXT6lidIOAibSV0Bo1e7p/X8XsOGEdsqgy8PQBuSzSCSvQ3BRTc+s0O6H661lVie9/eew==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.12.1.tgz", + "integrity": "sha512-0D0vlz0chs4rvwdWCd45Y8PI7aDRCYZ6/3IN48oBhW4LQsU49aQi/bTyXurcTdaxKirf7DQmlNAtuyRRjw4WEg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.12.0.tgz", - "integrity": "sha512-Sla1vScklmqSX/JqB9149ypkAibxoN8LCsHHvM2Pk8TQkKBbaia51WtkpOsaHLPVL5ao9oMyvLlQGgroEIOU/Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.12.1.tgz", + "integrity": "sha512-IdaajH2ajYPxQCLYVV+XfzlrF6R+kz8DLDeiS5cI5vgsF+bs1GmVFw2WzF1m2DFSUeuGSTLQcLWQbQsjHgGGnQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.12.0.tgz", - "integrity": "sha512-b3dBTrl+zG2nps9/CwmQCtIvf4DjHwmQ7VT4PZukvFGORxdFFgwmYoEmpzHjSS01NC0uBORSaYXFb6CLnTMz3A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.12.1.tgz", + "integrity": "sha512-MQUSeGMvM4e1Pzka4CdJOBsA8AMIHGuXX2QGE1uJj3u3EEn1WPQToD2YTSNB0Cxikfi08BEZT5GsbJI/PzwFmw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.12.0.tgz", - "integrity": "sha512-1Y1kQslpMzby8FEx8TzrBKo1gZPyckPodlTQYFBDLStM5OUXvWwoll7AYmqBKAaqxZpQf1PILoXcxqZnsE8xGg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.12.1.tgz", + "integrity": "sha512-ZKkiAOT0oE8E1/BXp8FCavyAooJe5hYYmUSALV795SB4OHaVSIL8Kh6MUFNzmtUzs0qC5+cCVtef67KJe6kuEA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-ref": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-ref": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.12.0.tgz", - "integrity": "sha512-QkXtmDabduVQwGXNEHbANLcbjdEkDvqSrgeIfMHAEa/nikEKwxENPR4NvUnnWiu0tdc4uR7ul5xtsGyD9Wpqmw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.12.1.tgz", + "integrity": "sha512-wY0OvqYSfVuuMYLVV1WKpITZ7SVZ+7RZ7DGOar3cJha6f3/e56J/ylunfTu1T+pxd/KIh8WNWZx3vVgWRFIm8Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.12.0.tgz", - "integrity": "sha512-lv0HZ+LdcIej7UbJggpUnuorRGrr6UclXmP+VevmI2il6x9qM5tO7ms+apbbzRqgYQK07C9zAVX9/A7FL6SdtA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.12.1.tgz", + "integrity": "sha512-EmC7x7SO2Q1uYhIlESAX8QtxEbPIkBwDPcCr8l5bQ/Y/0uXvBOja8tceIt19xe954KjeqcRs6AGTWsetv4UoMA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.12.0.tgz", - "integrity": "sha512-4vpsRY6LQ9tBunD80vCagCojZwmS4Wf9UFS9WXo9kyU4cxYJS4kn3k00o13wf1A4MN7A3M/AoSK+3MCRDaeEYw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.12.1.tgz", + "integrity": "sha512-ovxnbkmGPeCYMKb8aDhH3yafTtkYEwsz9eGxPvoDlioTw/coRVo4VF0dndKzxIqVBw/BnNotnFhGWt1l5k47zQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.12.0.tgz", - "integrity": "sha512-rqsob7U5cVvluKiJJ6zA7IdDMl7Kz6EZNO5hgQdRzEi/sQdrt+ci3qzLKLijBcqOgrE8gYEORtYq4joGssGong==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.12.1.tgz", + "integrity": "sha512-iGO5qTr/8kAFcZItYAJGF7CES5SN7oBMw+MDVcZG/JgBmxogSW0wDlBM9u6FPMDnum+bDG+YpUbJpDN+VA0/pQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.12.0.tgz", - "integrity": "sha512-IN2KFqtVy7VwUoftbxUP4+IKYgr6j8Ar0b1OkyAd58SZyouzEaR+oozB1Z+04WxSdxH/++MpVqCVBi3Cr/XLMg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.12.1.tgz", + "integrity": "sha512-KWI2nKHUOHFqQzjYc1qextxKrczHJrzKCxGOnHU4gmqnJxGwjnWmx6XDndlBE8bBeggmC+nUt+RAE8jSfo3xmQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.12.0.tgz", - "integrity": "sha512-Gv7mFTInvpRcnS1TdsLnHV3DeBjEBjKP+GAJ+v1Pq0E/ws6sSgA70LATmVIXVDEzmh6aMlT5bemUUQcNrFF61g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.12.1.tgz", + "integrity": "sha512-eO8aegyXUmFlxyvJFacM5lYkmP8eyroXmvbChoX9pfgkyONGKYLIGvpAvPFrL8447xVQdsWXCPMu0aTpiMqdAw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-ref-node": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-ref-node": "1.12.1" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.12.0.tgz", - "integrity": "sha512-yLeEDZd8r97jmRnC7fhaV68NrGercFMwMvs5oR2snUHMqGVZBahe7vsibdJAalmf9LpPwJM3MgAL0PNpHrmrTA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.12.1.tgz", + "integrity": "sha512-aeAvzUwjGtGIxNdixR3uTgIyzhattAnXqb7n/iB4N8f6NW2ZyLAoDM79RcTa6k7tDF0zEdQjlAZfjKlHAzCfpg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-select": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.12.0.tgz", - "integrity": "sha512-1PRIXwjdIF/jX8jAPJIIiHIZHKXWwLZgxukWih3VjDOkD/+JqNrwIZZlOlXzJQBEaswCKOGK36WB00/zq7gqpw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.12.1.tgz", + "integrity": "sha512-XvxMzKqwytjZr8wZ6PsT9fASMnXXC2GBS3Zlf/fbTzPoYFMxvprsVMe2MXeXoS8wXmQ/ojcsiWB3Gv0mgZvLUg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.12.0.tgz", - "integrity": "sha512-sktzAJMBqu/gwHlNA7DqpaoSfL9/xKKB697PtJC4U+X6zU5E0uBXnNHXZEap4XEyjoruRsmBsdWC3KVrIbvCEw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.12.1.tgz", + "integrity": "sha512-LWMrH+3aX9cSNGLN/MhebrRCUdXxMkXUleXmg+M6LKvLfRiyN9PPJHBtRzrxS6DARj69BwnrViNVVu4toZXTYw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.12.0.tgz", - "integrity": "sha512-3EjmTjXrxc3tJfaNH7t5okr4bJ4eREl8pztTToBt0DZnYRrnsf+XG8WClNjRPgt36DfbiEWr6ac7cTDqAmkrdg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.12.1.tgz", + "integrity": "sha512-NlT5PtYVx/GwiDRcUX519mC9DEkSPJNDCSU50RwcRaXI1XvvIUq0Ds7BO4lFUeArnRdb13Vp4jV+Lh1Pmohvwg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.12.0.tgz", - "integrity": "sha512-JUpETqj/wTu2nWth4Y0pdQXBN32kQn3Iu81Fc0tCeBljPjTL8Q5FbvQR+t+2JtY3lK3ecLQEWsSGnDVj37XnLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.12.1.tgz", + "integrity": "sha512-ST/wi+kwKftTLl9CEfYem3bAOFdaxiLN2soB4jWYUEkQL7uG1A+1oL0/6w8myq8PL210PO65khSuW0wCwVpolg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.12.0.tgz", - "integrity": "sha512-8A4sP9uAf7MxkQmT1GpzdWXZjdVZtJch9uaBBhArtVd5NUR8iCDE1J10fSviwei1trW9fm1D80ob6citiImLZQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.12.1.tgz", + "integrity": "sha512-3XpIC2GPkkTKg6XzvlTV7XUahK3+DZ/F3PdUXk7LSpnxowxU/5hDDr8ESPj9jKaBe1OcDH/bc0fsRJKOtkmBNQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.12.0.tgz", - "integrity": "sha512-HCn+MFJIrL37dvW7c2wbmPJCw3e0mew5G3KVBrCdTs5yy8TjSmk+m4gZrT5By09AstFcy+irFO0VJeJluIOjUw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.12.1.tgz", + "integrity": "sha512-TXYGygPFzLT4f/8iH1X5fKn7GrpagLcYsPDIFkEH1dOAoQWR0gu+V2TVoKfXkzzdxZ68knB8lbPeuXi4StUXSA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.12.0.tgz", - "integrity": "sha512-+t+2A/DvibviBAhFqdOI8eUiupezNfG2wC5dozhsqqEkUUeI019V04cd2UKFZ93A5zblWiokYaV/7/GX/sNePA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.12.1.tgz", + "integrity": "sha512-EUztWYMcWUiFTT3KRe7/qRLxOWu5sErNSVb+HRAYak3TOIXP/A0a7H09SRWTPAKqIjrmWo26es+lasCOC1rwEQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.12.0.tgz", - "integrity": "sha512-GgwamuY1YpRc/LCiIE+QFvSvdV9M3CLERLLHjQ/FIEIdEK/pLtMQVfQ/j69VZWR3111bS9dos4JXVpY2AcqJ6w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.12.1.tgz", + "integrity": "sha512-2tW8u20OM0wS3ZbPIlyVeHYR6mG1KAOC47CxSaCs59QIIw2PVBZgY7YVVP6bSUf4kttNkPt826gf7lW9ZEBrCg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.12.0.tgz", - "integrity": "sha512-H/B1X1lwmDp4lsgRJ2/r1SPeOWYjUnbFFi/Lo5GIO0RRGbdepF5LH6xVjCWz6ZtKzVXk0yjATZLRiFE2Niae7g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.12.1.tgz", + "integrity": "sha512-JrKpcSGizg20JUBKXEoMlDhfxpUFKp+JM9wldnm7JCyfee1JpMAQYDTF/Nw0Qsj5i60xqa7EAggZc38zQuDK6Q==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.12.0.tgz", - "integrity": "sha512-5ZSucjxfP++T3CsVeRrsibY1KcobGtBF52xU0BkCV7qPj0KVlmbmITMegZm8nkESQtOBGVPn93U+wGKZ56/xKw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.12.1.tgz", + "integrity": "sha512-HXQa9X1GahHOtuHA2BPRFlqblS8PXuhkDJwFMsXTxShgMnv0Wq3pEp7gh791Kk/XAsOWXozZgRPxWeB9HfAaRg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-table": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.12.0.tgz", - "integrity": "sha512-bfdSQ1l054fJCA+ancrTutdcDJim4seY8auIsjYMhca6l3Cqyhin3vwYxRp24J4uP4j66Q2INsZJxV5Z8u+6HQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.12.1.tgz", + "integrity": "sha512-rTsJnhP1jgDku5R4gIQF0GcLXTqqYLHRRSIjP+m8WEK18EvQIIER4iRjt6SC1Iv/KVaWB6M4G3OXq3RfQqvknA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.12.0.tgz", - "integrity": "sha512-Q/LNYBrfhRBWZdm52siK+126yaFliDKWgFgJXKlJAyzrqvIC3QYBe/jtHflMeS1YJdg1QUy/qf3kKPVT6nbmGw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.12.1.tgz", + "integrity": "sha512-UIQjeCm2jWJJSbpDZ5BKEQT6vh9vEpio6HVupH9KsF5lNq5JwCFsK29g+xCbDPT/tzbLFrSZiVGebQaJ9OrPkA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-popover-container": "1.12.0", - "@umbraco-ui/uui-symbol-more": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-popover-container": "1.12.1", + "@umbraco-ui/uui-symbol-more": "1.12.1" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.12.0.tgz", - "integrity": "sha512-SnsWhy3d53hZ5SV5IkENhLXgK/Jpm0GZVI0SqWFGg4hb2a84eBw9UgYvNkJlFr0KHGtcGKLaOiM9jAy286dldA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.12.1.tgz", + "integrity": "sha512-YHhAgaQLCMI0NXmmXXtyTk+mRtHCQ/+RcLkncl92RaTL8jHqFmkFQ/mm2MTYKenzF1BjwtTDHop++KEoQ6aJgg==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-textarea": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.12.0.tgz", - "integrity": "sha512-p7zZzCn/yI2YEll5WhbHGfX9MFPJkEl39sjOSpFEKjdXS5G0e5y6Rty+OdH0pJ5q8qmeKIAiIJE22R0B1isgIw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.12.1.tgz", + "integrity": "sha512-1es3dbrcl8dcGyHNSUVDvOlLsZtPCKAQubMF5qXj5uzkeO1vnVC8L4TgDchkncCLhI1Zi+Ur1dsZ7ZOr4KdW4w==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.12.0.tgz", - "integrity": "sha512-Dfinm7o99SgkbSRj56cSSC6deQYemaoWxzpo0qQRB5WHKSlYm2w7DA4Xg9GBWbjxU3tIztW2dVnzLFk5kfirEQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.12.1.tgz", + "integrity": "sha512-jNUMISZKlxWxUW57CnFSpk69B/m3Pq6Z+mr28YEAmk1kIfRur5DpqZOeO+jQacT0aZY1ua2ETJ9R5ZDi5XMuZA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-button": "1.12.0", - "@umbraco-ui/uui-css": "1.12.0", - "@umbraco-ui/uui-icon": "1.12.0", - "@umbraco-ui/uui-icon-registry-essential": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-button": "1.12.1", + "@umbraco-ui/uui-css": "1.12.1", + "@umbraco-ui/uui-icon": "1.12.1", + "@umbraco-ui/uui-icon-registry-essential": "1.12.1" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.12.0.tgz", - "integrity": "sha512-l+jYWzc20R0z4zp30252KzwHUNSnR+WfC1YBS0fm3MSmmpOijXVgT+aPjIa1GQtv6DHmCVm3YkEniEsVt61+Gw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.12.1.tgz", + "integrity": "sha512-LrjIFADbfb3C1TbUieo0haP1BCArcGcraZ6XcGa9YVVfB/yNKQPOz2M6U0vv14WulOBPeInHExaCV2GNkItEUw==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-toast-notification": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-toast-notification": "1.12.1" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.12.0.tgz", - "integrity": "sha512-vfYNZEijUovn5spSN+CmVECJ0NTReirPb7ybavdy245Ra87IeQcXno0njflu2J8qjB9RGJB59u3R8W+g+LpIPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.12.1.tgz", + "integrity": "sha512-dhpCnbxdgKEO54yLDn6FJtupmRaSoZSRJeed9y6E344swEkDc8/frrt/nm0wwSjV022rnejH2SYjkRfYl2qazA==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-css": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-css": "1.12.1" } }, "node_modules/@umbraco-ui/uui-toggle": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.12.0.tgz", - "integrity": "sha512-OfJsoBhKqeSRuLdspXcSR3Prhi0QzZxD6ejMS+ozeMoGDErKHN4bnGddcbTaFfK6bvT3mA8WlxVU64m6N2+tEA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.12.1.tgz", + "integrity": "sha512-//gnh+j6SmFLJ5B/zFZEu8aUBnR5dflz/gvwK5SQclGsoG1fCCEltIof24E2nEIqb8/fRQaT5ZTla2TpMXWV3g==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0", - "@umbraco-ui/uui-boolean-input": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1", + "@umbraco-ui/uui-boolean-input": "1.12.1" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.12.0.tgz", - "integrity": "sha512-J01yrYAD5lYRUaWSqE3D0JcQIdRhsC0vu3hocxW6lAh9S6Y4bfJofl/Mgu118iLYvHAwopQWcGI7f1K5hlKE7g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.12.1.tgz", + "integrity": "sha512-wXbmn7hFy7U/WZSiZjcI+UdgvogLTN6+iDd8pioW2ehy0+2nSNVJIbkoKHS+h/TrpKiJADjT8205WFJBIriFcQ==", "dependencies": { - "@umbraco-ui/uui-base": "1.12.0" + "@umbraco-ui/uui-base": "1.12.1" } }, "node_modules/@ungap/structured-clone": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 44b2766591e0..7ddbb37fd22b 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -215,8 +215,8 @@ "@types/diff": "^5.2.1", "@types/dompurify": "^3.0.5", "@types/uuid": "^10.0.0", - "@umbraco-ui/uui": "^1.12.0", - "@umbraco-ui/uui-css": "^1.12.0", + "@umbraco-ui/uui": "^1.12.1", + "@umbraco-ui/uui-css": "^1.12.1", "base64-js": "^1.5.1", "diff": "^5.2.0", "dompurify": "^3.1.6", From 7162efc865ae73eddf14c8ba26e11c897f17820c Mon Sep 17 00:00:00 2001 From: Mole Date: Mon, 25 Nov 2024 13:32:01 +0100 Subject: [PATCH 092/167] V15: Add information to item endpoints (#17623) * Add information to item response model * Update OpenApi.json --- .../Factories/DocumentPresentationFactory.cs | 11 +++++++-- .../Factories/MediaPresentationFactory.cs | 16 ++++++++++--- src/Umbraco.Cms.Api.Management/OpenApi.json | 24 +++++++++++++++++++ .../Item/DocumentItemResponseModel.cs | 4 ++++ .../Media/Item/MediaItemResponseModel.cs | 4 ++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs index 817cd9fa2e45..463dbbd5ab84 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/DocumentPresentationFactory.cs @@ -22,19 +22,22 @@ internal sealed class DocumentPresentationFactory : IDocumentPresentationFactory private readonly ITemplateService _templateService; private readonly IPublicAccessService _publicAccessService; private readonly TimeProvider _timeProvider; + private readonly IIdKeyMap _idKeyMap; public DocumentPresentationFactory( IUmbracoMapper umbracoMapper, IDocumentUrlFactory documentUrlFactory, ITemplateService templateService, IPublicAccessService publicAccessService, - TimeProvider timeProvider) + TimeProvider timeProvider, + IIdKeyMap idKeyMap) { _umbracoMapper = umbracoMapper; _documentUrlFactory = documentUrlFactory; _templateService = templateService; _publicAccessService = publicAccessService; _timeProvider = timeProvider; + _idKeyMap = idKeyMap; } public async Task CreateResponseModelAsync(IContent content) @@ -73,10 +76,14 @@ public async Task CreatePublishedResponseModelAs public DocumentItemResponseModel CreateItemResponseModel(IDocumentEntitySlim entity) { + Attempt parentKeyAttempt = _idKeyMap.GetKeyForId(entity.ParentId, UmbracoObjectTypes.Document); + var responseModel = new DocumentItemResponseModel { Id = entity.Key, - IsTrashed = entity.Trashed + IsTrashed = entity.Trashed, + Parent = parentKeyAttempt.Success ? new ReferenceByIdModel { Id = parentKeyAttempt.Result } : null, + HasChildren = entity.HasChildren, }; responseModel.IsProtected = _publicAccessService.IsProtected(entity.Path); diff --git a/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs index 7948e0d01936..f9b417028155 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/MediaPresentationFactory.cs @@ -1,10 +1,13 @@ -using Umbraco.Cms.Api.Management.ViewModels.Content; +using Umbraco.Cms.Api.Management.ViewModels; +using Umbraco.Cms.Api.Management.ViewModels.Content; using Umbraco.Cms.Api.Management.ViewModels.Media; using Umbraco.Cms.Api.Management.ViewModels.Media.Item; using Umbraco.Cms.Api.Management.ViewModels.MediaType; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; +using Umbraco.Cms.Core.Services; namespace Umbraco.Cms.Api.Management.Factories; @@ -12,13 +15,16 @@ internal sealed class MediaPresentationFactory : IMediaPresentationFactory { private readonly IUmbracoMapper _umbracoMapper; private readonly IMediaUrlFactory _mediaUrlFactory; + private readonly IIdKeyMap _idKeyMap; public MediaPresentationFactory( IUmbracoMapper umbracoMapper, - IMediaUrlFactory mediaUrlFactory) + IMediaUrlFactory mediaUrlFactory, + IIdKeyMap idKeyMap) { _umbracoMapper = umbracoMapper; _mediaUrlFactory = mediaUrlFactory; + _idKeyMap = idKeyMap; } public MediaResponseModel CreateResponseModel(IMedia media) @@ -32,10 +38,14 @@ public MediaResponseModel CreateResponseModel(IMedia media) public MediaItemResponseModel CreateItemResponseModel(IMediaEntitySlim entity) { + Attempt parentKeyAttempt = _idKeyMap.GetKeyForId(entity.ParentId, UmbracoObjectTypes.Media); + var responseModel = new MediaItemResponseModel { Id = entity.Key, - IsTrashed = entity.Trashed + IsTrashed = entity.Trashed, + Parent = parentKeyAttempt.Success ? new ReferenceByIdModel { Id = parentKeyAttempt.Result } : null, + HasChildren = entity.HasChildren, }; responseModel.MediaType = _umbracoMapper.Map(entity)!; diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index a57ae4553668..261279dc645b 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -36738,6 +36738,7 @@ "DocumentItemResponseModel": { "required": [ "documentType", + "hasChildren", "id", "isProtected", "isTrashed", @@ -36755,6 +36756,17 @@ "isProtected": { "type": "boolean" }, + "parent": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + }, + "hasChildren": { + "type": "boolean" + }, "documentType": { "oneOf": [ { @@ -38895,6 +38907,7 @@ }, "MediaItemResponseModel": { "required": [ + "hasChildren", "id", "isTrashed", "mediaType", @@ -38909,6 +38922,17 @@ "isTrashed": { "type": "boolean" }, + "parent": { + "oneOf": [ + { + "$ref": "#/components/schemas/ReferenceByIdModel" + } + ], + "nullable": true + }, + "hasChildren": { + "type": "boolean" + }, "mediaType": { "oneOf": [ { diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs index 6dc8aa4d596f..ad7d991a00b1 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Document/Item/DocumentItemResponseModel.cs @@ -10,6 +10,10 @@ public class DocumentItemResponseModel : ItemResponseModelBase public bool IsProtected { get; set; } + public ReferenceByIdModel? Parent { get; set; } + + public bool HasChildren { get; set; } + public DocumentTypeReferenceResponseModel DocumentType { get; set; } = new(); public IEnumerable Variants { get; set; } = Enumerable.Empty(); diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs index 2eb427060038..d342a163b85d 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Media/Item/MediaItemResponseModel.cs @@ -8,6 +8,10 @@ public class MediaItemResponseModel : ItemResponseModelBase { public bool IsTrashed { get; set; } + public ReferenceByIdModel? Parent { get; set; } + + public bool HasChildren { get; set; } + public MediaTypeReferenceResponseModel MediaType { get; set; } = new(); public IEnumerable Variants { get; set; } = Enumerable.Empty(); From 6b0f8e7b7c1cd6f09cf8768b7d97adaa32d61881 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:55:40 +0100 Subject: [PATCH 093/167] Validate email for member models (#17532) * Validate email for member models * Add null check or more test cases * return invalid when not a valid email * Cleanup * remove private method in favor of extension * Remove non used, using statement --------- Co-authored-by: Elitsa --- src/Umbraco.Core/Extensions/StringExtensions.cs | 9 +++++++++ src/Umbraco.Core/Services/UserService.cs | 6 ++---- .../Services/MemberEditingService.cs | 5 +++++ .../ShortStringHelper/StringExtensionsTests.cs | 10 ++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Extensions/StringExtensions.cs b/src/Umbraco.Core/Extensions/StringExtensions.cs index 7c144138b011..e5eb0819e94a 100644 --- a/src/Umbraco.Core/Extensions/StringExtensions.cs +++ b/src/Umbraco.Core/Extensions/StringExtensions.cs @@ -2,6 +2,7 @@ // See LICENSE for more details. using System.ComponentModel; +using System.ComponentModel.DataAnnotations; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Security.Cryptography; @@ -1558,6 +1559,14 @@ public static IEnumerable EscapedSplit(this string value, char splitChar yield return sb.ToString(); } + /// + /// Checks whether a string is a valid email address. + /// + /// The string check + /// Returns a bool indicating whether the string is an email address. + public static bool IsEmail(this string? email) => + string.IsNullOrWhiteSpace(email) is false && new EmailAddressAttribute().IsValid(email); + // having benchmarked various solutions (incl. for/foreach, split and LINQ based ones), // this is by far the fastest way to find string needles in a string haystack public static int CountOccurrences(this string haystack, string needle) diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 9eb5a3e5bb5c..657507f17b3d 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -917,7 +917,7 @@ private async Task ValidateUserCreateModel(UserCreateModel { return UserOperationStatus.UserNameIsNotEmail; } - if (!IsEmailValid(model.Email)) + if (model.Email.IsEmail() is false) { return UserOperationStatus.InvalidEmail; } @@ -1136,7 +1136,7 @@ private UserOperationStatus ValidateUserUpdateModel(IUser existingUser, UserUpda return UserOperationStatus.UserNameIsNotEmail; } - if (IsEmailValid(model.Email) is false) + if (model.Email.IsEmail() is false) { return UserOperationStatus.InvalidEmail; } @@ -1164,8 +1164,6 @@ private UserOperationStatus ValidateUserUpdateModel(IUser existingUser, UserUpda return UserOperationStatus.Success; } - private static bool IsEmailValid(string email) => new EmailAddressAttribute().IsValid(email); - private List? GetIdsFromKeys(IEnumerable? guids, UmbracoObjectTypes type) { var keys = guids? diff --git a/src/Umbraco.Infrastructure/Services/MemberEditingService.cs b/src/Umbraco.Infrastructure/Services/MemberEditingService.cs index f9f155523a40..061f3ecf6230 100644 --- a/src/Umbraco.Infrastructure/Services/MemberEditingService.cs +++ b/src/Umbraco.Infrastructure/Services/MemberEditingService.cs @@ -225,6 +225,11 @@ private async Task ValidateMemberDataAsync(MemberE return MemberEditingOperationStatus.InvalidUsername; } + if (model.Email.IsEmail() is false) + { + return MemberEditingOperationStatus.InvalidEmail; + } + if (password is not null) { IdentityResult validatePassword = await _memberManager.ValidatePasswordAsync(password); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs index 58e06ba17b2b..9043a1a854a2 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs @@ -364,6 +364,16 @@ public void IsFullPath() TryIsFullPath(" ", false, false); // technically, a valid filename on Linux } + [TestCase("test@test.com", true)] + [TestCase("test@test", true)] + [TestCase("testtest.com", false)] + [TestCase("test@test.dk", true)] + [TestCase("test@test.se", true)] + [TestCase(null, false)] + [TestCase("", false)] + [TestCase(" ", false)] + public void IsEmail(string? email, bool isEmail) => Assert.AreEqual(isEmail, email.IsEmail()); + private static void TryIsFullPath(string path, bool expectedIsFull, bool expectedIsValid = true) { Assert.AreEqual(expectedIsFull, path.IsFullPath(), "IsFullPath('" + path + "')"); From 772c523a2365947b80a049769b042310a7c18e1b Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Mon, 25 Nov 2024 13:55:40 +0100 Subject: [PATCH 094/167] Validate email for member models (#17532) * Validate email for member models * Add null check or more test cases * return invalid when not a valid email * Cleanup * remove private method in favor of extension * Remove non used, using statement --------- Co-authored-by: Elitsa (cherry picked from commit 6b0f8e7b7c1cd6f09cf8768b7d97adaa32d61881) --- src/Umbraco.Core/Extensions/StringExtensions.cs | 9 +++++++++ src/Umbraco.Core/Services/UserService.cs | 6 ++---- .../Services/MemberEditingService.cs | 5 +++++ .../ShortStringHelper/StringExtensionsTests.cs | 10 ++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/Extensions/StringExtensions.cs b/src/Umbraco.Core/Extensions/StringExtensions.cs index 7c144138b011..e5eb0819e94a 100644 --- a/src/Umbraco.Core/Extensions/StringExtensions.cs +++ b/src/Umbraco.Core/Extensions/StringExtensions.cs @@ -2,6 +2,7 @@ // See LICENSE for more details. using System.ComponentModel; +using System.ComponentModel.DataAnnotations; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Security.Cryptography; @@ -1558,6 +1559,14 @@ public static IEnumerable EscapedSplit(this string value, char splitChar yield return sb.ToString(); } + /// + /// Checks whether a string is a valid email address. + /// + /// The string check + /// Returns a bool indicating whether the string is an email address. + public static bool IsEmail(this string? email) => + string.IsNullOrWhiteSpace(email) is false && new EmailAddressAttribute().IsValid(email); + // having benchmarked various solutions (incl. for/foreach, split and LINQ based ones), // this is by far the fastest way to find string needles in a string haystack public static int CountOccurrences(this string haystack, string needle) diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 0167dc6d929f..9b57e5b94b04 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -915,7 +915,7 @@ private async Task ValidateUserCreateModel(UserCreateModel { return UserOperationStatus.UserNameIsNotEmail; } - if (!IsEmailValid(model.Email)) + if (model.Email.IsEmail() is false) { return UserOperationStatus.InvalidEmail; } @@ -1134,7 +1134,7 @@ private UserOperationStatus ValidateUserUpdateModel(IUser existingUser, UserUpda return UserOperationStatus.UserNameIsNotEmail; } - if (IsEmailValid(model.Email) is false) + if (model.Email.IsEmail() is false) { return UserOperationStatus.InvalidEmail; } @@ -1162,8 +1162,6 @@ private UserOperationStatus ValidateUserUpdateModel(IUser existingUser, UserUpda return UserOperationStatus.Success; } - private static bool IsEmailValid(string email) => new EmailAddressAttribute().IsValid(email); - private List? GetIdsFromKeys(IEnumerable? guids, UmbracoObjectTypes type) { var keys = guids? diff --git a/src/Umbraco.Infrastructure/Services/MemberEditingService.cs b/src/Umbraco.Infrastructure/Services/MemberEditingService.cs index f9f155523a40..061f3ecf6230 100644 --- a/src/Umbraco.Infrastructure/Services/MemberEditingService.cs +++ b/src/Umbraco.Infrastructure/Services/MemberEditingService.cs @@ -225,6 +225,11 @@ private async Task ValidateMemberDataAsync(MemberE return MemberEditingOperationStatus.InvalidUsername; } + if (model.Email.IsEmail() is false) + { + return MemberEditingOperationStatus.InvalidEmail; + } + if (password is not null) { IdentityResult validatePassword = await _memberManager.ValidatePasswordAsync(password); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs index 58e06ba17b2b..9043a1a854a2 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/ShortStringHelper/StringExtensionsTests.cs @@ -364,6 +364,16 @@ public void IsFullPath() TryIsFullPath(" ", false, false); // technically, a valid filename on Linux } + [TestCase("test@test.com", true)] + [TestCase("test@test", true)] + [TestCase("testtest.com", false)] + [TestCase("test@test.dk", true)] + [TestCase("test@test.se", true)] + [TestCase(null, false)] + [TestCase("", false)] + [TestCase(" ", false)] + public void IsEmail(string? email, bool isEmail) => Assert.AreEqual(isEmail, email.IsEmail()); + private static void TryIsFullPath(string path, bool expectedIsFull, bool expectedIsValid = true) { Assert.AreEqual(expectedIsFull, path.IsFullPath(), "IsFullPath('" + path + "')"); From 9c76f5cb37849c569036a7a14added14ed6bac08 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 25 Nov 2024 15:14:45 +0100 Subject: [PATCH 095/167] Handle "expose" for variant elements with all invariant properties (#17621) Co-authored-by: Elitsa --- .../BlockEditorVarianceHandler.cs | 71 ++++++++++- .../BlockGridPropertyValueConverterTests.cs | 2 +- .../BlockListPropertyValueConverterTests.cs | 2 +- .../DataValueEditorReuseTests.cs | 2 +- .../BlockEditorVarianceHandlerTests.cs | 114 ++++++++++++++++-- 5 files changed, 179 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockEditorVarianceHandler.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockEditorVarianceHandler.cs index 003464819122..815bc0f1b08c 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockEditorVarianceHandler.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockEditorVarianceHandler.cs @@ -1,3 +1,5 @@ +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Blocks; using Umbraco.Cms.Core.Models.PublishedContent; @@ -9,10 +11,29 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters; public sealed class BlockEditorVarianceHandler { private readonly ILanguageService _languageService; + private readonly IContentTypeService _contentTypeService; + [Obsolete("Please use the constructor that accepts IContentTypeService. Will be removed in V16.")] public BlockEditorVarianceHandler(ILanguageService languageService) - => _languageService = languageService; + : this(languageService, StaticServiceProvider.Instance.GetRequiredService()) + { + } + public BlockEditorVarianceHandler(ILanguageService languageService, IContentTypeService contentTypeService) + { + _languageService = languageService; + _contentTypeService = contentTypeService; + } + + /// + /// Aligns a block property value for variance changes. + /// + /// The block property value to align. + /// The underlying property type. + /// The culture being handled (null if invariant). + /// + /// Used for aligning variance changes when editing content. + /// public async Task AlignPropertyVarianceAsync(BlockPropertyValue blockPropertyValue, IPropertyType propertyType, string? culture) { culture ??= await _languageService.GetDefaultIsoCodeAsync(); @@ -24,6 +45,15 @@ public async Task AlignPropertyVarianceAsync(BlockPropertyValue blockPropertyVal } } + /// + /// Aligns a block property value for variance changes. + /// + /// The block property value to align. + /// The underlying property type. + /// The containing block element. + /// + /// Used for aligning variance changes when rendering content. + /// public async Task AlignedPropertyVarianceAsync(BlockPropertyValue blockPropertyValue, IPublishedPropertyType propertyType, IPublishedElement owner) { ContentVariation propertyTypeVariation = owner.ContentType.Variations & propertyType.Variations; @@ -65,6 +95,15 @@ public async Task AlignPropertyVarianceAsync(BlockPropertyValue blockPropertyVal return null; } + /// + /// Aligns a block value for variance changes. + /// + /// The block property value to align. + /// The owner element (the content for block properties at content level, or the parent element for nested block properties). + /// The containing block element. + /// + /// Used for aligning variance changes when rendering content. + /// public async Task> AlignedExposeVarianceAsync(BlockValue blockValue, IPublishedElement owner, IPublishedElement element) { BlockItemVariation[] blockVariations = blockValue.Expose.Where(v => v.ContentKey == element.Key).ToArray(); @@ -96,9 +135,29 @@ public async Task> AlignedExposeVarianceAsync(Bl return blockVariations; } + /// + /// Aligns block value expose for variance changes. + /// + /// The block value to align. + /// + /// + /// Used for aligning variance changes when editing content. + /// + /// + /// This is expected to be invoked after all block values have been aligned for variance changes by . + /// + /// public void AlignExposeVariance(BlockValue blockValue) { var contentDataToAlign = new List(); + var elementTypesByKey = blockValue + .ContentData + .Select(cd => cd.ContentTypeKey) + .Distinct() + .Select(_contentTypeService.Get) + .WhereNotNull() + .ToDictionary(c => c.Key); + foreach (BlockItemVariation variation in blockValue.Expose) { BlockItemData? contentData = blockValue.ContentData.FirstOrDefault(cd => cd.Key == variation.ContentKey); @@ -107,6 +166,16 @@ public void AlignExposeVariance(BlockValue blockValue) continue; } + if (elementTypesByKey.TryGetValue(contentData.ContentTypeKey, out IContentType? elementType) is false) + { + continue; + } + + if (variation.Culture is not null == elementType.VariesByCulture()) + { + continue; + } + if((variation.Culture is null && contentData.Values.Any(v => v.Culture is not null)) || (variation.Culture is not null && contentData.Values.All(v => v.Culture is null))) { diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockGridPropertyValueConverterTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockGridPropertyValueConverterTests.cs index 14a02d88c423..8f885645995d 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockGridPropertyValueConverterTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockGridPropertyValueConverterTests.cs @@ -187,7 +187,7 @@ public void Ignores_Other_Layouts() private BlockGridPropertyValueConverter CreateConverter() { var publishedModelFactory = new NoopPublishedModelFactory(); - var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of()); + var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of(), Mock.Of()); var editor = new BlockGridPropertyValueConverter( Mock.Of(), new BlockEditorConverter(GetPublishedContentTypeCache(), Mock.Of(), publishedModelFactory, Mock.Of(), blockVarianceHandler), diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockListPropertyValueConverterTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockListPropertyValueConverterTests.cs index 84070ffe4fe5..3cd7b4bc394c 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockListPropertyValueConverterTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/BlockListPropertyValueConverterTests.cs @@ -24,7 +24,7 @@ public class BlockListPropertyValueConverterTests : BlockPropertyValueConverterT private BlockListPropertyValueConverter CreateConverter() { var publishedModelFactory = new NoopPublishedModelFactory(); - var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of()); + var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of(), Mock.Of()); var editor = new BlockListPropertyValueConverter( Mock.Of(), new BlockEditorConverter(GetPublishedContentTypeCache(), Mock.Of(), publishedModelFactory, Mock.Of(), blockVarianceHandler), diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/DataValueEditorReuseTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/DataValueEditorReuseTests.cs index 39132ee7a8a1..217b820c78aa 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/DataValueEditorReuseTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/DataValueEditorReuseTests.cs @@ -36,7 +36,7 @@ public void SetUp() _propertyEditorCollection = new PropertyEditorCollection(new DataEditorCollection(Enumerable.Empty)); _dataValueReferenceFactories = new DataValueReferenceFactoryCollection(Enumerable.Empty); - var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of()); + var blockVarianceHandler = new BlockEditorVarianceHandler(Mock.Of(), Mock.Of()); _dataValueEditorFactoryMock .Setup(m => m.Create(It.IsAny(), It.IsAny>())) diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PropertyEditors/BlockEditorVarianceHandlerTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PropertyEditors/BlockEditorVarianceHandlerTests.cs index 664478f16b5e..5547c930d17c 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PropertyEditors/BlockEditorVarianceHandlerTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/PropertyEditors/BlockEditorVarianceHandlerTests.cs @@ -16,11 +16,12 @@ public class BlockEditorVarianceHandlerTests public async Task Assigns_Default_Culture_When_Culture_Variance_Is_Enabled() { var propertyValue = new BlockPropertyValue { Culture = null }; - var subject = BlockEditorVarianceHandler("da-DK"); + var owner = PublishedElement(ContentVariation.Culture); + var subject = BlockEditorVarianceHandler("da-DK", owner); var result = await subject.AlignedPropertyVarianceAsync( propertyValue, PublishedPropertyType(ContentVariation.Culture), - PublishedElement(ContentVariation.Culture)); + owner); Assert.IsNotNull(result); Assert.AreEqual("da-DK", result.Culture); } @@ -29,11 +30,12 @@ public async Task Assigns_Default_Culture_When_Culture_Variance_Is_Enabled() public async Task Removes_Default_Culture_When_Culture_Variance_Is_Disabled() { var propertyValue = new BlockPropertyValue { Culture = "da-DK" }; - var subject = BlockEditorVarianceHandler("da-DK"); + var owner = PublishedElement(ContentVariation.Nothing); + var subject = BlockEditorVarianceHandler("da-DK", owner); var result = await subject.AlignedPropertyVarianceAsync( propertyValue, PublishedPropertyType(ContentVariation.Nothing), - PublishedElement(ContentVariation.Nothing)); + owner); Assert.IsNotNull(result); Assert.AreEqual(null, result.Culture); } @@ -42,14 +44,104 @@ public async Task Removes_Default_Culture_When_Culture_Variance_Is_Disabled() public async Task Ignores_NonDefault_Culture_When_Culture_Variance_Is_Disabled() { var propertyValue = new BlockPropertyValue { Culture = "en-US" }; - var subject = BlockEditorVarianceHandler("da-DK"); + var owner = PublishedElement(ContentVariation.Nothing); + var subject = BlockEditorVarianceHandler("da-DK", owner); var result = await subject.AlignedPropertyVarianceAsync( propertyValue, PublishedPropertyType(ContentVariation.Nothing), - PublishedElement(ContentVariation.Nothing)); + owner); Assert.IsNull(result); } + [Test] + public void AlignExpose_Can_Align_Invariance() + { + var owner = PublishedElement(ContentVariation.Nothing); + var contentDataKey = Guid.NewGuid(); + var blockValue = new BlockListValue + { + ContentData = + [ + new() + { + Key = contentDataKey, + ContentTypeKey = owner.ContentType.Key, + Values = + [ + new BlockPropertyValue { Alias = "one", Culture = null, Segment = null, Value = "Value one" } + ] + } + ], + Expose = [new() { ContentKey = contentDataKey, Culture = "da-DK" }] + }; + + var subject = BlockEditorVarianceHandler("da-DK", owner); + subject.AlignExposeVariance(blockValue); + + Assert.AreEqual(null, blockValue.Expose.First().Culture); + } + + [Test] + public void AlignExpose_Can_Align_Variance() + { + var owner = PublishedElement(ContentVariation.CultureAndSegment); + var contentDataKey = Guid.NewGuid(); + var blockValue = new BlockListValue + { + ContentData = + [ + new() + { + Key = contentDataKey, + ContentTypeKey = owner.ContentType.Key, + Values = + [ + new BlockPropertyValue { Alias = "one", Culture = "en-US", Segment = "segment-one", Value = "Value one" } + ] + } + ], + Expose = [new() { ContentKey = contentDataKey, Culture = null, Segment = null }] + }; + + var subject = BlockEditorVarianceHandler("da-DK", owner); + subject.AlignExposeVariance(blockValue); + + Assert.Multiple(() => + { + var alignedExpose = blockValue.Expose.First(); + Assert.AreEqual("en-US", alignedExpose.Culture); + Assert.AreEqual("segment-one", alignedExpose.Segment); + }); + } + + [Test] + public void AlignExpose_Can_Handle_Variant_Element_Type_With_All_Invariant_Block_Values() + { + var owner = PublishedElement(ContentVariation.Culture); + var contentDataKey = Guid.NewGuid(); + var blockValue = new BlockListValue + { + ContentData = + [ + new() + { + Key = contentDataKey, + ContentTypeKey = owner.ContentType.Key, + Values = + [ + new BlockPropertyValue { Alias = "one", Culture = null, Segment = null, Value = "Value one" } + ] + } + ], + Expose = [new() { ContentKey = contentDataKey, Culture = "da-DK" }] + }; + + var subject = BlockEditorVarianceHandler("da-DK", owner); + subject.AlignExposeVariance(blockValue); + + Assert.AreEqual("da-DK", blockValue.Expose.First().Culture); + } + private static IPublishedPropertyType PublishedPropertyType(ContentVariation variation) { var propertyTypeMock = new Mock(); @@ -61,15 +153,21 @@ private static IPublishedElement PublishedElement(ContentVariation variation) { var contentTypeMock = new Mock(); contentTypeMock.SetupGet(m => m.Variations).Returns(variation); + contentTypeMock.SetupGet(m => m.Key).Returns(Guid.NewGuid()); var elementMock = new Mock(); elementMock.SetupGet(m => m.ContentType).Returns(contentTypeMock.Object); return elementMock.Object; } - private static BlockEditorVarianceHandler BlockEditorVarianceHandler(string defaultLanguageIsoCode) + private static BlockEditorVarianceHandler BlockEditorVarianceHandler(string defaultLanguageIsoCode, IPublishedElement element) { var languageServiceMock = new Mock(); languageServiceMock.Setup(m => m.GetDefaultIsoCodeAsync()).ReturnsAsync(defaultLanguageIsoCode); - return new BlockEditorVarianceHandler(languageServiceMock.Object); + var contentTypeServiceMock = new Mock(); + var elementType = new Mock(); + elementType.SetupGet(e => e.Key).Returns(element.ContentType.Key); + elementType.SetupGet(e => e.Variations).Returns(element.ContentType.Variations); + contentTypeServiceMock.Setup(c => c.Get(element.ContentType.Key)).Returns(elementType.Object); + return new BlockEditorVarianceHandler(languageServiceMock.Object, contentTypeServiceMock.Object); } } From ba4120050f5d280095fc1bc6ec0c47779ca29415 Mon Sep 17 00:00:00 2001 From: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:27:22 +0100 Subject: [PATCH 096/167] Add cache key to GetByUserName (#17350) * Add cache key to GetByUserName * Remove constants * create new cache policy for member repository --------- Co-authored-by: Elitsa --- .../MemberRepositoryUsernameCachePolicy.cs | 33 +++++++++++++++++++ .../Implement/MemberRepository.cs | 6 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Infrastructure/Cache/MemberRepositoryUsernameCachePolicy.cs diff --git a/src/Umbraco.Infrastructure/Cache/MemberRepositoryUsernameCachePolicy.cs b/src/Umbraco.Infrastructure/Cache/MemberRepositoryUsernameCachePolicy.cs new file mode 100644 index 000000000000..1dc5f42a0117 --- /dev/null +++ b/src/Umbraco.Infrastructure/Cache/MemberRepositoryUsernameCachePolicy.cs @@ -0,0 +1,33 @@ +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Infrastructure.Scoping; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Core.Cache; + +public class MemberRepositoryUsernameCachePolicy : DefaultRepositoryCachePolicy +{ + public MemberRepositoryUsernameCachePolicy(IAppPolicyCache cache, IScopeAccessor scopeAccessor, RepositoryCachePolicyOptions options) : base(cache, scopeAccessor, options) + { + } + + public IMember? GetByUserName(string key, string? username, Func performGetByUsername, Func?> performGetAll) + { + var cacheKey = GetEntityCacheKey(key + username); + IMember? fromCache = Cache.GetCacheItem(cacheKey); + + // if found in cache then return else fetch and cache + if (fromCache != null) + { + return fromCache; + } + + IMember? entity = performGetByUsername(username); + + if (entity != null && entity.HasIdentity) + { + InsertEntity(cacheKey, entity); + } + + return entity; + } +} diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs index c89344716ff1..053cb15b2d08 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberRepository.cs @@ -30,7 +30,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement; public class MemberRepository : ContentRepositoryBase, IMemberRepository { private readonly IJsonSerializer _jsonSerializer; - private readonly IRepositoryCachePolicy _memberByUsernameCachePolicy; + private readonly MemberRepositoryUsernameCachePolicy _memberByUsernameCachePolicy; private readonly IMemberGroupRepository _memberGroupRepository; private readonly IMemberTypeRepository _memberTypeRepository; private readonly MemberPasswordConfigurationSettings _passwordConfiguration; @@ -67,7 +67,7 @@ public MemberRepository( _memberGroupRepository = memberGroupRepository; _passwordConfiguration = passwordConfiguration.Value; _memberByUsernameCachePolicy = - new DefaultRepositoryCachePolicy(GlobalIsolatedCache, ScopeAccessor, DefaultOptions); + new MemberRepositoryUsernameCachePolicy(GlobalIsolatedCache, ScopeAccessor, DefaultOptions); } /// @@ -228,7 +228,7 @@ public override IEnumerable GetPage(IQuery? query, } public IMember? GetByUsername(string? username) => - _memberByUsernameCachePolicy.Get(username, PerformGetByUsername, PerformGetAllByUsername); + _memberByUsernameCachePolicy.GetByUserName("uRepo_userNameKey+", username, PerformGetByUsername, PerformGetAllByUsername); public int[] GetMemberIds(string[] usernames) { From 9141f61708a54d3e1e08803de491c3126d042753 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Mon, 25 Nov 2024 14:51:16 +0000 Subject: [PATCH 097/167] V13: Dropzone, upload complete callback with processed file array (#17631) * Dropzone, upload complete callback with processed file array * Media card: cosmetic fix for image border-radius The image's square corners were poking out. --- .../directives/components/upload/umbfiledropzone.directive.js | 2 +- .../src/less/components/umb-media-grid.less | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js index 8c51763364ab..395ea161b4ae 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js @@ -116,7 +116,7 @@ angular.module("umbraco.directives") if (scope.totalMessages === 0) { if (scope.filesUploaded) { //queue is empty, trigger the done action - scope.filesUploaded(scope.done); + scope.filesUploaded(scope.processed); } //auto-clear the done queue after 3 secs diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less index d25fe62c08ef..a2f72087c03b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less @@ -29,7 +29,7 @@ > div { overflow: hidden; - border-radius: @baseBorderRadius; + border-radius: 0 0 @baseBorderRadius @baseBorderRadius; } } @@ -106,6 +106,7 @@ position: relative; object-fit: contain; height: 100%; + border-radius: @baseBorderRadius; } .umb-media-grid__item-image-placeholder { From 2383fbcd704461159b39b5aca43ff34635e3db07 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 25 Nov 2024 17:32:02 +0100 Subject: [PATCH 098/167] V15: Show a loader during the login procedures rather than oddly styled content (#17618) * feat: show only a loader on a default login flow if the flow fails, the app-error component will be shown, or if the flow is initialised inside a popup (i.e. the session was lost) * fix: hasOwnOpener did not recognize the local vite url as its own pathname it should work better by checking the `startsWith` comparing the pathname, and besides, it seems to work better for the understanding of the function to inverse the true/false check * chore: adjust imports * chore: formatting --- .../src/apps/app/app-oauth.element.ts | 45 +++++++++++++++++++ .../src/apps/app/app.element.ts | 31 +++++++------ .../utils/path/has-own-opener.function.ts | 6 +-- 3 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/apps/app/app-oauth.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-oauth.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-oauth.element.ts new file mode 100644 index 000000000000..658e390d1bf7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-oauth.element.ts @@ -0,0 +1,45 @@ +import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +import './app-error.element.js'; + +/** + * A full page error element that can be used either solo or for instance as the error 500 page and BootFailed + */ +@customElement('umb-app-oauth') +export class UmbAppOauthElement extends UmbLitElement { + + /** + * Set to true if the login failed. A message will be shown instead of the loader. + * @attr + */ + @property({ type: Boolean }) + failure = false; + + override render() { + // If we have a message, we show the error page + // this is most likely happening inside a popup + if (this.failure) { + return html``; + } + + // If we don't have a message, we show the loader, this is most likely happening in the main app + // for the normal login flow + return html` + + + + `; + } +} + +export default UmbAppOauthElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-app-oauth': UmbAppOauthElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index d48bbbd57dac..57bd044230e1 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts @@ -20,6 +20,9 @@ import { } from '@umbraco-cms/backoffice/extension-registry'; import { filter, first, firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { hasOwnOpener, retrieveStoredPath } from '@umbraco-cms/backoffice/utils'; +import type { UmbAppOauthElement } from './app-oauth.element.js'; + +import './app-oauth.element.js'; @customElement('umb-app') export class UmbAppElement extends UmbLitElement { @@ -60,31 +63,27 @@ export class UmbAppElement extends UmbLitElement { }, { path: 'oauth_complete', - component: () => import('./app-error.element.js'), + component: () => import('./app-oauth.element.js'), setup: (component) => { if (!this.#authContext) { - throw new Error('[Fatal] Auth context is not available'); + (component as UmbAppOauthElement).failure = true; + console.error('[Fatal] Auth context is not available'); + return; } const searchParams = new URLSearchParams(window.location.search); const hasCode = searchParams.has('code'); - (component as UmbAppErrorElement).hideBackButton = true; - (component as UmbAppErrorElement).errorHeadline = this.localize.term('general_login'); + if (!hasCode) { + (component as UmbAppOauthElement).failure = true; + console.error('[Fatal] No code in query parameters'); + return; + } - // If there is an opener, we are in a popup window, and we should show a different message - // than if we are in the main window. If we are in the main window, we should redirect to the root. + // If we are in the main window (i.e. no opener), we should redirect to the root after the authorization request is completed. // The authorization request will be completed in the active window (main or popup) and the authorization signal will be sent. // If we are in a popup window, the storage event in UmbAuthContext will catch the signal and close the window. // If we are in the main window, the signal will be caught right here and the user will be redirected to the root. - if (hasOwnOpener(this.backofficePath)) { - (component as UmbAppErrorElement).errorMessage = hasCode - ? this.localize.term('errors_externalLoginSuccess') - : this.localize.term('errors_externalLoginFailed'); - } else { - (component as UmbAppErrorElement).errorMessage = hasCode - ? this.localize.term('errors_externalLoginRedirectSuccess') - : this.localize.term('errors_externalLoginFailed'); - + if (!hasOwnOpener(this.backofficePath)) { this.observe(this.#authContext.authorizationSignal, () => { // Redirect to the saved state or root const url = retrieveStoredPath(); @@ -99,7 +98,7 @@ export class UmbAppElement extends UmbLitElement { } // Complete the authorization request, which will send the authorization signal - this.#authContext.completeAuthorizationRequest(); + this.#authContext.completeAuthorizationRequest().catch(() => undefined); }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts index 72e72090af2b..3fda364240ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts @@ -22,11 +22,11 @@ export function hasOwnOpener(pathname?: string, windowLike: Window = globalThis. return false; } - if (pathname && openerLocation.pathname !== pathname) { - return false; + if (pathname && openerLocation.pathname.startsWith(pathname)) { + return true; } - return true; + return false; } catch { // If there is a security error, it means that the opener is from a different origin, so we let it fall through return false; From 5856fd9612a784792d7239af4269b15136977938 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 25 Nov 2024 17:47:13 +0100 Subject: [PATCH 099/167] V15: npm updates 2024-11-15 (#17545) * build(deps): bump storybook from 8.3.5 to 8.4.4 * reenable public folder (with msw file) for storybook * build(deps-dev): bump vite from 5.4.6 to 5.4.11 * build(deps-dev): bump babel and rollup * build(deps-dev): bump typedoc from 0.26.5 to 0.26.11 * build(deps-dev): bump @hey-api/openapi-ts from 0.52.11 to 0.55.3 regenerated all models and migrated the config * build(deps-dev): bump eslint from 9.7.0 to 9.14.0 including related deps * build(deps-dev): bump all @types packages * build(deps-dev): bump lucide to 0.459.0 and simple-icons to 13.16.0 regenerate icons: - renamed `box-select` to `square-dashed` * build(deps): bump marked from 14.1.0 to 15.0.0 * build(deps): bump monaco-editor from 0.50.0 to 0.52.0 * build(deps): bump dumpurify from 3.1.6 to 3.2.0 * build(deps): make changes based on the dompurify upgrade where types are now an inherent part of the package * build(deps): bump diff from 5.2.0 to 7.0.0 * build(deps): bump element-internals-polyfill from 1.3.11 to 1.3.12 * build(deps): bump lit from 3.2.0 to 3.2.1 * build(deps-dev): bump globals from 15.8.0 to 15.12.0 (eslint dependency) * build(deps-dev): bump storybook dependencies * build(deps-dev): bump @web/dev-server deps * build(deps-dev): bump typescript from 5.5.3 to 5.6.3 * build(deps): bump uuid from 10.0.0 to 11.0.3 thereby eliminating the @types/uuid module * build(deps): bump tinymce-i18n from 24.7.15 to 24.11.11 * build(deps): bump all deps to latest and use backoffice global types for extension manifests * chore: change import path * build(deps-dev): bump rollup/plugin-commonjs to 26.0.3 for compatibility reasons * feat: replace outdated 'webworker-loader' with manual paths to monaco's web workers since they are esmodules anyway * build(deps-dev): bump storybook from 8.4.4 to 8.4.5 * build(deps): bump tiptap from 2.9.1 to 2.10.2 * build(deps): bump dompurify from 3.2.0 to 3.2.1 * build(deps): bump tinymce-i18n from 24.11.11 to 24.11.25 * build(deps): bump static icons * build(deps): bump marked from 15.0.0 to 15.0.2 * build(deps-dev): bump eslint + deps * build(deps-dev): bump vite + rollup dependencies * build(deps-dev): bump @playwright/test from 1.48.2 to 1.49.0 * build(deps-dev): bump @hey-api/openapi-ts from 0.55.3 to 0.57.1 generated new services * build(deps-dev): bump @types/mocha * build(deps): bump typescript from 5.6.3 to 5.7.2 --- .../devops/openapi-ts/openapi-ts.config.js | 22 +- .../openapi-ts/openapi-ts.dev.config.js | 17 +- .../openapi-ts/openapi-ts.local.config.js | 19 - src/Umbraco.Web.UI.Client/package-lock.json | 1452 +- src/Umbraco.Web.UI.Client/package.json | 126 +- .../src/external/backend-api/src/index.ts | 2 +- .../external/backend-api/src/schemas.gen.ts | 10906 ++++++++++++++++ .../src/{services.gen.ts => sdk.gen.ts} | 3118 ++--- .../src/external/backend-api/src/types.gen.ts | 1348 +- .../src/external/dompurify/index.ts | 2 +- .../src/external/monaco-editor/index.ts | 21 +- .../src/external/openid/crypto_utils.ts | 4 +- .../formatting-api/formatting.controller.ts | 6 +- .../document-blueprint.db.ts | 2 + .../src/mocks/data/document/document.db.ts | 2 + .../src/mocks/data/media/media.db.ts | 2 + .../core/icon-registry/icon-dictionary.json | 4 +- .../core/icon-registry/icons/icon-activity.ts | 2 +- .../core/icon-registry/icons/icon-add.ts | 2 +- .../icon-registry/icons/icon-addressbook.ts | 2 +- .../icon-registry/icons/icon-alarm-clock.ts | 2 +- .../icon-registry/icons/icon-alert-alt.ts | 2 +- .../core/icon-registry/icons/icon-alert.ts | 2 +- .../core/icon-registry/icons/icon-alt.ts | 2 +- .../core/icon-registry/icons/icon-anchor.ts | 2 +- .../core/icon-registry/icons/icon-app.ts | 2 +- .../icons/icon-application-error.ts | 2 +- .../icons/icon-application-window-alt.ts | 2 +- .../icons/icon-application-window.ts | 2 +- .../core/icon-registry/icons/icon-arrivals.ts | 2 +- .../icon-registry/icons/icon-arrow-down.ts | 2 +- .../icon-registry/icons/icon-arrow-left.ts | 2 +- .../icon-registry/icons/icon-arrow-right.ts | 2 +- .../core/icon-registry/icons/icon-arrow-up.ts | 2 +- .../icon-registry/icons/icon-attachment.ts | 2 +- .../icon-registry/icons/icon-audio-lines.ts | 2 +- .../core/icon-registry/icons/icon-autofill.ts | 2 +- .../core/icon-registry/icons/icon-award.ts | 2 +- .../icons/icon-axis-rotation-2.ts | 2 +- .../icons/icon-axis-rotation-3.ts | 2 +- .../icon-registry/icons/icon-axis-rotation.ts | 2 +- .../icon-registry/icons/icon-backspace.ts | 2 +- .../icon-registry/icons/icon-badge-add.ts | 2 +- .../icon-registry/icons/icon-badge-remove.ts | 2 +- .../icons/icon-badge-restricted.ts | 2 +- .../core/icon-registry/icons/icon-ball.ts | 2 +- .../icon-registry/icons/icon-bar-chart.ts | 2 +- .../core/icon-registry/icons/icon-barcode.ts | 2 +- .../core/icon-registry/icons/icon-bars.ts | 2 +- .../icon-registry/icons/icon-battery-full.ts | 2 +- .../icon-registry/icons/icon-battery-low.ts | 2 +- .../icon-registry/icons/icon-beer-glass.ts | 2 +- .../core/icon-registry/icons/icon-bell-off.ts | 2 +- .../core/icon-registry/icons/icon-bell.ts | 2 +- .../icon-registry/icons/icon-binarycode.ts | 2 +- .../icon-registry/icons/icon-binoculars.ts | 2 +- .../core/icon-registry/icons/icon-bird.ts | 2 +- .../icon-registry/icons/icon-birthday-cake.ts | 2 +- .../core/icon-registry/icons/icon-block.ts | 2 +- .../icon-registry/icons/icon-blockquote.ts | 2 +- .../icon-registry/icons/icon-bluetooth.ts | 2 +- .../icon-registry/icons/icon-boat-shipping.ts | 2 +- .../core/icon-registry/icons/icon-bold.ts | 2 +- .../core/icon-registry/icons/icon-bones.ts | 2 +- .../icon-registry/icons/icon-book-alt-2.ts | 2 +- .../core/icon-registry/icons/icon-book-alt.ts | 2 +- .../core/icon-registry/icons/icon-book.ts | 2 +- .../core/icon-registry/icons/icon-bookmark.ts | 2 +- .../core/icon-registry/icons/icon-books.ts | 2 +- .../core/icon-registry/icons/icon-box-alt.ts | 2 +- .../core/icon-registry/icons/icon-box-open.ts | 2 +- .../core/icon-registry/icons/icon-box.ts | 8 +- .../core/icon-registry/icons/icon-brackets.ts | 2 +- .../core/icon-registry/icons/icon-brick.ts | 2 +- .../icon-registry/icons/icon-briefcase.ts | 2 +- .../icons/icon-browser-window.ts | 2 +- .../icon-registry/icons/icon-brush-alt-2.ts | 2 +- .../icon-registry/icons/icon-brush-alt.ts | 2 +- .../core/icon-registry/icons/icon-brush.ts | 2 +- .../core/icon-registry/icons/icon-bug.ts | 2 +- .../icon-registry/icons/icon-bulleted-list.ts | 14 +- .../core/icon-registry/icons/icon-burn.ts | 2 +- .../core/icon-registry/icons/icon-bus.ts | 2 +- .../icon-registry/icons/icon-calculator.ts | 2 +- .../icon-registry/icons/icon-calendar-alt.ts | 2 +- .../core/icon-registry/icons/icon-calendar.ts | 2 +- .../icon-registry/icons/icon-camcorder.ts | 2 +- .../icon-registry/icons/icon-camera-roll.ts | 2 +- .../core/icon-registry/icons/icon-candy.ts | 2 +- .../icon-registry/icons/icon-caps-lock.ts | 2 +- .../core/icon-registry/icons/icon-car.ts | 2 +- .../icon-registry/icons/icon-categories.ts | 2 +- .../icon-registry/icons/icon-certificate.ts | 2 +- .../icon-registry/icons/icon-chart-curve.ts | 2 +- .../core/icon-registry/icons/icon-chart.ts | 2 +- .../icon-registry/icons/icon-chat-active.ts | 2 +- .../core/icon-registry/icons/icon-chat.ts | 2 +- .../core/icon-registry/icons/icon-check.ts | 2 +- .../icons/icon-checkbox-dotted.ts | 4 +- .../icons/icon-checkbox-empty.ts | 4 +- .../core/icon-registry/icons/icon-checkbox.ts | 2 +- .../core/icon-registry/icons/icon-chip-alt.ts | 2 +- .../core/icon-registry/icons/icon-chip.ts | 2 +- .../core/icon-registry/icons/icon-cinema.ts | 2 +- .../icons/icon-circle-dotted-active.ts | 2 +- .../icon-registry/icons/icon-circle-dotted.ts | 2 +- .../core/icon-registry/icons/icon-circuits.ts | 2 +- .../icons/icon-clear-formatting.ts | 2 +- .../core/icon-registry/icons/icon-client.ts | 2 +- .../icon-registry/icons/icon-cloud-drive.ts | 2 +- .../icon-registry/icons/icon-cloud-upload.ts | 2 +- .../core/icon-registry/icons/icon-cloud.ts | 2 +- .../core/icon-registry/icons/icon-cloudy.ts | 2 +- .../core/icon-registry/icons/icon-clubs.ts | 2 +- .../core/icon-registry/icons/icon-cocktail.ts | 2 +- .../core/icon-registry/icons/icon-code-xml.ts | 2 +- .../core/icon-registry/icons/icon-code.ts | 2 +- .../core/icon-registry/icons/icon-coffee.ts | 2 +- .../icon-registry/icons/icon-coin-dollar.ts | 2 +- .../icon-registry/icons/icon-coin-euro.ts | 2 +- .../icon-registry/icons/icon-coin-pound.ts | 2 +- .../core/icon-registry/icons/icon-coin-yen.ts | 2 +- .../icon-registry/icons/icon-coins-alt.ts | 2 +- .../core/icon-registry/icons/icon-coins.ts | 2 +- .../icon-registry/icons/icon-color-bucket.ts | 2 +- .../icon-registry/icons/icon-colorpicker.ts | 2 +- .../core/icon-registry/icons/icon-columns.ts | 2 +- .../icons/icon-combination-lock-open.ts | 2 +- .../icons/icon-combination-lock.ts | 2 +- .../core/icon-registry/icons/icon-command.ts | 2 +- .../core/icon-registry/icons/icon-company.ts | 2 +- .../core/icon-registry/icons/icon-compress.ts | 2 +- .../icon-registry/icons/icon-connection.ts | 2 +- .../core/icon-registry/icons/icon-console.ts | 2 +- .../core/icon-registry/icons/icon-contrast.ts | 2 +- .../icons/icon-conversation-alt.ts | 2 +- .../icon-registry/icons/icon-conversation.ts | 2 +- .../icon-registry/icons/icon-coverflow.ts | 2 +- .../icons/icon-credit-card-alt.ts | 2 +- .../icon-registry/icons/icon-credit-card.ts | 2 +- .../core/icon-registry/icons/icon-crop.ts | 2 +- .../icon-registry/icons/icon-crosshair.ts | 2 +- .../icon-registry/icons/icon-crown-alt.ts | 2 +- .../core/icon-registry/icons/icon-crown.ts | 2 +- .../core/icon-registry/icons/icon-cupcake.ts | 2 +- .../core/icon-registry/icons/icon-curve.ts | 2 +- .../core/icon-registry/icons/icon-cut.ts | 2 +- .../icon-registry/icons/icon-dashboard.ts | 2 +- .../core/icon-registry/icons/icon-database.ts | 2 +- .../core/icon-registry/icons/icon-defrag.ts | 2 +- .../icon-registry/icons/icon-delete-key.ts | 2 +- .../core/icon-registry/icons/icon-delete.ts | 2 +- .../icon-registry/icons/icon-departure.ts | 2 +- .../core/icon-registry/icons/icon-desktop.ts | 2 +- .../icon-registry/icons/icon-diagnostics.ts | 2 +- .../icons/icon-diagonal-arrow-alt.ts | 8 +- .../icons/icon-diagonal-arrow.ts | 8 +- .../core/icon-registry/icons/icon-diamond.ts | 2 +- .../core/icon-registry/icons/icon-diamonds.ts | 2 +- .../core/icon-registry/icons/icon-dice.ts | 2 +- .../icon-registry/icons/icon-diploma-alt.ts | 2 +- .../core/icon-registry/icons/icon-diploma.ts | 2 +- .../icons/icon-directions-alt.ts | 2 +- .../icon-registry/icons/icon-directions.ts | 2 +- .../core/icon-registry/icons/icon-disc.ts | 2 +- .../icon-registry/icons/icon-disk-image.ts | 2 +- .../core/icon-registry/icons/icon-display.ts | 2 +- .../core/icon-registry/icons/icon-dna.ts | 2 +- .../icons/icon-dock-connector.ts | 2 +- .../icon-registry/icons/icon-document-3d.ts | 2 +- .../icons/icon-document-chart-bar.ts | 2 +- .../icons/icon-document-chart-graph.ts | 2 +- .../icons/icon-document-command.ts | 2 +- .../icons/icon-document-dashed-line.ts | 2 +- .../icon-registry/icons/icon-document-font.ts | 2 +- .../icon-registry/icons/icon-document-html.ts | 2 +- .../icons/icon-document-image.ts | 2 +- .../icon-registry/icons/icon-document-js.ts | 2 +- .../icon-registry/icons/icon-document-key.ts | 2 +- .../icons/icon-document-medal.ts | 2 +- .../icon-registry/icons/icon-document-play.ts | 2 +- .../icons/icon-document-search.ts | 2 +- .../icons/icon-document-settings.ts | 2 +- .../icons/icon-document-spreadsheet.ts | 2 +- .../icon-registry/icons/icon-document-user.ts | 2 +- .../core/icon-registry/icons/icon-document.ts | 2 +- .../icon-registry/icons/icon-documents.ts | 2 +- .../core/icon-registry/icons/icon-donate.ts | 2 +- .../icon-registry/icons/icon-door-open-alt.ts | 2 +- .../icon-registry/icons/icon-door-open.ts | 2 +- .../icon-registry/icons/icon-download-alt.ts | 2 +- .../core/icon-registry/icons/icon-download.ts | 2 +- .../core/icon-registry/icons/icon-drop.ts | 2 +- .../core/icon-registry/icons/icon-eco.ts | 2 +- .../core/icon-registry/icons/icon-economy.ts | 2 +- .../core/icon-registry/icons/icon-edit.ts | 2 +- .../core/icon-registry/icons/icon-embed.ts | 2 +- .../core/icon-registry/icons/icon-employee.ts | 2 +- .../icons/icon-energy-saving-bulb.ts | 2 +- .../core/icon-registry/icons/icon-enter.ts | 2 +- .../icon-registry/icons/icon-equalizer.ts | 2 +- .../core/icon-registry/icons/icon-escape.ts | 2 +- .../core/icon-registry/icons/icon-ethernet.ts | 2 +- .../icons/icon-exit-fullscreen.ts | 2 +- .../core/icon-registry/icons/icon-eye.ts | 2 +- .../icon-registry/icons/icon-facebook-like.ts | 2 +- .../core/icon-registry/icons/icon-factory.ts | 2 +- .../core/icon-registry/icons/icon-favorite.ts | 2 +- .../icon-registry/icons/icon-file-cabinet.ts | 2 +- .../core/icon-registry/icons/icon-files.ts | 2 +- .../icon-registry/icons/icon-filter-arrows.ts | 2 +- .../core/icon-registry/icons/icon-filter.ts | 2 +- .../icon-registry/icons/icon-fingerprint.ts | 2 +- .../core/icon-registry/icons/icon-fire.ts | 2 +- .../core/icon-registry/icons/icon-firewire.ts | 2 +- .../core/icon-registry/icons/icon-flag-alt.ts | 2 +- .../core/icon-registry/icons/icon-flag.ts | 2 +- .../core/icon-registry/icons/icon-flash.ts | 2 +- .../icon-registry/icons/icon-flashlight.ts | 2 +- .../icon-registry/icons/icon-flowerpot.ts | 2 +- .../core/icon-registry/icons/icon-folder.ts | 2 +- .../core/icon-registry/icons/icon-folders.ts | 2 +- .../core/icon-registry/icons/icon-font.ts | 2 +- .../core/icon-registry/icons/icon-food.ts | 2 +- .../icon-registry/icons/icon-footprints.ts | 2 +- .../core/icon-registry/icons/icon-forking.ts | 2 +- .../icon-registry/icons/icon-frame-alt.ts | 2 +- .../core/icon-registry/icons/icon-frame.ts | 2 +- .../icons/icon-fullscreen-alt.ts | 2 +- .../icon-registry/icons/icon-fullscreen.ts | 2 +- .../core/icon-registry/icons/icon-game.ts | 2 +- .../core/icon-registry/icons/icon-geometry.ts | 2 +- .../core/icon-registry/icons/icon-gift.ts | 2 +- .../core/icon-registry/icons/icon-glasses.ts | 2 +- .../icon-registry/icons/icon-globe-alt.ts | 2 +- .../icon-registry/icons/icon-globe-asia.ts | 2 +- .../icons/icon-globe-europe-africa.ts | 2 +- .../icons/icon-globe-inverted-america.ts | 2 +- .../icons/icon-globe-inverted-asia.ts | 2 +- .../icon-globe-inverted-europe-africa.ts | 2 +- .../core/icon-registry/icons/icon-globe.ts | 2 +- .../core/icon-registry/icons/icon-gps.ts | 2 +- .../core/icon-registry/icons/icon-graduate.ts | 2 +- .../core/icon-registry/icons/icon-grid.ts | 2 +- .../core/icon-registry/icons/icon-hammer.ts | 2 +- .../icons/icon-hand-active-alt.ts | 2 +- .../icon-registry/icons/icon-hand-active.ts | 2 +- .../icons/icon-hand-pointer-alt.ts | 2 +- .../icon-registry/icons/icon-hand-pointer.ts | 2 +- .../icon-registry/icons/icon-handshake.ts | 2 +- .../icon-registry/icons/icon-handtool-alt.ts | 2 +- .../core/icon-registry/icons/icon-handtool.ts | 2 +- .../icons/icon-hard-drive-alt.ts | 2 +- .../icon-registry/icons/icon-hard-drive.ts | 2 +- .../icon-registry/icons/icon-heading-1.ts | 2 +- .../icon-registry/icons/icon-heading-2.ts | 2 +- .../icon-registry/icons/icon-heading-3.ts | 2 +- .../icon-registry/icons/icon-headphones.ts | 2 +- .../core/icon-registry/icons/icon-headset.ts | 2 +- .../core/icon-registry/icons/icon-hearts.ts | 2 +- .../core/icon-registry/icons/icon-height.ts | 8 +- .../core/icon-registry/icons/icon-help-alt.ts | 2 +- .../core/icon-registry/icons/icon-help.ts | 2 +- .../core/icon-registry/icons/icon-history.ts | 2 +- .../core/icon-registry/icons/icon-home.ts | 2 +- .../icons/icon-horizontal-rule.ts | 2 +- .../icon-registry/icons/icon-hourglass.ts | 2 +- .../core/icon-registry/icons/icon-imac.ts | 2 +- .../core/icon-registry/icons/icon-image-up.ts | 2 +- .../icon-registry/icons/icon-inbox-full.ts | 2 +- .../core/icon-registry/icons/icon-inbox.ts | 2 +- .../core/icon-registry/icons/icon-indent.ts | 10 +- .../core/icon-registry/icons/icon-infinity.ts | 2 +- .../core/icon-registry/icons/icon-info.ts | 2 +- .../core/icon-registry/icons/icon-invoice.ts | 2 +- .../core/icon-registry/icons/icon-ipad.ts | 2 +- .../core/icon-registry/icons/icon-iphone.ts | 2 +- .../core/icon-registry/icons/icon-italic.ts | 2 +- .../icons/icon-item-arrangement.ts | 2 +- .../core/icon-registry/icons/icon-junk.ts | 2 +- .../core/icon-registry/icons/icon-key.ts | 2 +- .../core/icon-registry/icons/icon-keyboard.ts | 2 +- .../core/icon-registry/icons/icon-lab.ts | 2 +- .../core/icon-registry/icons/icon-laptop.ts | 2 +- .../icon-registry/icons/icon-layers-alt.ts | 2 +- .../core/icon-registry/icons/icon-layers.ts | 2 +- .../core/icon-registry/icons/icon-layout.ts | 2 +- .../icons/icon-left-double-arrow.ts | 2 +- .../core/icon-registry/icons/icon-legal.ts | 2 +- .../core/icon-registry/icons/icon-lense.ts | 2 +- .../core/icon-registry/icons/icon-library.ts | 2 +- .../icon-registry/icons/icon-light-down.ts | 2 +- .../core/icon-registry/icons/icon-light-up.ts | 2 +- .../icons/icon-lightbulb-active.ts | 2 +- .../icon-registry/icons/icon-lightbulb.ts | 2 +- .../icon-registry/icons/icon-lightning.ts | 2 +- .../core/icon-registry/icons/icon-link.ts | 2 +- .../core/icon-registry/icons/icon-list.ts | 8 +- .../core/icon-registry/icons/icon-load.ts | 2 +- .../core/icon-registry/icons/icon-loading.ts | 2 +- .../core/icon-registry/icons/icon-locate.ts | 2 +- .../icons/icon-location-near-me.ts | 2 +- .../icons/icon-location-nearby.ts | 2 +- .../core/icon-registry/icons/icon-lock.ts | 2 +- .../core/icon-registry/icons/icon-log-out.ts | 2 +- .../core/icon-registry/icons/icon-logout.ts | 2 +- .../core/icon-registry/icons/icon-loupe.ts | 2 +- .../core/icon-registry/icons/icon-magnet.ts | 2 +- .../core/icon-registry/icons/icon-mailbox.ts | 2 +- .../core/icon-registry/icons/icon-map-alt.ts | 2 +- .../icon-registry/icons/icon-map-location.ts | 2 +- .../icon-registry/icons/icon-map-marker.ts | 2 +- .../core/icon-registry/icons/icon-map.ts | 2 +- .../core/icon-registry/icons/icon-medal.ts | 2 +- .../icons/icon-medical-emergency.ts | 2 +- .../core/icon-registry/icons/icon-medicine.ts | 2 +- .../core/icon-registry/icons/icon-meeting.ts | 2 +- .../icon-registry/icons/icon-megaphone.ts | 2 +- .../core/icon-registry/icons/icon-merge.ts | 2 +- .../icon-registry/icons/icon-message-open.ts | 2 +- .../icons/icon-message-unopened.ts | 2 +- .../core/icon-registry/icons/icon-message.ts | 2 +- .../icon-registry/icons/icon-microscope.ts | 2 +- .../core/icon-registry/icons/icon-mindmap.ts | 2 +- .../core/icon-registry/icons/icon-mobile.ts | 2 +- .../core/icon-registry/icons/icon-mountain.ts | 2 +- .../icon-registry/icons/icon-mouse-cursor.ts | 2 +- .../core/icon-registry/icons/icon-mouse.ts | 2 +- .../icon-registry/icons/icon-movie-alt.ts | 2 +- .../core/icon-registry/icons/icon-movie.ts | 2 +- .../icons/icon-multiple-credit-cards.ts | 2 +- .../icons/icon-multiple-windows.ts | 2 +- .../core/icon-registry/icons/icon-music.ts | 2 +- .../icon-registry/icons/icon-name-badge.ts | 2 +- .../icons/icon-navigation-bottom.ts | 2 +- .../icons/icon-navigation-down.ts | 2 +- .../icons/icon-navigation-first.ts | 2 +- .../icons/icon-navigation-horizontal.ts | 8 +- .../icons/icon-navigation-last.ts | 2 +- .../icons/icon-navigation-left.ts | 2 +- .../icons/icon-navigation-right.ts | 2 +- .../icons/icon-navigation-road.ts | 8 +- .../icons/icon-navigation-top.ts | 2 +- .../icon-registry/icons/icon-navigation-up.ts | 2 +- .../icons/icon-navigation-vertical.ts | 8 +- .../icon-registry/icons/icon-navigation.ts | 14 +- .../icons/icon-navigational-arrow.ts | 2 +- .../icon-registry/icons/icon-network-alt.ts | 2 +- .../icon-registry/icons/icon-newspaper-alt.ts | 2 +- .../icon-registry/icons/icon-newspaper.ts | 2 +- .../icon-registry/icons/icon-next-media.ts | 2 +- .../core/icon-registry/icons/icon-next.ts | 2 +- .../core/icon-registry/icons/icon-nodes.ts | 2 +- .../icon-registry/icons/icon-notepad-alt.ts | 2 +- .../core/icon-registry/icons/icon-notepad.ts | 2 +- .../core/icon-registry/icons/icon-old-key.ts | 2 +- .../icon-registry/icons/icon-old-phone.ts | 2 +- .../core/icon-registry/icons/icon-operator.ts | 2 +- .../icon-registry/icons/icon-ordered-list.ts | 10 +- .../core/icon-registry/icons/icon-origami.ts | 2 +- .../core/icon-registry/icons/icon-out.ts | 2 +- .../core/icon-registry/icons/icon-outbox.ts | 2 +- .../core/icon-registry/icons/icon-outdent.ts | 10 +- .../core/icon-registry/icons/icon-page-add.ts | 2 +- .../icon-registry/icons/icon-page-down.ts | 2 +- .../icon-registry/icons/icon-page-remove.ts | 2 +- .../icons/icon-page-restricted.ts | 2 +- .../core/icon-registry/icons/icon-page-up.ts | 2 +- .../icon-registry/icons/icon-paint-roller.ts | 2 +- .../core/icon-registry/icons/icon-palette.ts | 2 +- .../icon-registry/icons/icon-panel-show.ts | 2 +- .../icon-registry/icons/icon-pannel-close.ts | 2 +- .../icon-registry/icons/icon-paper-bag.ts | 2 +- .../icons/icon-paper-plane-alt.ts | 2 +- .../icon-registry/icons/icon-paper-plane.ts | 2 +- .../icon-registry/icons/icon-partly-cloudy.ts | 2 +- .../core/icon-registry/icons/icon-paste-in.ts | 2 +- .../core/icon-registry/icons/icon-pause.ts | 2 +- .../core/icon-registry/icons/icon-pc.ts | 2 +- .../icon-registry/icons/icon-people-alt-2.ts | 2 +- .../icon-registry/icons/icon-people-alt.ts | 2 +- .../icon-registry/icons/icon-people-female.ts | 2 +- .../core/icon-registry/icons/icon-people.ts | 2 +- .../icon-registry/icons/icon-phone-ring.ts | 2 +- .../core/icon-registry/icons/icon-phone.ts | 2 +- .../icon-registry/icons/icon-photo-album.ts | 2 +- .../core/icon-registry/icons/icon-picture.ts | 2 +- .../icons/icon-pictures-alt-2.ts | 2 +- .../icon-registry/icons/icon-pictures-alt.ts | 2 +- .../core/icon-registry/icons/icon-pictures.ts | 2 +- .../icon-registry/icons/icon-pie-chart.ts | 2 +- .../icon-registry/icons/icon-piggy-bank.ts | 2 +- .../icon-registry/icons/icon-pin-location.ts | 2 +- .../core/icon-registry/icons/icon-plane.ts | 2 +- .../core/icon-registry/icons/icon-planet.ts | 2 +- .../core/icon-registry/icons/icon-play.ts | 2 +- .../icon-registry/icons/icon-playing-cards.ts | 2 +- .../core/icon-registry/icons/icon-playlist.ts | 2 +- .../core/icon-registry/icons/icon-plugin.ts | 2 +- .../core/icon-registry/icons/icon-podcast.ts | 2 +- .../core/icon-registry/icons/icon-poll.ts | 2 +- .../core/icon-registry/icons/icon-post-it.ts | 2 +- .../icon-registry/icons/icon-power-outlet.ts | 2 +- .../core/icon-registry/icons/icon-power.ts | 2 +- .../icon-registry/icons/icon-presentation.ts | 2 +- .../icons/icon-previous-media.ts | 2 +- .../core/icon-registry/icons/icon-previous.ts | 2 +- .../icon-registry/icons/icon-price-dollar.ts | 2 +- .../icon-registry/icons/icon-price-euro.ts | 2 +- .../icon-registry/icons/icon-price-pound.ts | 2 +- .../icon-registry/icons/icon-price-yen.ts | 2 +- .../core/icon-registry/icons/icon-print.ts | 2 +- .../icon-registry/icons/icon-printer-alt.ts | 2 +- .../icon-registry/icons/icon-projector.ts | 2 +- .../core/icon-registry/icons/icon-pulse.ts | 2 +- .../core/icon-registry/icons/icon-pushpin.ts | 2 +- .../core/icon-registry/icons/icon-qr-code.ts | 2 +- .../core/icon-registry/icons/icon-quote.ts | 2 +- .../icon-registry/icons/icon-radio-alt.ts | 2 +- .../icons/icon-radio-receiver.ts | 2 +- .../core/icon-registry/icons/icon-radio.ts | 2 +- .../core/icon-registry/icons/icon-rain.ts | 2 +- .../core/icon-registry/icons/icon-rate.ts | 4 +- .../core/icon-registry/icons/icon-re-post.ts | 2 +- .../core/icon-registry/icons/icon-readonly.ts | 2 +- .../icon-registry/icons/icon-receipt-alt.ts | 2 +- .../icon-registry/icons/icon-reception.ts | 2 +- .../core/icon-registry/icons/icon-record.ts | 2 +- .../icons/icon-rectangle-ellipsis.ts | 2 +- .../core/icon-registry/icons/icon-redo.ts | 2 +- .../core/icon-registry/icons/icon-refresh.ts | 2 +- .../core/icon-registry/icons/icon-remote.ts | 2 +- .../core/icon-registry/icons/icon-remove.ts | 2 +- .../icon-registry/icons/icon-repeat-one.ts | 2 +- .../core/icon-registry/icons/icon-repeat.ts | 2 +- .../icon-registry/icons/icon-reply-arrow.ts | 2 +- .../core/icon-registry/icons/icon-resize.ts | 2 +- .../icon-registry/icons/icon-return-to-top.ts | 2 +- .../icons/icon-right-double-arrow.ts | 2 +- .../core/icon-registry/icons/icon-roadsign.ts | 2 +- .../core/icon-registry/icons/icon-rocket.ts | 2 +- .../core/icon-registry/icons/icon-rss.ts | 2 +- .../icon-registry/icons/icon-ruler-alt.ts | 2 +- .../core/icon-registry/icons/icon-ruler.ts | 2 +- .../icons/icon-satellite-dish.ts | 2 +- .../core/icon-registry/icons/icon-save.ts | 2 +- .../core/icon-registry/icons/icon-scan.ts | 2 +- .../core/icon-registry/icons/icon-school.ts | 6 +- .../core/icon-registry/icons/icon-science.ts | 2 +- .../icon-registry/icons/icon-screensharing.ts | 2 +- .../icon-registry/icons/icon-script-alt.ts | 2 +- .../core/icon-registry/icons/icon-script.ts | 2 +- .../core/icon-registry/icons/icon-scull.ts | 2 +- .../core/icon-registry/icons/icon-search.ts | 2 +- .../core/icon-registry/icons/icon-sensor.ts | 2 +- .../icon-registry/icons/icon-server-alt.ts | 2 +- .../core/icon-registry/icons/icon-server.ts | 2 +- .../icon-registry/icons/icon-settings-alt.ts | 2 +- .../core/icon-registry/icons/icon-settings.ts | 2 +- .../icon-registry/icons/icon-share-alt.ts | 2 +- .../core/icon-registry/icons/icon-share.ts | 2 +- .../icons/icon-sharing-iphone.ts | 2 +- .../core/icon-registry/icons/icon-shield.ts | 2 +- .../core/icon-registry/icons/icon-shift.ts | 2 +- .../icon-registry/icons/icon-shipping-box.ts | 2 +- .../core/icon-registry/icons/icon-shipping.ts | 2 +- .../core/icon-registry/icons/icon-shoe.ts | 2 +- .../icons/icon-shopping-basket-alt-2.ts | 2 +- .../icons/icon-shopping-basket-alt.ts | 2 +- .../icons/icon-shopping-basket.ts | 2 +- .../core/icon-registry/icons/icon-shuffle.ts | 2 +- .../core/icon-registry/icons/icon-sience.ts | 2 +- .../icon-registry/icons/icon-single-note.ts | 2 +- .../core/icon-registry/icons/icon-sitemap.ts | 2 +- .../core/icon-registry/icons/icon-sleep.ts | 2 +- .../icon-registry/icons/icon-slideshow.ts | 2 +- .../icons/icon-smiley-inverted.ts | 2 +- .../core/icon-registry/icons/icon-smiley.ts | 2 +- .../core/icon-registry/icons/icon-snow.ts | 2 +- .../icon-registry/icons/icon-sound-low.ts | 2 +- .../icon-registry/icons/icon-sound-medium.ts | 2 +- .../icon-registry/icons/icon-sound-off.ts | 2 +- .../icon-registry/icons/icon-sound-waves.ts | 2 +- .../core/icon-registry/icons/icon-sound.ts | 2 +- .../core/icon-registry/icons/icon-spades.ts | 2 +- .../core/icon-registry/icons/icon-speaker.ts | 2 +- .../icon-registry/icons/icon-speed-gauge.ts | 2 +- .../icon-registry/icons/icon-split-alt.ts | 2 +- .../core/icon-registry/icons/icon-split.ts | 2 +- .../core/icon-registry/icons/icon-sprout.ts | 2 +- .../icon-registry/icons/icon-squiggly-line.ts | 2 +- .../core/icon-registry/icons/icon-ssd.ts | 2 +- .../icon-registry/icons/icon-stacked-disks.ts | 2 +- .../core/icon-registry/icons/icon-stamp.ts | 2 +- .../core/icon-registry/icons/icon-star.ts | 4 +- .../core/icon-registry/icons/icon-stop-alt.ts | 2 +- .../icon-registry/icons/icon-stop-hand.ts | 2 +- .../core/icon-registry/icons/icon-stop.ts | 2 +- .../core/icon-registry/icons/icon-store.ts | 2 +- .../core/icon-registry/icons/icon-stream.ts | 2 +- .../icon-registry/icons/icon-strikethrough.ts | 2 +- .../icon-registry/icons/icon-subscript.ts | 2 +- .../core/icon-registry/icons/icon-sunny.ts | 2 +- .../icon-registry/icons/icon-superscript.ts | 2 +- .../icon-registry/icons/icon-sweatshirt.ts | 2 +- .../core/icon-registry/icons/icon-sync.ts | 2 +- .../core/icon-registry/icons/icon-t-shirt.ts | 2 +- .../core/icon-registry/icons/icon-tab-key.ts | 2 +- .../core/icon-registry/icons/icon-table.ts | 2 +- .../core/icon-registry/icons/icon-tag.ts | 2 +- .../core/icon-registry/icons/icon-tags.ts | 2 +- .../icon-registry/icons/icon-takeaway-cup.ts | 2 +- .../core/icon-registry/icons/icon-target.ts | 2 +- .../icons/icon-temperatrure-alt.ts | 2 +- .../icon-registry/icons/icon-temperature.ts | 2 +- .../core/icon-registry/icons/icon-terminal.ts | 2 +- .../icons/icon-text-align-center.ts | 8 +- .../icons/icon-text-align-justify.ts | 8 +- .../icons/icon-text-align-left.ts | 8 +- .../icons/icon-text-align-right.ts | 8 +- .../core/icon-registry/icons/icon-theater.ts | 2 +- .../icon-registry/icons/icon-thumb-down.ts | 2 +- .../core/icon-registry/icons/icon-thumb-up.ts | 2 +- .../icons/icon-thumbnail-list.ts | 2 +- .../icons/icon-thumbnails-small.ts | 2 +- .../icon-registry/icons/icon-thumbnails.ts | 2 +- .../core/icon-registry/icons/icon-ticket.ts | 2 +- .../core/icon-registry/icons/icon-time.ts | 2 +- .../core/icon-registry/icons/icon-timer.ts | 2 +- .../core/icon-registry/icons/icon-tools.ts | 2 +- .../core/icon-registry/icons/icon-top.ts | 2 +- .../icon-registry/icons/icon-traffic-alt.ts | 2 +- .../core/icon-registry/icons/icon-trafic.ts | 2 +- .../core/icon-registry/icons/icon-train.ts | 2 +- .../icon-registry/icons/icon-trash-alt-2.ts | 2 +- .../icon-registry/icons/icon-trash-alt.ts | 2 +- .../core/icon-registry/icons/icon-trash.ts | 2 +- .../core/icon-registry/icons/icon-tree.ts | 2 +- .../core/icon-registry/icons/icon-trophy.ts | 2 +- .../core/icon-registry/icons/icon-truck.ts | 2 +- .../core/icon-registry/icons/icon-tv-old.ts | 2 +- .../core/icon-registry/icons/icon-tv.ts | 2 +- .../icon-registry/icons/icon-umb-content.ts | 2 +- .../icon-registry/icons/icon-umb-developer.ts | 2 +- .../icon-registry/icons/icon-umb-manifest.ts | 4 +- .../icon-registry/icons/icon-umb-media.ts | 2 +- .../icon-registry/icons/icon-umb-settings.ts | 2 +- .../icon-registry/icons/icon-umb-users.ts | 2 +- .../core/icon-registry/icons/icon-umbrella.ts | 2 +- .../icon-registry/icons/icon-underline.ts | 2 +- .../core/icon-registry/icons/icon-undo.ts | 2 +- .../core/icon-registry/icons/icon-unlink.ts | 2 +- .../core/icon-registry/icons/icon-unlocked.ts | 2 +- .../core/icon-registry/icons/icon-unplug.ts | 2 +- .../core/icon-registry/icons/icon-untitled.ts | 2 +- .../icon-registry/icons/icon-usb-connector.ts | 2 +- .../core/icon-registry/icons/icon-usb.ts | 2 +- .../icon-registry/icons/icon-user-female.ts | 2 +- .../icons/icon-user-females-alt.ts | 2 +- .../icon-registry/icons/icon-user-females.ts | 2 +- .../icon-registry/icons/icon-user-glasses.ts | 2 +- .../core/icon-registry/icons/icon-user.ts | 2 +- .../icon-registry/icons/icon-users-alt.ts | 2 +- .../core/icon-registry/icons/icon-users.ts | 2 +- .../icon-registry/icons/icon-utilities.ts | 2 +- .../core/icon-registry/icons/icon-vcard.ts | 2 +- .../core/icon-registry/icons/icon-video.ts | 2 +- .../core/icon-registry/icons/icon-voice.ts | 2 +- .../icon-registry/icons/icon-wall-plug.ts | 2 +- .../core/icon-registry/icons/icon-wallet.ts | 2 +- .../core/icon-registry/icons/icon-wand.ts | 2 +- .../core/icon-registry/icons/icon-webhook.ts | 2 +- .../core/icon-registry/icons/icon-weight.ts | 2 +- .../core/icon-registry/icons/icon-width.ts | 8 +- .../core/icon-registry/icons/icon-wifi.ts | 2 +- .../icon-registry/icons/icon-window-popin.ts | 2 +- .../icon-registry/icons/icon-window-popout.ts | 2 +- .../icon-registry/icons/icon-window-sizes.ts | 2 +- .../icon-registry/icons/icon-wine-glass.ts | 2 +- .../core/icon-registry/icons/icon-wrench.ts | 2 +- .../core/icon-registry/icons/icon-wrong.ts | 2 +- .../core/icon-registry/icons/icon-zip.ts | 2 +- .../core/icon-registry/icons/icon-zom-out.ts | 2 +- .../core/icon-registry/icons/icon-zoom-in.ts | 2 +- .../core/icon-registry/icons/icon-zoom-out.ts | 2 +- .../src/packages/ufm/contexts/ufm.context.ts | 6 +- .../src/rollup.config.js | 8 +- src/Umbraco.Web.UI.Client/vite.config.ts | 8 +- src/Umbraco.Web.UI.Login/package-lock.json | 2211 +++- src/Umbraco.Web.UI.Login/package.json | 10 +- .../src/localization/manifests.ts | 146 +- src/Umbraco.Web.UI.Login/tsconfig.json | 39 +- 592 files changed, 16275 insertions(+), 4482 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.local.config.js create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/schemas.gen.ts rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/{services.gen.ts => sdk.gen.ts} (96%) diff --git a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.config.js b/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.config.js index 012b35b47cc5..a86fd9d42689 100644 --- a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.config.js +++ b/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.config.js @@ -1,18 +1,22 @@ import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ - client: 'fetch', - input: 'https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v15/dev/src/Umbraco.Cms.Api.Management/OpenApi.json', + client: 'legacy/fetch', + debug: true, + input: '../Umbraco.Cms.Api.Management/OpenApi.json', output: { path: 'src/external/backend-api/src', format: 'prettier', lint: 'eslint', }, - schemas: false, - services: { - asClass: true, - }, - types: { - enums: 'typescript', - }, + plugins: [ + { + name: '@hey-api/typescript', + enums: 'typescript' + }, + { + name: '@hey-api/sdk', + asClass: true + } + ] }); diff --git a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.dev.config.js b/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.dev.config.js index 3507acc928a5..5d84fc988f60 100644 --- a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.dev.config.js +++ b/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.dev.config.js @@ -1,19 +1,8 @@ import { defineConfig } from '@hey-api/openapi-ts'; +import defaultConfig from './openapi-ts.config'; + export default defineConfig({ - client: 'fetch', - debug: true, + ...defaultConfig, input: 'http://localhost:11000/umbraco/swagger/management/swagger.json', - output: { - path: 'src/external/backend-api/src', - format: 'prettier', - lint: 'eslint', - }, - schemas: false, - services: { - asClass: true, - }, - types: { - enums: 'typescript', - }, }); diff --git a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.local.config.js b/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.local.config.js deleted file mode 100644 index 35a11ca85b76..000000000000 --- a/src/Umbraco.Web.UI.Client/devops/openapi-ts/openapi-ts.local.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from '@hey-api/openapi-ts'; - -export default defineConfig({ - client: 'fetch', - debug: true, - input: '../Umbraco.Cms.Api.Management/OpenApi.json', - output: { - path: 'src/external/backend-api/src', - format: 'prettier', - lint: 'eslint', - }, - schemas: false, - services: { - asClass: true, - }, - types: { - enums: 'typescript', - }, -}); diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 4d4a13cc8b01..e674baea87e7 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -12,95 +12,92 @@ "./src/packages/*" ], "dependencies": { - "@tiptap/core": "^2.9.1", - "@tiptap/extension-image": "^2.9.1", - "@tiptap/extension-link": "^2.9.1", - "@tiptap/extension-placeholder": "^2.9.1", - "@tiptap/extension-subscript": "^2.9.1", - "@tiptap/extension-superscript": "^2.9.1", - "@tiptap/extension-table": "^2.9.1", - "@tiptap/extension-table-cell": "^2.9.1", - "@tiptap/extension-table-header": "^2.9.1", - "@tiptap/extension-table-row": "^2.9.1", - "@tiptap/extension-text-align": "^2.9.1", - "@tiptap/extension-underline": "^2.9.1", - "@tiptap/pm": "^2.9.1", - "@tiptap/starter-kit": "^2.9.1", - "@types/diff": "^5.2.1", - "@types/dompurify": "^3.0.5", - "@types/uuid": "^10.0.0", + "@tiptap/core": "^2.10.2", + "@tiptap/extension-image": "^2.10.2", + "@tiptap/extension-link": "^2.10.2", + "@tiptap/extension-placeholder": "^2.10.2", + "@tiptap/extension-subscript": "^2.10.2", + "@tiptap/extension-superscript": "^2.10.2", + "@tiptap/extension-table": "^2.10.2", + "@tiptap/extension-table-cell": "^2.10.2", + "@tiptap/extension-table-header": "^2.10.2", + "@tiptap/extension-table-row": "^2.10.2", + "@tiptap/extension-text-align": "^2.10.2", + "@tiptap/extension-underline": "^2.10.2", + "@tiptap/pm": "^2.10.2", + "@tiptap/starter-kit": "^2.10.2", + "@types/diff": "^6.0.0", "@umbraco-ui/uui": "^1.12.1", "@umbraco-ui/uui-css": "^1.12.1", "base64-js": "^1.5.1", - "diff": "^5.2.0", - "dompurify": "^3.1.6", - "element-internals-polyfill": "^1.3.11", - "lit": "^3.2.0", - "marked": "^14.1.0", - "monaco-editor": "^0.50.0", + "diff": "^7.0.0", + "dompurify": "^3.2.1", + "element-internals-polyfill": "^1.3.12", + "lit": "^3.2.1", + "marked": "^15.0.2", + "monaco-editor": "^0.52.0", "rxjs": "^7.8.1", "tinymce": "^6.8.3", - "tinymce-i18n": "^24.7.15", - "uuid": "^10.0.0" + "tinymce-i18n": "^24.11.25", + "uuid": "^11.0.3" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@eslint/js": "^9.9.1", - "@hey-api/openapi-ts": "^0.52.11", + "@babel/core": "^7.26.0", + "@eslint/js": "^9.15.0", + "@hey-api/openapi-ts": "^0.57.1", "@open-wc/testing": "^4.0.0", - "@playwright/test": "^1.48.2", - "@rollup/plugin-commonjs": "^26.0.1", + "@playwright/test": "^1.49.0", + "@rollup/plugin-commonjs": "^26.0.3", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.7", - "@storybook/addon-a11y": "^8.3.5", - "@storybook/addon-actions": "^8.3.5", - "@storybook/addon-essentials": "^8.3.5", - "@storybook/addon-links": "^8.3.5", - "@storybook/web-components": "^8.3.5", - "@storybook/web-components-vite": "^8.3.5", - "@types/chai": "^5.0.0", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", + "@storybook/addon-a11y": "^8.4.5", + "@storybook/addon-actions": "^8.4.5", + "@storybook/addon-essentials": "^8.4.5", + "@storybook/addon-links": "^8.4.5", + "@storybook/web-components": "^8.4.5", + "@storybook/web-components-vite": "^8.4.5", + "@types/chai": "^5.0.1", "@types/eslint__js": "^8.42.3", - "@types/mocha": "^10.0.7", - "@web/dev-server-esbuild": "^1.0.2", + "@types/mocha": "^10.0.10", + "@web/dev-server-esbuild": "^1.0.3", "@web/dev-server-import-maps": "^0.2.1", "@web/dev-server-rollup": "^0.6.4", - "@web/test-runner": "^0.18.3", + "@web/test-runner": "^0.19.0", "@web/test-runner-playwright": "^0.11.0", "babel-loader": "^9.2.1", - "eslint": "^9.7.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.11.0", - "eslint-plugin-lit": "^1.14.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsdoc": "^50.5.0", + "eslint-plugin-lit": "^1.15.0", "eslint-plugin-local-rules": "^3.0.2", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-wc": "^2.1.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-wc": "^2.2.0", "glob": "^11.0.0", - "globals": "^15.8.0", - "lucide-static": "^0.446.0", + "globals": "^15.12.0", + "lucide-static": "^0.460.0", "madge": "^8.0.0", "msw": "^1.3.2", "playwright-msw": "^3.0.1", "prettier": "3.3.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "remark-gfm": "^4.0.0", - "rollup": "^4.22.4", + "rollup": "^4.27.4", "rollup-plugin-esbuild": "^6.1.1", - "rollup-plugin-import-css": "^3.5.0", - "rollup-plugin-web-worker-loader": "^1.6.1", - "simple-icons": "^13.1.0", - "storybook": "^8.3.5", + "rollup-plugin-import-css": "^3.5.7", + "simple-icons": "^13.18.0", + "storybook": "^8.4.5", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.10", - "typedoc": "^0.26.5", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", + "typedoc": "^0.26.11", + "typescript": "^5.7.2", + "typescript-eslint": "^8.15.0", "typescript-json-schema": "^0.65.1", - "vite": "^5.4.6", - "vite-plugin-static-copy": "^1.0.6", - "vite-tsconfig-paths": "^4.3.2", + "vite": "^5.4.11", + "vite-plugin-static-copy": "^2.1.0", + "vite-tsconfig-paths": "^5.1.3", "web-component-analyzer": "^2.0.0" }, "engines": { @@ -123,9 +120,9 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.0.tgz", - "integrity": "sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog==", + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", "dev": true, "license": "MIT", "dependencies": { @@ -432,15 +429,15 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.46.0.tgz", - "integrity": "sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==", + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", "dev": true, "license": "MIT", "dependencies": { "comment-parser": "1.4.1", "esquery": "^1.6.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { "node": ">=16" @@ -897,9 +894,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -912,9 +909,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", - "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -922,9 +919,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", "dependencies": { @@ -959,9 +956,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", - "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "dev": true, "license": "MIT", "engines": { @@ -979,9 +976,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", - "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1016,14 +1013,14 @@ "license": "BSD-3-Clause" }, "node_modules/@hey-api/openapi-ts": { - "version": "0.52.11", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.52.11.tgz", - "integrity": "sha512-S3NrCQDxy7AtW5sx8OVoBaqpaYNqYsD0y6YNwhUXPUahbrW7Wxm/N4RIEsRtXVbcjUqdAjo1FmFmeyEKYziJkw==", + "version": "0.57.1", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.57.1.tgz", + "integrity": "sha512-CZ2W1Ma4Z1zPI2M7mR5wfgTvDnxYenv/zAiX4wYgUX3n8GlWWjRkAQ02TgwBiHD3T9isR2zPyub/8rqyZ5yIsA==", "dev": true, - "license": "MIT", + "license": "FSL-1.1-MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "11.7.0", - "c12": "1.11.1", + "@apidevtools/json-schema-ref-parser": "11.7.2", + "c12": "2.0.1", "commander": "12.1.0", "handlebars": "4.7.8" }, @@ -1033,6 +1030,9 @@ "engines": { "node": "^18.0.0 || >=20.0.0" }, + "funding": { + "url": "https://github.com/sponsors/hey-api" + }, "peerDependencies": { "typescript": "^5.x" } @@ -1405,13 +1405,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz", - "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz", + "integrity": "sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.48.2" + "playwright": "1.49.0" }, "bin": { "playwright": "cli.js" @@ -1421,13 +1421,13 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", - "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz", + "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.3.7", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.4.0", @@ -1622,9 +1622,9 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", - "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", + "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1667,9 +1667,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz", - "integrity": "sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", + "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", "cpu": [ "arm" ], @@ -1681,9 +1681,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.25.0.tgz", - "integrity": "sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", + "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", "cpu": [ "arm64" ], @@ -1695,9 +1695,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.25.0.tgz", - "integrity": "sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", "cpu": [ "arm64" ], @@ -1709,9 +1709,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", - "integrity": "sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", "cpu": [ "x64" ], @@ -1723,9 +1723,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.25.0.tgz", - "integrity": "sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", + "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", "cpu": [ "arm64" ], @@ -1737,9 +1737,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.25.0.tgz", - "integrity": "sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", + "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", "cpu": [ "x64" ], @@ -1751,9 +1751,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.25.0.tgz", - "integrity": "sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", + "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", "cpu": [ "arm" ], @@ -1765,9 +1765,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.25.0.tgz", - "integrity": "sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", + "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", "cpu": [ "arm" ], @@ -1779,9 +1779,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.25.0.tgz", - "integrity": "sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", + "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", "cpu": [ "arm64" ], @@ -1793,9 +1793,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.25.0.tgz", - "integrity": "sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", + "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", "cpu": [ "arm64" ], @@ -1807,9 +1807,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.25.0.tgz", - "integrity": "sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", + "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", "cpu": [ "ppc64" ], @@ -1821,9 +1821,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.25.0.tgz", - "integrity": "sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", + "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", "cpu": [ "riscv64" ], @@ -1835,9 +1835,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.25.0.tgz", - "integrity": "sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", + "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", "cpu": [ "s390x" ], @@ -1849,9 +1849,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.25.0.tgz", - "integrity": "sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", "cpu": [ "x64" ], @@ -1863,9 +1863,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.25.0.tgz", - "integrity": "sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", + "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", "cpu": [ "x64" ], @@ -1877,9 +1877,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.25.0.tgz", - "integrity": "sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", + "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", "cpu": [ "arm64" ], @@ -1891,9 +1891,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.25.0.tgz", - "integrity": "sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", + "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", "cpu": [ "ia32" ], @@ -1905,9 +1905,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.25.0.tgz", - "integrity": "sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", + "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", "cpu": [ "x64" ], @@ -1982,13 +1982,13 @@ "license": "MIT" }, "node_modules/@storybook/addon-a11y": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.4.2.tgz", - "integrity": "sha512-v6Tl+qr3Eslf06qmt2hq1ticYi7oRLIFosePQUOlW1+cgdIbV+r1IxsZ7creCDWX4kIMTbUFhbET9LTYGHem1A==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.4.5.tgz", + "integrity": "sha512-lqIOpWJZNR0Ur+2zUcnFAMvdOe7kYEDeXPv1TM7fwEGyzKPYoM/k5xPA2cJCrYwtydxOqqrmn1jUIw0Qdkhuhg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-highlight": "8.4.2", + "@storybook/addon-highlight": "8.4.5", "axe-core": "^4.2.0" }, "funding": { @@ -1996,13 +1996,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-actions": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.2.tgz", - "integrity": "sha512-+hA200XN5aeA4T3jq8IifQq6Y+9FyNQ0Q+blM1L0Tl7WLzBc7B1kHQnKvhSj5pvMSBWc/Q/kY7Ev5t9gdOu13g==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.5.tgz", + "integrity": "sha512-rbB19uiGJ61XHbKIbS1a9bUS6re5L8rT5NMNeEJhCxXRpFUPrlTXMSoD/Pgcn3ENeEMVZsm8/eCzxAVgAP3Mgg==", "dev": true, "license": "MIT", "dependencies": { @@ -2017,7 +2017,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-actions/node_modules/@types/uuid": { @@ -2042,9 +2042,9 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.2.tgz", - "integrity": "sha512-s4uag5VKuk8q2MSnuNS7Sv+v1/mykzGPXe/zZRW2ammtkdHp8Uy78eQS2G0aiG02chXCX+qQgWMyy5QItDcTFQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.5.tgz", + "integrity": "sha512-FeMt4qHCMYDQiLGGDKiRuSPXFup2WXOaZSdL137v1W36wEL/vGkK1A5iQt1qJ8MZzL5WZQuedox8rSybFy7eow==", "dev": true, "license": "MIT", "dependencies": { @@ -2057,13 +2057,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-controls": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.2.tgz", - "integrity": "sha512-raCbHEj1xl4F3wKH6IdfEXNRaxKpY4QGhjSTE8Pte5iJSVhKG86taLqqRr+4dC7H1/LVMPU1XCGV4mkgDGtyxQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.5.tgz", + "integrity": "sha512-RVTtDDuESLYc1+SJQv2kI7wzBddzAS9uoEe8P75quN6S4pC0GxAB6xirWZ2+WOcba4eHosY+PxMwuBXQfH78Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -2076,20 +2076,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-docs": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.2.tgz", - "integrity": "sha512-jIpykha7hv2Inlrq31ZoYg2QhuCuvcO+Q+uvhT45RDTB+2US/fg3rJINKlw2Djq8RPPOXvty5W0yvE6CrWKhnQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.5.tgz", + "integrity": "sha512-zPELIl7wXormOylVaaSpkUIuuCCxrO+OFPMKZnlENt6zSReyy0dJu4V0tzfV8FCw+V4D6Y4wrLRk/TIG951Ojw==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.4.2", - "@storybook/csf-plugin": "8.4.2", - "@storybook/react-dom-shim": "8.4.2", + "@storybook/blocks": "8.4.5", + "@storybook/csf-plugin": "8.4.5", + "@storybook/react-dom-shim": "8.4.5", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", "ts-dedent": "^2.0.0" @@ -2099,25 +2099,25 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-essentials": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.2.tgz", - "integrity": "sha512-+/vfPrXM/GWU3Kbrg92PepwAZr7lOeulTTYF4THK0CL3DfUUlkGNpBPLP5PtjCuIkVrTCjXiIEdVWk47d5m2+w==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.5.tgz", + "integrity": "sha512-AxetQo/zSPIu3RZqWG2opwAz22Bb+jpf1nWbHp0kEpCrBemcWd8X2gonVmXNOC1PDKNl3jcWyc3lmg/+3mxjYg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/addon-actions": "8.4.2", - "@storybook/addon-backgrounds": "8.4.2", - "@storybook/addon-controls": "8.4.2", - "@storybook/addon-docs": "8.4.2", - "@storybook/addon-highlight": "8.4.2", - "@storybook/addon-measure": "8.4.2", - "@storybook/addon-outline": "8.4.2", - "@storybook/addon-toolbars": "8.4.2", - "@storybook/addon-viewport": "8.4.2", + "@storybook/addon-actions": "8.4.5", + "@storybook/addon-backgrounds": "8.4.5", + "@storybook/addon-controls": "8.4.5", + "@storybook/addon-docs": "8.4.5", + "@storybook/addon-highlight": "8.4.5", + "@storybook/addon-measure": "8.4.5", + "@storybook/addon-outline": "8.4.5", + "@storybook/addon-toolbars": "8.4.5", + "@storybook/addon-viewport": "8.4.5", "ts-dedent": "^2.0.0" }, "funding": { @@ -2125,13 +2125,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.2.tgz", - "integrity": "sha512-vTtwp7nyJ09SXrsMnH+pukCjHjRMjQXgHZHxvbrv09uoH8ldQMv9B7u+X+9Wcy/jYSKFz/ng7pWo4b4a2oXHkg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.5.tgz", + "integrity": "sha512-sMA7v+4unaKY+5RDhow6lLncJqNX9ZLUnBIt3vzY1ntUsOYVwykAY1Hq4Ysj0luCBXjJJdJ6223ylrycnb7Ilw==", "dev": true, "license": "MIT", "dependencies": { @@ -2142,13 +2142,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-links": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.4.2.tgz", - "integrity": "sha512-8nncReA/drR2cyAcUz484FIv+MXbyCQxYrA6yfWHthZfGu+vMIETvhh+eP4OpluVnxySoQ+hCVK/V8G2jcyAZg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.4.5.tgz", + "integrity": "sha512-ac3OtplFdrPw/2jtLnteuVllwu2yCe3sgKJS9AbdYMT/65OW47M7oDnzcpRPsDGufrKlDMBJXXEv4SfTtlT+rg==", "dev": true, "license": "MIT", "dependencies": { @@ -2162,7 +2162,7 @@ }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.2" + "storybook": "^8.4.5" }, "peerDependenciesMeta": { "react": { @@ -2171,9 +2171,9 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.2.tgz", - "integrity": "sha512-z+j6xQwcUBSpgzl1XDU+xU4YYgLraLMljECW7NvRNyJ/PYixvol8R3wtzWbr+CBpxmvbXjEJCPlF+EjF9/mBWQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.5.tgz", + "integrity": "sha512-+sNjew991YaoXQyWWloFybjEGrDO40Jk6w8BgZs2X7oc3D5t/6oFzvyC862U++LGqKFA3quXDeBjEb92CI9cRA==", "dev": true, "license": "MIT", "dependencies": { @@ -2185,13 +2185,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-outline": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.2.tgz", - "integrity": "sha512-oTMlPEyT4CBqzcQbfemoJzJ6yzeRAmvrAx9ssaBcnQQRsKxo0D2Ri/Jmm6SNcR0yBHxYRkvIH+2phLw8aiflCQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.5.tgz", + "integrity": "sha512-XlpN98AUDnWQWNFSFVm+HkRUzm3xIUMjBGTkv6HsL6zt6XoJ+LsQMca+PPtYqlBJA+5CU41xMDaG8HC/p+sd3A==", "dev": true, "license": "MIT", "dependencies": { @@ -2203,13 +2203,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.2.tgz", - "integrity": "sha512-DidzW/NQS224niMJIjcJI2ls83emqygUcS9GYNGgdc5Xwro/TPgGYOXP2qnXgYUxXQTHbrxmIbHdEehxC7CcYQ==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.5.tgz", + "integrity": "sha512-hOq5560ONOU/qrslrwosWzxnC4nrF8HZWD43ciKwtethm8HuptU2M+Jrui1CRsMScEZLopWWVE9o0vJMdKpIFQ==", "dev": true, "license": "MIT", "funding": { @@ -2217,13 +2217,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.2.tgz", - "integrity": "sha512-qVQ2UaxCNsUSFHnAAAizNPIJ/QwfMg7p5bBdpYROTZXJe+bxVp0rFzZmQgHZ3/sn+lzE4ItM4QEfxkfQUWi1ag==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.5.tgz", + "integrity": "sha512-l7Y41gIbJAsIN/QCg1QJ9sr61FLz1C/imUotcDej41tOHxUTSQOlXpNtVnfhUM1vGQc0yNpP3pVxj8BpXi0cAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2234,13 +2234,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/blocks": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.2.tgz", - "integrity": "sha512-yAAvmOWaD8gIrepOxCh/RxQqd/1xZIwd/V+gsvAhW/thawN+SpI+zK63gmcqAPLX84hJ3Dh5pegRk0SoHNuDVA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.5.tgz", + "integrity": "sha512-Z+LHauSqm3A4HBR9pUEf9KQhD3/3xYMt0FXgA+GHCAyDa6lFeD1C6r9Y2nlT+9dt8gv9B9oygTZvV6GqFVyRSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2255,7 +2255,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.2" + "storybook": "^8.4.5" }, "peerDependenciesMeta": { "react": { @@ -2267,13 +2267,13 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.2.tgz", - "integrity": "sha512-dO5FB5yH1C6tr/kBHn1frvGwp8Pt0D1apgXWkJ5ITWEUfh6WwOqX2fqsWsqaNwE7gP0qn0XgwCIEkI/4Mj55SA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.5.tgz", + "integrity": "sha512-fZXWQcG5ccHCAS8NbyUwu8/5aVlZr4zmWbvKxoyvcVeuxJIsWa9RUS8Mtu7hdi+r/Wk8AlpckqhHo6go0iaDcA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "8.4.2", + "@storybook/csf-plugin": "8.4.5", "browser-assert": "^1.2.1", "ts-dedent": "^2.0.0" }, @@ -2282,14 +2282,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2", + "storybook": "^8.4.5", "vite": "^4.0.0 || ^5.0.0" } }, "node_modules/@storybook/components": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.2.tgz", - "integrity": "sha512-+W59oF7D73LAxLNmCfFrfs98cH9pyNHK9HlJoO5/lKbK4IdWhhOoqUR/AJ3ueksoLuetFat4DxyE8SN1H4Bvrg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.5.tgz", + "integrity": "sha512-2PdnKfqNNv3sO7qILgWXiNvmLOi503oN9OMemNCQjTIvdvySc5JpS9/eClwcl/JfmE4qHdSHZr8dLLkBM9S7+Q==", "dev": true, "license": "MIT", "funding": { @@ -2301,9 +2301,9 @@ } }, "node_modules/@storybook/core": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.2.tgz", - "integrity": "sha512-hF8GWoUZTjwwuV5j4OLhMHZtZQL/NYcVUBReC2Ba06c8PkFIKqKZwATr1zKd301gQ5Qwcn9WgmZxJTMgdKQtOg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.5.tgz", + "integrity": "sha512-aB1sQNX5nRoUAqg5u1py0MuR/VPd6c6PhECa4rW6pmr7kZcfyP4PP6UFpXuN71ypTQlkRE3Vc5PQZ3gLhE9o3g==", "dev": true, "license": "MIT", "dependencies": { @@ -2378,9 +2378,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.2.tgz", - "integrity": "sha512-1f0t6W5xbC1sSAHHs3uXYPIQs2NXAEtIGqn6X9i3xbbub6hDS8PF8BIm7dOjQ8dZOPp7d9ltR64V5CoLlsOigA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.5.tgz", + "integrity": "sha512-qd2rQTglOTS+phQmTbNTXNjNyxdGvolaqHqDNMw3Vf6h9o3U+mLkwnDWNVnQ9oqvOoUEAqpBthgwzU9FhkIk+A==", "dev": true, "license": "MIT", "dependencies": { @@ -2391,7 +2391,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/global": { @@ -2416,9 +2416,9 @@ } }, "node_modules/@storybook/manager-api": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.2.tgz", - "integrity": "sha512-rhPc4cgQDKDH8NUyRh/ZaJW7QIhR/PO5MNX4xc+vz71sM2nO7ONA/FrgLtCuu4SULdwilEPvGefYvLK0dE+Caw==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.5.tgz", + "integrity": "sha512-t39JaMy3UX4StbUH/tIDcaflBDxTcyIq853wQtBMhVL3e1+Dw3MIiiG/5bw79HU4R7kSmPVLXIIbV3FmXkq7KQ==", "dev": true, "license": "MIT", "funding": { @@ -2430,9 +2430,9 @@ } }, "node_modules/@storybook/preview-api": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.2.tgz", - "integrity": "sha512-5X/xvIvDPaWJKUBCo5zVeBbbjkhnwcI2KPkuOgrHVRRhuQ5WqD0RYxVtOOFNyQXme7g0nNl5RFNgvT7qv9qGeg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.5.tgz", + "integrity": "sha512-MKIZ2jQO/3cUdsT57eq8jRgB6inALo9BxrQ88f7mqzltOkMvADvTAY6y8JZqTUoDzWTH/ny/8SGGdtpqlxRuiQ==", "dev": true, "license": "MIT", "funding": { @@ -2444,9 +2444,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.2.tgz", - "integrity": "sha512-FZVTM1f34FpGnf6e3MDIKkz05gmn8H9wEccvQAgr8pEFe8VWfrpVWeUrmatSAfgrCMNXYC1avDend8UX6IM8Fg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.5.tgz", + "integrity": "sha512-YTWTfPagptEYXJsnxAl3zP97Ev0zebtaEV0WgjGaEeumr+zsfgKKwzzHxgrtumBmDzwkuKlzFwlQB5A8keOIGA==", "dev": true, "license": "MIT", "funding": { @@ -2456,13 +2456,13 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/theming": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.2.tgz", - "integrity": "sha512-9j4fnu5LcV+qSs1rdwf61Bt14lms0T1LOZkHxGNcS1c1oH+cPS+sxECh2lxtni+mvOAHUlBs9pKhVZzRPdWpvg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.5.tgz", + "integrity": "sha512-45e/jeG4iuqdZcHg3PbB6dwXQTwlnnEB7r/QcVExyC7ibrkTnjUfvxzyUw4mmU3CXETFGD5EcUobFkgK+/aPxQ==", "dev": true, "license": "MIT", "funding": { @@ -2474,17 +2474,17 @@ } }, "node_modules/@storybook/web-components": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-8.4.2.tgz", - "integrity": "sha512-hySg4dsp9Q3oilSLHZM7xQte8x6OGnrRl3RuHzfSXNvsy5FqBpUM0r0sE84lxVpdLzfwBg5PoQaRPj/0nyTrMg==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-8.4.5.tgz", + "integrity": "sha512-7cLYOOWFUSIlrAvzIZuSbl9JAaovqaYUGO25MrPlrfx4ldGN/36P57haKf9vaMJHM4sm9f8yMfgMhsvHITLxkA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "8.4.2", + "@storybook/components": "8.4.5", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.4.2", - "@storybook/preview-api": "8.4.2", - "@storybook/theming": "8.4.2", + "@storybook/manager-api": "8.4.5", + "@storybook/preview-api": "8.4.5", + "@storybook/theming": "8.4.5", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, @@ -2497,18 +2497,18 @@ }, "peerDependencies": { "lit": "^2.0.0 || ^3.0.0", - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@storybook/web-components-vite": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-8.4.2.tgz", - "integrity": "sha512-qsg+xOLBRe4GjvWArHEisZpnQvV8tCTVrkRoVXgdM5J2sNb75EYwaIWWQRAb5LWWI6FELbqqc4MdcvRsM1rY6w==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-8.4.5.tgz", + "integrity": "sha512-oslxwipKKfQ0jDJ0sPDcOi0xsNcHoiVbZjOAbmx4fTjnnKE3/Rc2RA4YttKrOUS7CP3AzqiwHtoWjppjoYCJng==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/builder-vite": "8.4.2", - "@storybook/web-components": "8.4.2", + "@storybook/builder-vite": "8.4.5", + "@storybook/web-components": "8.4.5", "magic-string": "^0.30.0" }, "engines": { @@ -2519,13 +2519,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.2" + "storybook": "^8.4.5" } }, "node_modules/@tiptap/core": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.9.1.tgz", - "integrity": "sha512-tifnLL/ARzQ6/FGEJjVwj9UT3v+pENdWHdk9x6F3X0mB1y0SeCjV21wpFLYESzwNdBPAj8NMp8Behv7dBnhIfw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.2.tgz", + "integrity": "sha512-jYLXbYHTi1stLla/74J8NJizDtcJ/uokhG+1gN4DMWHDujaZOrRZhW98o9gN5BYAp4zv//TVX8H+afLZwKGCKQ==", "license": "MIT", "funding": { "type": "github", @@ -2536,9 +2536,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.9.1.tgz", - "integrity": "sha512-Y0jZxc/pdkvcsftmEZFyG+73um8xrx6/DMfgUcNg3JAM63CISedNcr+OEI11L0oFk1KFT7/aQ9996GM6Kubdqg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.2.tgz", + "integrity": "sha512-whmep+v0VvBI9Kg5TJ4sKIj7Z+MOjBKAndP0qn1bMoqPNNVRxt92iIud72wfXwfBNcrYiGNlssvsAnPwXfbG9w==", "license": "MIT", "funding": { "type": "github", @@ -2549,9 +2549,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.9.1.tgz", - "integrity": "sha512-e2P1zGpnnt4+TyxTC5pX/lPxPasZcuHCYXY0iwQ3bf8qRQQEjDfj3X7EI+cXqILtnhOiviEOcYmeu5op2WhQDg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.2.tgz", + "integrity": "sha512-1KNTXA8HDkhXblkfeRYDdqAu/Xz2fygyaSrvabrfzg5QVYyVYPNJwjrtfTQNyzWOejBVGE3mOyqnjlLUzPmyYA==", "license": "MIT", "funding": { "type": "github", @@ -2562,9 +2562,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.9.1.tgz", - "integrity": "sha512-0hizL/0j9PragJObjAWUVSuGhN1jKjCFnhLQVRxtx4HutcvS/lhoWMvFg6ZF8xqWgIa06n6A7MaknQkqhTdhKA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.2.tgz", + "integrity": "sha512-jXtTQXZ3j2cyG2dNyVnGauIbsX8CmDY56MJfDg1p+1UZ3zW2GVbKHfvyuulsjobxEd0DNLxduGqbkDY7x3I+HA==", "license": "MIT", "funding": { "type": "github", @@ -2575,9 +2575,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.9.1.tgz", - "integrity": "sha512-WQqcVGe7i/E+yO3wz5XQteU1ETNZ00euUEl4ylVVmH2NM4Dh0KDjEhbhHlCM0iCfLUo7jhjC7dmS+hMdPUb+Tg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.2.tgz", + "integrity": "sha512-VV14oeOsJ3VqUEjuUl+lzSW/IBLhurmcj9IiN2sq/Voin04dwvtchqP5fNXgmM3+rFM88zNOsbX0e4uSG4R10w==", "license": "MIT", "funding": { "type": "github", @@ -2588,9 +2588,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.9.1.tgz", - "integrity": "sha512-A/50wPWDqEUUUPhrwRKILP5gXMO5UlQ0F6uBRGYB9CEVOREam9yIgvONOnZVJtszHqOayjIVMXbH/JMBeq11/g==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.2.tgz", + "integrity": "sha512-Y/wkK9Ni4ALGqiGezov62p6cpPcJauBfn2wF1lgJVr6XJ4na5KTCUEbiyBZNbo3aD52vZKgWt8LpLvJ2/5STSw==", "license": "MIT", "funding": { "type": "github", @@ -2602,9 +2602,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.9.1.tgz", - "integrity": "sha512-1a+HCoDPnBttjqExfYLwfABq8MYdiowhy/wp8eCxVb6KGFEENO53KapstISvPzqH7eOi+qRjBB1KtVYb/ZXicg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.2.tgz", + "integrity": "sha512-Xodp6rMg6vtKZkyX3I6gVd6OZ9PNz9udhDLdCG6JscVJQPO8viV++39UOH416FCvRT46BdHWNCRu/xjUG1C0rA==", "license": "MIT", "funding": { "type": "github", @@ -2615,9 +2615,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.9.1.tgz", - "integrity": "sha512-wJZspSmJRkDBtPkzFz1g7gvZOEOayk8s93UHsgbJxcV4VWHYleZ5XhT74sZunSjefNDm3qC6v2BSgLp3vNHVKQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.2.tgz", + "integrity": "sha512-pzkD6Y9r3x4Mb6KqpuPraGNNfxIkQD6dJNtZ9PpU9jVtJDjsGIGdyzCbVJq984UAPBamXiF/5DLwlON7buLd6A==", "license": "MIT", "funding": { "type": "github", @@ -2629,9 +2629,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.9.1.tgz", - "integrity": "sha512-jsRBmX01vr+5H02GljiHMo0n5H1vzoMLmFarxe0Yq2d2l9G/WV2VWX2XnGliqZAYWd1bI0phs7uLQIN3mxGQTw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.2.tgz", + "integrity": "sha512-Uj2hIYC5zRPGI9xBYFwtld8JrZ8YZXEqO7sN5VcOwt12cnSmvzga86jUKpj3WOMP/8KamLWW8m8UKHd7Qg1kMA==", "license": "MIT", "funding": { "type": "github", @@ -2643,9 +2643,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.9.1.tgz", - "integrity": "sha512-fCuaOD/b7nDjm47PZ58oanq7y4ccS2wjPh42Qm0B0yipu/1fmC8eS1SmaXmk28F89BLtuL6uOCtR1spe+lZtlQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.2.tgz", + "integrity": "sha512-jEVKEe8I+Ai/qYjVf6Idg2Gpp1Cxn4O4twJ0MnlEdzoaEHgt/OTU5NO0PBZMpoe/4BkOvkETZmqRbrcGsapeYQ==", "license": "MIT", "funding": { "type": "github", @@ -2656,9 +2656,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.9.1.tgz", - "integrity": "sha512-SjZowzLixOFaCrV2cMaWi1mp8REK0zK1b3OcVx7bCZfVSmsOETJyrAIUpCKA8o60NwF7pwhBg0MN8oXlNKMeFw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.2.tgz", + "integrity": "sha512-OfvE+epZSyB0TbV5/4GdvRPMT1kd0fbgLUEaldWMZOLw/4eOGWZ8yXAtrWkoRMLZfOclgnDfwXvXJLnWXrDdDw==", "license": "MIT", "funding": { "type": "github", @@ -2669,9 +2669,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.9.1.tgz", - "integrity": "sha512-wp9qR1NM+LpvyLZFmdNaAkDq0d4jDJ7z7Fz7icFQPu31NVxfQYO3IXNmvJDCNu8hFAbImpA5aG8MBuwzRo0H9w==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.2.tgz", + "integrity": "sha512-Hr5cvYgOAP7vaRD5vbMjirTATFe/zYqnzePhq1c9TQESOi2o0zKxWpZIcHbFFIXCjHLSnpXOZ4yFwHP4k12rgg==", "license": "MIT", "funding": { "type": "github", @@ -2683,9 +2683,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.9.1.tgz", - "integrity": "sha512-ydUhABeaBI1CoJp+/BBqPhXINfesp1qMNL/jiDcMsB66fsD4nOyphpAJT7FaRFZFtQVF06+nttBtFZVkITQVqg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.2.tgz", + "integrity": "sha512-DqaCUxjXnoVN/yylEjoGIlvKkT1KF8mwFJncJn8oSAukYEaSAK056ETvmyZk+/bzc3aRpfv0Kfn/zmLfHZ3wnA==", "license": "MIT", "funding": { "type": "github", @@ -2697,9 +2697,9 @@ } }, "node_modules/@tiptap/extension-image": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.9.1.tgz", - "integrity": "sha512-aGqJnsuS8oagIhsx7wetm8jw4NEDsOV0OSx4FQ4VPlUqWlnzK0N+erFKKJmXTdAxL8PGzoPSlITFH63MV3eV3Q==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.10.2.tgz", + "integrity": "sha512-xaJOVeR/fWozJMVKjYhskecsbayUUm1tIbjE+SyG7IW3Jp+081/W9z2nyfXG6YNnuVjYq+uLejR2Bt0cnEZvmA==", "license": "MIT", "funding": { "type": "github", @@ -2710,9 +2710,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.9.1.tgz", - "integrity": "sha512-VkNA6Vz96+/+7uBlsgM7bDXXx4b62T1fDam/3UKifA72aD/fZckeWrbT7KrtdUbzuIniJSbA0lpTs5FY29+86Q==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.2.tgz", + "integrity": "sha512-6p1YkJEWHuMROzNrK+GFJamujBswpydfR3ZMpIjQTLr4hRhSGrde/B5WODRDS+3JiK1xcN16ZQVPFsRJaHMjfQ==", "license": "MIT", "funding": { "type": "github", @@ -2723,9 +2723,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.9.1.tgz", - "integrity": "sha512-yG+e3e8cCCN9dZjX4ttEe3e2xhh58ryi3REJV4MdiEkOT9QF75Bl5pUbMIS4tQ8HkOr04QBFMHKM12kbSxg1BA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.2.tgz", + "integrity": "sha512-bgsWdinDPGEiMD0NgphpKaxm4l9+PbPwdLDGDFyEX069VAyuSN4y63Sn32clpwlLcibVu3JxVFClJ+o6wKtmdg==", "license": "MIT", "dependencies": { "linkifyjs": "^4.1.0" @@ -2740,9 +2740,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.9.1.tgz", - "integrity": "sha512-6O4NtYNR5N2Txi4AC0/4xMRJq9xd4+7ShxCZCDVL0WDVX37IhaqMO7LGQtA6MVlYyNaX4W1swfdJaqrJJ5HIUw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.2.tgz", + "integrity": "sha512-NE800m/QCk58MUcfeeCqmDjgOuiwHddaZvCCQIpErZdI2Y0io9RsSYU3HHEFPIfbKsv/ykVTYbwSweTPs1Tmxw==", "license": "MIT", "funding": { "type": "github", @@ -2753,9 +2753,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.9.1.tgz", - "integrity": "sha512-6J9jtv1XP8dW7/JNSH/K4yiOABc92tBJtgCsgP8Ep4+fjfjdj4HbjS1oSPWpgItucF2Fp/VF8qg55HXhjxHjTw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.2.tgz", + "integrity": "sha512-1WYknf7/feouoBN7jW9Z6fvN9gzS1WRaOrDVkLZQ2ZLgT+Bs8H8/r1pv23q8Un6lg0mApwqnUxNhLOOrVyDkGQ==", "license": "MIT", "funding": { "type": "github", @@ -2766,9 +2766,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.9.1.tgz", - "integrity": "sha512-JOmT0xd4gd3lIhLwrsjw8lV+ZFROKZdIxLi0Ia05XSu4RLrrvWj0zdKMSB+V87xOWfSB3Epo95zAvnPox5Q16A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.2.tgz", + "integrity": "sha512-EZG9W5rsU4uP585cIOrhbAPOUsgqrFbDrj1tZjTbvv0EWK03Un3FGYoGilkcUIxD9uB/XVHP+v2596Ifyi/dvQ==", "license": "MIT", "funding": { "type": "github", @@ -2779,9 +2779,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.9.1.tgz", - "integrity": "sha512-Q/w3OOg/C6jGBf4QKEWKF9k+iaCQCgPoaIg2IDTPx8QmaxRfgoVE5Csd+oTOY/brdmSNXOxykZWEci6OJP+MbA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.10.2.tgz", + "integrity": "sha512-QWzih69SetWYiylQzHsK29dMR8z1ParfcEw05hy3yyWqXE1DiKEot6rOGV1xenMVEA/SNGYYhQia15Bvco95TA==", "license": "MIT", "funding": { "type": "github", @@ -2793,9 +2793,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.9.1.tgz", - "integrity": "sha512-V5aEXdML+YojlPhastcu7w4biDPwmzy/fWq0T2qjfu5Te/THcqDmGYVBKESBm5x6nBy5OLkanw2O+KHu2quDdg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.2.tgz", + "integrity": "sha512-TjrBbO6UbXCt55hV9wRE7h5R/jLTB+z2yn2blz1TfR7wKkX3tJOnb+ptvIHEVFGJOjkZP6Xaj+aAkGVg5dKZYA==", "license": "MIT", "funding": { "type": "github", @@ -2806,9 +2806,9 @@ } }, "node_modules/@tiptap/extension-subscript": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.9.1.tgz", - "integrity": "sha512-jjfuHmF2dCUAtHmJH2K/7HhOCleM3aPVOI/UsBBYa8xM4mDU4xuW1O5sLAr2JWcB1xxyk9YKcBWwyRq+b1ENFA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.10.2.tgz", + "integrity": "sha512-V6fxOl7+WWckXJfE9vx4c9Ab7PIc+lCH59WSwyp20Qe+tbEw6Qw1oP+qvwI82v3+XAhkexIlfhlMkwIoqKSTtA==", "license": "MIT", "funding": { "type": "github", @@ -2819,9 +2819,9 @@ } }, "node_modules/@tiptap/extension-superscript": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.9.1.tgz", - "integrity": "sha512-7cgAPpUNgO/3QdvCN9/6dWP6JQC641o8dSgkyv0XzVv0nxISck4SU+2eADRYQLyP2s4M3xuSEFhCCiKZleK2yA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.10.2.tgz", + "integrity": "sha512-Cw4T99cgOMEqjjFrse2q8EBE9z8kDuCyGdkVYozrVtF+PRs1oyicp+JFKxm43fV5hMHtj/r4a8soIF93ll1JnA==", "license": "MIT", "funding": { "type": "github", @@ -2832,9 +2832,9 @@ } }, "node_modules/@tiptap/extension-table": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.9.1.tgz", - "integrity": "sha512-OmWZFZOSZwSSEvoVUkDsRFyCXTYei/pV396Xjv9pfFzXQkVbfq/CjTp61zvb/9mmEz3rcfvfG7G39eRlZTvBNg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.10.2.tgz", + "integrity": "sha512-T7hzHEB090KsAy0VS4wogcjwauKHlYorQKrBxxZHzE6n6w6Zi0Cz00qJnAb6oYgKrMCTredcxnWUH8PmWlehYg==", "license": "MIT", "funding": { "type": "github", @@ -2846,9 +2846,9 @@ } }, "node_modules/@tiptap/extension-table-cell": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.9.1.tgz", - "integrity": "sha512-/wrcniLdhMhs5M2NDetFcfq510N5to7YKK+52KOXNotBI8K/GjMmGmtwWEKPITD0/RgYrXzpMcta/O+/0OCOPQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.10.2.tgz", + "integrity": "sha512-FmppE53gmg/PTdtxAMsGP13SZc03dVKsH94l/Jj60gU5xPnjR6424+SETdotjAQdFCBRTYoci2BCP+22e/FTzw==", "license": "MIT", "funding": { "type": "github", @@ -2859,9 +2859,9 @@ } }, "node_modules/@tiptap/extension-table-header": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.9.1.tgz", - "integrity": "sha512-KtI01636Du1IB/I3pe9ZJWKkOc6INqAaIw+RFirRCnd8Xnik7tJfAwdhXzoPRcer6ViZmlzSrM2dkwaZCF7gcw==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.10.2.tgz", + "integrity": "sha512-1kmWgKrrHSC38sB+IWwYnBmRFot8u3PntneHIpQoo11wcVkEWUNZ9lmhEKMawnKan5h2yDVlUsPMR9QB/iarsQ==", "license": "MIT", "funding": { "type": "github", @@ -2872,9 +2872,9 @@ } }, "node_modules/@tiptap/extension-table-row": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.9.1.tgz", - "integrity": "sha512-Wq7QlI/S5iX4UCAdX+ok/szegVMbvrM3H8o6jwO+G4p8JJt6iv7ZmEnJ19xIINhmiKsrdanqH9FFK4tQ3yvQ0A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.10.2.tgz", + "integrity": "sha512-htS8ld4HD0zl7g0C/V9szdAX8Cjz9+ckr8qGrJy6yJS9ByS2x0VnV5fT73WUCx0zlNOrr1hcedlvDUTEPvzSuQ==", "license": "MIT", "funding": { "type": "github", @@ -2885,9 +2885,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.9.1.tgz", - "integrity": "sha512-3wo9uCrkLVLQFgbw2eFU37QAa1jq1/7oExa+FF/DVxdtHRS9E2rnUZ8s2hat/IWzvPUHXMwo3Zg2XfhoamQpCA==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.2.tgz", + "integrity": "sha512-7WaJCmHAnf24gZc+Bl64vZgjAFt0CSEc5Jr+f3GII6XeCkZpTCJX85po2MFUhBRZMJheyctyL+UfsRauo/iP0Q==", "license": "MIT", "funding": { "type": "github", @@ -2898,9 +2898,9 @@ } }, "node_modules/@tiptap/extension-text-align": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.9.1.tgz", - "integrity": "sha512-oUp0XnwJpAImcOVV68vsY2CpkHpRZ3gzWfIRTuy+aYitQim3xDKis/qfWQUWZsANp9/TZ0VyjtkZxNMwOfcu1g==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.10.2.tgz", + "integrity": "sha512-eDvks4fUZuOuAhWD8/HJ070g2OQlEnBpak2+huvzPhGdYP81vhx5OWk/rfF6WzLzxLwnDND2zvk3YL+RBqERZQ==", "license": "MIT", "funding": { "type": "github", @@ -2911,9 +2911,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.9.1.tgz", - "integrity": "sha512-LAxc0SeeiPiAVBwksczeA7BJSZb6WtVpYhy5Esvy9K0mK5kttB4KxtnXWeQzMIJZQbza65yftGKfQlexf/Y7yg==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.2.tgz", + "integrity": "sha512-dWx5Ean7Rb6rdqO6C/i0qIIABKHFsABZj0mTDr0/ZXsw3V2O4d1cP13evvcc7HMLNAXziRTtWCVU6M06vwM/Pw==", "license": "MIT", "funding": { "type": "github", @@ -2924,9 +2924,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.9.1.tgz", - "integrity": "sha512-IrUsIqKPgD7GcAjr4D+RC0WvLHUDBTMkD8uPNEoeD1uH9t9zFyDfMRPnx/z3/6Gf6fTh3HzLcHGibiW2HiMi2A==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.10.2.tgz", + "integrity": "sha512-jDWGqqUYkrLgqRQDyqh+LpbkiqPfaWOoo5bydYL0u80GPEavovxZPoCJ/HDlOfdwm+FIPy55OP/29tELJRptmg==", "license": "MIT", "funding": { "type": "github", @@ -2937,29 +2937,29 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.9.1.tgz", - "integrity": "sha512-mvV86fr7kEuDYEApQ2uMPCKL2uagUE0BsXiyyz3KOkY1zifyVm1fzdkscb24Qy1GmLzWAIIihA+3UHNRgYdOlQ==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.2.tgz", + "integrity": "sha512-jEgC79uvuEl51XxulutUJPSlhkoY0xQc9R/G4MQltAi+JxJ+KE/pOxgqziWNxBpgUzQqloupjod0kLhLUL4Cig==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.0", + "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.0", + "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.22.3", + "prosemirror-model": "^1.23.0", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.4.0", + "prosemirror-tables": "^1.6.1", "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.0", - "prosemirror-view": "^1.34.3" + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.36.0" }, "funding": { "type": "github", @@ -2967,32 +2967,32 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.9.1.tgz", - "integrity": "sha512-nsw6UF/7wDpPfHRhtGOwkj1ipIEiWZS1VGw+c14K61vM1CNj0uQ4jogbHwHZqN1dlL5Hh+FCqUHDPxG6ECbijg==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.9.1", - "@tiptap/extension-blockquote": "^2.9.1", - "@tiptap/extension-bold": "^2.9.1", - "@tiptap/extension-bullet-list": "^2.9.1", - "@tiptap/extension-code": "^2.9.1", - "@tiptap/extension-code-block": "^2.9.1", - "@tiptap/extension-document": "^2.9.1", - "@tiptap/extension-dropcursor": "^2.9.1", - "@tiptap/extension-gapcursor": "^2.9.1", - "@tiptap/extension-hard-break": "^2.9.1", - "@tiptap/extension-heading": "^2.9.1", - "@tiptap/extension-history": "^2.9.1", - "@tiptap/extension-horizontal-rule": "^2.9.1", - "@tiptap/extension-italic": "^2.9.1", - "@tiptap/extension-list-item": "^2.9.1", - "@tiptap/extension-ordered-list": "^2.9.1", - "@tiptap/extension-paragraph": "^2.9.1", - "@tiptap/extension-strike": "^2.9.1", - "@tiptap/extension-text": "^2.9.1", - "@tiptap/extension-text-style": "^2.9.1", - "@tiptap/pm": "^2.9.1" + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.2.tgz", + "integrity": "sha512-YbS9P3zvLhfEWnCPMcvCwK/+3XjMgZX73D1qMu9jVRHtQGI2DMk9u42KWAMLQAMBUESMcIeGxJ9G5IWJO0PsyA==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.10.2", + "@tiptap/extension-blockquote": "^2.10.2", + "@tiptap/extension-bold": "^2.10.2", + "@tiptap/extension-bullet-list": "^2.10.2", + "@tiptap/extension-code": "^2.10.2", + "@tiptap/extension-code-block": "^2.10.2", + "@tiptap/extension-document": "^2.10.2", + "@tiptap/extension-dropcursor": "^2.10.2", + "@tiptap/extension-gapcursor": "^2.10.2", + "@tiptap/extension-hard-break": "^2.10.2", + "@tiptap/extension-heading": "^2.10.2", + "@tiptap/extension-history": "^2.10.2", + "@tiptap/extension-horizontal-rule": "^2.10.2", + "@tiptap/extension-italic": "^2.10.2", + "@tiptap/extension-list-item": "^2.10.2", + "@tiptap/extension-ordered-list": "^2.10.2", + "@tiptap/extension-paragraph": "^2.10.2", + "@tiptap/extension-strike": "^2.10.2", + "@tiptap/extension-text": "^2.10.2", + "@tiptap/extension-text-style": "^2.10.2", + "@tiptap/pm": "^2.10.2" }, "funding": { "type": "github", @@ -3259,20 +3259,11 @@ "license": "MIT" }, "node_modules/@types/diff": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.2.3.tgz", - "integrity": "sha512-K0Oqlrq3kQMaO2RhfrNQX5trmt+XLyom88zS0u84nnIcLvFnRUMRRHmrGny5GSM+kNO9IZLARsdQHDzkhAgmrQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-6.0.0.tgz", + "integrity": "sha512-dhVCYGv3ZSbzmQaBSagrv1WJ6rXCdkyTcDyoNu1MD8JohI7pR7k8wdZEm+mvdxRKXyHVwckFzWU1vJc+Z29MlA==", "license": "MIT" }, - "node_modules/@types/dompurify": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", - "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", - "license": "MIT", - "dependencies": { - "@types/trusted-types": "*" - } - }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -3480,9 +3471,9 @@ "license": "MIT" }, "node_modules/@types/mocha": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", - "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", "dev": true, "license": "MIT" }, @@ -3605,12 +3596,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "license": "MIT" - }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -3633,17 +3618,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", - "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/type-utils": "8.13.0", - "@typescript-eslint/utils": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3667,9 +3652,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -3681,14 +3666,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3698,30 +3683,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", - "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/typescript-estree": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4" }, "engines": { @@ -3741,9 +3713,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -3755,14 +3727,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", - "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3784,14 +3756,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3811,19 +3783,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/parser/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -3854,14 +3813,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", - "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3872,9 +3831,9 @@ } }, "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -3886,14 +3845,14 @@ } }, "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3903,28 +3862,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/scope-manager/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", - "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.13.0", - "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3935,6 +3881,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -3942,9 +3891,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -3956,14 +3905,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", - "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3985,14 +3934,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4012,19 +3961,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -4137,16 +4073,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", - "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/typescript-estree": "8.13.0" + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4157,12 +4093,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -4174,14 +4115,14 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", - "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -4203,14 +4144,14 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4230,19 +4171,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -5509,16 +5437,16 @@ } }, "node_modules/@web/test-runner": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.18.3.tgz", - "integrity": "sha512-QkVK8Qguw3Zhyu8SYR7F4VdcjyXBeJNr8W8L++s4zO/Ok7DR/Wu7+rLswn3H7OH3xYoCHRmwteehcFejefz6ew==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.19.0.tgz", + "integrity": "sha512-qLUupi88OK1Kl52cWPD/2JewUCRUxYsZ1V1DyLd05P7u09zCdrUYrtkB/cViWyxlBe/TOvqkSNpcTv6zLJ9GoA==", "dev": true, "license": "MIT", "dependencies": { "@web/browser-logs": "^0.4.0", "@web/config-loader": "^0.3.0", "@web/dev-server": "^0.4.0", - "@web/test-runner-chrome": "^0.16.0", + "@web/test-runner-chrome": "^0.17.0", "@web/test-runner-commands": "^0.9.0", "@web/test-runner-core": "^0.13.0", "@web/test-runner-mocha": "^0.9.0", @@ -5541,9 +5469,9 @@ } }, "node_modules/@web/test-runner-chrome": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.16.0.tgz", - "integrity": "sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.17.0.tgz", + "integrity": "sha512-Il5N9z41NKWCrQM1TVgRaDWWYoJtG5Ha4fG+cN1MWL2OlzBS4WoOb4lFV3EylZ7+W3twZOFr1zy2Rx61yDYd/A==", "dev": true, "license": "MIT", "dependencies": { @@ -5551,7 +5479,7 @@ "@web/test-runner-coverage-v8": "^0.8.0", "async-mutex": "0.4.0", "chrome-launcher": "^0.15.0", - "puppeteer-core": "^22.0.0" + "puppeteer-core": "^23.2.0" }, "engines": { "node": ">=18.0.0" @@ -5690,6 +5618,16 @@ "node": ">=18.0.0" } }, + "node_modules/@web/test-runner/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -6455,27 +6393,27 @@ } }, "node_modules/c12": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.1.tgz", - "integrity": "sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz", + "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "confbox": "^0.1.7", "defu": "^6.1.4", "dotenv": "^16.4.5", "giget": "^1.2.3", - "jiti": "^1.21.6", + "jiti": "^2.3.0", "mlly": "^1.7.1", - "ohash": "^1.1.3", + "ohash": "^1.1.4", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", - "pkg-types": "^1.1.1", + "pkg-types": "^1.2.0", "rc9": "^2.1.2" }, "peerDependencies": { - "magicast": "^0.3.4" + "magicast": "^0.3.5" }, "peerDependenciesMeta": { "magicast": { @@ -6483,70 +6421,6 @@ } } }, - "node_modules/c12/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/c12/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/c12/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -6765,9 +6639,9 @@ } }, "node_modules/chromium-bidi": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", - "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7640,16 +7514,16 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1312386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -7682,10 +7556,13 @@ } }, "node_modules/dompurify": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", - "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", - "license": "(MPL-2.0 OR Apache-2.0)" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.1.tgz", + "integrity": "sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/dotenv": { "version": "16.4.5", @@ -8050,27 +7927,27 @@ } }, "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", + "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -8089,8 +7966,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -8218,16 +8094,16 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.11.0.tgz", - "integrity": "sha512-d12JHJDPNo7IFwTOAItCeJY1hcqoIxE0lHA8infQByLilQ9xkqrRa6laWCnsuCrf+8rUnvxXY1XuTbibRBNylA==", + "version": "50.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.5.0.tgz", + "integrity": "sha512-xTkshfZrUbiSHXBwZ/9d5ulZ2OcHXxSvm/NPo494H/hadLRJwOq5PMV0EUpMqsb9V+kQo+9BAgi6Z7aJtdBp2A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.46.0", + "@es-joy/jsdoccomment": "~0.49.0", "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", - "debug": "^4.3.5", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", @@ -10371,13 +10247,13 @@ } }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.0.tgz", + "integrity": "sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==", "dev": true, "license": "MIT", "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-levenshtein": { @@ -10425,9 +10301,9 @@ "license": "MIT" }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, "license": "MIT", "engines": { @@ -10878,9 +10754,9 @@ } }, "node_modules/lucide-static": { - "version": "0.446.0", - "resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-0.446.0.tgz", - "integrity": "sha512-u9IkgI8k7qk738A9rt+JlENM5Sz/18EaEfqTfMEhXy2Sjq1uJA2I1WacVn6wJPXNHzrFpI5BCSmi1GtnGhsVwA==", + "version": "0.460.0", + "resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-0.460.0.tgz", + "integrity": "sha512-X6pIdg7jVxv7YQ/uR241hwhNiztcAfmj181TbcX7HCxxk/3mGaRtAc6b2ftUvQBufbJE6ehgyzO2uVsa604tWg==", "dev": true, "license": "ISC" }, @@ -11022,9 +10898,9 @@ } }, "node_modules/marked": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.4.tgz", - "integrity": "sha512-vkVZ8ONmUdPnjCKc5uTRvmkRbx4EAi2OkTOXmfTDhZz3OFqMNBM1oTTWwTr4HY4uAEojhzPf+Fy8F1DWa3Sndg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.2.tgz", + "integrity": "sha512-85RUkoYKIVB21PbMKrnD6aCl9ws+XKEyhJNMbLn206NyD3jbBo7Ec7Wi4Jrsn4dV1a2ng7K/jfkmIN0DNoS41w==", "license": "MIT", "bin": { "marked": "bin/marked.js" @@ -12057,15 +11933,15 @@ } }, "node_modules/mlly": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz", - "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.14.0", "pathe": "^1.1.2", - "pkg-types": "^1.2.0", + "pkg-types": "^1.2.1", "ufo": "^1.5.4" } }, @@ -12128,9 +12004,9 @@ } }, "node_modules/monaco-editor": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", - "integrity": "sha512-8CclLCmrRRh+sul7C08BmPBP3P8wVWfBHomsTcndxg5NRCEPfu/mc2AGU8k37ajjDVXcXFc12ORAMUkmk+lkFA==", + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.0.tgz", + "integrity": "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==", "license": "MIT" }, "node_modules/ms": { @@ -13267,13 +13143,13 @@ } }, "node_modules/playwright": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz", - "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", + "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.48.2" + "playwright-core": "1.49.0" }, "bin": { "playwright": "cli.js" @@ -13286,9 +13162,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz", - "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", + "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -13843,16 +13719,17 @@ } }, "node_modules/puppeteer-core": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", - "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "version": "23.8.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.8.0.tgz", + "integrity": "sha512-c2ymGN2M//We7pC+JhP2dE/g4+qnT89BO+EMSZyJmecN3DN6RNqErA7eH7DrWoNIcU75r2nP4VHa4pswAL6NVg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.3.0", - "chromium-bidi": "0.6.3", - "debug": "^4.3.6", - "devtools-protocol": "0.0.1312386", + "@puppeteer/browsers": "2.4.1", + "chromium-bidi": "0.8.0", + "debug": "^4.3.7", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", "ws": "^8.18.0" }, "engines": { @@ -14396,9 +14273,9 @@ } }, "node_modules/rollup": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.25.0.tgz", - "integrity": "sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", + "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", "dev": true, "license": "MIT", "dependencies": { @@ -14412,24 +14289,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.25.0", - "@rollup/rollup-android-arm64": "4.25.0", - "@rollup/rollup-darwin-arm64": "4.25.0", - "@rollup/rollup-darwin-x64": "4.25.0", - "@rollup/rollup-freebsd-arm64": "4.25.0", - "@rollup/rollup-freebsd-x64": "4.25.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.25.0", - "@rollup/rollup-linux-arm-musleabihf": "4.25.0", - "@rollup/rollup-linux-arm64-gnu": "4.25.0", - "@rollup/rollup-linux-arm64-musl": "4.25.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.25.0", - "@rollup/rollup-linux-riscv64-gnu": "4.25.0", - "@rollup/rollup-linux-s390x-gnu": "4.25.0", - "@rollup/rollup-linux-x64-gnu": "4.25.0", - "@rollup/rollup-linux-x64-musl": "4.25.0", - "@rollup/rollup-win32-arm64-msvc": "4.25.0", - "@rollup/rollup-win32-ia32-msvc": "4.25.0", - "@rollup/rollup-win32-x64-msvc": "4.25.0", + "@rollup/rollup-android-arm-eabi": "4.27.4", + "@rollup/rollup-android-arm64": "4.27.4", + "@rollup/rollup-darwin-arm64": "4.27.4", + "@rollup/rollup-darwin-x64": "4.27.4", + "@rollup/rollup-freebsd-arm64": "4.27.4", + "@rollup/rollup-freebsd-x64": "4.27.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", + "@rollup/rollup-linux-arm-musleabihf": "4.27.4", + "@rollup/rollup-linux-arm64-gnu": "4.27.4", + "@rollup/rollup-linux-arm64-musl": "4.27.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", + "@rollup/rollup-linux-riscv64-gnu": "4.27.4", + "@rollup/rollup-linux-s390x-gnu": "4.27.4", + "@rollup/rollup-linux-x64-gnu": "4.27.4", + "@rollup/rollup-linux-x64-musl": "4.27.4", + "@rollup/rollup-win32-arm64-msvc": "4.27.4", + "@rollup/rollup-win32-ia32-msvc": "4.27.4", + "@rollup/rollup-win32-x64-msvc": "4.27.4", "fsevents": "~2.3.2" } }, @@ -14454,13 +14331,13 @@ } }, "node_modules/rollup-plugin-import-css": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.5.6.tgz", - "integrity": "sha512-a+EVWlL8hGRrrAAa5Ds791sIxBxson5DCYeXAwWqYm+ITziUpmiFTR5czS7EEkuw1k7IZj1lGnHnuCVo0tmxzg==", + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.5.7.tgz", + "integrity": "sha512-mipsJ1s5xL5MgALTSMCMehngpAMFMMcYUFk6gAvv4Es8DlHGnA8iNQrw0X6hXiQYtjsa17uV1rpk5tXo0otZ6Q==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/pluginutils": "^5.0.4" + "@rollup/pluginutils": "^5.1.3" }, "engines": { "node": ">=16" @@ -14469,16 +14346,6 @@ "rollup": "^2.x.x || ^3.x.x || ^4.x.x" } }, - "node_modules/rollup-plugin-web-worker-loader": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz", - "integrity": "sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "rollup": "^1.9.2 || ^2.0.0" - } - }, "node_modules/rope-sequence": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", @@ -14802,9 +14669,9 @@ } }, "node_modules/simple-icons": { - "version": "13.16.0", - "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-13.16.0.tgz", - "integrity": "sha512-aMg1efZ0IvYPKdvqUW0woVGSJwb199y9z7j1+6D5zPMn95eMQN0xzKAHefsqQW2K/5LwfgtFK3Gxn9n1eafX0A==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/simple-icons/-/simple-icons-13.18.0.tgz", + "integrity": "sha512-nxG6XOUKWgt0K7eochrIn46tLBvOcUhcSpVUwWpo8WRkS4RHxreRIRosScDm4KmmTeDuNbW114GjviHlOSWyTg==", "dev": true, "license": "CC0-1.0", "engines": { @@ -14965,13 +14832,13 @@ } }, "node_modules/storybook": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.2.tgz", - "integrity": "sha512-GMCgyAulmLNrkUtDkCpFO4SB77YrpiIxq6e5tzaQdXEuaDu1mdNwOuP3VG7nE2FzxmqDvagSgriM68YW9iFaZA==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.5.tgz", + "integrity": "sha512-9tfgabXnMibYp3SvoaJXXMD63Pw0SA9Hnf5v6TxysCYZs4DZ/04fAkK+9RW+K4C5JkV83qXMMlrsPj766R47fg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/core": "8.4.2" + "@storybook/core": "8.4.5" }, "bin": { "getstorybook": "bin/index.cjs", @@ -15002,9 +14869,9 @@ } }, "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", + "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", "dev": true, "license": "MIT", "dependencies": { @@ -15414,13 +15281,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -15453,9 +15313,9 @@ "license": "MIT" }, "node_modules/tinymce-i18n": { - "version": "24.11.4", - "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-24.11.4.tgz", - "integrity": "sha512-PCP8+Lr306+miLPntBI69yf5rG3FLZHZeAgUoaA0x4Ol52x0IwAkX/HcBqeha25yv1tlcT5c6d9Q+36WIou9Gg==", + "version": "24.11.25", + "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-24.11.25.tgz", + "integrity": "sha512-/g56/NXUpkl7l17S1wkAg/3tMJ/YWR7qZimvsBibE+iHYo0CYnemmYn9dA4RBrmpr5ZEzhFz65u48Cr5MRfv5w==", "license": "MIT" }, "node_modules/tmp": { @@ -15911,6 +15771,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, "node_modules/typedoc": { "version": "0.26.11", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", @@ -15961,9 +15828,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -15975,15 +15842,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.13.0.tgz", - "integrity": "sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz", + "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.13.0", - "@typescript-eslint/parser": "8.13.0", - "@typescript-eslint/utils": "8.13.0" + "@typescript-eslint/eslint-plugin": "8.15.0", + "@typescript-eslint/parser": "8.15.0", + "@typescript-eslint/utils": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15992,6 +15859,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -16283,9 +16153,9 @@ } }, "node_modules/unplugin": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.15.0.tgz", - "integrity": "sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz", + "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16294,14 +16164,6 @@ }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } } }, "node_modules/update-browserslist-db": { @@ -16374,16 +16236,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { @@ -16449,9 +16311,9 @@ } }, "node_modules/vite": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", - "integrity": "sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16509,9 +16371,9 @@ } }, "node_modules/vite-plugin-static-copy": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.6.tgz", - "integrity": "sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.1.0.tgz", + "integrity": "sha512-n8lEOIVM00Y/zronm0RG8RdPyFd0SAAFR0sii3NWmgG3PSCyYMsvUNRQTlb3onp1XeMrKIDwCrPGxthKvqX9OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16592,9 +16454,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.3.tgz", + "integrity": "sha512-0bz+PDlLpGfP2CigeSKL9NFTF1KtXkeHGZSSaGQSuPZH77GhoiQaA8IjYgOaynSuwlDTolSUEU0ErVvju3NURg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 7ddbb37fd22b..d07cd7e73b7b 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -165,7 +165,6 @@ "example": "node ./devops/example-runner/index.js", "format:fix": "npm run format -- --write", "format": "prettier 'src/**/*.ts' --check", - "generate:server-api-local": "openapi-ts --file devops/openapi-ts/openapi-ts.local.config.js", "generate:server-api-dev": "openapi-ts --file devops/openapi-ts/openapi-ts.dev.config.js", "generate:server-api": "openapi-ts --file devops/openapi-ts/openapi-ts.config.js", "generate:icons": "node ./devops/icons/index.js", @@ -198,95 +197,92 @@ "npm": ">=10.1 < 11" }, "dependencies": { - "@tiptap/core": "^2.9.1", - "@tiptap/extension-image": "^2.9.1", - "@tiptap/extension-link": "^2.9.1", - "@tiptap/extension-placeholder": "^2.9.1", - "@tiptap/extension-subscript": "^2.9.1", - "@tiptap/extension-superscript": "^2.9.1", - "@tiptap/extension-table": "^2.9.1", - "@tiptap/extension-table-cell": "^2.9.1", - "@tiptap/extension-table-header": "^2.9.1", - "@tiptap/extension-table-row": "^2.9.1", - "@tiptap/extension-text-align": "^2.9.1", - "@tiptap/extension-underline": "^2.9.1", - "@tiptap/pm": "^2.9.1", - "@tiptap/starter-kit": "^2.9.1", - "@types/diff": "^5.2.1", - "@types/dompurify": "^3.0.5", - "@types/uuid": "^10.0.0", + "@tiptap/core": "^2.10.2", + "@tiptap/extension-image": "^2.10.2", + "@tiptap/extension-link": "^2.10.2", + "@tiptap/extension-placeholder": "^2.10.2", + "@tiptap/extension-subscript": "^2.10.2", + "@tiptap/extension-superscript": "^2.10.2", + "@tiptap/extension-table": "^2.10.2", + "@tiptap/extension-table-cell": "^2.10.2", + "@tiptap/extension-table-header": "^2.10.2", + "@tiptap/extension-table-row": "^2.10.2", + "@tiptap/extension-text-align": "^2.10.2", + "@tiptap/extension-underline": "^2.10.2", + "@tiptap/pm": "^2.10.2", + "@tiptap/starter-kit": "^2.10.2", + "@types/diff": "^6.0.0", "@umbraco-ui/uui": "^1.12.1", "@umbraco-ui/uui-css": "^1.12.1", "base64-js": "^1.5.1", - "diff": "^5.2.0", - "dompurify": "^3.1.6", - "element-internals-polyfill": "^1.3.11", - "lit": "^3.2.0", - "marked": "^14.1.0", - "monaco-editor": "^0.50.0", + "diff": "^7.0.0", + "dompurify": "^3.2.1", + "element-internals-polyfill": "^1.3.12", + "lit": "^3.2.1", + "marked": "^15.0.2", + "monaco-editor": "^0.52.0", "rxjs": "^7.8.1", "tinymce": "^6.8.3", - "tinymce-i18n": "^24.7.15", - "uuid": "^10.0.0" + "tinymce-i18n": "^24.11.25", + "uuid": "^11.0.3" }, "devDependencies": { - "@babel/core": "^7.24.9", - "@eslint/js": "^9.9.1", - "@hey-api/openapi-ts": "^0.52.11", + "@babel/core": "^7.26.0", + "@eslint/js": "^9.15.0", + "@hey-api/openapi-ts": "^0.57.1", "@open-wc/testing": "^4.0.0", - "@playwright/test": "^1.48.2", - "@rollup/plugin-commonjs": "^26.0.1", + "@playwright/test": "^1.49.0", + "@rollup/plugin-commonjs": "^26.0.3", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.7", - "@storybook/addon-a11y": "^8.3.5", - "@storybook/addon-actions": "^8.3.5", - "@storybook/addon-essentials": "^8.3.5", - "@storybook/addon-links": "^8.3.5", - "@storybook/web-components": "^8.3.5", - "@storybook/web-components-vite": "^8.3.5", - "@types/chai": "^5.0.0", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", + "@storybook/addon-a11y": "^8.4.5", + "@storybook/addon-actions": "^8.4.5", + "@storybook/addon-essentials": "^8.4.5", + "@storybook/addon-links": "^8.4.5", + "@storybook/web-components": "^8.4.5", + "@storybook/web-components-vite": "^8.4.5", + "@types/chai": "^5.0.1", "@types/eslint__js": "^8.42.3", - "@types/mocha": "^10.0.7", - "@web/dev-server-esbuild": "^1.0.2", + "@types/mocha": "^10.0.10", + "@web/dev-server-esbuild": "^1.0.3", "@web/dev-server-import-maps": "^0.2.1", "@web/dev-server-rollup": "^0.6.4", - "@web/test-runner": "^0.18.3", + "@web/test-runner": "^0.19.0", "@web/test-runner-playwright": "^0.11.0", "babel-loader": "^9.2.1", - "eslint": "^9.7.0", + "eslint": "^9.15.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.11.0", - "eslint-plugin-lit": "^1.14.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsdoc": "^50.5.0", + "eslint-plugin-lit": "^1.15.0", "eslint-plugin-local-rules": "^3.0.2", - "eslint-plugin-prettier": "^5.1.3", - "eslint-plugin-wc": "^2.1.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-wc": "^2.2.0", "glob": "^11.0.0", - "globals": "^15.8.0", - "lucide-static": "^0.446.0", + "globals": "^15.12.0", + "lucide-static": "^0.460.0", "madge": "^8.0.0", "msw": "^1.3.2", "playwright-msw": "^3.0.1", "prettier": "3.3.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "remark-gfm": "^4.0.0", - "rollup": "^4.22.4", + "rollup": "^4.27.4", "rollup-plugin-esbuild": "^6.1.1", - "rollup-plugin-import-css": "^3.5.0", - "rollup-plugin-web-worker-loader": "^1.6.1", - "simple-icons": "^13.1.0", - "storybook": "^8.3.5", + "rollup-plugin-import-css": "^3.5.7", + "simple-icons": "^13.18.0", + "storybook": "^8.4.5", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.10", - "typedoc": "^0.26.5", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", + "typedoc": "^0.26.11", + "typescript": "^5.7.2", + "typescript-eslint": "^8.15.0", "typescript-json-schema": "^0.65.1", - "vite": "^5.4.6", - "vite-plugin-static-copy": "^1.0.6", - "vite-tsconfig-paths": "^4.3.2", + "vite": "^5.4.11", + "vite-plugin-static-copy": "^2.1.0", + "vite-tsconfig-paths": "^5.1.3", "web-component-analyzer": "^2.0.0" }, "msw": { @@ -296,4 +292,4 @@ "access": "public", "registry": "https://registry.npmjs.org/" } -} +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts index 3e1f0b35c8be..50a1dd734c30 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/index.ts @@ -2,5 +2,5 @@ export { ApiError } from './core/ApiError'; export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI'; -export * from './services.gen'; +export * from './sdk.gen'; export * from './types.gen'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/schemas.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/schemas.gen.ts new file mode 100644 index 000000000000..03b11dd68e96 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/schemas.gen.ts @@ -0,0 +1,10906 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export const AllowedDocumentTypeModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const AllowedMediaTypeModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const AuditLogResponseModelSchema = { + required: ['logType', 'timestamp', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + timestamp: { + type: 'string', + format: 'date-time' + }, + logType: { + '$ref': '#/components/schemas/AuditTypeModel' + }, + comment: { + type: 'string', + nullable: true + }, + parameters: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const AuditTypeModelSchema = { + enum: ['New', 'Save', 'SaveVariant', 'Open', 'Delete', 'Publish', 'PublishVariant', 'SendToPublish', 'SendToPublishVariant', 'Unpublish', 'UnpublishVariant', 'Move', 'Copy', 'AssignDomain', 'PublicAccess', 'Sort', 'Notify', 'System', 'RollBack', 'PackagerInstall', 'PackagerUninstall', 'Custom', 'ContentVersionPreventCleanup', 'ContentVersionEnableCleanup'], + type: 'string' +} as const; + +export const AvailableDocumentTypeCompositionResponseModelSchema = { + required: ['folderPath', 'icon', 'id', 'isCompatible', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + }, + folderPath: { + type: 'array', + items: { + type: 'string' + } + }, + isCompatible: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const AvailableMediaTypeCompositionResponseModelSchema = { + required: ['folderPath', 'icon', 'id', 'isCompatible', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + }, + folderPath: { + type: 'array', + items: { + type: 'string' + } + }, + isCompatible: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const AvailableMemberTypeCompositionResponseModelSchema = { + required: ['folderPath', 'icon', 'id', 'isCompatible', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + }, + folderPath: { + type: 'array', + items: { + type: 'string' + } + }, + isCompatible: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const CalculatedUserStartNodesResponseModelSchema = { + required: ['documentStartNodeIds', 'hasDocumentRootAccess', 'hasMediaRootAccess', 'id', 'mediaStartNodeIds'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + documentStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasDocumentRootAccess: { + type: 'boolean' + }, + mediaStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasMediaRootAccess: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ChangePasswordCurrentUserRequestModelSchema = { + required: ['newPassword'], + type: 'object', + properties: { + newPassword: { + type: 'string' + }, + oldPassword: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ChangePasswordUserRequestModelSchema = { + required: ['newPassword'], + type: 'object', + properties: { + newPassword: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CompositionTypeModelSchema = { + enum: ['Composition', 'Inheritance'], + type: 'string' +} as const; + +export const ConsentLevelPresentationModelSchema = { + required: ['description', 'level'], + type: 'object', + properties: { + level: { + '$ref': '#/components/schemas/TelemetryLevelModel' + }, + description: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CopyDataTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CopyDocumentRequestModelSchema = { + required: ['includeDescendants', 'relateToOriginal'], + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + relateToOriginal: { + type: 'boolean' + }, + includeDescendants: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const CopyDocumentTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CopyMediaTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateDataTypeRequestModelSchema = { + required: ['editorAlias', 'editorUiAlias', 'name', 'values'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + editorAlias: { + minLength: 1, + type: 'string' + }, + editorUiAlias: { + type: 'string' + }, + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypePropertyPresentationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateDictionaryItemRequestModelSchema = { + required: ['name', 'translations'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + translations: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DictionaryItemTranslationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentBlueprintFromDocumentRequestModelSchema = { + required: ['document', 'name'], + type: 'object', + properties: { + document: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentBlueprintRequestModelSchema = { + required: ['documentType', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentRequestModelSchema = { + required: ['documentType', 'template', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + template: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CreateDocumentTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'allowedDocumentTypes', 'allowedTemplates', 'cleanup', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateDocumentTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateDocumentTypePropertyTypeContainerRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + allowedTemplates: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + defaultTemplate: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + cleanup: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCleanupModel' + } + ] + }, + allowedDocumentTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const CreateFolderRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateInitialPasswordUserRequestModelSchema = { + required: ['password', 'token', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + token: { + minLength: 1, + type: 'string' + }, + password: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateLanguageRequestModelSchema = { + required: ['isDefault', 'isMandatory', 'isoCode', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + isDefault: { + type: 'boolean' + }, + isMandatory: { + type: 'boolean' + }, + fallbackIsoCode: { + type: 'string', + nullable: true + }, + isoCode: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateMediaRequestModelSchema = { + required: ['mediaType', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaVariantRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CreateMediaTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const CreateMediaTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CreateMediaTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'allowedMediaTypes', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateMediaTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateMediaTypePropertyTypeContainerRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + allowedMediaTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeCompositionModel' + } + ] + } + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateMemberGroupRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateMemberRequestModelSchema = { + required: ['email', 'isApproved', 'memberType', 'password', 'username', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberVariantRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + email: { + type: 'string' + }, + username: { + type: 'string' + }, + password: { + type: 'string' + }, + memberType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + groups: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + }, + nullable: true + }, + isApproved: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const CreateMemberTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const CreateMemberTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'isSensitive', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment', 'visibility'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + }, + isSensitive: { + type: 'boolean' + }, + visibility: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypePropertyTypeVisibilityModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CreateMemberTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateMemberTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CreateMemberTypePropertyTypeContainerRequestModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const CreatePackageRequestModelSchema = { + required: ['contentLoadChildNodes', 'dataTypes', 'dictionaryItems', 'documentTypes', 'languages', 'mediaIds', 'mediaLoadChildNodes', 'mediaTypes', 'name', 'partialViews', 'scripts', 'stylesheets', 'templates'], + type: 'object', + properties: { + name: { + type: 'string' + }, + contentNodeId: { + type: 'string', + nullable: true + }, + contentLoadChildNodes: { + type: 'boolean' + }, + mediaIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + mediaLoadChildNodes: { + type: 'boolean' + }, + documentTypes: { + type: 'array', + items: { + type: 'string' + } + }, + mediaTypes: { + type: 'array', + items: { + type: 'string' + } + }, + dataTypes: { + type: 'array', + items: { + type: 'string' + } + }, + templates: { + type: 'array', + items: { + type: 'string' + } + }, + partialViews: { + type: 'array', + items: { + type: 'string' + } + }, + stylesheets: { + type: 'array', + items: { + type: 'string' + } + }, + scripts: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + dictionaryItems: { + type: 'array', + items: { + type: 'string' + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreatePartialViewFolderRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreatePartialViewRequestModelSchema = { + required: ['content', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateScriptFolderRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateScriptRequestModelSchema = { + required: ['content', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateStylesheetFolderRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateStylesheetRequestModelSchema = { + required: ['content', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateTemplateRequestModelSchema = { + required: ['alias', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + alias: { + minLength: 1, + type: 'string' + }, + content: { + type: 'string', + nullable: true + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateUserClientCredentialsRequestModelSchema = { + required: ['clientId', 'clientSecret'], + type: 'object', + properties: { + clientId: { + type: 'string' + }, + clientSecret: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CreateUserDataRequestModelSchema = { + required: ['group', 'identifier', 'value'], + type: 'object', + properties: { + group: { + type: 'string' + }, + identifier: { + type: 'string' + }, + value: { + type: 'string' + }, + key: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateUserGroupRequestModelSchema = { + required: ['alias', 'documentRootAccess', 'fallbackPermissions', 'hasAccessToAllLanguages', 'languages', 'mediaRootAccess', 'name', 'permissions', 'sections'], + type: 'object', + properties: { + name: { + type: 'string' + }, + alias: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + }, + sections: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + hasAccessToAllLanguages: { + type: 'boolean' + }, + documentStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentRootAccess: { + type: 'boolean' + }, + mediaStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + mediaRootAccess: { + type: 'boolean' + }, + fallbackPermissions: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + permissions: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentPermissionPresentationModel' + }, + { + '$ref': '#/components/schemas/UnknownTypePermissionPresentationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CreateUserRequestModelSchema = { + required: ['email', 'kind', 'name', 'userGroupIds', 'userName'], + type: 'object', + properties: { + email: { + type: 'string' + }, + userName: { + type: 'string' + }, + name: { + type: 'string' + }, + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + kind: { + '$ref': '#/components/schemas/UserKindModel' + } + }, + additionalProperties: false +} as const; + +export const CreateWebhookRequestModelSchema = { + required: ['contentTypeKeys', 'enabled', 'events', 'headers', 'url'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + }, + url: { + minLength: 1, + type: 'string' + }, + contentTypeKeys: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + headers: { + type: 'object', + additionalProperties: { + type: 'string' + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + events: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const CultureAndScheduleRequestModelSchema = { + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + schedule: { + oneOf: [ + { + '$ref': '#/components/schemas/ScheduleRequestModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const CultureReponseModelSchema = { + required: ['englishName', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + englishName: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const CurrenUserConfigurationResponseModelSchema = { + required: ['keepUserLoggedIn', 'passwordConfiguration', 'usernameIsEmail'], + type: 'object', + properties: { + keepUserLoggedIn: { + type: 'boolean' + }, + usernameIsEmail: { + type: 'boolean', + deprecated: true + }, + passwordConfiguration: { + oneOf: [ + { + '$ref': '#/components/schemas/PasswordConfigurationResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const CurrentUserResponseModelSchema = { + required: ['allowedSections', 'avatarUrls', 'documentStartNodeIds', 'email', 'fallbackPermissions', 'hasAccessToAllLanguages', 'hasAccessToSensitiveData', 'hasDocumentRootAccess', 'hasMediaRootAccess', 'id', 'isAdmin', 'languageIsoCode', 'languages', 'mediaStartNodeIds', 'name', 'permissions', 'userName'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + email: { + type: 'string' + }, + userName: { + type: 'string' + }, + name: { + type: 'string' + }, + languageIsoCode: { + type: 'string', + nullable: true + }, + documentStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasDocumentRootAccess: { + type: 'boolean' + }, + mediaStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasMediaRootAccess: { + type: 'boolean' + }, + avatarUrls: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + hasAccessToAllLanguages: { + type: 'boolean' + }, + hasAccessToSensitiveData: { + type: 'boolean' + }, + fallbackPermissions: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + permissions: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentPermissionPresentationModel' + }, + { + '$ref': '#/components/schemas/UnknownTypePermissionPresentationModel' + } + ] + } + }, + allowedSections: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + isAdmin: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DataTypeChangeModeModelSchema = { + enum: ['True', 'False', 'FalseWithHelpText'], + type: 'string' +} as const; + +export const DataTypeContentTypeReferenceModelSchema = { + required: ['icon', 'id', 'name', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + type: { + type: 'string', + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DataTypeItemResponseModelSchema = { + required: ['editorAlias', 'id', 'isDeletable', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + editorUiAlias: { + type: 'string', + nullable: true + }, + editorAlias: { + type: 'string' + }, + isDeletable: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DataTypePropertyPresentationModelSchema = { + required: ['alias'], + type: 'object', + properties: { + alias: { + type: 'string' + }, + value: { + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DataTypePropertyReferenceModelSchema = { + required: ['alias', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + alias: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DataTypeReferenceResponseModelSchema = { + required: ['contentType', 'properties'], + type: 'object', + properties: { + contentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypeContentTypeReferenceModel' + } + ] + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypePropertyReferenceModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DataTypeResponseModelSchema = { + required: ['canIgnoreStartNodes', 'editorAlias', 'editorUiAlias', 'id', 'isDeletable', 'name', 'values'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + editorAlias: { + minLength: 1, + type: 'string' + }, + editorUiAlias: { + type: 'string' + }, + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypePropertyPresentationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + isDeletable: { + type: 'boolean' + }, + canIgnoreStartNodes: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DataTypeTreeItemResponseModelSchema = { + required: ['hasChildren', 'id', 'isDeletable', 'isFolder', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + }, + isFolder: { + type: 'boolean' + }, + editorUiAlias: { + type: 'string', + nullable: true + }, + isDeletable: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DatabaseInstallRequestModelSchema = { + required: ['id', 'providerName', 'trustServerCertificate', 'useIntegratedAuthentication'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + providerName: { + minLength: 1, + type: 'string' + }, + server: { + type: 'string', + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + username: { + type: 'string', + nullable: true + }, + password: { + type: 'string', + nullable: true + }, + useIntegratedAuthentication: { + type: 'boolean' + }, + connectionString: { + type: 'string', + nullable: true + }, + trustServerCertificate: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DatabaseSettingsPresentationModelSchema = { + required: ['defaultDatabaseName', 'displayName', 'id', 'isConfigured', 'providerName', 'requiresConnectionTest', 'requiresCredentials', 'requiresServer', 'serverPlaceholder', 'sortOrder', 'supportsIntegratedAuthentication'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + displayName: { + minLength: 1, + type: 'string' + }, + defaultDatabaseName: { + minLength: 1, + type: 'string' + }, + providerName: { + minLength: 1, + type: 'string' + }, + isConfigured: { + type: 'boolean' + }, + requiresServer: { + type: 'boolean' + }, + serverPlaceholder: { + minLength: 1, + type: 'string' + }, + requiresCredentials: { + type: 'boolean' + }, + supportsIntegratedAuthentication: { + type: 'boolean' + }, + requiresConnectionTest: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DatatypeConfigurationResponseModelSchema = { + required: ['canBeChanged', 'documentListViewId', 'mediaListViewId'], + type: 'object', + properties: { + canBeChanged: { + '$ref': '#/components/schemas/DataTypeChangeModeModel' + }, + documentListViewId: { + type: 'string', + format: 'uuid' + }, + mediaListViewId: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DefaultReferenceResponseModelSchema = { + required: ['id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + nullable: true + }, + type: { + type: 'string', + nullable: true + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DeleteUserGroupsRequestModelSchema = { + required: ['userGroupIds'], + type: 'object', + properties: { + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DeleteUsersRequestModelSchema = { + required: ['userIds'], + type: 'object', + properties: { + userIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DictionaryItemItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DictionaryItemResponseModelSchema = { + required: ['id', 'name', 'translations'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + translations: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DictionaryItemTranslationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const DictionaryItemTranslationModelSchema = { + required: ['isoCode', 'translation'], + type: 'object', + properties: { + isoCode: { + minLength: 1, + type: 'string' + }, + translation: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DictionaryOverviewResponseModelSchema = { + required: ['id', 'translatedIsoCodes'], + type: 'object', + properties: { + name: { + type: 'string', + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + translatedIsoCodes: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const DirectionModelSchema = { + enum: ['Ascending', 'Descending'], + type: 'string' +} as const; + +export const DisableUserRequestModelSchema = { + required: ['userIds'], + type: 'object', + properties: { + userIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentBlueprintItemResponseModelSchema = { + required: ['documentType', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const DocumentBlueprintResponseModelSchema = { + required: ['documentType', 'id', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const DocumentBlueprintTreeItemResponseModelSchema = { + required: ['hasChildren', 'id', 'isFolder', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + }, + isFolder: { + type: 'boolean' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentCollectionResponseModelSchema = { + required: ['documentType', 'id', 'sortOrder', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + creator: { + type: 'string', + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCollectionReferenceResponseModel' + } + ] + }, + updater: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentConfigurationResponseModelSchema = { + required: ['allowEditInvariantFromNonDefault', 'allowNonExistingSegmentsCreation', 'disableDeleteWhenReferenced', 'disableUnpublishWhenReferenced', 'reservedFieldNames'], + type: 'object', + properties: { + disableDeleteWhenReferenced: { + type: 'boolean' + }, + disableUnpublishWhenReferenced: { + type: 'boolean' + }, + allowEditInvariantFromNonDefault: { + type: 'boolean' + }, + allowNonExistingSegmentsCreation: { + type: 'boolean' + }, + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + }, + deprecated: true + } + }, + additionalProperties: false +} as const; + +export const DocumentItemResponseModelSchema = { + required: ['documentType', 'id', 'isProtected', 'isTrashed', 'variants'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + isTrashed: { + type: 'boolean' + }, + isProtected: { + type: 'boolean' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentNotificationResponseModelSchema = { + required: ['actionId', 'alias', 'subscribed'], + type: 'object', + properties: { + actionId: { + type: 'string' + }, + alias: { + type: 'string' + }, + subscribed: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DocumentPermissionPresentationModelSchema = { + required: ['$type', 'document', 'verbs'], + type: 'object', + properties: { + '$type': { + type: 'string' + }, + document: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + verbs: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false, + discriminator: { + propertyName: '$type', + mapping: { + DocumentPermissionPresentationModel: '#/components/schemas/DocumentPermissionPresentationModel' + } + } +} as const; + +export const DocumentRecycleBinItemResponseModelSchema = { + required: ['documentType', 'hasChildren', 'id', 'variants'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + hasChildren: { + type: 'boolean' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ItemReferenceByIdResponseModel' + } + ], + nullable: true + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentReferenceResponseModelSchema = { + required: ['documentType', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + nullable: true + }, + published: { + type: 'boolean', + nullable: true + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/TrackedReferenceDocumentTypeModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const DocumentResponseModelSchema = { + required: ['documentType', 'id', 'isTrashed', 'urls', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + urls: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentUrlInfoModel' + } + ] + } + }, + template: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isTrashed: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DocumentTreeItemResponseModelSchema = { + required: ['documentType', 'hasChildren', 'id', 'isProtected', 'isTrashed', 'noAccess', 'variants'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + noAccess: { + type: 'boolean' + }, + isTrashed: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + isProtected: { + type: 'boolean' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeBlueprintItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeCleanupModelSchema = { + required: ['preventCleanup'], + type: 'object', + properties: { + preventCleanup: { + type: 'boolean' + }, + keepAllVersionsNewerThanDays: { + type: 'integer', + format: 'int32', + nullable: true + }, + keepLatestVersionPerDayForDays: { + type: 'integer', + format: 'int32', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeCollectionReferenceResponseModelSchema = { + required: ['alias', 'icon', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + alias: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeCompositionModelSchema = { + required: ['compositionType', 'documentType'], + type: 'object', + properties: { + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + compositionType: { + '$ref': '#/components/schemas/CompositionTypeModel' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeCompositionRequestModelSchema = { + required: ['currentCompositeIds', 'currentPropertyAliases', 'isElement'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + currentPropertyAliases: { + type: 'array', + items: { + type: 'string' + } + }, + currentCompositeIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + isElement: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeCompositionResponseModelSchema = { + required: ['icon', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeConfigurationResponseModelSchema = { + required: ['dataTypesCanBeChanged', 'disableTemplates', 'reservedFieldNames', 'useSegments'], + type: 'object', + properties: { + dataTypesCanBeChanged: { + '$ref': '#/components/schemas/DataTypeChangeModeModel' + }, + disableTemplates: { + type: 'boolean' + }, + useSegments: { + type: 'boolean' + }, + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeItemResponseModelSchema = { + required: ['id', 'isElement', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + isElement: { + type: 'boolean' + }, + icon: { + type: 'string', + nullable: true + }, + description: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentTypePropertyTypeContainerResponseModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypePropertyTypeResponseModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeReferenceResponseModelSchema = { + required: ['icon', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + icon: { + type: 'string' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeResponseModelSchema = { + required: ['alias', 'allowedAsRoot', 'allowedDocumentTypes', 'allowedTemplates', 'cleanup', 'compositions', 'containers', 'icon', 'id', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypePropertyTypeResponseModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypePropertyTypeContainerResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + allowedTemplates: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + defaultTemplate: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + cleanup: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCleanupModel' + } + ] + }, + allowedDocumentTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeSortModelSchema = { + required: ['documentType', 'sortOrder'], + type: 'object', + properties: { + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const DocumentTypeTreeItemResponseModelSchema = { + required: ['hasChildren', 'icon', 'id', 'isElement', 'isFolder', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + }, + isFolder: { + type: 'boolean' + }, + isElement: { + type: 'boolean' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentUrlInfoModelSchema = { + required: ['culture', 'url'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + url: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentUrlInfoResponseModelSchema = { + required: ['id', 'urlInfos'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + urlInfos: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentUrlInfoModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DocumentValueModelSchema = { + required: ['alias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentValueResponseModelSchema = { + required: ['alias', 'editorAlias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + }, + editorAlias: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentVariantItemResponseModelSchema = { + required: ['name', 'state'], + type: 'object', + properties: { + name: { + type: 'string' + }, + culture: { + type: 'string', + nullable: true + }, + state: { + '$ref': '#/components/schemas/DocumentVariantStateModel' + } + }, + additionalProperties: false +} as const; + +export const DocumentVariantRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DocumentVariantResponseModelSchema = { + required: ['createDate', 'name', 'state', 'updateDate'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + }, + createDate: { + type: 'string', + format: 'date-time' + }, + updateDate: { + type: 'string', + format: 'date-time' + }, + state: { + '$ref': '#/components/schemas/DocumentVariantStateModel' + }, + publishDate: { + type: 'string', + format: 'date-time', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DocumentVariantStateModelSchema = { + enum: ['NotCreated', 'Draft', 'Published', 'PublishedPendingChanges'], + type: 'string' +} as const; + +export const DocumentVersionItemResponseModelSchema = { + required: ['document', 'documentType', 'id', 'isCurrentDraftVersion', 'isCurrentPublishedVersion', 'preventCleanup', 'user', 'versionDate'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + document: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + versionDate: { + type: 'string', + format: 'date-time' + }, + isCurrentPublishedVersion: { + type: 'boolean' + }, + isCurrentDraftVersion: { + type: 'boolean' + }, + preventCleanup: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const DocumentVersionResponseModelSchema = { + required: ['documentType', 'id', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + document: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DomainPresentationModelSchema = { + required: ['domainName', 'isoCode'], + type: 'object', + properties: { + domainName: { + type: 'string' + }, + isoCode: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const DomainsResponseModelSchema = { + required: ['domains'], + type: 'object', + properties: { + defaultIsoCode: { + type: 'string', + nullable: true + }, + domains: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DomainPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DynamicRootContextRequestModelSchema = { + required: ['parent'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DynamicRootQueryOriginRequestModelSchema = { + required: ['alias'], + type: 'object', + properties: { + alias: { + type: 'string' + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const DynamicRootQueryRequestModelSchema = { + required: ['origin', 'steps'], + type: 'object', + properties: { + origin: { + oneOf: [ + { + '$ref': '#/components/schemas/DynamicRootQueryOriginRequestModel' + } + ] + }, + steps: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DynamicRootQueryStepRequestModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const DynamicRootQueryStepRequestModelSchema = { + required: ['alias', 'documentTypeIds'], + type: 'object', + properties: { + alias: { + type: 'string' + }, + documentTypeIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + } + }, + additionalProperties: false +} as const; + +export const DynamicRootRequestModelSchema = { + required: ['context', 'query'], + type: 'object', + properties: { + context: { + oneOf: [ + { + '$ref': '#/components/schemas/DynamicRootContextRequestModel' + } + ] + }, + query: { + oneOf: [ + { + '$ref': '#/components/schemas/DynamicRootQueryRequestModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const DynamicRootResponseModelSchema = { + required: ['roots'], + type: 'object', + properties: { + roots: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + } + }, + additionalProperties: false +} as const; + +export const EnableTwoFactorRequestModelSchema = { + required: ['code', 'secret'], + type: 'object', + properties: { + code: { + type: 'string' + }, + secret: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const EnableUserRequestModelSchema = { + required: ['userIds'], + type: 'object', + properties: { + userIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const EntityImportAnalysisResponseModelSchema = { + required: ['entityType'], + type: 'object', + properties: { + entityType: { + type: 'string' + }, + alias: { + type: 'string', + nullable: true + }, + key: { + type: 'string', + format: 'uuid', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const EventMessageTypeModelSchema = { + enum: ['Default', 'Info', 'Error', 'Success', 'Warning'], + type: 'string' +} as const; + +export const FieldPresentationModelSchema = { + required: ['name', 'values'], + type: 'object', + properties: { + name: { + type: 'string' + }, + values: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const FileSystemFolderModelSchema = { + required: ['path'], + type: 'object', + properties: { + path: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const FileSystemTreeItemPresentationModelSchema = { + required: ['hasChildren', 'isFolder', 'name', 'path'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + name: { + type: 'string' + }, + path: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + isFolder: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const FolderResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const HealthCheckActionRequestModelSchema = { + required: ['healthCheck', 'valueRequired'], + type: 'object', + properties: { + healthCheck: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + alias: { + type: 'string', + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + description: { + type: 'string', + nullable: true + }, + valueRequired: { + type: 'boolean' + }, + providedValue: { + type: 'string', + nullable: true + }, + providedValueValidation: { + type: 'string', + nullable: true + }, + providedValueValidationRegex: { + type: 'string', + nullable: true + }, + actionParameters: { + type: 'object', + additionalProperties: {}, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const HealthCheckGroupPresentationModelSchema = { + required: ['checks', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + checks: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthCheckModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const HealthCheckGroupResponseModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const HealthCheckGroupWithResultResponseModelSchema = { + required: ['checks'], + type: 'object', + properties: { + checks: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthCheckWithResultPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const HealthCheckModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + description: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const HealthCheckResultResponseModelSchema = { + required: ['message', 'resultType'], + type: 'object', + properties: { + message: { + type: 'string' + }, + resultType: { + '$ref': '#/components/schemas/StatusResultTypeModel' + }, + actions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthCheckActionRequestModel' + } + ] + }, + nullable: true + }, + readMoreLink: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const HealthCheckWithResultPresentationModelSchema = { + required: ['id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + results: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthCheckResultResponseModel' + } + ] + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const HealthStatusModelSchema = { + enum: ['Healthy', 'Unhealthy', 'Rebuilding'], + type: 'string' +} as const; + +export const HealthStatusResponseModelSchema = { + required: ['status'], + type: 'object', + properties: { + status: { + '$ref': '#/components/schemas/HealthStatusModel' + }, + message: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const HelpPageResponseModelSchema = { + type: 'object', + properties: { + name: { + type: 'string', + nullable: true + }, + description: { + type: 'string', + nullable: true + }, + url: { + type: 'string', + nullable: true + }, + type: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ImageCropModeModelSchema = { + enum: ['Crop', 'Max', 'Stretch', 'Pad', 'BoxPad', 'Min'], + type: 'string' +} as const; + +export const ImportDictionaryRequestModelSchema = { + required: ['temporaryFile'], + type: 'object', + properties: { + temporaryFile: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ImportDocumentTypeRequestModelSchema = { + required: ['file'], + type: 'object', + properties: { + file: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const ImportMediaTypeRequestModelSchema = { + required: ['file'], + type: 'object', + properties: { + file: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const IndexResponseModelSchema = { + required: ['canRebuild', 'documentCount', 'fieldCount', 'healthStatus', 'name', 'searcherName'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + healthStatus: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthStatusResponseModel' + } + ] + }, + canRebuild: { + type: 'boolean' + }, + searcherName: { + type: 'string' + }, + documentCount: { + type: 'integer', + format: 'int64' + }, + fieldCount: { + type: 'integer', + format: 'int32' + }, + providerProperties: { + type: 'object', + additionalProperties: { + nullable: true + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const InstallRequestModelSchema = { + required: ['database', 'telemetryLevel', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/UserInstallRequestModel' + } + ] + }, + database: { + oneOf: [ + { + '$ref': '#/components/schemas/DatabaseInstallRequestModel' + } + ] + }, + telemetryLevel: { + '$ref': '#/components/schemas/TelemetryLevelModel' + } + }, + additionalProperties: false +} as const; + +export const InstallSettingsResponseModelSchema = { + required: ['databases', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/UserSettingsPresentationModel' + } + ] + }, + databases: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DatabaseSettingsPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const InviteUserRequestModelSchema = { + required: ['email', 'name', 'userGroupIds', 'userName'], + type: 'object', + properties: { + email: { + type: 'string' + }, + userName: { + type: 'string' + }, + name: { + type: 'string' + }, + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + message: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ItemReferenceByIdResponseModelSchema = { + required: ['id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const ItemSortingRequestModelSchema = { + required: ['id', 'sortOrder'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const LanguageItemResponseModelSchema = { + required: ['isoCode', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + isoCode: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const LanguageResponseModelSchema = { + required: ['isDefault', 'isMandatory', 'isoCode', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + isDefault: { + type: 'boolean' + }, + isMandatory: { + type: 'boolean' + }, + fallbackIsoCode: { + type: 'string', + nullable: true + }, + isoCode: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const LogLevelCountsReponseModelSchema = { + required: ['debug', 'error', 'fatal', 'information', 'warning'], + type: 'object', + properties: { + information: { + type: 'integer', + format: 'int32' + }, + debug: { + type: 'integer', + format: 'int32' + }, + warning: { + type: 'integer', + format: 'int32' + }, + error: { + type: 'integer', + format: 'int32' + }, + fatal: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const LogLevelModelSchema = { + enum: ['Verbose', 'Debug', 'Information', 'Warning', 'Error', 'Fatal'], + type: 'string' +} as const; + +export const LogMessagePropertyPresentationModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + value: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const LogMessageResponseModelSchema = { + required: ['level', 'properties', 'timestamp'], + type: 'object', + properties: { + timestamp: { + type: 'string', + format: 'date-time' + }, + level: { + '$ref': '#/components/schemas/LogLevelModel' + }, + messageTemplate: { + type: 'string', + nullable: true + }, + renderedMessage: { + type: 'string', + nullable: true + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/LogMessagePropertyPresentationModel' + } + ] + } + }, + exception: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const LogTemplateResponseModelSchema = { + required: ['count'], + type: 'object', + properties: { + messageTemplate: { + type: 'string', + nullable: true + }, + count: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const LoggerResponseModelSchema = { + required: ['level', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + level: { + '$ref': '#/components/schemas/LogLevelModel' + } + }, + additionalProperties: false +} as const; + +export const ManifestResponseModelSchema = { + required: ['extensions', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + id: { + type: 'string', + nullable: true + }, + version: { + type: 'string', + nullable: true + }, + extensions: { + type: 'array', + items: {} + } + }, + additionalProperties: false +} as const; + +export const MediaCollectionResponseModelSchema = { + required: ['id', 'mediaType', 'sortOrder', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + creator: { + type: 'string', + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeCollectionReferenceResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const MediaConfigurationResponseModelSchema = { + required: ['disableDeleteWhenReferenced', 'disableUnpublishWhenReferenced', 'reservedFieldNames'], + type: 'object', + properties: { + disableDeleteWhenReferenced: { + type: 'boolean' + }, + disableUnpublishWhenReferenced: { + type: 'boolean' + }, + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + }, + deprecated: true + } + }, + additionalProperties: false +} as const; + +export const MediaItemResponseModelSchema = { + required: ['id', 'isTrashed', 'mediaType', 'variants'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + isTrashed: { + type: 'boolean' + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/VariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const MediaRecycleBinItemResponseModelSchema = { + required: ['hasChildren', 'id', 'mediaType', 'variants'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + hasChildren: { + type: 'boolean' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ItemReferenceByIdResponseModel' + } + ], + nullable: true + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/VariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const MediaReferenceResponseModelSchema = { + required: ['id', 'mediaType'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + nullable: true + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/TrackedReferenceMediaTypeModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const MediaResponseModelSchema = { + required: ['id', 'isTrashed', 'mediaType', 'urls', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + urls: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaUrlInfoModel' + } + ] + } + }, + isTrashed: { + type: 'boolean' + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeReferenceResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const MediaTreeItemResponseModelSchema = { + required: ['hasChildren', 'id', 'isTrashed', 'mediaType', 'noAccess', 'variants'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + noAccess: { + type: 'boolean' + }, + isTrashed: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/VariantItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const MediaTypeCollectionReferenceResponseModelSchema = { + required: ['alias', 'icon', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + alias: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MediaTypeCompositionModelSchema = { + required: ['compositionType', 'mediaType'], + type: 'object', + properties: { + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + compositionType: { + '$ref': '#/components/schemas/CompositionTypeModel' + } + }, + additionalProperties: false +} as const; + +export const MediaTypeCompositionRequestModelSchema = { + required: ['currentCompositeIds', 'currentPropertyAliases'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + currentPropertyAliases: { + type: 'array', + items: { + type: 'string' + } + }, + currentCompositeIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + } + }, + additionalProperties: false +} as const; + +export const MediaTypeCompositionResponseModelSchema = { + required: ['icon', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MediaTypeConfigurationResponseModelSchema = { + required: ['reservedFieldNames'], + type: 'object', + properties: { + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const MediaTypeItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MediaTypePropertyTypeContainerResponseModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const MediaTypePropertyTypeResponseModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const MediaTypeReferenceResponseModelSchema = { + required: ['icon', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + icon: { + type: 'string' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MediaTypeResponseModelSchema = { + required: ['alias', 'aliasCanBeChanged', 'allowedAsRoot', 'allowedMediaTypes', 'compositions', 'containers', 'icon', 'id', 'isDeletable', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypePropertyTypeResponseModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypePropertyTypeContainerResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + allowedMediaTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeCompositionModel' + } + ] + } + }, + isDeletable: { + type: 'boolean' + }, + aliasCanBeChanged: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const MediaTypeSortModelSchema = { + required: ['mediaType', 'sortOrder'], + type: 'object', + properties: { + mediaType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const MediaTypeTreeItemResponseModelSchema = { + required: ['hasChildren', 'icon', 'id', 'isDeletable', 'isFolder', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + }, + isFolder: { + type: 'boolean' + }, + icon: { + type: 'string' + }, + isDeletable: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const MediaUrlInfoModelSchema = { + required: ['culture', 'url'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + url: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MediaUrlInfoResponseModelSchema = { + required: ['id', 'urlInfos'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + urlInfos: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaUrlInfoModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const MediaValueModelSchema = { + required: ['alias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MediaValueResponseModelSchema = { + required: ['alias', 'editorAlias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + }, + editorAlias: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MediaVariantRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MediaVariantResponseModelSchema = { + required: ['createDate', 'name', 'updateDate'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + }, + createDate: { + type: 'string', + format: 'date-time' + }, + updateDate: { + type: 'string', + format: 'date-time' + } + }, + additionalProperties: false +} as const; + +export const MemberConfigurationResponseModelSchema = { + required: ['reservedFieldNames'], + type: 'object', + properties: { + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + }, + deprecated: true + } + }, + additionalProperties: false +} as const; + +export const MemberGroupItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MemberGroupResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const MemberItemResponseModelSchema = { + required: ['id', 'kind', 'memberType', 'variants'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + memberType: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeReferenceResponseModel' + } + ] + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/VariantItemResponseModel' + } + ] + } + }, + kind: { + '$ref': '#/components/schemas/MemberKindModel' + } + }, + additionalProperties: false +} as const; + +export const MemberKindModelSchema = { + enum: ['Default', 'Api'], + type: 'string' +} as const; + +export const MemberResponseModelSchema = { + required: ['email', 'failedPasswordAttempts', 'groups', 'id', 'isApproved', 'isLockedOut', 'isTwoFactorEnabled', 'kind', 'memberType', 'username', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + email: { + type: 'string' + }, + username: { + type: 'string' + }, + memberType: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeReferenceResponseModel' + } + ] + }, + isApproved: { + type: 'boolean' + }, + isLockedOut: { + type: 'boolean' + }, + isTwoFactorEnabled: { + type: 'boolean' + }, + failedPasswordAttempts: { + type: 'integer', + format: 'int32' + }, + lastLoginDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastLockoutDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastPasswordChangeDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + groups: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + kind: { + '$ref': '#/components/schemas/MemberKindModel' + } + }, + additionalProperties: false +} as const; + +export const MemberTypeCompositionModelSchema = { + required: ['compositionType', 'memberType'], + type: 'object', + properties: { + memberType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + compositionType: { + '$ref': '#/components/schemas/CompositionTypeModel' + } + }, + additionalProperties: false +} as const; + +export const MemberTypeCompositionRequestModelSchema = { + required: ['currentCompositeIds', 'currentPropertyAliases'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid', + nullable: true + }, + currentPropertyAliases: { + type: 'array', + items: { + type: 'string' + } + }, + currentCompositeIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + } + }, + additionalProperties: false +} as const; + +export const MemberTypeCompositionResponseModelSchema = { + required: ['icon', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MemberTypeConfigurationResponseModelSchema = { + required: ['reservedFieldNames'], + type: 'object', + properties: { + reservedFieldNames: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const MemberTypeItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MemberTypePropertyTypeContainerResponseModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const MemberTypePropertyTypeResponseModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'isSensitive', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment', 'visibility'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + }, + isSensitive: { + type: 'boolean' + }, + visibility: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypePropertyTypeVisibilityModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const MemberTypePropertyTypeVisibilityModelSchema = { + required: ['memberCanEdit', 'memberCanView'], + type: 'object', + properties: { + memberCanView: { + type: 'boolean' + }, + memberCanEdit: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const MemberTypeReferenceResponseModelSchema = { + required: ['icon', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + icon: { + type: 'string' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MemberTypeResponseModelSchema = { + required: ['alias', 'allowedAsRoot', 'compositions', 'containers', 'icon', 'id', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypePropertyTypeResponseModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypePropertyTypeContainerResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const MemberTypeTreeItemResponseModelSchema = { + required: ['hasChildren', 'icon', 'id', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + }, + icon: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MemberValueModelSchema = { + required: ['alias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MemberValueResponseModelSchema = { + required: ['alias', 'editorAlias'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + alias: { + minLength: 1, + type: 'string' + }, + value: { + nullable: true + }, + editorAlias: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MemberVariantRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const MemberVariantResponseModelSchema = { + required: ['createDate', 'name', 'updateDate'], + type: 'object', + properties: { + culture: { + type: 'string', + nullable: true + }, + segment: { + type: 'string', + nullable: true + }, + name: { + minLength: 1, + type: 'string' + }, + createDate: { + type: 'string', + format: 'date-time' + }, + updateDate: { + type: 'string', + format: 'date-time' + } + }, + additionalProperties: false +} as const; + +export const ModelsBuilderResponseModelSchema = { + required: ['canGenerate', 'mode', 'outOfDateModels', 'trackingOutOfDateModels'], + type: 'object', + properties: { + mode: { + '$ref': '#/components/schemas/ModelsModeModel' + }, + canGenerate: { + type: 'boolean' + }, + outOfDateModels: { + type: 'boolean' + }, + lastError: { + type: 'string', + nullable: true + }, + version: { + type: 'string', + nullable: true + }, + modelsNamespace: { + type: 'string', + nullable: true + }, + trackingOutOfDateModels: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ModelsModeModelSchema = { + enum: ['Nothing', 'InMemoryAuto', 'SourceCodeManual', 'SourceCodeAuto'], + type: 'string' +} as const; + +export const MoveDataTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveDictionaryRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveDocumentBlueprintRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveDocumentRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveDocumentTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveMediaRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const MoveMediaTypeRequestModelSchema = { + type: 'object', + properties: { + target: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const NamedEntityTreeItemResponseModelSchema = { + required: ['hasChildren', 'id', 'name'], + type: 'object', + properties: { + hasChildren: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const NoopSetupTwoFactorModelSchema = { + type: 'object', + additionalProperties: false +} as const; + +export const NotificationHeaderModelSchema = { + required: ['category', 'message', 'type'], + type: 'object', + properties: { + message: { + type: 'string' + }, + category: { + type: 'string' + }, + type: { + '$ref': '#/components/schemas/EventMessageTypeModel' + } + }, + additionalProperties: false +} as const; + +export const OEmbedResponseModelSchema = { + required: ['markup'], + type: 'object', + properties: { + markup: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ObjectTypeResponseModelSchema = { + required: ['id'], + type: 'object', + properties: { + name: { + type: 'string', + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const OperatorModelSchema = { + enum: ['Equals', 'NotEquals', 'Contains', 'NotContains', 'LessThan', 'LessThanEqualTo', 'GreaterThan', 'GreaterThanEqualTo'], + type: 'string' +} as const; + +export const OutOfDateStatusResponseModelSchema = { + required: ['status'], + type: 'object', + properties: { + status: { + '$ref': '#/components/schemas/OutOfDateTypeModel' + } + }, + additionalProperties: false +} as const; + +export const OutOfDateTypeModelSchema = { + enum: ['OutOfDate', 'Current', 'Unknown'], + type: 'string' +} as const; + +export const PackageConfigurationResponseModelSchema = { + required: ['marketplaceUrl'], + type: 'object', + properties: { + marketplaceUrl: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const PackageDefinitionResponseModelSchema = { + required: ['contentLoadChildNodes', 'dataTypes', 'dictionaryItems', 'documentTypes', 'id', 'languages', 'mediaIds', 'mediaLoadChildNodes', 'mediaTypes', 'name', 'packagePath', 'partialViews', 'scripts', 'stylesheets', 'templates'], + type: 'object', + properties: { + name: { + type: 'string' + }, + contentNodeId: { + type: 'string', + nullable: true + }, + contentLoadChildNodes: { + type: 'boolean' + }, + mediaIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + mediaLoadChildNodes: { + type: 'boolean' + }, + documentTypes: { + type: 'array', + items: { + type: 'string' + } + }, + mediaTypes: { + type: 'array', + items: { + type: 'string' + } + }, + dataTypes: { + type: 'array', + items: { + type: 'string' + } + }, + templates: { + type: 'array', + items: { + type: 'string' + } + }, + partialViews: { + type: 'array', + items: { + type: 'string' + } + }, + stylesheets: { + type: 'array', + items: { + type: 'string' + } + }, + scripts: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + dictionaryItems: { + type: 'array', + items: { + type: 'string' + } + }, + id: { + type: 'string', + format: 'uuid' + }, + packagePath: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const PackageMigrationStatusResponseModelSchema = { + required: ['hasPendingMigrations', 'packageName'], + type: 'object', + properties: { + packageName: { + type: 'string' + }, + hasPendingMigrations: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const PagedAllowedDocumentTypeModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/AllowedDocumentTypeModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedAllowedMediaTypeModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/AllowedMediaTypeModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedAuditLogResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/AuditLogResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedCultureReponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CultureReponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDataTypeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDataTypeTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypeTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDictionaryOverviewResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DictionaryOverviewResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentBlueprintTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentBlueprintTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentCollectionResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentCollectionResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentRecycleBinItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentRecycleBinItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentTypeBlueprintItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeBlueprintItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentTypeTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedDocumentVersionItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVersionItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedFileSystemTreeItemPresentationModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemTreeItemPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedHealthCheckGroupResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HealthCheckGroupResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedHelpPageResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/HelpPageResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedIReferenceResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DefaultReferenceResponseModel' + }, + { + '$ref': '#/components/schemas/DocumentReferenceResponseModel' + }, + { + '$ref': '#/components/schemas/MediaReferenceResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedIndexResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/IndexResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedLanguageResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/LanguageResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedLogMessageResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/LogMessageResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedLogTemplateResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/LogTemplateResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedLoggerResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/LoggerResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMediaCollectionResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaCollectionResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMediaRecycleBinItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaRecycleBinItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMediaTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMediaTypeTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMemberGroupResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberGroupResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMemberResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedMemberTypeTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedModelDataTypeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypeItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelDocumentItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelDocumentTypeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelMediaItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelMediaTypeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelMemberItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelMemberTypeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedModelTemplateItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateItemResponseModel' + } + ] + } + }, + total: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const PagedNamedEntityTreeItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/NamedEntityTreeItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedObjectTypeResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ObjectTypeResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedPackageDefinitionResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/PackageDefinitionResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedPackageMigrationStatusResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/PackageMigrationStatusResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedPartialViewSnippetItemResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/PartialViewSnippetItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedProblemDetailsModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ProblemDetails' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedRedirectUrlResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/RedirectUrlResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedReferenceByIdModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedRelationResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/RelationResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedRelationTypeResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/RelationTypeResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedSavedLogSearchResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/SavedLogSearchResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedSearchResultResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/SearchResultResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedSearcherResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/SearcherResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedSegmentResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/SegmentResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedTagResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TagResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedTelemetryResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TelemetryResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedUserDataResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UserDataResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedUserGroupResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UserGroupResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedUserResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UserResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedWebhookEventModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/WebhookEventModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PagedWebhookResponseModelSchema = { + required: ['items', 'total'], + type: 'object', + properties: { + total: { + type: 'integer', + format: 'int64' + }, + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/WebhookResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PartialViewFolderResponseModelSchema = { + required: ['name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PartialViewItemResponseModelSchema = { + required: ['isFolder', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + isFolder: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const PartialViewResponseModelSchema = { + required: ['content', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const PartialViewSnippetItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string' + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const PartialViewSnippetResponseModelSchema = { + required: ['content', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string' + }, + name: { + type: 'string' + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const PasswordConfigurationResponseModelSchema = { + required: ['minimumPasswordLength', 'requireDigit', 'requireLowercase', 'requireNonLetterOrDigit', 'requireUppercase'], + type: 'object', + properties: { + minimumPasswordLength: { + type: 'integer', + format: 'int32' + }, + requireNonLetterOrDigit: { + type: 'boolean' + }, + requireDigit: { + type: 'boolean' + }, + requireLowercase: { + type: 'boolean' + }, + requireUppercase: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ProblemDetailsSchema = { + type: 'object', + properties: { + type: { + type: 'string', + nullable: true + }, + title: { + type: 'string', + nullable: true + }, + status: { + type: 'integer', + format: 'int32', + nullable: true + }, + detail: { + type: 'string', + nullable: true + }, + instance: { + type: 'string', + nullable: true + } + }, + additionalProperties: {} +} as const; + +export const ProblemDetailsBuilderModelSchema = { + type: 'object', + additionalProperties: false +} as const; + +export const ProfilingStatusRequestModelSchema = { + required: ['enabled'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ProfilingStatusResponseModelSchema = { + required: ['enabled'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const PropertyTypeAppearanceModelSchema = { + required: ['labelOnTop'], + type: 'object', + properties: { + labelOnTop: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const PropertyTypeValidationModelSchema = { + required: ['mandatory'], + type: 'object', + properties: { + mandatory: { + type: 'boolean' + }, + mandatoryMessage: { + type: 'string', + nullable: true + }, + regEx: { + type: 'string', + nullable: true + }, + regExMessage: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const PublicAccessRequestModelSchema = { + required: ['errorDocument', 'loginDocument', 'memberGroupNames', 'memberUserNames'], + type: 'object', + properties: { + loginDocument: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + errorDocument: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + memberUserNames: { + type: 'array', + items: { + type: 'string' + } + }, + memberGroupNames: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const PublicAccessResponseModelSchema = { + required: ['errorDocument', 'groups', 'loginDocument', 'members'], + type: 'object', + properties: { + loginDocument: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + errorDocument: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + members: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberItemResponseModel' + } + ] + } + }, + groups: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberGroupItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PublishDocumentRequestModelSchema = { + required: ['publishSchedules'], + type: 'object', + properties: { + publishSchedules: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/CultureAndScheduleRequestModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const PublishDocumentWithDescendantsRequestModelSchema = { + required: ['cultures', 'includeUnpublishedDescendants'], + type: 'object', + properties: { + includeUnpublishedDescendants: { + type: 'boolean' + }, + cultures: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const PublishedDocumentResponseModelSchema = { + required: ['documentType', 'id', 'isTrashed', 'urls', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueResponseModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantResponseModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + documentType: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeReferenceResponseModel' + } + ] + }, + urls: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentUrlInfoModel' + } + ] + } + }, + template: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isTrashed: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const RedirectStatusModelSchema = { + enum: ['Enabled', 'Disabled'], + type: 'string' +} as const; + +export const RedirectUrlResponseModelSchema = { + required: ['created', 'destinationUrl', 'document', 'id', 'originalUrl'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + originalUrl: { + type: 'string' + }, + destinationUrl: { + type: 'string' + }, + created: { + type: 'string', + format: 'date-time' + }, + document: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + culture: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RedirectUrlStatusResponseModelSchema = { + required: ['status', 'userIsAdmin'], + type: 'object', + properties: { + status: { + '$ref': '#/components/schemas/RedirectStatusModel' + }, + userIsAdmin: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ReferenceByIdModelSchema = { + required: ['id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const RelationReferenceModelSchema = { + required: ['id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RelationResponseModelSchema = { + required: ['child', 'createDate', 'id', 'parent', 'relationType'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + relationType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/RelationReferenceModel' + } + ] + }, + child: { + oneOf: [ + { + '$ref': '#/components/schemas/RelationReferenceModel' + } + ] + }, + createDate: { + type: 'string', + format: 'date-time' + }, + comment: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RelationTypeItemResponseModelSchema = { + required: ['id', 'isDeletable', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + isDeletable: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const RelationTypeResponseModelSchema = { + required: ['id', 'isBidirectional', 'isDependency', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + isBidirectional: { + type: 'boolean' + }, + isDependency: { + type: 'boolean' + }, + id: { + type: 'string', + format: 'uuid' + }, + alias: { + type: 'string', + nullable: true + }, + parentObject: { + oneOf: [ + { + '$ref': '#/components/schemas/ObjectTypeResponseModel' + } + ], + nullable: true + }, + childObject: { + oneOf: [ + { + '$ref': '#/components/schemas/ObjectTypeResponseModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RenamePartialViewRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const RenameScriptRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const RenameStylesheetRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ResendInviteUserRequestModelSchema = { + required: ['user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + message: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ResetPasswordRequestModelSchema = { + required: ['email'], + type: 'object', + properties: { + email: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ResetPasswordTokenRequestModelSchema = { + required: ['password', 'resetCode', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + resetCode: { + type: 'string' + }, + password: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ResetPasswordUserResponseModelSchema = { + type: 'object', + properties: { + resetPassword: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const RuntimeLevelModelSchema = { + enum: ['Unknown', 'Boot', 'Install', 'Upgrade', 'Run', 'BootFailed'], + type: 'string' +} as const; + +export const RuntimeModeModelSchema = { + enum: ['BackofficeDevelopment', 'Development', 'Production'], + type: 'string' +} as const; + +export const SavedLogSearchRequestModelSchema = { + required: ['name', 'query'], + type: 'object', + properties: { + name: { + type: 'string' + }, + query: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const SavedLogSearchResponseModelSchema = { + required: ['name', 'query'], + type: 'object', + properties: { + name: { + type: 'string' + }, + query: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ScheduleRequestModelSchema = { + type: 'object', + properties: { + publishTime: { + type: 'string', + format: 'date-time', + nullable: true + }, + unpublishTime: { + type: 'string', + format: 'date-time', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ScriptFolderResponseModelSchema = { + required: ['name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const ScriptItemResponseModelSchema = { + required: ['isFolder', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + isFolder: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ScriptResponseModelSchema = { + required: ['content', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const SearchResultResponseModelSchema = { + required: ['fieldCount', 'fields', 'id', 'score'], + type: 'object', + properties: { + id: { + minLength: 1, + type: 'string' + }, + score: { + type: 'number', + format: 'float' + }, + fieldCount: { + type: 'integer', + format: 'int32', + readOnly: true + }, + fields: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/FieldPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const SearcherResponseModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const SecurityConfigurationResponseModelSchema = { + required: ['passwordConfiguration'], + type: 'object', + properties: { + passwordConfiguration: { + oneOf: [ + { + '$ref': '#/components/schemas/PasswordConfigurationResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const SegmentResponseModelSchema = { + required: ['alias', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + alias: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ServerConfigurationItemResponseModelSchema = { + required: ['data', 'name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + data: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const ServerConfigurationResponseModelSchema = { + required: ['allowPasswordReset', 'versionCheckPeriod'], + type: 'object', + properties: { + allowPasswordReset: { + type: 'boolean' + }, + versionCheckPeriod: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const ServerInformationResponseModelSchema = { + required: ['assemblyVersion', 'baseUtcOffset', 'runtimeMode', 'version'], + type: 'object', + properties: { + version: { + type: 'string' + }, + assemblyVersion: { + type: 'string' + }, + baseUtcOffset: { + type: 'string' + }, + runtimeMode: { + '$ref': '#/components/schemas/RuntimeModeModel' + } + }, + additionalProperties: false +} as const; + +export const ServerStatusResponseModelSchema = { + required: ['serverStatus'], + type: 'object', + properties: { + serverStatus: { + '$ref': '#/components/schemas/RuntimeLevelModel' + } + }, + additionalProperties: false +} as const; + +export const ServerTroubleshootingResponseModelSchema = { + required: ['items'], + type: 'object', + properties: { + items: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ServerConfigurationItemResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const SetAvatarRequestModelSchema = { + required: ['file'], + type: 'object', + properties: { + file: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const SortingRequestModelSchema = { + required: ['sorting'], + type: 'object', + properties: { + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sorting: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ItemSortingRequestModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const StaticFileItemResponseModelSchema = { + required: ['isFolder', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + isFolder: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const StatusResultTypeModelSchema = { + enum: ['Success', 'Warning', 'Error', 'Info'], + type: 'string' +} as const; + +export const StylesheetFolderResponseModelSchema = { + required: ['name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const StylesheetItemResponseModelSchema = { + required: ['isFolder', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + isFolder: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const StylesheetResponseModelSchema = { + required: ['content', 'name', 'path'], + type: 'object', + properties: { + path: { + type: 'string' + }, + name: { + type: 'string' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/FileSystemFolderModel' + } + ], + nullable: true + }, + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const TagResponseModelSchema = { + required: ['id', 'nodeCount'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + text: { + type: 'string', + nullable: true + }, + group: { + type: 'string', + nullable: true + }, + nodeCount: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const TelemetryLevelModelSchema = { + enum: ['Minimal', 'Basic', 'Detailed'], + type: 'string' +} as const; + +export const TelemetryRequestModelSchema = { + required: ['telemetryLevel'], + type: 'object', + properties: { + telemetryLevel: { + '$ref': '#/components/schemas/TelemetryLevelModel' + } + }, + additionalProperties: false +} as const; + +export const TelemetryResponseModelSchema = { + required: ['telemetryLevel'], + type: 'object', + properties: { + telemetryLevel: { + '$ref': '#/components/schemas/TelemetryLevelModel' + } + }, + additionalProperties: false +} as const; + +export const TemplateConfigurationResponseModelSchema = { + required: ['disabled'], + type: 'object', + properties: { + disabled: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const TemplateItemResponseModelSchema = { + required: ['alias', 'id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + alias: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryExecuteFilterPresentationModelSchema = { + required: ['constraintValue', 'operator', 'propertyAlias'], + type: 'object', + properties: { + propertyAlias: { + minLength: 1, + type: 'string' + }, + constraintValue: { + minLength: 1, + type: 'string' + }, + operator: { + '$ref': '#/components/schemas/OperatorModel' + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryExecuteModelSchema = { + required: ['take'], + type: 'object', + properties: { + rootDocument: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentTypeAlias: { + type: 'string', + nullable: true + }, + filters: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateQueryExecuteFilterPresentationModel' + } + ] + }, + nullable: true + }, + sort: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateQueryExecuteSortModel' + } + ], + nullable: true + }, + take: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryExecuteSortModelSchema = { + required: ['propertyAlias'], + type: 'object', + properties: { + propertyAlias: { + type: 'string' + }, + direction: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryOperatorModelSchema = { + required: ['applicableTypes', 'operator'], + type: 'object', + properties: { + operator: { + '$ref': '#/components/schemas/OperatorModel' + }, + applicableTypes: { + type: 'array', + items: { + '$ref': '#/components/schemas/TemplateQueryPropertyTypeModel' + } + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryPropertyPresentationModelSchema = { + required: ['alias', 'type'], + type: 'object', + properties: { + alias: { + type: 'string' + }, + type: { + '$ref': '#/components/schemas/TemplateQueryPropertyTypeModel' + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryPropertyTypeModelSchema = { + enum: ['String', 'DateTime', 'Integer'], + type: 'string' +} as const; + +export const TemplateQueryResultItemPresentationModelSchema = { + required: ['icon', 'name'], + type: 'object', + properties: { + icon: { + type: 'string' + }, + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const TemplateQueryResultResponseModelSchema = { + required: ['executionTime', 'queryExpression', 'resultCount', 'sampleResults'], + type: 'object', + properties: { + queryExpression: { + type: 'string' + }, + sampleResults: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateQueryResultItemPresentationModel' + } + ] + } + }, + resultCount: { + type: 'integer', + format: 'int32' + }, + executionTime: { + type: 'integer', + format: 'int64' + } + }, + additionalProperties: false +} as const; + +export const TemplateQuerySettingsResponseModelSchema = { + required: ['documentTypeAliases', 'operators', 'properties'], + type: 'object', + properties: { + documentTypeAliases: { + type: 'array', + items: { + type: 'string' + } + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateQueryPropertyPresentationModel' + } + ] + } + }, + operators: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/TemplateQueryOperatorModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const TemplateResponseModelSchema = { + required: ['alias', 'id', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + alias: { + minLength: 1, + type: 'string' + }, + content: { + type: 'string', + nullable: true + }, + id: { + type: 'string', + format: 'uuid' + }, + masterTemplate: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const TemporaryFileConfigurationResponseModelSchema = { + required: ['allowedUploadedFileExtensions', 'disallowedUploadedFilesExtensions', 'imageFileTypes'], + type: 'object', + properties: { + imageFileTypes: { + type: 'array', + items: { + type: 'string' + } + }, + disallowedUploadedFilesExtensions: { + type: 'array', + items: { + type: 'string' + } + }, + allowedUploadedFileExtensions: { + type: 'array', + items: { + type: 'string' + } + }, + maxFileSize: { + type: 'integer', + format: 'int32', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const TemporaryFileResponseModelSchema = { + required: ['fileName', 'id'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + availableUntil: { + type: 'string', + format: 'date-time', + nullable: true + }, + fileName: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const TrackedReferenceDocumentTypeModelSchema = { + type: 'object', + properties: { + icon: { + type: 'string', + nullable: true + }, + alias: { + type: 'string', + nullable: true + }, + name: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const TrackedReferenceMediaTypeModelSchema = { + type: 'object', + properties: { + icon: { + type: 'string', + nullable: true + }, + alias: { + type: 'string', + nullable: true + }, + name: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UnknownTypePermissionPresentationModelSchema = { + required: ['$type', 'context', 'verbs'], + type: 'object', + properties: { + '$type': { + type: 'string' + }, + verbs: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + context: { + type: 'string' + } + }, + additionalProperties: false, + discriminator: { + propertyName: '$type', + mapping: { + UnknownTypePermissionPresentationModel: '#/components/schemas/UnknownTypePermissionPresentationModel' + } + } +} as const; + +export const UnlockUsersRequestModelSchema = { + required: ['userIds'], + type: 'object', + properties: { + userIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UnpublishDocumentRequestModelSchema = { + type: 'object', + properties: { + cultures: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateDataTypeRequestModelSchema = { + required: ['editorAlias', 'editorUiAlias', 'name', 'values'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + editorAlias: { + minLength: 1, + type: 'string' + }, + editorUiAlias: { + type: 'string' + }, + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DataTypePropertyPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateDictionaryItemRequestModelSchema = { + required: ['name', 'translations'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + translations: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DictionaryItemTranslationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentBlueprintRequestModelSchema = { + required: ['values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantRequestModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentNotificationsRequestModelSchema = { + required: ['subscribedActionIds'], + type: 'object', + properties: { + subscribedActionIds: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentRequestModelSchema = { + required: ['values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantRequestModel' + } + ] + } + }, + template: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const UpdateDocumentTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'allowedDocumentTypes', 'allowedTemplates', 'cleanup', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateDocumentTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateDocumentTypePropertyTypeContainerRequestModel' + } + ] + } + }, + allowedTemplates: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + defaultTemplate: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + cleanup: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCleanupModel' + } + ] + }, + allowedDocumentTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateDomainsRequestModelSchema = { + required: ['domains'], + type: 'object', + properties: { + defaultIsoCode: { + type: 'string', + nullable: true + }, + domains: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DomainPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateFolderResponseModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdateLanguageRequestModelSchema = { + required: ['isDefault', 'isMandatory', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + isDefault: { + type: 'boolean' + }, + isMandatory: { + type: 'boolean' + }, + fallbackIsoCode: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateMediaRequestModelSchema = { + required: ['values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaVariantRequestModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateMediaTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const UpdateMediaTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const UpdateMediaTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'allowedMediaTypes', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateMediaTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateMediaTypePropertyTypeContainerRequestModel' + } + ] + } + }, + allowedMediaTypes: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeSortModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MediaTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateMemberGroupRequestModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdateMemberRequestModelSchema = { + required: ['email', 'isApproved', 'isLockedOut', 'isTwoFactorEnabled', 'username', 'values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberVariantRequestModel' + } + ] + } + }, + email: { + type: 'string' + }, + username: { + type: 'string' + }, + oldPassword: { + type: 'string', + nullable: true + }, + newPassword: { + type: 'string', + nullable: true + }, + groups: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + }, + nullable: true + }, + isApproved: { + type: 'boolean' + }, + isLockedOut: { + type: 'boolean' + }, + isTwoFactorEnabled: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const UpdateMemberTypePropertyTypeContainerRequestModelSchema = { + required: ['id', 'sortOrder', 'type'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + parent: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + name: { + type: 'string', + nullable: true + }, + type: { + minLength: 1, + type: 'string' + }, + sortOrder: { + type: 'integer', + format: 'int32' + } + }, + additionalProperties: false +} as const; + +export const UpdateMemberTypePropertyTypeRequestModelSchema = { + required: ['alias', 'appearance', 'dataType', 'id', 'isSensitive', 'name', 'sortOrder', 'validation', 'variesByCulture', 'variesBySegment', 'visibility'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + container: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + sortOrder: { + type: 'integer', + format: 'int32' + }, + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + dataType: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + validation: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeValidationModel' + } + ] + }, + appearance: { + oneOf: [ + { + '$ref': '#/components/schemas/PropertyTypeAppearanceModel' + } + ] + }, + isSensitive: { + type: 'boolean' + }, + visibility: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypePropertyTypeVisibilityModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const UpdateMemberTypeRequestModelSchema = { + required: ['alias', 'allowedAsRoot', 'compositions', 'containers', 'icon', 'isElement', 'name', 'properties', 'variesByCulture', 'variesBySegment'], + type: 'object', + properties: { + alias: { + minLength: 1, + type: 'string' + }, + name: { + minLength: 1, + type: 'string' + }, + description: { + type: 'string', + nullable: true + }, + icon: { + minLength: 1, + type: 'string' + }, + allowedAsRoot: { + type: 'boolean' + }, + variesByCulture: { + type: 'boolean' + }, + variesBySegment: { + type: 'boolean' + }, + collection: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + isElement: { + type: 'boolean' + }, + properties: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateMemberTypePropertyTypeRequestModel' + } + ] + } + }, + containers: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UpdateMemberTypePropertyTypeContainerRequestModel' + } + ] + } + }, + compositions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/MemberTypeCompositionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdatePackageRequestModelSchema = { + required: ['contentLoadChildNodes', 'dataTypes', 'dictionaryItems', 'documentTypes', 'languages', 'mediaIds', 'mediaLoadChildNodes', 'mediaTypes', 'name', 'packagePath', 'partialViews', 'scripts', 'stylesheets', 'templates'], + type: 'object', + properties: { + name: { + type: 'string' + }, + contentNodeId: { + type: 'string', + nullable: true + }, + contentLoadChildNodes: { + type: 'boolean' + }, + mediaIds: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + mediaLoadChildNodes: { + type: 'boolean' + }, + documentTypes: { + type: 'array', + items: { + type: 'string' + } + }, + mediaTypes: { + type: 'array', + items: { + type: 'string' + } + }, + dataTypes: { + type: 'array', + items: { + type: 'string' + } + }, + templates: { + type: 'array', + items: { + type: 'string' + } + }, + partialViews: { + type: 'array', + items: { + type: 'string' + } + }, + stylesheets: { + type: 'array', + items: { + type: 'string' + } + }, + scripts: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + dictionaryItems: { + type: 'array', + items: { + type: 'string' + } + }, + packagePath: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdatePartialViewRequestModelSchema = { + required: ['content'], + type: 'object', + properties: { + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdateScriptRequestModelSchema = { + required: ['content'], + type: 'object', + properties: { + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdateStylesheetRequestModelSchema = { + required: ['content'], + type: 'object', + properties: { + content: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpdateTemplateRequestModelSchema = { + required: ['alias', 'name'], + type: 'object', + properties: { + name: { + minLength: 1, + type: 'string' + }, + alias: { + minLength: 1, + type: 'string' + }, + content: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UpdateUserDataRequestModelSchema = { + required: ['group', 'identifier', 'key', 'value'], + type: 'object', + properties: { + group: { + type: 'string' + }, + identifier: { + type: 'string' + }, + value: { + type: 'string' + }, + key: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const UpdateUserGroupRequestModelSchema = { + required: ['alias', 'documentRootAccess', 'fallbackPermissions', 'hasAccessToAllLanguages', 'languages', 'mediaRootAccess', 'name', 'permissions', 'sections'], + type: 'object', + properties: { + name: { + type: 'string' + }, + alias: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + }, + sections: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + hasAccessToAllLanguages: { + type: 'boolean' + }, + documentStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentRootAccess: { + type: 'boolean' + }, + mediaStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + mediaRootAccess: { + type: 'boolean' + }, + fallbackPermissions: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + permissions: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentPermissionPresentationModel' + }, + { + '$ref': '#/components/schemas/UnknownTypePermissionPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateUserGroupsOnUserRequestModelSchema = { + required: ['userGroupIds', 'userIds'], + type: 'object', + properties: { + userIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UpdateUserRequestModelSchema = { + required: ['documentStartNodeIds', 'email', 'hasDocumentRootAccess', 'hasMediaRootAccess', 'languageIsoCode', 'mediaStartNodeIds', 'name', 'userGroupIds', 'userName'], + type: 'object', + properties: { + email: { + type: 'string' + }, + userName: { + type: 'string' + }, + name: { + type: 'string' + }, + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + languageIsoCode: { + type: 'string' + }, + documentStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasDocumentRootAccess: { + type: 'boolean' + }, + mediaStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasMediaRootAccess: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const UpdateWebhookRequestModelSchema = { + required: ['contentTypeKeys', 'enabled', 'events', 'headers', 'url'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + }, + url: { + minLength: 1, + type: 'string' + }, + contentTypeKeys: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + headers: { + type: 'object', + additionalProperties: { + type: 'string' + } + }, + events: { + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const UpgradeCheckResponseModelSchema = { + required: ['comment', 'type', 'url'], + type: 'object', + properties: { + type: { + type: 'string' + }, + comment: { + type: 'string' + }, + url: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UpgradeSettingsResponseModelSchema = { + required: ['currentState', 'newState', 'newVersion', 'oldVersion', 'reportUrl'], + type: 'object', + properties: { + currentState: { + minLength: 1, + type: 'string' + }, + newState: { + minLength: 1, + type: 'string' + }, + newVersion: { + minLength: 1, + type: 'string' + }, + oldVersion: { + minLength: 1, + type: 'string' + }, + reportUrl: { + type: 'string', + readOnly: true + } + }, + additionalProperties: false +} as const; + +export const UserConfigurationResponseModelSchema = { + required: ['canInviteUsers', 'passwordConfiguration', 'usernameIsEmail'], + type: 'object', + properties: { + canInviteUsers: { + type: 'boolean' + }, + usernameIsEmail: { + type: 'boolean' + }, + passwordConfiguration: { + oneOf: [ + { + '$ref': '#/components/schemas/PasswordConfigurationResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const UserDataModelSchema = { + required: ['group', 'identifier', 'value'], + type: 'object', + properties: { + group: { + type: 'string' + }, + identifier: { + type: 'string' + }, + value: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const UserDataOperationStatusModelSchema = { + enum: ['Success', 'NotFound', 'UserNotFound', 'AlreadyExists'], + type: 'string' +} as const; + +export const UserDataResponseModelSchema = { + required: ['group', 'identifier', 'key', 'value'], + type: 'object', + properties: { + group: { + type: 'string' + }, + identifier: { + type: 'string' + }, + value: { + type: 'string' + }, + key: { + type: 'string', + format: 'uuid' + } + }, + additionalProperties: false +} as const; + +export const UserExternalLoginProviderModelSchema = { + required: ['hasManualLinkingEnabled', 'isLinkedOnUser', 'providerSchemeName'], + type: 'object', + properties: { + providerSchemeName: { + type: 'string' + }, + providerKey: { + type: 'string', + nullable: true + }, + isLinkedOnUser: { + type: 'boolean' + }, + hasManualLinkingEnabled: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const UserGroupItemResponseModelSchema = { + required: ['id', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + }, + alias: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const UserGroupResponseModelSchema = { + required: ['alias', 'aliasCanBeChanged', 'documentRootAccess', 'fallbackPermissions', 'hasAccessToAllLanguages', 'id', 'isDeletable', 'languages', 'mediaRootAccess', 'name', 'permissions', 'sections'], + type: 'object', + properties: { + name: { + type: 'string' + }, + alias: { + type: 'string' + }, + icon: { + type: 'string', + nullable: true + }, + sections: { + type: 'array', + items: { + type: 'string' + } + }, + languages: { + type: 'array', + items: { + type: 'string' + } + }, + hasAccessToAllLanguages: { + type: 'boolean' + }, + documentStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + documentRootAccess: { + type: 'boolean' + }, + mediaStartNode: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + mediaRootAccess: { + type: 'boolean' + }, + fallbackPermissions: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + }, + permissions: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentPermissionPresentationModel' + }, + { + '$ref': '#/components/schemas/UnknownTypePermissionPresentationModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + isDeletable: { + type: 'boolean' + }, + aliasCanBeChanged: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const UserInstallRequestModelSchema = { + required: ['email', 'name', 'password', 'subscribeToNewsletter'], + type: 'object', + properties: { + name: { + maxLength: 255, + minLength: 0, + type: 'string' + }, + email: { + minLength: 1, + type: 'string', + format: 'email' + }, + password: { + minLength: 1, + type: 'string' + }, + subscribeToNewsletter: { + type: 'boolean', + readOnly: true + } + }, + additionalProperties: false +} as const; + +export const UserItemResponseModelSchema = { + required: ['avatarUrls', 'id', 'kind', 'name'], + type: 'object', + properties: { + id: { + type: 'string', + format: 'uuid' + }, + name: { + type: 'string' + }, + avatarUrls: { + type: 'array', + items: { + type: 'string' + } + }, + kind: { + '$ref': '#/components/schemas/UserKindModel' + } + }, + additionalProperties: false +} as const; + +export const UserKindModelSchema = { + enum: ['Default', 'Api'], + type: 'string' +} as const; + +export const UserOrderModelSchema = { + enum: ['UserName', 'Language', 'Name', 'Email', 'Id', 'CreateDate', 'UpdateDate', 'IsApproved', 'IsLockedOut', 'LastLoginDate'], + type: 'string' +} as const; + +export const UserPermissionModelSchema = { + required: ['nodeKey', 'permissions'], + type: 'object', + properties: { + nodeKey: { + type: 'string', + format: 'uuid' + }, + permissions: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + } + } + }, + additionalProperties: false +} as const; + +export const UserPermissionsResponseModelSchema = { + required: ['permissions'], + type: 'object', + properties: { + permissions: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/UserPermissionModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UserResponseModelSchema = { + required: ['avatarUrls', 'createDate', 'documentStartNodeIds', 'email', 'failedLoginAttempts', 'hasDocumentRootAccess', 'hasMediaRootAccess', 'id', 'isAdmin', 'kind', 'mediaStartNodeIds', 'name', 'state', 'updateDate', 'userGroupIds', 'userName'], + type: 'object', + properties: { + email: { + type: 'string' + }, + userName: { + type: 'string' + }, + name: { + type: 'string' + }, + userGroupIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + id: { + type: 'string', + format: 'uuid' + }, + languageIsoCode: { + type: 'string', + nullable: true + }, + documentStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasDocumentRootAccess: { + type: 'boolean' + }, + mediaStartNodeIds: { + uniqueItems: true, + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + } + }, + hasMediaRootAccess: { + type: 'boolean' + }, + avatarUrls: { + type: 'array', + items: { + type: 'string' + } + }, + state: { + '$ref': '#/components/schemas/UserStateModel' + }, + failedLoginAttempts: { + type: 'integer', + format: 'int32' + }, + createDate: { + type: 'string', + format: 'date-time' + }, + updateDate: { + type: 'string', + format: 'date-time' + }, + lastLoginDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastLockoutDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + lastPasswordChangeDate: { + type: 'string', + format: 'date-time', + nullable: true + }, + isAdmin: { + type: 'boolean' + }, + kind: { + '$ref': '#/components/schemas/UserKindModel' + } + }, + additionalProperties: false +} as const; + +export const UserSettingsPresentationModelSchema = { + required: ['consentLevels', 'minCharLength', 'minNonAlphaNumericLength'], + type: 'object', + properties: { + minCharLength: { + type: 'integer', + format: 'int32' + }, + minNonAlphaNumericLength: { + type: 'integer', + format: 'int32' + }, + consentLevels: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/ConsentLevelPresentationModel' + } + ] + } + } + }, + additionalProperties: false +} as const; + +export const UserStateModelSchema = { + enum: ['Active', 'Disabled', 'LockedOut', 'Invited', 'Inactive', 'All'], + type: 'string' +} as const; + +export const UserTwoFactorProviderModelSchema = { + required: ['isEnabledOnUser', 'providerName'], + type: 'object', + properties: { + providerName: { + type: 'string' + }, + isEnabledOnUser: { + type: 'boolean' + } + }, + additionalProperties: false +} as const; + +export const ValidateUpdateDocumentRequestModelSchema = { + required: ['values', 'variants'], + type: 'object', + properties: { + values: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentValueModel' + } + ] + } + }, + variants: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/DocumentVariantRequestModel' + } + ] + } + }, + template: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ], + nullable: true + }, + cultures: { + uniqueItems: true, + type: 'array', + items: { + type: 'string' + }, + nullable: true + } + }, + additionalProperties: false +} as const; + +export const VariantItemResponseModelSchema = { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string' + }, + culture: { + type: 'string', + nullable: true + } + }, + additionalProperties: false +} as const; + +export const VerifyInviteUserRequestModelSchema = { + required: ['token', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + token: { + minLength: 1, + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const VerifyInviteUserResponseModelSchema = { + required: ['passwordConfiguration'], + type: 'object', + properties: { + passwordConfiguration: { + oneOf: [ + { + '$ref': '#/components/schemas/PasswordConfigurationResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const VerifyResetPasswordResponseModelSchema = { + required: ['passwordConfiguration'], + type: 'object', + properties: { + passwordConfiguration: { + oneOf: [ + { + '$ref': '#/components/schemas/PasswordConfigurationResponseModel' + } + ] + } + }, + additionalProperties: false +} as const; + +export const VerifyResetPasswordTokenRequestModelSchema = { + required: ['resetCode', 'user'], + type: 'object', + properties: { + user: { + oneOf: [ + { + '$ref': '#/components/schemas/ReferenceByIdModel' + } + ] + }, + resetCode: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const WebhookEventModelSchema = { + required: ['alias', 'eventName', 'eventType'], + type: 'object', + properties: { + eventName: { + type: 'string' + }, + eventType: { + type: 'string' + }, + alias: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const WebhookEventResponseModelSchema = { + required: ['alias', 'eventName', 'eventType'], + type: 'object', + properties: { + eventName: { + type: 'string' + }, + eventType: { + type: 'string' + }, + alias: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const WebhookItemResponseModelSchema = { + required: ['enabled', 'events', 'name', 'types', 'url'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + }, + name: { + type: 'string' + }, + events: { + type: 'string' + }, + url: { + type: 'string' + }, + types: { + type: 'string' + } + }, + additionalProperties: false +} as const; + +export const WebhookResponseModelSchema = { + required: ['contentTypeKeys', 'enabled', 'events', 'headers', 'id', 'url'], + type: 'object', + properties: { + enabled: { + type: 'boolean' + }, + url: { + minLength: 1, + type: 'string' + }, + contentTypeKeys: { + type: 'array', + items: { + type: 'string', + format: 'uuid' + } + }, + headers: { + type: 'object', + additionalProperties: { + type: 'string' + } + }, + id: { + type: 'string', + format: 'uuid' + }, + events: { + type: 'array', + items: { + oneOf: [ + { + '$ref': '#/components/schemas/WebhookEventResponseModel' + } + ] + } + } + }, + additionalProperties: false +} as const; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts similarity index 96% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.gen.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts index 8eecab4cc60d..c3f1d924dc95 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/sdk.gen.ts @@ -3,7 +3,7 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdPublishedData, GetDocumentByIdPublishedResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Response, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetServerUpgradeCheckResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsResponse, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsResponse, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookEventsData, GetWebhookEventsResponse } from './types.gen'; +import type { GetCultureData, GetCultureResponse, PostDataTypeData, PostDataTypeResponse, GetDataTypeByIdData, GetDataTypeByIdResponse, DeleteDataTypeByIdData, DeleteDataTypeByIdResponse, PutDataTypeByIdData, PutDataTypeByIdResponse, PostDataTypeByIdCopyData, PostDataTypeByIdCopyResponse, GetDataTypeByIdIsUsedData, GetDataTypeByIdIsUsedResponse, PutDataTypeByIdMoveData, PutDataTypeByIdMoveResponse, GetDataTypeByIdReferencesData, GetDataTypeByIdReferencesResponse, GetDataTypeConfigurationResponse, PostDataTypeFolderData, PostDataTypeFolderResponse, GetDataTypeFolderByIdData, GetDataTypeFolderByIdResponse, DeleteDataTypeFolderByIdData, DeleteDataTypeFolderByIdResponse, PutDataTypeFolderByIdData, PutDataTypeFolderByIdResponse, GetFilterDataTypeData, GetFilterDataTypeResponse, GetItemDataTypeData, GetItemDataTypeResponse, GetItemDataTypeSearchData, GetItemDataTypeSearchResponse, GetTreeDataTypeAncestorsData, GetTreeDataTypeAncestorsResponse, GetTreeDataTypeChildrenData, GetTreeDataTypeChildrenResponse, GetTreeDataTypeRootData, GetTreeDataTypeRootResponse, GetDictionaryData, GetDictionaryResponse, PostDictionaryData, PostDictionaryResponse, GetDictionaryByIdData, GetDictionaryByIdResponse, DeleteDictionaryByIdData, DeleteDictionaryByIdResponse, PutDictionaryByIdData, PutDictionaryByIdResponse, GetDictionaryByIdExportData, GetDictionaryByIdExportResponse, PutDictionaryByIdMoveData, PutDictionaryByIdMoveResponse, PostDictionaryImportData, PostDictionaryImportResponse, GetItemDictionaryData, GetItemDictionaryResponse, GetTreeDictionaryAncestorsData, GetTreeDictionaryAncestorsResponse, GetTreeDictionaryChildrenData, GetTreeDictionaryChildrenResponse, GetTreeDictionaryRootData, GetTreeDictionaryRootResponse, GetCollectionDocumentByIdData, GetCollectionDocumentByIdResponse, PostDocumentData, PostDocumentResponse, GetDocumentByIdData, GetDocumentByIdResponse, DeleteDocumentByIdData, DeleteDocumentByIdResponse, PutDocumentByIdData, PutDocumentByIdResponse, GetDocumentByIdAuditLogData, GetDocumentByIdAuditLogResponse, PostDocumentByIdCopyData, PostDocumentByIdCopyResponse, GetDocumentByIdDomainsData, GetDocumentByIdDomainsResponse, PutDocumentByIdDomainsData, PutDocumentByIdDomainsResponse, PutDocumentByIdMoveData, PutDocumentByIdMoveResponse, PutDocumentByIdMoveToRecycleBinData, PutDocumentByIdMoveToRecycleBinResponse, GetDocumentByIdNotificationsData, GetDocumentByIdNotificationsResponse, PutDocumentByIdNotificationsData, PutDocumentByIdNotificationsResponse, PostDocumentByIdPublicAccessData, PostDocumentByIdPublicAccessResponse, DeleteDocumentByIdPublicAccessData, DeleteDocumentByIdPublicAccessResponse, GetDocumentByIdPublicAccessData, GetDocumentByIdPublicAccessResponse, PutDocumentByIdPublicAccessData, PutDocumentByIdPublicAccessResponse, PutDocumentByIdPublishData, PutDocumentByIdPublishResponse, PutDocumentByIdPublishWithDescendantsData, PutDocumentByIdPublishWithDescendantsResponse, GetDocumentByIdPublishedData, GetDocumentByIdPublishedResponse, GetDocumentByIdReferencedByData, GetDocumentByIdReferencedByResponse, GetDocumentByIdReferencedDescendantsData, GetDocumentByIdReferencedDescendantsResponse, PutDocumentByIdUnpublishData, PutDocumentByIdUnpublishResponse, PutDocumentByIdValidateData, PutDocumentByIdValidateResponse, PutUmbracoManagementApiV11DocumentByIdValidate11Data, PutUmbracoManagementApiV11DocumentByIdValidate11Response, GetDocumentAreReferencedData, GetDocumentAreReferencedResponse, GetDocumentConfigurationResponse, PutDocumentSortData, PutDocumentSortResponse, GetDocumentUrlsData, GetDocumentUrlsResponse, PostDocumentValidateData, PostDocumentValidateResponse, GetItemDocumentData, GetItemDocumentResponse, GetItemDocumentSearchData, GetItemDocumentSearchResponse, DeleteRecycleBinDocumentResponse, DeleteRecycleBinDocumentByIdData, DeleteRecycleBinDocumentByIdResponse, GetRecycleBinDocumentByIdOriginalParentData, GetRecycleBinDocumentByIdOriginalParentResponse, PutRecycleBinDocumentByIdRestoreData, PutRecycleBinDocumentByIdRestoreResponse, GetRecycleBinDocumentChildrenData, GetRecycleBinDocumentChildrenResponse, GetRecycleBinDocumentRootData, GetRecycleBinDocumentRootResponse, GetTreeDocumentAncestorsData, GetTreeDocumentAncestorsResponse, GetTreeDocumentChildrenData, GetTreeDocumentChildrenResponse, GetTreeDocumentRootData, GetTreeDocumentRootResponse, PostDocumentBlueprintData, PostDocumentBlueprintResponse, GetDocumentBlueprintByIdData, GetDocumentBlueprintByIdResponse, DeleteDocumentBlueprintByIdData, DeleteDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdData, PutDocumentBlueprintByIdResponse, PutDocumentBlueprintByIdMoveData, PutDocumentBlueprintByIdMoveResponse, PostDocumentBlueprintFolderData, PostDocumentBlueprintFolderResponse, GetDocumentBlueprintFolderByIdData, GetDocumentBlueprintFolderByIdResponse, DeleteDocumentBlueprintFolderByIdData, DeleteDocumentBlueprintFolderByIdResponse, PutDocumentBlueprintFolderByIdData, PutDocumentBlueprintFolderByIdResponse, PostDocumentBlueprintFromDocumentData, PostDocumentBlueprintFromDocumentResponse, GetItemDocumentBlueprintData, GetItemDocumentBlueprintResponse, GetTreeDocumentBlueprintAncestorsData, GetTreeDocumentBlueprintAncestorsResponse, GetTreeDocumentBlueprintChildrenData, GetTreeDocumentBlueprintChildrenResponse, GetTreeDocumentBlueprintRootData, GetTreeDocumentBlueprintRootResponse, PostDocumentTypeData, PostDocumentTypeResponse, GetDocumentTypeByIdData, GetDocumentTypeByIdResponse, DeleteDocumentTypeByIdData, DeleteDocumentTypeByIdResponse, PutDocumentTypeByIdData, PutDocumentTypeByIdResponse, GetDocumentTypeByIdAllowedChildrenData, GetDocumentTypeByIdAllowedChildrenResponse, GetDocumentTypeByIdBlueprintData, GetDocumentTypeByIdBlueprintResponse, GetDocumentTypeByIdCompositionReferencesData, GetDocumentTypeByIdCompositionReferencesResponse, PostDocumentTypeByIdCopyData, PostDocumentTypeByIdCopyResponse, GetDocumentTypeByIdExportData, GetDocumentTypeByIdExportResponse, PutDocumentTypeByIdImportData, PutDocumentTypeByIdImportResponse, PutDocumentTypeByIdMoveData, PutDocumentTypeByIdMoveResponse, GetDocumentTypeAllowedAtRootData, GetDocumentTypeAllowedAtRootResponse, PostDocumentTypeAvailableCompositionsData, PostDocumentTypeAvailableCompositionsResponse, GetDocumentTypeConfigurationResponse, PostDocumentTypeFolderData, PostDocumentTypeFolderResponse, GetDocumentTypeFolderByIdData, GetDocumentTypeFolderByIdResponse, DeleteDocumentTypeFolderByIdData, DeleteDocumentTypeFolderByIdResponse, PutDocumentTypeFolderByIdData, PutDocumentTypeFolderByIdResponse, PostDocumentTypeImportData, PostDocumentTypeImportResponse, GetItemDocumentTypeData, GetItemDocumentTypeResponse, GetItemDocumentTypeSearchData, GetItemDocumentTypeSearchResponse, GetTreeDocumentTypeAncestorsData, GetTreeDocumentTypeAncestorsResponse, GetTreeDocumentTypeChildrenData, GetTreeDocumentTypeChildrenResponse, GetTreeDocumentTypeRootData, GetTreeDocumentTypeRootResponse, GetDocumentVersionData, GetDocumentVersionResponse, GetDocumentVersionByIdData, GetDocumentVersionByIdResponse, PutDocumentVersionByIdPreventCleanupData, PutDocumentVersionByIdPreventCleanupResponse, PostDocumentVersionByIdRollbackData, PostDocumentVersionByIdRollbackResponse, PostDynamicRootQueryData, PostDynamicRootQueryResponse, GetDynamicRootStepsResponse, GetHealthCheckGroupData, GetHealthCheckGroupResponse, GetHealthCheckGroupByNameData, GetHealthCheckGroupByNameResponse, PostHealthCheckGroupByNameCheckData, PostHealthCheckGroupByNameCheckResponse, PostHealthCheckExecuteActionData, PostHealthCheckExecuteActionResponse, GetHelpData, GetHelpResponse, GetImagingResizeUrlsData, GetImagingResizeUrlsResponse, GetImportAnalyzeData, GetImportAnalyzeResponse, GetIndexerData, GetIndexerResponse, GetIndexerByIndexNameData, GetIndexerByIndexNameResponse, PostIndexerByIndexNameRebuildData, PostIndexerByIndexNameRebuildResponse, GetInstallSettingsResponse, PostInstallSetupData, PostInstallSetupResponse, PostInstallValidateDatabaseData, PostInstallValidateDatabaseResponse, GetItemLanguageData, GetItemLanguageResponse, GetItemLanguageDefaultResponse, GetLanguageData, GetLanguageResponse, PostLanguageData, PostLanguageResponse, GetLanguageByIsoCodeData, GetLanguageByIsoCodeResponse, DeleteLanguageByIsoCodeData, DeleteLanguageByIsoCodeResponse, PutLanguageByIsoCodeData, PutLanguageByIsoCodeResponse, GetLogViewerLevelData, GetLogViewerLevelResponse, GetLogViewerLevelCountData, GetLogViewerLevelCountResponse, GetLogViewerLogData, GetLogViewerLogResponse, GetLogViewerMessageTemplateData, GetLogViewerMessageTemplateResponse, GetLogViewerSavedSearchData, GetLogViewerSavedSearchResponse, PostLogViewerSavedSearchData, PostLogViewerSavedSearchResponse, GetLogViewerSavedSearchByNameData, GetLogViewerSavedSearchByNameResponse, DeleteLogViewerSavedSearchByNameData, DeleteLogViewerSavedSearchByNameResponse, GetLogViewerValidateLogsSizeData, GetLogViewerValidateLogsSizeResponse, GetManifestManifestResponse, GetManifestManifestPrivateResponse, GetManifestManifestPublicResponse, GetCollectionMediaData, GetCollectionMediaResponse, GetItemMediaData, GetItemMediaResponse, GetItemMediaSearchData, GetItemMediaSearchResponse, PostMediaData, PostMediaResponse, GetMediaByIdData, GetMediaByIdResponse, DeleteMediaByIdData, DeleteMediaByIdResponse, PutMediaByIdData, PutMediaByIdResponse, GetMediaByIdAuditLogData, GetMediaByIdAuditLogResponse, PutMediaByIdMoveData, PutMediaByIdMoveResponse, PutMediaByIdMoveToRecycleBinData, PutMediaByIdMoveToRecycleBinResponse, GetMediaByIdReferencedByData, GetMediaByIdReferencedByResponse, GetMediaByIdReferencedDescendantsData, GetMediaByIdReferencedDescendantsResponse, PutMediaByIdValidateData, PutMediaByIdValidateResponse, GetMediaAreReferencedData, GetMediaAreReferencedResponse, GetMediaConfigurationResponse, PutMediaSortData, PutMediaSortResponse, GetMediaUrlsData, GetMediaUrlsResponse, PostMediaValidateData, PostMediaValidateResponse, DeleteRecycleBinMediaResponse, DeleteRecycleBinMediaByIdData, DeleteRecycleBinMediaByIdResponse, GetRecycleBinMediaByIdOriginalParentData, GetRecycleBinMediaByIdOriginalParentResponse, PutRecycleBinMediaByIdRestoreData, PutRecycleBinMediaByIdRestoreResponse, GetRecycleBinMediaChildrenData, GetRecycleBinMediaChildrenResponse, GetRecycleBinMediaRootData, GetRecycleBinMediaRootResponse, GetTreeMediaAncestorsData, GetTreeMediaAncestorsResponse, GetTreeMediaChildrenData, GetTreeMediaChildrenResponse, GetTreeMediaRootData, GetTreeMediaRootResponse, GetItemMediaTypeData, GetItemMediaTypeResponse, GetItemMediaTypeAllowedData, GetItemMediaTypeAllowedResponse, GetItemMediaTypeFoldersData, GetItemMediaTypeFoldersResponse, GetItemMediaTypeSearchData, GetItemMediaTypeSearchResponse, PostMediaTypeData, PostMediaTypeResponse, GetMediaTypeByIdData, GetMediaTypeByIdResponse, DeleteMediaTypeByIdData, DeleteMediaTypeByIdResponse, PutMediaTypeByIdData, PutMediaTypeByIdResponse, GetMediaTypeByIdAllowedChildrenData, GetMediaTypeByIdAllowedChildrenResponse, GetMediaTypeByIdCompositionReferencesData, GetMediaTypeByIdCompositionReferencesResponse, PostMediaTypeByIdCopyData, PostMediaTypeByIdCopyResponse, GetMediaTypeByIdExportData, GetMediaTypeByIdExportResponse, PutMediaTypeByIdImportData, PutMediaTypeByIdImportResponse, PutMediaTypeByIdMoveData, PutMediaTypeByIdMoveResponse, GetMediaTypeAllowedAtRootData, GetMediaTypeAllowedAtRootResponse, PostMediaTypeAvailableCompositionsData, PostMediaTypeAvailableCompositionsResponse, GetMediaTypeConfigurationResponse, PostMediaTypeFolderData, PostMediaTypeFolderResponse, GetMediaTypeFolderByIdData, GetMediaTypeFolderByIdResponse, DeleteMediaTypeFolderByIdData, DeleteMediaTypeFolderByIdResponse, PutMediaTypeFolderByIdData, PutMediaTypeFolderByIdResponse, PostMediaTypeImportData, PostMediaTypeImportResponse, GetTreeMediaTypeAncestorsData, GetTreeMediaTypeAncestorsResponse, GetTreeMediaTypeChildrenData, GetTreeMediaTypeChildrenResponse, GetTreeMediaTypeRootData, GetTreeMediaTypeRootResponse, GetFilterMemberData, GetFilterMemberResponse, GetItemMemberData, GetItemMemberResponse, GetItemMemberSearchData, GetItemMemberSearchResponse, PostMemberData, PostMemberResponse, GetMemberByIdData, GetMemberByIdResponse, DeleteMemberByIdData, DeleteMemberByIdResponse, PutMemberByIdData, PutMemberByIdResponse, PutMemberByIdValidateData, PutMemberByIdValidateResponse, GetMemberConfigurationResponse, PostMemberValidateData, PostMemberValidateResponse, GetItemMemberGroupData, GetItemMemberGroupResponse, GetMemberGroupData, GetMemberGroupResponse, PostMemberGroupData, PostMemberGroupResponse, GetMemberGroupByIdData, GetMemberGroupByIdResponse, DeleteMemberGroupByIdData, DeleteMemberGroupByIdResponse, PutMemberGroupByIdData, PutMemberGroupByIdResponse, GetTreeMemberGroupRootData, GetTreeMemberGroupRootResponse, GetItemMemberTypeData, GetItemMemberTypeResponse, GetItemMemberTypeSearchData, GetItemMemberTypeSearchResponse, PostMemberTypeData, PostMemberTypeResponse, GetMemberTypeByIdData, GetMemberTypeByIdResponse, DeleteMemberTypeByIdData, DeleteMemberTypeByIdResponse, PutMemberTypeByIdData, PutMemberTypeByIdResponse, GetMemberTypeByIdCompositionReferencesData, GetMemberTypeByIdCompositionReferencesResponse, PostMemberTypeByIdCopyData, PostMemberTypeByIdCopyResponse, PostMemberTypeAvailableCompositionsData, PostMemberTypeAvailableCompositionsResponse, GetMemberTypeConfigurationResponse, GetTreeMemberTypeRootData, GetTreeMemberTypeRootResponse, PostModelsBuilderBuildResponse, GetModelsBuilderDashboardResponse, GetModelsBuilderStatusResponse, GetObjectTypesData, GetObjectTypesResponse, GetOembedQueryData, GetOembedQueryResponse, PostPackageByNameRunMigrationData, PostPackageByNameRunMigrationResponse, GetPackageConfigurationResponse, GetPackageCreatedData, GetPackageCreatedResponse, PostPackageCreatedData, PostPackageCreatedResponse, GetPackageCreatedByIdData, GetPackageCreatedByIdResponse, DeletePackageCreatedByIdData, DeletePackageCreatedByIdResponse, PutPackageCreatedByIdData, PutPackageCreatedByIdResponse, GetPackageCreatedByIdDownloadData, GetPackageCreatedByIdDownloadResponse, GetPackageMigrationStatusData, GetPackageMigrationStatusResponse, GetItemPartialViewData, GetItemPartialViewResponse, PostPartialViewData, PostPartialViewResponse, GetPartialViewByPathData, GetPartialViewByPathResponse, DeletePartialViewByPathData, DeletePartialViewByPathResponse, PutPartialViewByPathData, PutPartialViewByPathResponse, PutPartialViewByPathRenameData, PutPartialViewByPathRenameResponse, PostPartialViewFolderData, PostPartialViewFolderResponse, GetPartialViewFolderByPathData, GetPartialViewFolderByPathResponse, DeletePartialViewFolderByPathData, DeletePartialViewFolderByPathResponse, GetPartialViewSnippetData, GetPartialViewSnippetResponse, GetPartialViewSnippetByIdData, GetPartialViewSnippetByIdResponse, GetTreePartialViewAncestorsData, GetTreePartialViewAncestorsResponse, GetTreePartialViewChildrenData, GetTreePartialViewChildrenResponse, GetTreePartialViewRootData, GetTreePartialViewRootResponse, DeletePreviewResponse, PostPreviewResponse, GetProfilingStatusResponse, PutProfilingStatusData, PutProfilingStatusResponse, GetPropertyTypeIsUsedData, GetPropertyTypeIsUsedResponse, PostPublishedCacheRebuildResponse, PostPublishedCacheReloadResponse, GetRedirectManagementData, GetRedirectManagementResponse, GetRedirectManagementByIdData, GetRedirectManagementByIdResponse, DeleteRedirectManagementByIdData, DeleteRedirectManagementByIdResponse, GetRedirectManagementStatusResponse, PostRedirectManagementStatusData, PostRedirectManagementStatusResponse, GetRelationByRelationTypeIdData, GetRelationByRelationTypeIdResponse, GetItemRelationTypeData, GetItemRelationTypeResponse, GetRelationTypeData, GetRelationTypeResponse, GetRelationTypeByIdData, GetRelationTypeByIdResponse, GetItemScriptData, GetItemScriptResponse, PostScriptData, PostScriptResponse, GetScriptByPathData, GetScriptByPathResponse, DeleteScriptByPathData, DeleteScriptByPathResponse, PutScriptByPathData, PutScriptByPathResponse, PutScriptByPathRenameData, PutScriptByPathRenameResponse, PostScriptFolderData, PostScriptFolderResponse, GetScriptFolderByPathData, GetScriptFolderByPathResponse, DeleteScriptFolderByPathData, DeleteScriptFolderByPathResponse, GetTreeScriptAncestorsData, GetTreeScriptAncestorsResponse, GetTreeScriptChildrenData, GetTreeScriptChildrenResponse, GetTreeScriptRootData, GetTreeScriptRootResponse, GetSearcherData, GetSearcherResponse, GetSearcherBySearcherNameQueryData, GetSearcherBySearcherNameQueryResponse, GetSecurityConfigurationResponse, PostSecurityForgotPasswordData, PostSecurityForgotPasswordResponse, PostSecurityForgotPasswordResetData, PostSecurityForgotPasswordResetResponse, PostSecurityForgotPasswordVerifyData, PostSecurityForgotPasswordVerifyResponse, GetSegmentData, GetSegmentResponse, GetServerConfigurationResponse, GetServerInformationResponse, GetServerStatusResponse, GetServerTroubleshootingResponse, GetServerUpgradeCheckResponse, GetItemStaticFileData, GetItemStaticFileResponse, GetTreeStaticFileAncestorsData, GetTreeStaticFileAncestorsResponse, GetTreeStaticFileChildrenData, GetTreeStaticFileChildrenResponse, GetTreeStaticFileRootData, GetTreeStaticFileRootResponse, GetItemStylesheetData, GetItemStylesheetResponse, PostStylesheetData, PostStylesheetResponse, GetStylesheetByPathData, GetStylesheetByPathResponse, DeleteStylesheetByPathData, DeleteStylesheetByPathResponse, PutStylesheetByPathData, PutStylesheetByPathResponse, PutStylesheetByPathRenameData, PutStylesheetByPathRenameResponse, PostStylesheetFolderData, PostStylesheetFolderResponse, GetStylesheetFolderByPathData, GetStylesheetFolderByPathResponse, DeleteStylesheetFolderByPathData, DeleteStylesheetFolderByPathResponse, GetTreeStylesheetAncestorsData, GetTreeStylesheetAncestorsResponse, GetTreeStylesheetChildrenData, GetTreeStylesheetChildrenResponse, GetTreeStylesheetRootData, GetTreeStylesheetRootResponse, GetTagData, GetTagResponse, GetTelemetryData, GetTelemetryResponse, GetTelemetryLevelResponse, PostTelemetryLevelData, PostTelemetryLevelResponse, GetItemTemplateData, GetItemTemplateResponse, GetItemTemplateSearchData, GetItemTemplateSearchResponse, PostTemplateData, PostTemplateResponse, GetTemplateByIdData, GetTemplateByIdResponse, DeleteTemplateByIdData, DeleteTemplateByIdResponse, PutTemplateByIdData, PutTemplateByIdResponse, GetTemplateConfigurationResponse, PostTemplateQueryExecuteData, PostTemplateQueryExecuteResponse, GetTemplateQuerySettingsResponse, GetTreeTemplateAncestorsData, GetTreeTemplateAncestorsResponse, GetTreeTemplateChildrenData, GetTreeTemplateChildrenResponse, GetTreeTemplateRootData, GetTreeTemplateRootResponse, PostTemporaryFileData, PostTemporaryFileResponse, GetTemporaryFileByIdData, GetTemporaryFileByIdResponse, DeleteTemporaryFileByIdData, DeleteTemporaryFileByIdResponse, GetTemporaryFileConfigurationResponse, PostUpgradeAuthorizeResponse, GetUpgradeSettingsResponse, GetFilterUserData, GetFilterUserResponse, GetItemUserData, GetItemUserResponse, PostUserData, PostUserResponse, DeleteUserData, DeleteUserResponse, GetUserData, GetUserResponse, GetUserByIdData, GetUserByIdResponse, DeleteUserByIdData, DeleteUserByIdResponse, PutUserByIdData, PutUserByIdResponse, GetUserById2FaData, GetUserById2FaResponse, DeleteUserById2FaByProviderNameData, DeleteUserById2FaByProviderNameResponse, GetUserByIdCalculateStartNodesData, GetUserByIdCalculateStartNodesResponse, PostUserByIdChangePasswordData, PostUserByIdChangePasswordResponse, PostUserByIdClientCredentialsData, PostUserByIdClientCredentialsResponse, GetUserByIdClientCredentialsData, GetUserByIdClientCredentialsResponse, DeleteUserByIdClientCredentialsByClientIdData, DeleteUserByIdClientCredentialsByClientIdResponse, PostUserByIdResetPasswordData, PostUserByIdResetPasswordResponse, DeleteUserAvatarByIdData, DeleteUserAvatarByIdResponse, PostUserAvatarByIdData, PostUserAvatarByIdResponse, GetUserConfigurationResponse, GetUserCurrentResponse, GetUserCurrent2FaResponse, DeleteUserCurrent2FaByProviderNameData, DeleteUserCurrent2FaByProviderNameResponse, PostUserCurrent2FaByProviderNameData, PostUserCurrent2FaByProviderNameResponse, GetUserCurrent2FaByProviderNameData, GetUserCurrent2FaByProviderNameResponse, PostUserCurrentAvatarData, PostUserCurrentAvatarResponse, PostUserCurrentChangePasswordData, PostUserCurrentChangePasswordResponse, GetUserCurrentConfigurationResponse, GetUserCurrentLoginProvidersResponse, GetUserCurrentPermissionsData, GetUserCurrentPermissionsResponse, GetUserCurrentPermissionsDocumentData, GetUserCurrentPermissionsDocumentResponse, GetUserCurrentPermissionsMediaData, GetUserCurrentPermissionsMediaResponse, PostUserDisableData, PostUserDisableResponse, PostUserEnableData, PostUserEnableResponse, PostUserInviteData, PostUserInviteResponse, PostUserInviteCreatePasswordData, PostUserInviteCreatePasswordResponse, PostUserInviteResendData, PostUserInviteResendResponse, PostUserInviteVerifyData, PostUserInviteVerifyResponse, PostUserSetUserGroupsData, PostUserSetUserGroupsResponse, PostUserUnlockData, PostUserUnlockResponse, PostUserDataData, PostUserDataResponse, GetUserDataData, GetUserDataResponse, PutUserDataData, PutUserDataResponse, GetUserDataByIdData, GetUserDataByIdResponse, GetFilterUserGroupData, GetFilterUserGroupResponse, GetItemUserGroupData, GetItemUserGroupResponse, DeleteUserGroupData, DeleteUserGroupResponse, PostUserGroupData, PostUserGroupResponse, GetUserGroupData, GetUserGroupResponse, GetUserGroupByIdData, GetUserGroupByIdResponse, DeleteUserGroupByIdData, DeleteUserGroupByIdResponse, PutUserGroupByIdData, PutUserGroupByIdResponse, DeleteUserGroupByIdUsersData, DeleteUserGroupByIdUsersResponse, PostUserGroupByIdUsersData, PostUserGroupByIdUsersResponse, GetItemWebhookData, GetItemWebhookResponse, GetWebhookData, GetWebhookResponse, PostWebhookData, PostWebhookResponse, GetWebhookByIdData, GetWebhookByIdResponse, DeleteWebhookByIdData, DeleteWebhookByIdResponse, PutWebhookByIdData, PutWebhookByIdResponse, GetWebhookEventsData, GetWebhookEventsResponse } from './types.gen'; export class CultureService { /** @@ -741,17 +741,55 @@ export class DictionaryService { } -export class DocumentBlueprintService { +export class DocumentService { + /** + * @param data The data for the request. + * @param data.id + * @param data.dataTypeId + * @param data.orderBy + * @param data.orderCulture + * @param data.orderDirection + * @param data.filter + * @param data.skip + * @param data.take + * @returns unknown OK + * @throws ApiError + */ + public static getCollectionDocumentById(data: GetCollectionDocumentByIdData): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/collection/document/{id}', + path: { + id: data.id + }, + query: { + dataTypeId: data.dataTypeId, + orderBy: data.orderBy, + orderCulture: data.orderCulture, + orderDirection: data.orderDirection, + filter: data.filter, + skip: data.skip, + take: data.take + }, + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + /** * @param data The data for the request. * @param data.requestBody * @returns string Created * @throws ApiError */ - public static postDocumentBlueprint(data: PostDocumentBlueprintData = {}): CancelablePromise { + public static postDocument(data: PostDocumentData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint', + url: '/umbraco/management/api/v1/document', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Generated-Resource', @@ -770,10 +808,10 @@ export class DocumentBlueprintService { * @returns unknown OK * @throws ApiError */ - public static getDocumentBlueprintById(data: GetDocumentBlueprintByIdData): CancelablePromise { + public static getDocumentById(data: GetDocumentByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-blueprint/{id}', + url: '/umbraco/management/api/v1/document/{id}', path: { id: data.id }, @@ -791,10 +829,10 @@ export class DocumentBlueprintService { * @returns string OK * @throws ApiError */ - public static deleteDocumentBlueprintById(data: DeleteDocumentBlueprintByIdData): CancelablePromise { + public static deleteDocumentById(data: DeleteDocumentByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/document-blueprint/{id}', + url: '/umbraco/management/api/v1/document/{id}', path: { id: data.id }, @@ -815,10 +853,10 @@ export class DocumentBlueprintService { * @returns string OK * @throws ApiError */ - public static putDocumentBlueprintById(data: PutDocumentBlueprintByIdData): CancelablePromise { + public static putDocumentById(data: PutDocumentByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/{id}', + url: '/umbraco/management/api/v1/document/{id}', path: { id: data.id }, @@ -837,43 +875,51 @@ export class DocumentBlueprintService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @param data.orderDirection + * @param data.sinceDate + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static putDocumentBlueprintByIdMove(data: PutDocumentBlueprintByIdMoveData): CancelablePromise { + public static getDocumentByIdAuditLog(data: GetDocumentByIdAuditLogData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/{id}/move', + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/audit-log', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + query: { + orderDirection: data.orderDirection, + sinceDate: data.sinceDate, + skip: data.skip, + take: data.take + }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. + * @param data.id * @param data.requestBody * @returns string Created * @throws ApiError */ - public static postDocumentBlueprintFolder(data: PostDocumentBlueprintFolderData = {}): CancelablePromise { + public static postDocumentByIdCopy(data: PostDocumentByIdCopyData): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint/folder', + url: '/umbraco/management/api/v1/document/{id}/copy', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Generated-Resource', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -887,10 +933,10 @@ export class DocumentBlueprintService { * @returns unknown OK * @throws ApiError */ - public static getDocumentBlueprintFolderById(data: GetDocumentBlueprintFolderByIdData): CancelablePromise { + public static getDocumentByIdDomains(data: GetDocumentByIdDomainsData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + url: '/umbraco/management/api/v1/document/{id}/domains', path: { id: data.id }, @@ -905,22 +951,26 @@ export class DocumentBlueprintService { /** * @param data The data for the request. * @param data.id + * @param data.requestBody * @returns string OK * @throws ApiError */ - public static deleteDocumentBlueprintFolderById(data: DeleteDocumentBlueprintFolderByIdData): CancelablePromise { + public static putDocumentByIdDomains(data: PutDocumentByIdDomainsData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/domains', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 404: 'Not Found', + 409: 'Conflict' } }); } @@ -932,10 +982,10 @@ export class DocumentBlueprintService { * @returns string OK * @throws ApiError */ - public static putDocumentBlueprintFolderById(data: PutDocumentBlueprintFolderByIdData): CancelablePromise { + public static putDocumentByIdMove(data: PutDocumentByIdMoveData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + url: '/umbraco/management/api/v1/document/{id}/move', path: { id: data.id }, @@ -943,7 +993,6 @@ export class DocumentBlueprintService { mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -953,18 +1002,20 @@ export class DocumentBlueprintService { /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.id + * @returns string OK * @throws ApiError */ - public static postDocumentBlueprintFromDocument(data: PostDocumentBlueprintFromDocumentData = {}): CancelablePromise { + public static putDocumentByIdMoveToRecycleBin(data: PutDocumentByIdMoveToRecycleBinData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint/from-document', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/move-to-recycle-bin', + path: { + id: data.id + }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -978,107 +1029,107 @@ export class DocumentBlueprintService { * @returns unknown OK * @throws ApiError */ - public static getItemDocumentBlueprint(data: GetItemDocumentBlueprintData = {}): CancelablePromise { + public static getDocumentByIdNotifications(data: GetDocumentByIdNotificationsData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/document-blueprint', - query: { + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.descendantId - * @returns unknown OK + * @param data.id + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getTreeDocumentBlueprintAncestors(data: GetTreeDocumentBlueprintAncestorsData = {}): CancelablePromise { + public static putDocumentByIdNotifications(data: PutDocumentByIdNotificationsData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/ancestors', - query: { - descendantId: data.descendantId + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { + id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.parentId - * @param data.skip - * @param data.take - * @param data.foldersOnly - * @returns unknown OK + * @param data.id + * @param data.requestBody + * @returns string Created * @throws ApiError */ - public static getTreeDocumentBlueprintChildren(data: GetTreeDocumentBlueprintChildrenData = {}): CancelablePromise { + public static postDocumentByIdPublicAccess(data: PostDocumentByIdPublicAccessData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/children', - query: { - parentId: data.parentId, - skip: data.skip, - take: data.take, - foldersOnly: data.foldersOnly + method: 'POST', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.skip - * @param data.take - * @param data.foldersOnly - * @returns unknown OK + * @param data.id + * @returns string OK * @throws ApiError */ - public static getTreeDocumentBlueprintRoot(data: GetTreeDocumentBlueprintRootData = {}): CancelablePromise { + public static deleteDocumentByIdPublicAccess(data: DeleteDocumentByIdPublicAccessData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/root', - query: { - skip: data.skip, - take: data.take, - foldersOnly: data.foldersOnly + method: 'DELETE', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id: data.id }, + responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } -} - -export class DocumentTypeService { /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.id + * @returns unknown OK * @throws ApiError */ - public static postDocumentType(data: PostDocumentTypeData = {}): CancelablePromise { + public static getDocumentByIdPublicAccess(data: GetDocumentByIdPublicAccessData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id: data.id + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -1089,16 +1140,20 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getDocumentTypeById(data: GetDocumentTypeByIdData): CancelablePromise { + public static putDocumentByIdPublicAccess(data: PutDocumentByIdPublicAccessData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}', + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/public-access', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -1110,18 +1165,22 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.id + * @param data.requestBody * @returns string OK * @throws ApiError */ - public static deleteDocumentTypeById(data: DeleteDocumentTypeByIdData): CancelablePromise { + public static putDocumentByIdPublish(data: PutDocumentByIdPublishData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-type/{id}', + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/publish', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -1136,10 +1195,10 @@ export class DocumentTypeService { * @returns string OK * @throws ApiError */ - public static putDocumentTypeById(data: PutDocumentTypeByIdData): CancelablePromise { + public static putDocumentByIdPublishWithDescendants(data: PutDocumentByIdPublishWithDescendantsData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document-type/{id}', + url: '/umbraco/management/api/v1/document/{id}/publish-with-descendants', path: { id: data.id }, @@ -1158,22 +1217,16 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.id - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeByIdAllowedChildren(data: GetDocumentTypeByIdAllowedChildrenData): CancelablePromise { + public static getDocumentByIdPublished(data: GetDocumentByIdPublishedData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}/allowed-children', + url: '/umbraco/management/api/v1/document/{id}/published', path: { id: data.id }, - query: { - skip: data.skip, - take: data.take - }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -1190,10 +1243,10 @@ export class DocumentTypeService { * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeByIdBlueprint(data: GetDocumentTypeByIdBlueprintData): CancelablePromise { + public static getDocumentByIdReferencedBy(data: GetDocumentByIdReferencedByData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}/blueprint', + url: '/umbraco/management/api/v1/document/{id}/referenced-by', path: { id: data.id }, @@ -1203,8 +1256,7 @@ export class DocumentTypeService { }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -1212,21 +1264,25 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.id + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeByIdCompositionReferences(data: GetDocumentTypeByIdCompositionReferencesData): CancelablePromise { + public static getDocumentByIdReferencedDescendants(data: GetDocumentByIdReferencedDescendantsData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}/composition-references', + url: '/umbraco/management/api/v1/document/{id}/referenced-descendants', path: { id: data.id }, + query: { + skip: data.skip, + take: data.take + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -1235,19 +1291,19 @@ export class DocumentTypeService { * @param data The data for the request. * @param data.id * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postDocumentTypeByIdCopy(data: PostDocumentTypeByIdCopyData): CancelablePromise { + public static putDocumentByIdUnpublish(data: PutDocumentByIdUnpublishData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type/{id}/copy', + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/unpublish', path: { id: data.id }, body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -1258,37 +1314,17 @@ export class DocumentTypeService { } /** - * @param data The data for the request. - * @param data.id - * @returns unknown OK - * @throws ApiError - */ - public static getDocumentTypeByIdExport(data: GetDocumentTypeByIdExportData): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}/export', - path: { - id: data.id - }, - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** + * @deprecated * @param data The data for the request. * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static putDocumentTypeByIdImport(data: PutDocumentTypeByIdImportData): CancelablePromise { + public static putDocumentByIdValidate(data: PutDocumentByIdValidateData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document-type/{id}/import', + url: '/umbraco/management/api/v1/document/{id}/validate', path: { id: data.id }, @@ -1311,10 +1347,10 @@ export class DocumentTypeService { * @returns string OK * @throws ApiError */ - public static putDocumentTypeByIdMove(data: PutDocumentTypeByIdMoveData): CancelablePromise { + public static putUmbracoManagementApiV11DocumentByIdValidate11(data: PutUmbracoManagementApiV11DocumentByIdValidate11Data): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document-type/{id}/move', + url: '/umbraco/management/api/v1.1/document/{id}/validate', path: { id: data.id }, @@ -1332,16 +1368,18 @@ export class DocumentTypeService { /** * @param data The data for the request. + * @param data.id * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeAllowedAtRoot(data: GetDocumentTypeAllowedAtRootData = {}): CancelablePromise { + public static getDocumentAreReferenced(data: GetDocumentAreReferencedData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/allowed-at-root', + url: '/umbraco/management/api/v1/document/are-referenced', query: { + id: data.id, skip: data.skip, take: data.take }, @@ -1352,33 +1390,56 @@ export class DocumentTypeService { }); } + /** + * @returns unknown OK + * @throws ApiError + */ + public static getDocumentConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/configuration', + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' + } + }); + } + /** * @param data The data for the request. * @param data.requestBody - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static postDocumentTypeAvailableCompositions(data: PostDocumentTypeAvailableCompositionsData = {}): CancelablePromise { + public static putDocumentSort(data: PutDocumentSortData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type/available-compositions', + method: 'PUT', + url: '/umbraco/management/api/v1/document/sort', body: data.requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** + * @param data The data for the request. + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeConfiguration(): CancelablePromise { + public static getDocumentUrls(data: GetDocumentUrlsData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/configuration', + url: '/umbraco/management/api/v1/document/urls', + query: { + id: data.id + }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' @@ -1389,16 +1450,16 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postDocumentTypeFolder(data: PostDocumentTypeFolderData = {}): CancelablePromise { + public static postDocumentValidate(data: PostDocumentValidateData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/document-type/folder', + url: '/umbraco/management/api/v1/document/validate', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -1414,17 +1475,57 @@ export class DocumentTypeService { * @returns unknown OK * @throws ApiError */ - public static getDocumentTypeFolderById(data: GetDocumentTypeFolderByIdData): CancelablePromise { + public static getItemDocument(data: GetItemDocumentData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-type/folder/{id}', - path: { + url: '/umbraco/management/api/v1/item/document', + query: { id: data.id }, errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + + /** + * @param data The data for the request. + * @param data.query + * @param data.skip + * @param data.take + * @param data.parentId + * @returns unknown OK + * @throws ApiError + */ + public static getItemDocumentSearch(data: GetItemDocumentSearchData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document/search', + query: { + query: data.query, + skip: data.skip, + take: data.take, + parentId: data.parentId + }, + errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + + /** + * @returns string OK + * @throws ApiError + */ + public static deleteRecycleBinDocument(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/document', + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -1435,10 +1536,10 @@ export class DocumentTypeService { * @returns string OK * @throws ApiError */ - public static deleteDocumentTypeFolderById(data: DeleteDocumentTypeFolderByIdData): CancelablePromise { + public static deleteRecycleBinDocumentById(data: DeleteRecycleBinDocumentByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/document-type/folder/{id}', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}', path: { id: data.id }, @@ -1455,20 +1556,16 @@ export class DocumentTypeService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putDocumentTypeFolderById(data: PutDocumentTypeFolderByIdData): CancelablePromise { + public static getRecycleBinDocumentByIdOriginalParent(data: GetRecycleBinDocumentByIdOriginalParentData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-type/folder/{id}', + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/original-parent', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -1480,17 +1577,21 @@ export class DocumentTypeService { /** * @param data The data for the request. + * @param data.id * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postDocumentTypeImport(data: PostDocumentTypeImportData = {}): CancelablePromise { + public static putRecycleBinDocumentByIdRestore(data: PutRecycleBinDocumentByIdRestoreData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type/import', + method: 'PUT', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/restore', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -1502,42 +1603,46 @@ export class DocumentTypeService { /** * @param data The data for the request. - * @param data.id + * @param data.parentId + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemDocumentType(data: GetItemDocumentTypeData = {}): CancelablePromise { + public static getRecycleBinDocumentChildren(data: GetRecycleBinDocumentChildrenData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/document-type', + url: '/umbraco/management/api/v1/recycle-bin/document/children', query: { - id: data.id + parentId: data.parentId, + skip: data.skip, + take: data.take }, errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.query * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemDocumentTypeSearch(data: GetItemDocumentTypeSearchData = {}): CancelablePromise { + public static getRecycleBinDocumentRoot(data: GetRecycleBinDocumentRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/document-type/search', + url: '/umbraco/management/api/v1/recycle-bin/document/root', query: { - query: data.query, skip: data.skip, take: data.take }, errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' } }); } @@ -1548,10 +1653,10 @@ export class DocumentTypeService { * @returns unknown OK * @throws ApiError */ - public static getTreeDocumentTypeAncestors(data: GetTreeDocumentTypeAncestorsData = {}): CancelablePromise { + public static getTreeDocumentAncestors(data: GetTreeDocumentAncestorsData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/ancestors', + url: '/umbraco/management/api/v1/tree/document/ancestors', query: { descendantId: data.descendantId }, @@ -1567,19 +1672,19 @@ export class DocumentTypeService { * @param data.parentId * @param data.skip * @param data.take - * @param data.foldersOnly + * @param data.dataTypeId * @returns unknown OK * @throws ApiError */ - public static getTreeDocumentTypeChildren(data: GetTreeDocumentTypeChildrenData = {}): CancelablePromise { + public static getTreeDocumentChildren(data: GetTreeDocumentChildrenData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/children', + url: '/umbraco/management/api/v1/tree/document/children', query: { parentId: data.parentId, skip: data.skip, take: data.take, - foldersOnly: data.foldersOnly + dataTypeId: data.dataTypeId }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -1592,18 +1697,18 @@ export class DocumentTypeService { * @param data The data for the request. * @param data.skip * @param data.take - * @param data.foldersOnly + * @param data.dataTypeId * @returns unknown OK * @throws ApiError */ - public static getTreeDocumentTypeRoot(data: GetTreeDocumentTypeRootData = {}): CancelablePromise { + public static getTreeDocumentRoot(data: GetTreeDocumentRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/root', + url: '/umbraco/management/api/v1/tree/document/root', query: { skip: data.skip, take: data.take, - foldersOnly: data.foldersOnly + dataTypeId: data.dataTypeId }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -1614,26 +1719,20 @@ export class DocumentTypeService { } -export class DocumentVersionService { +export class DocumentBlueprintService { /** * @param data The data for the request. - * @param data.documentId - * @param data.culture - * @param data.skip - * @param data.take - * @returns unknown OK + * @param data.requestBody + * @returns string Created * @throws ApiError */ - public static getDocumentVersion(data: GetDocumentVersionData): CancelablePromise { + public static postDocumentBlueprint(data: PostDocumentBlueprintData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-version', - query: { - documentId: data.documentId, - culture: data.culture, - skip: data.skip, - take: data.take - }, + method: 'POST', + url: '/umbraco/management/api/v1/document-blueprint', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -1649,15 +1748,14 @@ export class DocumentVersionService { * @returns unknown OK * @throws ApiError */ - public static getDocumentVersionById(data: GetDocumentVersionByIdData): CancelablePromise { + public static getDocumentBlueprintById(data: GetDocumentBlueprintByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document-version/{id}', + url: '/umbraco/management/api/v1/document-blueprint/{id}', path: { id: data.id }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -1668,20 +1766,16 @@ export class DocumentVersionService { /** * @param data The data for the request. * @param data.id - * @param data.preventCleanup * @returns string OK * @throws ApiError */ - public static putDocumentVersionByIdPreventCleanup(data: PutDocumentVersionByIdPreventCleanupData): CancelablePromise { + public static deleteDocumentBlueprintById(data: DeleteDocumentBlueprintByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-version/{id}/prevent-cleanup', + method: 'DELETE', + url: '/umbraco/management/api/v1/document-blueprint/{id}', path: { id: data.id }, - query: { - preventCleanup: data.preventCleanup - }, responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', @@ -1695,20 +1789,19 @@ export class DocumentVersionService { /** * @param data The data for the request. * @param data.id - * @param data.culture + * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postDocumentVersionByIdRollback(data: PostDocumentVersionByIdRollbackData): CancelablePromise { + public static putDocumentBlueprintById(data: PutDocumentBlueprintByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-version/{id}/rollback', + method: 'PUT', + url: '/umbraco/management/api/v1/document-blueprint/{id}', path: { id: data.id }, - query: { - culture: data.culture - }, + body: data.requestBody, + mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', @@ -1719,40 +1812,24 @@ export class DocumentVersionService { }); } -} - -export class DocumentService { /** * @param data The data for the request. * @param data.id - * @param data.dataTypeId - * @param data.orderBy - * @param data.orderCulture - * @param data.orderDirection - * @param data.filter - * @param data.skip - * @param data.take - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getCollectionDocumentById(data: GetCollectionDocumentByIdData): CancelablePromise { + public static putDocumentBlueprintByIdMove(data: PutDocumentBlueprintByIdMoveData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/collection/document/{id}', + method: 'PUT', + url: '/umbraco/management/api/v1/document-blueprint/{id}/move', path: { id: data.id }, - query: { - dataTypeId: data.dataTypeId, - orderBy: data.orderBy, - orderCulture: data.orderCulture, - orderDirection: data.orderDirection, - filter: data.filter, - skip: data.skip, - take: data.take - }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -1766,10 +1843,10 @@ export class DocumentService { * @returns string Created * @throws ApiError */ - public static postDocument(data: PostDocumentData = {}): CancelablePromise { + public static postDocumentBlueprintFolder(data: PostDocumentBlueprintFolderData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/document', + url: '/umbraco/management/api/v1/document-blueprint/folder', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Generated-Resource', @@ -1788,10 +1865,10 @@ export class DocumentService { * @returns unknown OK * @throws ApiError */ - public static getDocumentById(data: GetDocumentByIdData): CancelablePromise { + public static getDocumentBlueprintFolderById(data: GetDocumentBlueprintFolderByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{id}', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', path: { id: data.id }, @@ -1809,10 +1886,10 @@ export class DocumentService { * @returns string OK * @throws ApiError */ - public static deleteDocumentById(data: DeleteDocumentByIdData): CancelablePromise { + public static deleteDocumentBlueprintFolderById(data: DeleteDocumentBlueprintFolderByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/document/{id}', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', path: { id: data.id }, @@ -1833,10 +1910,10 @@ export class DocumentService { * @returns string OK * @throws ApiError */ - public static putDocumentById(data: PutDocumentByIdData): CancelablePromise { + public static putDocumentBlueprintFolderById(data: PutDocumentBlueprintFolderByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', path: { id: data.id }, @@ -1852,127 +1929,134 @@ export class DocumentService { }); } + /** + * @param data The data for the request. + * @param data.requestBody + * @returns string Created + * @throws ApiError + */ + public static postDocumentBlueprintFromDocument(data: PostDocumentBlueprintFromDocumentData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-blueprint/from-document', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + /** * @param data The data for the request. * @param data.id - * @param data.orderDirection - * @param data.sinceDate - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getDocumentByIdAuditLog(data: GetDocumentByIdAuditLogData): CancelablePromise { + public static getItemDocumentBlueprint(data: GetItemDocumentBlueprintData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/audit-log', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/item/document-blueprint', query: { - orderDirection: data.orderDirection, - sinceDate: data.sinceDate, - skip: data.skip, - take: data.take + id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 401: 'The resource is protected and requires an authentication token' } }); } /** * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string Created + * @param data.descendantId + * @returns unknown OK * @throws ApiError */ - public static postDocumentByIdCopy(data: PostDocumentByIdCopyData): CancelablePromise { + public static getTreeDocumentBlueprintAncestors(data: GetTreeDocumentBlueprintAncestorsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document/{id}/copy', - path: { - id: data.id + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-blueprint/ancestors', + query: { + descendantId: data.descendantId }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.id + * @param data.parentId + * @param data.skip + * @param data.take + * @param data.foldersOnly * @returns unknown OK * @throws ApiError */ - public static getDocumentByIdDomains(data: GetDocumentByIdDomainsData): CancelablePromise { + public static getTreeDocumentBlueprintChildren(data: GetTreeDocumentBlueprintChildrenData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/domains', - path: { - id: data.id + url: '/umbraco/management/api/v1/tree/document-blueprint/children', + query: { + parentId: data.parentId, + skip: data.skip, + take: data.take, + foldersOnly: data.foldersOnly }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK + * @param data.skip + * @param data.take + * @param data.foldersOnly + * @returns unknown OK * @throws ApiError */ - public static putDocumentByIdDomains(data: PutDocumentByIdDomainsData): CancelablePromise { + public static getTreeDocumentBlueprintRoot(data: GetTreeDocumentBlueprintRootData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/domains', - path: { - id: data.id + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-blueprint/root', + query: { + skip: data.skip, + take: data.take, + foldersOnly: data.foldersOnly }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found', - 409: 'Conflict' + 403: 'The authenticated user do not have access to this resource' } }); } +} + +export class DocumentTypeService { /** * @param data The data for the request. - * @param data.id * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static putDocumentByIdMove(data: PutDocumentByIdMoveData): CancelablePromise { + public static postDocumentType(data: PostDocumentTypeData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/move', - path: { - id: data.id - }, + method: 'POST', + url: '/umbraco/management/api/v1/document-type', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -1983,19 +2067,17 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putDocumentByIdMoveToRecycleBin(data: PutDocumentByIdMoveToRecycleBinData): CancelablePromise { + public static getDocumentTypeById(data: GetDocumentTypeByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/move-to-recycle-bin', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}', path: { id: data.id }, - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2006,16 +2088,17 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static getDocumentByIdNotifications(data: GetDocumentByIdNotificationsData): CancelablePromise { + public static deleteDocumentTypeById(data: DeleteDocumentTypeByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/notifications', + method: 'DELETE', + url: '/umbraco/management/api/v1/document-type/{id}', path: { id: data.id }, + responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -2031,10 +2114,10 @@ export class DocumentService { * @returns string OK * @throws ApiError */ - public static putDocumentByIdNotifications(data: PutDocumentByIdNotificationsData): CancelablePromise { + public static putDocumentTypeById(data: PutDocumentTypeByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/notifications', + url: '/umbraco/management/api/v1/document-type/{id}', path: { id: data.id }, @@ -2042,6 +2125,7 @@ export class DocumentService { mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2052,20 +2136,22 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string Created + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static postDocumentByIdPublicAccess(data: PostDocumentByIdPublicAccessData): CancelablePromise { + public static getDocumentTypeByIdAllowedChildren(data: GetDocumentTypeByIdAllowedChildrenData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document/{id}/public-access', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/allowed-children', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + query: { + skip: data.skip, + take: data.take + }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -2077,17 +2163,22 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static deleteDocumentByIdPublicAccess(data: DeleteDocumentByIdPublicAccessData): CancelablePromise { + public static getDocumentTypeByIdBlueprint(data: GetDocumentTypeByIdBlueprintData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document/{id}/public-access', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/blueprint', path: { id: data.id }, - responseHeader: 'Umb-Notifications', + query: { + skip: data.skip, + take: data.take + }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -2102,14 +2193,15 @@ export class DocumentService { * @returns unknown OK * @throws ApiError */ - public static getDocumentByIdPublicAccess(data: GetDocumentByIdPublicAccessData): CancelablePromise { + public static getDocumentTypeByIdCompositionReferences(data: GetDocumentTypeByIdCompositionReferencesData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/public-access', + url: '/umbraco/management/api/v1/document-type/{id}/composition-references', path: { id: data.id }, errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2121,20 +2213,21 @@ export class DocumentService { * @param data The data for the request. * @param data.id * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static putDocumentByIdPublicAccess(data: PutDocumentByIdPublicAccessData): CancelablePromise { + public static postDocumentTypeByIdCopy(data: PostDocumentTypeByIdCopyData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/public-access', + method: 'POST', + url: '/umbraco/management/api/v1/document-type/{id}/copy', path: { id: data.id }, body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2145,22 +2238,17 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putDocumentByIdPublish(data: PutDocumentByIdPublishData): CancelablePromise { + public static getDocumentTypeByIdExport(data: GetDocumentTypeByIdExportData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/publish', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/export', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2175,10 +2263,10 @@ export class DocumentService { * @returns string OK * @throws ApiError */ - public static putDocumentByIdPublishWithDescendants(data: PutDocumentByIdPublishWithDescendantsData): CancelablePromise { + public static putDocumentTypeByIdImport(data: PutDocumentTypeByIdImportData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/publish-with-descendants', + url: '/umbraco/management/api/v1/document-type/{id}/import', path: { id: data.id }, @@ -2197,17 +2285,22 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getDocumentByIdPublished(data: GetDocumentByIdPublishedData): CancelablePromise { + public static putDocumentTypeByIdMove(data: PutDocumentTypeByIdMoveData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/published', + method: 'PUT', + url: '/umbraco/management/api/v1/document-type/{id}/move', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2217,19 +2310,15 @@ export class DocumentService { /** * @param data The data for the request. - * @param data.id * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getDocumentByIdReferencedBy(data: GetDocumentByIdReferencedByData): CancelablePromise { + public static getDocumentTypeAllowedAtRoot(data: GetDocumentTypeAllowedAtRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/referenced-by', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/document-type/allowed-at-root', query: { skip: data.skip, take: data.take @@ -2243,23 +2332,16 @@ export class DocumentService { /** * @param data The data for the request. - * @param data.id - * @param data.skip - * @param data.take + * @param data.requestBody * @returns unknown OK * @throws ApiError */ - public static getDocumentByIdReferencedDescendants(data: GetDocumentByIdReferencedDescendantsData): CancelablePromise { + public static postDocumentTypeAvailableCompositions(data: PostDocumentTypeAvailableCompositionsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/referenced-descendants', - path: { - id: data.id - }, - query: { - skip: data.skip, - take: data.take - }, + method: 'POST', + url: '/umbraco/management/api/v1/document-type/available-compositions', + body: data.requestBody, + mediaType: 'application/json', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' @@ -2268,49 +2350,33 @@ export class DocumentService { } /** - * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putDocumentByIdUnpublish(data: PutDocumentByIdUnpublishData): CancelablePromise { + public static getDocumentTypeConfiguration(): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/unpublish', - path: { - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/configuration', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** - * @deprecated * @param data The data for the request. - * @param data.id * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static putDocumentByIdValidate(data: PutDocumentByIdValidateData): CancelablePromise { + public static postDocumentTypeFolder(data: PostDocumentTypeFolderData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/validate', - path: { - id: data.id - }, + method: 'POST', + url: '/umbraco/management/api/v1/document-type/folder', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -2323,22 +2389,17 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putUmbracoManagementApiV11DocumentByIdValidate11(data: PutUmbracoManagementApiV11DocumentByIdValidate11Data): CancelablePromise { + public static getDocumentTypeFolderById(data: GetDocumentTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1.1/document/{id}/validate', + method: 'GET', + url: '/umbraco/management/api/v1/document-type/folder/{id}', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -2349,52 +2410,40 @@ export class DocumentService { /** * @param data The data for the request. * @param data.id - * @param data.skip - * @param data.take - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static getDocumentAreReferenced(data: GetDocumentAreReferencedData = {}): CancelablePromise { + public static deleteDocumentTypeFolderById(data: DeleteDocumentTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/are-referenced', - query: { - id: data.id, - skip: data.skip, - take: data.take + method: 'DELETE', + url: '/umbraco/management/api/v1/document-type/folder/{id}', + path: { + id: data.id }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - - /** - * @returns unknown OK - * @throws ApiError - */ - public static getDocumentConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/configuration', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. + * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static putDocumentSort(data: PutDocumentSortData = {}): CancelablePromise { + public static putDocumentTypeFolderById(data: PutDocumentTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/document/sort', + url: '/umbraco/management/api/v1/document-type/folder/{id}', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', @@ -2407,39 +2456,19 @@ export class DocumentService { }); } - /** - * @param data The data for the request. - * @param data.id - * @returns unknown OK - * @throws ApiError - */ - public static getDocumentUrls(data: GetDocumentUrlsData = {}): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/urls', - query: { - id: data.id - }, - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static postDocumentValidate(data: PostDocumentValidateData = {}): CancelablePromise { + public static postDocumentTypeImport(data: PostDocumentTypeImportData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/document/validate', + url: '/umbraco/management/api/v1/document-type/import', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -2455,10 +2484,10 @@ export class DocumentService { * @returns unknown OK * @throws ApiError */ - public static getItemDocument(data: GetItemDocumentData = {}): CancelablePromise { + public static getItemDocumentType(data: GetItemDocumentTypeData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/document', + url: '/umbraco/management/api/v1/item/document-type', query: { id: data.id }, @@ -2473,19 +2502,17 @@ export class DocumentService { * @param data.query * @param data.skip * @param data.take - * @param data.parentId * @returns unknown OK * @throws ApiError */ - public static getItemDocumentSearch(data: GetItemDocumentSearchData = {}): CancelablePromise { + public static getItemDocumentTypeSearch(data: GetItemDocumentTypeSearchData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/document/search', + url: '/umbraco/management/api/v1/item/document-type/search', query: { query: data.query, skip: data.skip, - take: data.take, - parentId: data.parentId + take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -2494,16 +2521,19 @@ export class DocumentService { } /** - * @returns string OK + * @param data The data for the request. + * @param data.descendantId + * @returns unknown OK * @throws ApiError */ - public static deleteRecycleBinDocument(): CancelablePromise { + public static getTreeDocumentTypeAncestors(data: GetTreeDocumentTypeAncestorsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/document', - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-type/ancestors', + query: { + descendantId: data.descendantId + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' } @@ -2512,91 +2542,46 @@ export class DocumentService { /** * @param data The data for the request. - * @param data.id - * @returns string OK + * @param data.parentId + * @param data.skip + * @param data.take + * @param data.foldersOnly + * @returns unknown OK * @throws ApiError */ - public static deleteRecycleBinDocumentById(data: DeleteRecycleBinDocumentByIdData): CancelablePromise { + public static getTreeDocumentTypeChildren(data: GetTreeDocumentTypeChildrenData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/document/{id}', - path: { - id: data.id + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-type/children', + query: { + parentId: data.parentId, + skip: data.skip, + take: data.take, + foldersOnly: data.foldersOnly }, - responseHeader: 'Umb-Notifications', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @returns unknown OK - * @throws ApiError - */ - public static getRecycleBinDocumentByIdOriginalParent(data: GetRecycleBinDocumentByIdOriginalParentData): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/{id}/original-parent', - path: { - id: data.id - }, - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK - * @throws ApiError - */ - public static putRecycleBinDocumentByIdRestore(data: PutRecycleBinDocumentByIdRestoreData): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/recycle-bin/document/{id}/restore', - path: { - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.parentId * @param data.skip * @param data.take + * @param data.foldersOnly * @returns unknown OK * @throws ApiError */ - public static getRecycleBinDocumentChildren(data: GetRecycleBinDocumentChildrenData = {}): CancelablePromise { + public static getTreeDocumentTypeRoot(data: GetTreeDocumentTypeRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/children', + url: '/umbraco/management/api/v1/tree/document-type/root', query: { - parentId: data.parentId, skip: data.skip, - take: data.take + take: data.take, + foldersOnly: data.foldersOnly }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -2605,94 +2590,109 @@ export class DocumentService { }); } +} + +export class DocumentVersionService { /** * @param data The data for the request. + * @param data.documentId + * @param data.culture * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getRecycleBinDocumentRoot(data: GetRecycleBinDocumentRootData = {}): CancelablePromise { + public static getDocumentVersion(data: GetDocumentVersionData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/root', + url: '/umbraco/management/api/v1/document-version', query: { + documentId: data.documentId, + culture: data.culture, skip: data.skip, take: data.take }, errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.descendantId + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getTreeDocumentAncestors(data: GetTreeDocumentAncestorsData = {}): CancelablePromise { + public static getDocumentVersionById(data: GetDocumentVersionByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/document/ancestors', - query: { - descendantId: data.descendantId + url: '/umbraco/management/api/v1/document-version/{id}', + path: { + id: data.id }, errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.parentId - * @param data.skip - * @param data.take - * @param data.dataTypeId - * @returns unknown OK + * @param data.id + * @param data.preventCleanup + * @returns string OK * @throws ApiError */ - public static getTreeDocumentChildren(data: GetTreeDocumentChildrenData = {}): CancelablePromise { + public static putDocumentVersionByIdPreventCleanup(data: PutDocumentVersionByIdPreventCleanupData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/children', + method: 'PUT', + url: '/umbraco/management/api/v1/document-version/{id}/prevent-cleanup', + path: { + id: data.id + }, query: { - parentId: data.parentId, - skip: data.skip, - take: data.take, - dataTypeId: data.dataTypeId + preventCleanup: data.preventCleanup }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.skip - * @param data.take - * @param data.dataTypeId - * @returns unknown OK + * @param data.id + * @param data.culture + * @returns string OK * @throws ApiError */ - public static getTreeDocumentRoot(data: GetTreeDocumentRootData = {}): CancelablePromise { + public static postDocumentVersionByIdRollback(data: PostDocumentVersionByIdRollbackData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/root', + method: 'POST', + url: '/umbraco/management/api/v1/document-version/{id}/rollback', + path: { + id: data.id + }, query: { - skip: data.skip, - take: data.take, - dataTypeId: data.dataTypeId + culture: data.culture }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -3437,63 +3437,53 @@ export class ManifestService { } -export class MediaTypeService { +export class MediaService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK - * @throws ApiError - */ - public static getItemMediaType(data: GetItemMediaTypeData = {}): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/media-type', - query: { - id: data.id - }, - errors: { - 401: 'The resource is protected and requires an authentication token' - } - }); - } - - /** - * @param data The data for the request. - * @param data.fileExtension + * @param data.dataTypeId + * @param data.orderBy + * @param data.orderDirection + * @param data.filter * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemMediaTypeAllowed(data: GetItemMediaTypeAllowedData = {}): CancelablePromise { + public static getCollectionMedia(data: GetCollectionMediaData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/media-type/allowed', + url: '/umbraco/management/api/v1/collection/media', query: { - fileExtension: data.fileExtension, + id: data.id, + dataTypeId: data.dataTypeId, + orderBy: data.orderBy, + orderDirection: data.orderDirection, + filter: data.filter, skip: data.skip, take: data.take }, errors: { - 401: 'The resource is protected and requires an authentication token' + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.skip - * @param data.take + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getItemMediaTypeFolders(data: GetItemMediaTypeFoldersData = {}): CancelablePromise { + public static getItemMedia(data: GetItemMediaData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/media-type/folders', + url: '/umbraco/management/api/v1/item/media', query: { - skip: data.skip, - take: data.take + id: data.id }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -3506,17 +3496,19 @@ export class MediaTypeService { * @param data.query * @param data.skip * @param data.take + * @param data.parentId * @returns unknown OK * @throws ApiError */ - public static getItemMediaTypeSearch(data: GetItemMediaTypeSearchData = {}): CancelablePromise { + public static getItemMediaSearch(data: GetItemMediaSearchData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/media-type/search', + url: '/umbraco/management/api/v1/item/media/search', query: { query: data.query, skip: data.skip, - take: data.take + take: data.take, + parentId: data.parentId }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -3530,10 +3522,10 @@ export class MediaTypeService { * @returns string Created * @throws ApiError */ - public static postMediaType(data: PostMediaTypeData = {}): CancelablePromise { + public static postMedia(data: PostMediaData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/media-type', + url: '/umbraco/management/api/v1/media', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Generated-Resource', @@ -3552,10 +3544,10 @@ export class MediaTypeService { * @returns unknown OK * @throws ApiError */ - public static getMediaTypeById(data: GetMediaTypeByIdData): CancelablePromise { + public static getMediaById(data: GetMediaByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/{id}', + url: '/umbraco/management/api/v1/media/{id}', path: { id: data.id }, @@ -3573,15 +3565,16 @@ export class MediaTypeService { * @returns string OK * @throws ApiError */ - public static deleteMediaTypeById(data: DeleteMediaTypeByIdData): CancelablePromise { + public static deleteMediaById(data: DeleteMediaByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/media-type/{id}', + url: '/umbraco/management/api/v1/media/{id}', path: { id: data.id }, responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -3596,10 +3589,10 @@ export class MediaTypeService { * @returns string OK * @throws ApiError */ - public static putMediaTypeById(data: PutMediaTypeByIdData): CancelablePromise { + public static putMediaById(data: PutMediaByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media-type/{id}', + url: '/umbraco/management/api/v1/media/{id}', path: { id: data.id }, @@ -3618,26 +3611,29 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id + * @param data.orderDirection + * @param data.sinceDate * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaTypeByIdAllowedChildren(data: GetMediaTypeByIdAllowedChildrenData): CancelablePromise { + public static getMediaByIdAuditLog(data: GetMediaByIdAuditLogData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/{id}/allowed-children', + url: '/umbraco/management/api/v1/media/{id}/audit-log', path: { id: data.id }, query: { + orderDirection: data.orderDirection, + sinceDate: data.sinceDate, skip: data.skip, take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -3645,18 +3641,21 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getMediaTypeByIdCompositionReferences(data: GetMediaTypeByIdCompositionReferencesData): CancelablePromise { + public static putMediaByIdMove(data: PutMediaByIdMoveData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media-type/{id}/composition-references', + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/move', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -3667,20 +3666,17 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postMediaTypeByIdCopy(data: PostMediaTypeByIdCopyData): CancelablePromise { + public static putMediaByIdMoveToRecycleBin(data: PutMediaByIdMoveToRecycleBinData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media-type/{id}/copy', + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/move-to-recycle-bin', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -3693,20 +3689,25 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaTypeByIdExport(data: GetMediaTypeByIdExportData): CancelablePromise { + public static getMediaByIdReferencedBy(data: GetMediaByIdReferencedByData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/{id}/export', + url: '/umbraco/management/api/v1/media/{id}/referenced-by', path: { id: data.id }, + query: { + skip: data.skip, + take: data.take + }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -3714,25 +3715,25 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static putMediaTypeByIdImport(data: PutMediaTypeByIdImportData): CancelablePromise { + public static getMediaByIdReferencedDescendants(data: GetMediaByIdReferencedDescendantsData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media-type/{id}/import', + method: 'GET', + url: '/umbraco/management/api/v1/media/{id}/referenced-descendants', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + query: { + skip: data.skip, + take: data.take + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -3744,10 +3745,10 @@ export class MediaTypeService { * @returns string OK * @throws ApiError */ - public static putMediaTypeByIdMove(data: PutMediaTypeByIdMoveData): CancelablePromise { + public static putMediaByIdValidate(data: PutMediaByIdValidateData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media-type/{id}/move', + url: '/umbraco/management/api/v1/media/{id}/validate', path: { id: data.id }, @@ -3765,16 +3766,18 @@ export class MediaTypeService { /** * @param data The data for the request. + * @param data.id * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaTypeAllowedAtRoot(data: GetMediaTypeAllowedAtRootData = {}): CancelablePromise { + public static getMediaAreReferenced(data: GetMediaAreReferencedData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/allowed-at-root', + url: '/umbraco/management/api/v1/media/are-referenced', query: { + id: data.id, skip: data.skip, take: data.take }, @@ -3785,33 +3788,56 @@ export class MediaTypeService { }); } + /** + * @returns unknown OK + * @throws ApiError + */ + public static getMediaConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/configuration', + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' + } + }); + } + /** * @param data The data for the request. * @param data.requestBody - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static postMediaTypeAvailableCompositions(data: PostMediaTypeAvailableCompositionsData = {}): CancelablePromise { + public static putMediaSort(data: PutMediaSortData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media-type/available-compositions', + method: 'PUT', + url: '/umbraco/management/api/v1/media/sort', body: data.requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** + * @param data The data for the request. + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getMediaTypeConfiguration(): CancelablePromise { + public static getMediaUrls(data: GetMediaUrlsData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media-type/configuration', + url: '/umbraco/management/api/v1/media/urls', + query: { + id: data.id + }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' @@ -3822,16 +3848,16 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postMediaTypeFolder(data: PostMediaTypeFolderData = {}): CancelablePromise { + public static postMediaValidate(data: PostMediaValidateData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/media-type/folder', + url: '/umbraco/management/api/v1/media/validate', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -3841,20 +3867,39 @@ export class MediaTypeService { }); } + /** + * @returns string OK + * @throws ApiError + */ + public static deleteRecycleBinMedia(): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/media', + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' + } + }); + } + /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static getMediaTypeFolderById(data: GetMediaTypeFolderByIdData): CancelablePromise { + public static deleteRecycleBinMediaById(data: DeleteRecycleBinMediaByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media-type/folder/{id}', + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}', path: { id: data.id }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -3865,17 +3910,16 @@ export class MediaTypeService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteMediaTypeFolderById(data: DeleteMediaTypeFolderByIdData): CancelablePromise { + public static getRecycleBinMediaByIdOriginalParent(data: GetRecycleBinMediaByIdOriginalParentData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/media-type/folder/{id}', + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/original-parent', path: { id: data.id }, - responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -3892,10 +3936,10 @@ export class MediaTypeService { * @returns string OK * @throws ApiError */ - public static putMediaTypeFolderById(data: PutMediaTypeFolderByIdData): CancelablePromise { + public static putRecycleBinMediaByIdRestore(data: PutRecycleBinMediaByIdRestoreData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media-type/folder/{id}', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/restore', path: { id: data.id }, @@ -3913,22 +3957,46 @@ export class MediaTypeService { /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.parentId + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static postMediaTypeImport(data: PostMediaTypeImportData = {}): CancelablePromise { + public static getRecycleBinMediaChildren(data: GetRecycleBinMediaChildrenData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media-type/import', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/children', + query: { + parentId: data.parentId, + skip: data.skip, + take: data.take + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' + } + }); + } + + /** + * @param data The data for the request. + * @param data.skip + * @param data.take + * @returns unknown OK + * @throws ApiError + */ + public static getRecycleBinMediaRoot(data: GetRecycleBinMediaRootData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/root', + query: { + skip: data.skip, + take: data.take + }, + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' } }); } @@ -3939,10 +4007,10 @@ export class MediaTypeService { * @returns unknown OK * @throws ApiError */ - public static getTreeMediaTypeAncestors(data: GetTreeMediaTypeAncestorsData = {}): CancelablePromise { + public static getTreeMediaAncestors(data: GetTreeMediaAncestorsData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/ancestors', + url: '/umbraco/management/api/v1/tree/media/ancestors', query: { descendantId: data.descendantId }, @@ -3958,19 +4026,19 @@ export class MediaTypeService { * @param data.parentId * @param data.skip * @param data.take - * @param data.foldersOnly + * @param data.dataTypeId * @returns unknown OK * @throws ApiError */ - public static getTreeMediaTypeChildren(data: GetTreeMediaTypeChildrenData = {}): CancelablePromise { + public static getTreeMediaChildren(data: GetTreeMediaChildrenData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/children', + url: '/umbraco/management/api/v1/tree/media/children', query: { parentId: data.parentId, skip: data.skip, take: data.take, - foldersOnly: data.foldersOnly + dataTypeId: data.dataTypeId }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -3983,18 +4051,18 @@ export class MediaTypeService { * @param data The data for the request. * @param data.skip * @param data.take - * @param data.foldersOnly + * @param data.dataTypeId * @returns unknown OK * @throws ApiError */ - public static getTreeMediaTypeRoot(data: GetTreeMediaTypeRootData = {}): CancelablePromise { + public static getTreeMediaRoot(data: GetTreeMediaRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/root', + url: '/umbraco/management/api/v1/tree/media/root', query: { skip: data.skip, take: data.take, - foldersOnly: data.foldersOnly + dataTypeId: data.dataTypeId }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -4005,53 +4073,63 @@ export class MediaTypeService { } -export class MediaService { +export class MediaTypeService { /** * @param data The data for the request. * @param data.id - * @param data.dataTypeId - * @param data.orderBy - * @param data.orderDirection - * @param data.filter + * @returns unknown OK + * @throws ApiError + */ + public static getItemMediaType(data: GetItemMediaTypeData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media-type', + query: { + id: data.id + }, + errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + + /** + * @param data The data for the request. + * @param data.fileExtension * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getCollectionMedia(data: GetCollectionMediaData = {}): CancelablePromise { + public static getItemMediaTypeAllowed(data: GetItemMediaTypeAllowedData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/collection/media', + url: '/umbraco/management/api/v1/item/media-type/allowed', query: { - id: data.id, - dataTypeId: data.dataTypeId, - orderBy: data.orderBy, - orderDirection: data.orderDirection, - filter: data.filter, + fileExtension: data.fileExtension, skip: data.skip, take: data.take }, errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } /** * @param data The data for the request. - * @param data.id + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemMedia(data: GetItemMediaData = {}): CancelablePromise { + public static getItemMediaTypeFolders(data: GetItemMediaTypeFoldersData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/media', + url: '/umbraco/management/api/v1/item/media-type/folders', query: { - id: data.id + skip: data.skip, + take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -4064,19 +4142,17 @@ export class MediaService { * @param data.query * @param data.skip * @param data.take - * @param data.parentId * @returns unknown OK * @throws ApiError */ - public static getItemMediaSearch(data: GetItemMediaSearchData = {}): CancelablePromise { + public static getItemMediaTypeSearch(data: GetItemMediaTypeSearchData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/media/search', + url: '/umbraco/management/api/v1/item/media-type/search', query: { query: data.query, skip: data.skip, - take: data.take, - parentId: data.parentId + take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -4090,10 +4166,10 @@ export class MediaService { * @returns string Created * @throws ApiError */ - public static postMedia(data: PostMediaData = {}): CancelablePromise { + public static postMediaType(data: PostMediaTypeData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/media', + url: '/umbraco/management/api/v1/media-type', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Generated-Resource', @@ -4112,10 +4188,10 @@ export class MediaService { * @returns unknown OK * @throws ApiError */ - public static getMediaById(data: GetMediaByIdData): CancelablePromise { + public static getMediaTypeById(data: GetMediaTypeByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/{id}', + url: '/umbraco/management/api/v1/media-type/{id}', path: { id: data.id }, @@ -4133,16 +4209,15 @@ export class MediaService { * @returns string OK * @throws ApiError */ - public static deleteMediaById(data: DeleteMediaByIdData): CancelablePromise { + public static deleteMediaTypeById(data: DeleteMediaTypeByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/media/{id}', + url: '/umbraco/management/api/v1/media-type/{id}', path: { id: data.id }, responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -4157,10 +4232,10 @@ export class MediaService { * @returns string OK * @throws ApiError */ - public static putMediaById(data: PutMediaByIdData): CancelablePromise { + public static putMediaTypeById(data: PutMediaTypeByIdData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}', + url: '/umbraco/management/api/v1/media-type/{id}', path: { id: data.id }, @@ -4179,29 +4254,26 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @param data.orderDirection - * @param data.sinceDate * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaByIdAuditLog(data: GetMediaByIdAuditLogData): CancelablePromise { + public static getMediaTypeByIdAllowedChildren(data: GetMediaTypeByIdAllowedChildrenData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/{id}/audit-log', + url: '/umbraco/management/api/v1/media-type/{id}/allowed-children', path: { id: data.id }, query: { - orderDirection: data.orderDirection, - sinceDate: data.sinceDate, skip: data.skip, take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -4209,21 +4281,18 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putMediaByIdMove(data: PutMediaByIdMoveData): CancelablePromise { + public static getMediaTypeByIdCompositionReferences(data: GetMediaTypeByIdCompositionReferencesData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/move', + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}/composition-references', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -4234,17 +4303,20 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @param data.requestBody + * @returns string Created * @throws ApiError */ - public static putMediaByIdMoveToRecycleBin(data: PutMediaByIdMoveToRecycleBinData): CancelablePromise { + public static postMediaTypeByIdCopy(data: PostMediaTypeByIdCopyData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/move-to-recycle-bin', + method: 'POST', + url: '/umbraco/management/api/v1/media-type/{id}/copy', path: { id: data.id }, - responseHeader: 'Umb-Notifications', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -4257,25 +4329,20 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaByIdReferencedBy(data: GetMediaByIdReferencedByData): CancelablePromise { + public static getMediaTypeByIdExport(data: GetMediaTypeByIdExportData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/{id}/referenced-by', + url: '/umbraco/management/api/v1/media-type/{id}/export', path: { id: data.id }, - query: { - skip: data.skip, - take: data.take - }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -4283,25 +4350,25 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @param data.skip - * @param data.take - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getMediaByIdReferencedDescendants(data: GetMediaByIdReferencedDescendantsData): CancelablePromise { + public static putMediaTypeByIdImport(data: PutMediaTypeByIdImportData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/{id}/referenced-descendants', + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/{id}/import', path: { id: data.id }, - query: { - skip: data.skip, - take: data.take - }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -4313,10 +4380,10 @@ export class MediaService { * @returns string OK * @throws ApiError */ - public static putMediaByIdValidate(data: PutMediaByIdValidateData): CancelablePromise { + public static putMediaTypeByIdMove(data: PutMediaTypeByIdMoveData): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/validate', + url: '/umbraco/management/api/v1/media-type/{id}/move', path: { id: data.id }, @@ -4334,18 +4401,16 @@ export class MediaService { /** * @param data The data for the request. - * @param data.id * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getMediaAreReferenced(data: GetMediaAreReferencedData = {}): CancelablePromise { + public static getMediaTypeAllowedAtRoot(data: GetMediaTypeAllowedAtRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/are-referenced', + url: '/umbraco/management/api/v1/media-type/allowed-at-root', query: { - id: data.id, skip: data.skip, take: data.take }, @@ -4356,56 +4421,33 @@ export class MediaService { }); } - /** - * @returns unknown OK - * @throws ApiError - */ - public static getMediaConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/configuration', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static putMediaSort(data: PutMediaSortData = {}): CancelablePromise { + public static postMediaTypeAvailableCompositions(data: PostMediaTypeAvailableCompositionsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/sort', + method: 'POST', + url: '/umbraco/management/api/v1/media-type/available-compositions', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** - * @param data The data for the request. - * @param data.id * @returns unknown OK * @throws ApiError */ - public static getMediaUrls(data: GetMediaUrlsData = {}): CancelablePromise { + public static getMediaTypeConfiguration(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/media/urls', - query: { - id: data.id - }, + url: '/umbraco/management/api/v1/media-type/configuration', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' @@ -4416,16 +4458,16 @@ export class MediaService { /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static postMediaValidate(data: PostMediaValidateData = {}): CancelablePromise { + public static postMediaTypeFolder(data: PostMediaTypeFolderData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/media/validate', + url: '/umbraco/management/api/v1/media-type/folder', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -4436,18 +4478,22 @@ export class MediaService { } /** - * @returns string OK + * @param data The data for the request. + * @param data.id + * @returns unknown OK * @throws ApiError */ - public static deleteRecycleBinMedia(): CancelablePromise { + public static getMediaTypeFolderById(data: GetMediaTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/media', - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/media-type/folder/{id}', + path: { + id: data.id + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -4458,10 +4504,10 @@ export class MediaService { * @returns string OK * @throws ApiError */ - public static deleteRecycleBinMediaById(data: DeleteRecycleBinMediaByIdData): CancelablePromise { + public static deleteMediaTypeFolderById(data: DeleteMediaTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}', + url: '/umbraco/management/api/v1/media-type/folder/{id}', path: { id: data.id }, @@ -4478,16 +4524,20 @@ export class MediaService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getRecycleBinMediaByIdOriginalParent(data: GetRecycleBinMediaByIdOriginalParentData): CancelablePromise { + public static putMediaTypeFolderById(data: PutMediaTypeFolderByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}/original-parent', + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/folder/{id}', path: { id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -4499,21 +4549,17 @@ export class MediaService { /** * @param data The data for the request. - * @param data.id * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static putRecycleBinMediaByIdRestore(data: PutRecycleBinMediaByIdRestoreData): CancelablePromise { + public static postMediaTypeImport(data: PostMediaTypeImportData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}/restore', - path: { - id: data.id - }, + method: 'POST', + url: '/umbraco/management/api/v1/media-type/import', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -4525,20 +4571,16 @@ export class MediaService { /** * @param data The data for the request. - * @param data.parentId - * @param data.skip - * @param data.take + * @param data.descendantId * @returns unknown OK * @throws ApiError */ - public static getRecycleBinMediaChildren(data: GetRecycleBinMediaChildrenData = {}): CancelablePromise { + public static getTreeMediaTypeAncestors(data: GetTreeMediaTypeAncestorsData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/children', + url: '/umbraco/management/api/v1/tree/media-type/ancestors', query: { - parentId: data.parentId, - skip: data.skip, - take: data.take + descendantId: data.descendantId }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -4549,18 +4591,22 @@ export class MediaService { /** * @param data The data for the request. + * @param data.parentId * @param data.skip * @param data.take + * @param data.foldersOnly * @returns unknown OK * @throws ApiError */ - public static getRecycleBinMediaRoot(data: GetRecycleBinMediaRootData = {}): CancelablePromise { + public static getTreeMediaTypeChildren(data: GetTreeMediaTypeChildrenData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/root', + url: '/umbraco/management/api/v1/tree/media-type/children', query: { + parentId: data.parentId, skip: data.skip, - take: data.take + take: data.take, + foldersOnly: data.foldersOnly }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -4571,16 +4617,20 @@ export class MediaService { /** * @param data The data for the request. - * @param data.descendantId + * @param data.skip + * @param data.take + * @param data.foldersOnly * @returns unknown OK * @throws ApiError */ - public static getTreeMediaAncestors(data: GetTreeMediaAncestorsData = {}): CancelablePromise { + public static getTreeMediaTypeRoot(data: GetTreeMediaTypeRootData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media/ancestors', + url: '/umbraco/management/api/v1/tree/media-type/root', query: { - descendantId: data.descendantId + skip: data.skip, + take: data.take, + foldersOnly: data.foldersOnly }, errors: { 401: 'The resource is protected and requires an authentication token', @@ -4589,49 +4639,214 @@ export class MediaService { }); } +} + +export class MemberService { /** * @param data The data for the request. - * @param data.parentId + * @param data.memberTypeId + * @param data.memberGroupName + * @param data.isApproved + * @param data.isLockedOut + * @param data.orderBy + * @param data.orderDirection + * @param data.filter * @param data.skip * @param data.take - * @param data.dataTypeId * @returns unknown OK * @throws ApiError */ - public static getTreeMediaChildren(data: GetTreeMediaChildrenData = {}): CancelablePromise { + public static getFilterMember(data: GetFilterMemberData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media/children', + url: '/umbraco/management/api/v1/filter/member', query: { - parentId: data.parentId, + memberTypeId: data.memberTypeId, + memberGroupName: data.memberGroupName, + isApproved: data.isApproved, + isLockedOut: data.isLockedOut, + orderBy: data.orderBy, + orderDirection: data.orderDirection, + filter: data.filter, skip: data.skip, - take: data.take, - dataTypeId: data.dataTypeId + take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.skip - * @param data.take - * @param data.dataTypeId + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getTreeMediaRoot(data: GetTreeMediaRootData = {}): CancelablePromise { + public static getItemMember(data: GetItemMemberData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/tree/media/root', + url: '/umbraco/management/api/v1/item/member', + query: { + id: data.id + }, + errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + + /** + * @param data The data for the request. + * @param data.query + * @param data.skip + * @param data.take + * @returns unknown OK + * @throws ApiError + */ + public static getItemMemberSearch(data: GetItemMemberSearchData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member/search', query: { + query: data.query, skip: data.skip, - take: data.take, - dataTypeId: data.dataTypeId + take: data.take + }, + errors: { + 401: 'The resource is protected and requires an authentication token' + } + }); + } + + /** + * @param data The data for the request. + * @param data.requestBody + * @returns string Created + * @throws ApiError + */ + public static postMember(data: PostMemberData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + + /** + * @param data The data for the request. + * @param data.id + * @returns unknown OK + * @throws ApiError + */ + public static getMemberById(data: GetMemberByIdData): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id: data.id + }, + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + + /** + * @param data The data for the request. + * @param data.id + * @returns string OK + * @throws ApiError + */ + public static deleteMemberById(data: DeleteMemberByIdData): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id: data.id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + + /** + * @param data The data for the request. + * @param data.id + * @param data.requestBody + * @returns string OK + * @throws ApiError + */ + public static putMemberById(data: PutMemberByIdData): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id: data.id + }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + + /** + * @param data The data for the request. + * @param data.id + * @param data.requestBody + * @returns string OK + * @throws ApiError + */ + public static putMemberByIdValidate(data: PutMemberByIdValidateData): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member/{id}/validate', + path: { + id: data.id }, + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + + /** + * @returns unknown OK + * @throws ApiError + */ + public static getMemberConfiguration(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member/configuration', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' @@ -4639,6 +4854,28 @@ export class MediaService { }); } + /** + * @param data The data for the request. + * @param data.requestBody + * @returns string OK + * @throws ApiError + */ + public static postMemberValidate(data: PostMemberValidateData = {}): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member/validate', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' + } + }); + } + } export class MemberGroupService { @@ -5035,77 +5272,69 @@ export class MemberTypeService { } -export class MemberService { +export class ModelsBuilderService { + /** + * @returns string OK + * @throws ApiError + */ + public static postModelsBuilderBuild(): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/models-builder/build', + responseHeader: 'Umb-Notifications', + errors: { + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 428: 'Precondition Required' + } + }); + } + /** - * @param data The data for the request. - * @param data.memberTypeId - * @param data.memberGroupName - * @param data.isApproved - * @param data.isLockedOut - * @param data.orderBy - * @param data.orderDirection - * @param data.filter - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getFilterMember(data: GetFilterMemberData = {}): CancelablePromise { + public static getModelsBuilderDashboard(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/filter/member', - query: { - memberTypeId: data.memberTypeId, - memberGroupName: data.memberGroupName, - isApproved: data.isApproved, - isLockedOut: data.isLockedOut, - orderBy: data.orderBy, - orderDirection: data.orderDirection, - filter: data.filter, - skip: data.skip, - take: data.take - }, + url: '/umbraco/management/api/v1/models-builder/dashboard', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** - * @param data The data for the request. - * @param data.id * @returns unknown OK * @throws ApiError */ - public static getItemMember(data: GetItemMemberData = {}): CancelablePromise { + public static getModelsBuilderStatus(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/member', - query: { - id: data.id - }, + url: '/umbraco/management/api/v1/models-builder/status', errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' } }); } +} + +export class ObjectTypesService { /** * @param data The data for the request. - * @param data.query * @param data.skip * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemMemberSearch(data: GetItemMemberSearchData = {}): CancelablePromise { + public static getObjectTypes(data: GetObjectTypesData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/member/search', + url: '/umbraco/management/api/v1/object-types', query: { - query: data.query, skip: data.skip, take: data.take }, @@ -5115,238 +5344,9 @@ export class MemberService { }); } - /** - * @param data The data for the request. - * @param data.requestBody - * @returns string Created - * @throws ApiError - */ - public static postMember(data: PostMemberData = {}): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @returns unknown OK - * @throws ApiError - */ - public static getMemberById(data: GetMemberByIdData): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member/{id}', - path: { - id: data.id - }, - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @returns string OK - * @throws ApiError - */ - public static deleteMemberById(data: DeleteMemberByIdData): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/member/{id}', - path: { - id: data.id - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK - * @throws ApiError - */ - public static putMemberById(data: PutMemberByIdData): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member/{id}', - path: { - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK - * @throws ApiError - */ - public static putMemberByIdValidate(data: PutMemberByIdValidateData): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member/{id}/validate', - path: { - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - - /** - * @returns unknown OK - * @throws ApiError - */ - public static getMemberConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member/configuration', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - - /** - * @param data The data for the request. - * @param data.requestBody - * @returns string OK - * @throws ApiError - */ - public static postMemberValidate(data: PostMemberValidateData = {}): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member/validate', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' - } - }); - } - -} - -export class ModelsBuilderService { - /** - * @returns string OK - * @throws ApiError - */ - public static postModelsBuilderBuild(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/models-builder/build', - responseHeader: 'Umb-Notifications', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 428: 'Precondition Required' - } - }); - } - - /** - * @returns unknown OK - * @throws ApiError - */ - public static getModelsBuilderDashboard(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/models-builder/dashboard', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - - /** - * @returns unknown OK - * @throws ApiError - */ - public static getModelsBuilderStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/models-builder/status', - errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' - } - }); - } - -} - -export class ObjectTypesService { - /** - * @param data The data for the request. - * @param data.skip - * @param data.take - * @returns unknown OK - * @throws ApiError - */ - public static getObjectTypes(data: GetObjectTypesData = {}): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/object-types', - query: { - skip: data.skip, - take: data.take - }, - errors: { - 401: 'The resource is protected and requires an authentication token' - } - }); - } - -} - -export class OEmbedService { +} + +export class OEmbedService { /** * @param data The data for the request. * @param data.url @@ -6152,91 +6152,91 @@ export class RedirectManagementService { } -export class RelationTypeService { +export class RelationService { /** * @param data The data for the request. * @param data.id + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getItemRelationType(data: GetItemRelationTypeData = {}): CancelablePromise { + public static getRelationByRelationTypeId(data: GetRelationByRelationTypeIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/relation-type', - query: { + url: '/umbraco/management/api/v1/relation/type/{id}', + path: { id: data.id }, + query: { + skip: data.skip, + take: data.take + }, errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } +} + +export class RelationTypeService { /** * @param data The data for the request. - * @param data.skip - * @param data.take + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getRelationType(data: GetRelationTypeData = {}): CancelablePromise { + public static getItemRelationType(data: GetItemRelationTypeData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/relation-type', + url: '/umbraco/management/api/v1/item/relation-type', query: { - skip: data.skip, - take: data.take + id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 401: 'The resource is protected and requires an authentication token' } }); } /** * @param data The data for the request. - * @param data.id + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getRelationTypeById(data: GetRelationTypeByIdData): CancelablePromise { + public static getRelationType(data: GetRelationTypeData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/relation-type/{id}', - path: { - id: data.id + url: '/umbraco/management/api/v1/relation-type', + query: { + skip: data.skip, + take: data.take }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } -} - -export class RelationService { /** * @param data The data for the request. * @param data.id - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getRelationByRelationTypeId(data: GetRelationByRelationTypeIdData): CancelablePromise { + public static getRelationTypeById(data: GetRelationTypeByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/relation/type/{id}', + url: '/umbraco/management/api/v1/relation-type/{id}', path: { id: data.id }, - query: { - skip: data.skip, - take: data.take - }, errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -7568,23 +7568,36 @@ export class UpgradeService { } -export class UserDataService { +export class UserService { /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.skip + * @param data.take + * @param data.orderBy + * @param data.orderDirection + * @param data.userGroupIds + * @param data.userStates + * @param data.filter + * @returns unknown OK * @throws ApiError */ - public static postUserData(data: PostUserDataData = {}): CancelablePromise { + public static getFilterUser(data: GetFilterUserData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user-data', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'GET', + url: '/umbraco/management/api/v1/filter/user', + query: { + skip: data.skip, + take: data.take, + orderBy: data.orderBy, + orderDirection: data.orderDirection, + userGroupIds: data.userGroupIds, + userStates: data.userStates, + filter: data.filter + }, errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -7592,22 +7605,16 @@ export class UserDataService { /** * @param data The data for the request. - * @param data.groups - * @param data.identifiers - * @param data.skip - * @param data.take + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getUserData(data: GetUserDataData = {}): CancelablePromise { + public static getItemUser(data: GetItemUserData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user-data', + url: '/umbraco/management/api/v1/item/user', query: { - groups: data.groups, - identifiers: data.identifiers, - skip: data.skip, - take: data.take + id: data.id }, errors: { 401: 'The resource is protected and requires an authentication token' @@ -7618,19 +7625,20 @@ export class UserDataService { /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static putUserData(data: PutUserDataData = {}): CancelablePromise { + public static postUser(data: PostUserData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/user-data', + method: 'POST', + url: '/umbraco/management/api/v1/user', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -7638,46 +7646,41 @@ export class UserDataService { /** * @param data The data for the request. - * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserDataById(data: GetUserDataByIdData): CancelablePromise { + public static deleteUser(data: DeleteUserData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user-data/{id}', - path: { - id: data.id - }, + method: 'DELETE', + url: '/umbraco/management/api/v1/user', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } -} - -export class UserGroupService { /** * @param data The data for the request. * @param data.skip * @param data.take - * @param data.filter * @returns unknown OK * @throws ApiError */ - public static getFilterUserGroup(data: GetFilterUserGroupData = {}): CancelablePromise { + public static getUser(data: GetUserData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/filter/user-group', + url: '/umbraco/management/api/v1/user', query: { skip: data.skip, - take: data.take, - filter: data.filter + take: data.take }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -7691,33 +7694,37 @@ export class UserGroupService { * @returns unknown OK * @throws ApiError */ - public static getItemUserGroup(data: GetItemUserGroupData = {}): CancelablePromise { + public static getUserById(data: GetUserByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/item/user-group', - query: { + url: '/umbraco/management/api/v1/user/{id}', + path: { id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.requestBody + * @param data.id * @returns string OK * @throws ApiError */ - public static deleteUserGroup(data: DeleteUserGroupData = {}): CancelablePromise { + public static deleteUserById(data: DeleteUserByIdData): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/user-group', - body: data.requestBody, - mediaType: 'application/json', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id: data.id + }, responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -7727,43 +7734,47 @@ export class UserGroupService { /** * @param data The data for the request. + * @param data.id * @param data.requestBody - * @returns string Created + * @returns string OK * @throws ApiError */ - public static postUserGroup(data: PostUserGroupData = {}): CancelablePromise { + public static putUserById(data: PutUserByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user-group', + method: 'PUT', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.skip - * @param data.take + * @param data.id * @returns unknown OK * @throws ApiError */ - public static getUserGroup(data: GetUserGroupData = {}): CancelablePromise { + public static getUserById2Fa(data: GetUserById2FaData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user-group', - query: { - skip: data.skip, - take: data.take + url: '/umbraco/management/api/v1/user/{id}/2fa', + path: { + id: data.id }, errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } @@ -7771,17 +7782,21 @@ export class UserGroupService { /** * @param data The data for the request. * @param data.id - * @returns unknown OK + * @param data.providerName + * @returns string OK * @throws ApiError */ - public static getUserGroupById(data: GetUserGroupByIdData): CancelablePromise { + public static deleteUserById2FaByProviderName(data: DeleteUserById2FaByProviderNameData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user-group/{id}', + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}/2fa/{providerName}', path: { - id: data.id + id: data.id, + providerName: data.providerName }, + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -7792,17 +7807,16 @@ export class UserGroupService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteUserGroupById(data: DeleteUserGroupByIdData): CancelablePromise { + public static getUserByIdCalculateStartNodes(data: GetUserByIdCalculateStartNodesData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user-group/{id}', + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}/calculate-start-nodes', path: { id: data.id }, - responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', @@ -7818,10 +7832,10 @@ export class UserGroupService { * @returns string OK * @throws ApiError */ - public static putUserGroupById(data: PutUserGroupByIdData): CancelablePromise { + public static postUserByIdChangePassword(data: PostUserByIdChangePasswordData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/user-group/{id}', + method: 'POST', + url: '/umbraco/management/api/v1/user/{id}/change-password', path: { id: data.id }, @@ -7829,6 +7843,7 @@ export class UserGroupService { mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -7843,10 +7858,10 @@ export class UserGroupService { * @returns string OK * @throws ApiError */ - public static deleteUserGroupByIdUsers(data: DeleteUserGroupByIdUsersData): CancelablePromise { + public static postUserByIdClientCredentials(data: PostUserByIdClientCredentialsData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user-group/{id}/users', + method: 'POST', + url: '/umbraco/management/api/v1/user/{id}/client-credentials', path: { id: data.id }, @@ -7854,9 +7869,9 @@ export class UserGroupService { mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -7864,61 +7879,43 @@ export class UserGroupService { /** * @param data The data for the request. * @param data.id - * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postUserGroupByIdUsers(data: PostUserGroupByIdUsersData): CancelablePromise { + public static getUserByIdClientCredentials(data: GetUserByIdClientCredentialsData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user-group/{id}/users', + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}/client-credentials', path: { id: data.id }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } -} - -export class UserService { /** * @param data The data for the request. - * @param data.skip - * @param data.take - * @param data.orderBy - * @param data.orderDirection - * @param data.userGroupIds - * @param data.userStates - * @param data.filter - * @returns unknown OK + * @param data.id + * @param data.clientId + * @returns string OK * @throws ApiError */ - public static getFilterUser(data: GetFilterUserData = {}): CancelablePromise { + public static deleteUserByIdClientCredentialsByClientId(data: DeleteUserByIdClientCredentialsByClientIdData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/filter/user', - query: { - skip: data.skip, - take: data.take, - orderBy: data.orderBy, - orderDirection: data.orderDirection, - userGroupIds: data.userGroupIds, - userStates: data.userStates, - filter: data.filter + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}/client-credentials/{clientId}', + path: { + id: data.id, + clientId: data.clientId }, + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -7929,32 +7926,36 @@ export class UserService { * @returns unknown OK * @throws ApiError */ - public static getItemUser(data: GetItemUserData = {}): CancelablePromise { + public static postUserByIdResetPassword(data: PostUserByIdResetPasswordData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/user', - query: { + method: 'POST', + url: '/umbraco/management/api/v1/user/{id}/reset-password', + path: { id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token' + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.id + * @returns string OK * @throws ApiError */ - public static postUser(data: PostUserData = {}): CancelablePromise { + public static deleteUserAvatarById(data: DeleteUserAvatarByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'DELETE', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id: data.id + }, + responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', @@ -7966,113 +7967,94 @@ export class UserService { /** * @param data The data for the request. + * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static deleteUser(data: DeleteUserData = {}): CancelablePromise { + public static postUserAvatarById(data: PostUserAvatarByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user', + method: 'POST', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** - * @param data The data for the request. - * @param data.skip - * @param data.take * @returns unknown OK * @throws ApiError */ - public static getUser(data: GetUserData = {}): CancelablePromise { + public static getUserConfiguration(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user', - query: { - skip: data.skip, - take: data.take - }, + url: '/umbraco/management/api/v1/user/configuration', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** - * @param data The data for the request. - * @param data.id * @returns unknown OK * @throws ApiError */ - public static getUserById(data: GetUserByIdData): CancelablePromise { + public static getUserCurrent(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/{id}', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/user/current', errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } /** - * @param data The data for the request. - * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteUserById(data: DeleteUserByIdData): CancelablePromise { + public static getUserCurrent2Fa(): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/{id}', - path: { - id: data.id - }, - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/user/current/2fa', errors: { - 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } /** * @param data The data for the request. - * @param data.id - * @param data.requestBody + * @param data.providerName + * @param data.code * @returns string OK * @throws ApiError */ - public static putUserById(data: PutUserByIdData): CancelablePromise { + public static deleteUserCurrent2FaByProviderName(data: DeleteUserCurrent2FaByProviderNameData): CancelablePromise { return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/user/{id}', + method: 'DELETE', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', path: { - id: data.id + providerName: data.providerName + }, + query: { + code: data.code }, - body: data.requestBody, - mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8080,20 +8062,23 @@ export class UserService { /** * @param data The data for the request. - * @param data.id + * @param data.providerName + * @param data.requestBody * @returns unknown OK * @throws ApiError */ - public static getUserById2Fa(data: GetUserById2FaData): CancelablePromise { + public static postUserCurrent2FaByProviderName(data: PostUserCurrent2FaByProviderNameData): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/{id}/2fa', + method: 'POST', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', path: { - id: data.id + providerName: data.providerName }, + body: data.requestBody, + mediaType: 'application/json', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8101,24 +8086,20 @@ export class UserService { /** * @param data The data for the request. - * @param data.id * @param data.providerName - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteUserById2FaByProviderName(data: DeleteUserById2FaByProviderNameData): CancelablePromise { + public static getUserCurrent2FaByProviderName(data: GetUserCurrent2FaByProviderNameData): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/{id}/2fa/{providerName}', + method: 'GET', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', path: { - id: data.id, providerName: data.providerName }, - responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8126,70 +8107,53 @@ export class UserService { /** * @param data The data for the request. - * @param data.id - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserByIdCalculateStartNodes(data: GetUserByIdCalculateStartNodesData): CancelablePromise { + public static postUserCurrentAvatar(data: PostUserCurrentAvatarData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/{id}/calculate-start-nodes', - path: { - id: data.id - }, + method: 'POST', + url: '/umbraco/management/api/v1/user/current/avatar', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token' } }); } /** * @param data The data for the request. - * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postUserByIdChangePassword(data: PostUserByIdChangePasswordData): CancelablePromise { + public static postUserCurrentChangePassword(data: PostUserCurrentChangePasswordData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/{id}/change-password', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/user/current/change-password', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } /** - * @param data The data for the request. - * @param data.id - * @param data.requestBody - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static postUserByIdClientCredentials(data: PostUserByIdClientCredentialsData): CancelablePromise { + public static getUserCurrentConfiguration(): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/{id}/client-credentials', - path: { - id: data.id - }, - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/user/current/configuration', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource' } @@ -8197,21 +8161,15 @@ export class UserService { } /** - * @param data The data for the request. - * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static getUserByIdClientCredentials(data: GetUserByIdClientCredentialsData): CancelablePromise { + public static getUserCurrentLoginProviders(): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/{id}/client-credentials', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/user/current/login-providers', errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 401: 'The resource is protected and requires an authentication token' } }); } @@ -8219,23 +8177,19 @@ export class UserService { /** * @param data The data for the request. * @param data.id - * @param data.clientId - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteUserByIdClientCredentialsByClientId(data: DeleteUserByIdClientCredentialsByClientIdData): CancelablePromise { + public static getUserCurrentPermissions(data: GetUserCurrentPermissionsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/{id}/client-credentials/{clientId}', - path: { - id: data.id, - clientId: data.clientId + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions', + query: { + id: data.id }, - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 404: 'Not Found' } }); } @@ -8246,17 +8200,15 @@ export class UserService { * @returns unknown OK * @throws ApiError */ - public static postUserByIdResetPassword(data: PostUserByIdResetPasswordData): CancelablePromise { + public static getUserCurrentPermissionsDocument(data: GetUserCurrentPermissionsDocumentData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/{id}/reset-password', - path: { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions/document', + query: { id: data.id }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8265,21 +8217,18 @@ export class UserService { /** * @param data The data for the request. * @param data.id - * @returns string OK + * @returns unknown OK * @throws ApiError */ - public static deleteUserAvatarById(data: DeleteUserAvatarByIdData): CancelablePromise { + public static getUserCurrentPermissionsMedia(data: GetUserCurrentPermissionsMediaData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/avatar/{id}', - path: { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions/media', + query: { id: data.id }, - responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8287,18 +8236,14 @@ export class UserService { /** * @param data The data for the request. - * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postUserAvatarById(data: PostUserAvatarByIdData): CancelablePromise { + public static postUserDisable(data: PostUserDisableData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/avatar/{id}', - path: { - id: data.id - }, + url: '/umbraco/management/api/v1/user/disable', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', @@ -8312,69 +8257,87 @@ export class UserService { } /** - * @returns unknown OK + * @param data The data for the request. + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserConfiguration(): CancelablePromise { + public static postUserEnable(data: PostUserEnableData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/configuration', + method: 'POST', + url: '/umbraco/management/api/v1/user/enable', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** - * @returns unknown OK + * @param data The data for the request. + * @param data.requestBody + * @returns string Created * @throws ApiError */ - public static getUserCurrent(): CancelablePromise { + public static postUserInvite(data: PostUserInviteData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current', + method: 'POST', + url: '/umbraco/management/api/v1/user/invite', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', errors: { - 401: 'The resource is protected and requires an authentication token' + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** - * @returns unknown OK + * @param data The data for the request. + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserCurrent2Fa(): CancelablePromise { + public static postUserInviteCreatePassword(data: PostUserInviteCreatePasswordData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/2fa', + method: 'POST', + url: '/umbraco/management/api/v1/user/invite/create-password', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 401: 'The resource is protected and requires an authentication token' + 400: 'Bad Request', + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. - * @param data.providerName - * @param data.code + * @param data.requestBody * @returns string OK * @throws ApiError */ - public static deleteUserCurrent2FaByProviderName(data: DeleteUserCurrent2FaByProviderNameData): CancelablePromise { + public static postUserInviteResend(data: PostUserInviteResendData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', - path: { - providerName: data.providerName - }, - query: { - code: data.code - }, + method: 'POST', + url: '/umbraco/management/api/v1/user/invite/resend', + body: data.requestBody, + mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8382,23 +8345,19 @@ export class UserService { /** * @param data The data for the request. - * @param data.providerName * @param data.requestBody * @returns unknown OK * @throws ApiError */ - public static postUserCurrent2FaByProviderName(data: PostUserCurrent2FaByProviderNameData): CancelablePromise { + public static postUserInviteVerify(data: PostUserInviteVerifyData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', - path: { - providerName: data.providerName - }, + url: '/umbraco/management/api/v1/user/invite/verify', body: data.requestBody, mediaType: 'application/json', errors: { 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8406,21 +8365,20 @@ export class UserService { /** * @param data The data for the request. - * @param data.providerName - * @returns unknown OK + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserCurrent2FaByProviderName(data: GetUserCurrent2FaByProviderNameData): CancelablePromise { + public static postUserSetUserGroups(data: PostUserSetUserGroupsData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', - path: { - providerName: data.providerName - }, + method: 'POST', + url: '/umbraco/management/api/v1/user/set-user-groups', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } @@ -8431,65 +8389,87 @@ export class UserService { * @returns string OK * @throws ApiError */ - public static postUserCurrentAvatar(data: PostUserCurrentAvatarData = {}): CancelablePromise { + public static postUserUnlock(data: PostUserUnlockData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/current/avatar', + url: '/umbraco/management/api/v1/user/unlock', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource' } }); } +} + +export class UserDataService { /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static postUserCurrentChangePassword(data: PostUserCurrentChangePasswordData = {}): CancelablePromise { + public static postUserData(data: PostUserDataData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/current/change-password', + url: '/umbraco/management/api/v1/user-data', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', - 401: 'The resource is protected and requires an authentication token' + 401: 'The resource is protected and requires an authentication token', + 404: 'Not Found' } }); } /** + * @param data The data for the request. + * @param data.groups + * @param data.identifiers + * @param data.skip + * @param data.take * @returns unknown OK * @throws ApiError */ - public static getUserCurrentConfiguration(): CancelablePromise { + public static getUserData(data: GetUserDataData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/current/configuration', + url: '/umbraco/management/api/v1/user-data', + query: { + groups: data.groups, + identifiers: data.identifiers, + skip: data.skip, + take: data.take + }, errors: { - 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 401: 'The resource is protected and requires an authentication token' } }); } /** - * @returns unknown OK + * @param data The data for the request. + * @param data.requestBody + * @returns string OK * @throws ApiError */ - public static getUserCurrentLoginProviders(): CancelablePromise { + public static putUserData(data: PutUserDataData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/login-providers', + method: 'PUT', + url: '/umbraco/management/api/v1/user-data', + body: data.requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 401: 'The resource is protected and requires an authentication token' + 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', + 404: 'Not Found' } }); } @@ -8500,11 +8480,11 @@ export class UserService { * @returns unknown OK * @throws ApiError */ - public static getUserCurrentPermissions(data: GetUserCurrentPermissionsData = {}): CancelablePromise { + public static getUserDataById(data: GetUserDataByIdData): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions', - query: { + url: '/umbraco/management/api/v1/user-data/{id}', + path: { id: data.id }, errors: { @@ -8514,21 +8494,30 @@ export class UserService { }); } +} + +export class UserGroupService { /** * @param data The data for the request. - * @param data.id + * @param data.skip + * @param data.take + * @param data.filter * @returns unknown OK * @throws ApiError */ - public static getUserCurrentPermissionsDocument(data: GetUserCurrentPermissionsDocumentData = {}): CancelablePromise { + public static getFilterUserGroup(data: GetFilterUserGroupData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions/document', + url: '/umbraco/management/api/v1/filter/user-group', query: { - id: data.id + skip: data.skip, + take: data.take, + filter: data.filter }, errors: { + 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', + 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } }); @@ -8540,16 +8529,15 @@ export class UserService { * @returns unknown OK * @throws ApiError */ - public static getUserCurrentPermissionsMedia(data: GetUserCurrentPermissionsMediaData = {}): CancelablePromise { + public static getItemUserGroup(data: GetItemUserGroupData = {}): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions/media', + url: '/umbraco/management/api/v1/item/user-group', query: { id: data.id }, errors: { - 401: 'The resource is protected and requires an authentication token', - 404: 'Not Found' + 401: 'The resource is protected and requires an authentication token' } }); } @@ -8560,15 +8548,14 @@ export class UserService { * @returns string OK * @throws ApiError */ - public static postUserDisable(data: PostUserDisableData = {}): CancelablePromise { + public static deleteUserGroup(data: DeleteUserGroupData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/disable', + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group', body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -8579,62 +8566,61 @@ export class UserService { /** * @param data The data for the request. * @param data.requestBody - * @returns string OK + * @returns string Created * @throws ApiError */ - public static postUserEnable(data: PostUserEnableData = {}): CancelablePromise { + public static postUserGroup(data: PostUserGroupData = {}): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/enable', + url: '/umbraco/management/api/v1/user-group', body: data.requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + responseHeader: 'Umb-Generated-Resource', errors: { 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.requestBody - * @returns string Created + * @param data.skip + * @param data.take + * @returns unknown OK * @throws ApiError */ - public static postUserInvite(data: PostUserInviteData = {}): CancelablePromise { + public static getUserGroup(data: GetUserGroupData = {}): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', + method: 'GET', + url: '/umbraco/management/api/v1/user-group', + query: { + skip: data.skip, + take: data.take + }, errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource', - 404: 'Not Found' + 403: 'The authenticated user do not have access to this resource' } }); } /** * @param data The data for the request. - * @param data.requestBody - * @returns string OK + * @param data.id + * @returns unknown OK * @throws ApiError */ - public static postUserInviteCreatePassword(data: PostUserInviteCreatePasswordData = {}): CancelablePromise { + public static getUserGroupById(data: GetUserGroupByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/create-password', - body: data.requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', + method: 'GET', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + id: data.id + }, errors: { - 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } @@ -8643,19 +8629,19 @@ export class UserService { /** * @param data The data for the request. - * @param data.requestBody + * @param data.id * @returns string OK * @throws ApiError */ - public static postUserInviteResend(data: PostUserInviteResendData = {}): CancelablePromise { + public static deleteUserGroupById(data: DeleteUserGroupByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/resend', - body: data.requestBody, - mediaType: 'application/json', + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + id: data.id + }, responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' @@ -8665,18 +8651,23 @@ export class UserService { /** * @param data The data for the request. + * @param data.id * @param data.requestBody - * @returns unknown OK + * @returns string OK * @throws ApiError */ - public static postUserInviteVerify(data: PostUserInviteVerifyData = {}): CancelablePromise { + public static putUserGroupById(data: PutUserGroupByIdData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/verify', + method: 'PUT', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', + responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', + 401: 'The resource is protected and requires an authentication token', 403: 'The authenticated user do not have access to this resource', 404: 'Not Found' } @@ -8685,41 +8676,50 @@ export class UserService { /** * @param data The data for the request. + * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postUserSetUserGroups(data: PostUserSetUserGroupsData = {}): CancelablePromise { + public static deleteUserGroupByIdUsers(data: DeleteUserGroupByIdUsersData): CancelablePromise { return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/set-user-groups', + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } /** * @param data The data for the request. + * @param data.id * @param data.requestBody * @returns string OK * @throws ApiError */ - public static postUserUnlock(data: PostUserUnlockData = {}): CancelablePromise { + public static postUserGroupByIdUsers(data: PostUserGroupByIdUsersData): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user/unlock', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + id: data.id + }, body: data.requestBody, mediaType: 'application/json', responseHeader: 'Umb-Notifications', errors: { - 400: 'Bad Request', 401: 'The resource is protected and requires an authentication token', - 403: 'The authenticated user do not have access to this resource' + 403: 'The authenticated user do not have access to this resource', + 404: 'Not Found' } }); } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts index b6471bde72b1..2f2b1909e313 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts @@ -442,15 +442,6 @@ export type CultureReponseModel = { englishName: string; }; -export type CurrenUserConfigurationResponseModel = { - keepUserLoggedIn: boolean; - /** - * @deprecated - */ - usernameIsEmail: boolean; - passwordConfiguration: (PasswordConfigurationResponseModel); -}; - export type CurrentUserResponseModel = { id: string; email: string; @@ -471,12 +462,53 @@ export type CurrentUserResponseModel = { isAdmin: boolean; }; +export type CurrenUserConfigurationResponseModel = { + keepUserLoggedIn: boolean; + /** + * @deprecated + */ + usernameIsEmail: boolean; + passwordConfiguration: (PasswordConfigurationResponseModel); +}; + +export type DatabaseInstallRequestModel = { + id: string; + providerName: string; + server?: (string) | null; + name?: (string) | null; + username?: (string) | null; + password?: (string) | null; + useIntegratedAuthentication: boolean; + connectionString?: (string) | null; + trustServerCertificate: boolean; +}; + +export type DatabaseSettingsPresentationModel = { + id: string; + sortOrder: number; + displayName: string; + defaultDatabaseName: string; + providerName: string; + isConfigured: boolean; + requiresServer: boolean; + serverPlaceholder: string; + requiresCredentials: boolean; + supportsIntegratedAuthentication: boolean; + requiresConnectionTest: boolean; +}; + export enum DataTypeChangeModeModel { TRUE = 'True', FALSE = 'False', FALSE_WITH_HELP_TEXT = 'FalseWithHelpText' } +export type DatatypeConfigurationResponseModel = { + canBeChanged: DataTypeChangeModeModel; + documentListViewId: string; + mediaListViewId: string; +}; + export type DataTypeContentTypeReferenceModel = { id: string; type: (string) | null; @@ -527,38 +559,6 @@ export type DataTypeTreeItemResponseModel = { isDeletable: boolean; }; -export type DatabaseInstallRequestModel = { - id: string; - providerName: string; - server?: (string) | null; - name?: (string) | null; - username?: (string) | null; - password?: (string) | null; - useIntegratedAuthentication: boolean; - connectionString?: (string) | null; - trustServerCertificate: boolean; -}; - -export type DatabaseSettingsPresentationModel = { - id: string; - sortOrder: number; - displayName: string; - defaultDatabaseName: string; - providerName: string; - isConfigured: boolean; - requiresServer: boolean; - serverPlaceholder: string; - requiresCredentials: boolean; - supportsIntegratedAuthentication: boolean; - requiresConnectionTest: boolean; -}; - -export type DatatypeConfigurationResponseModel = { - canBeChanged: DataTypeChangeModeModel; - documentListViewId: string; - mediaListViewId: string; -}; - export type DefaultReferenceResponseModel = { id: string; name?: (string) | null; @@ -653,6 +653,8 @@ export type DocumentItemResponseModel = { id: string; isTrashed: boolean; isProtected: boolean; + parent?: ((ReferenceByIdModel) | null); + hasChildren: boolean; documentType: (DocumentTypeReferenceResponseModel); variants: Array<(DocumentVariantItemResponseModel)>; }; @@ -1116,6 +1118,11 @@ export type LanguageResponseModel = { isoCode: string; }; +export type LoggerResponseModel = { + name: string; + level: LogLevelModel; +}; + export type LogLevelCountsReponseModel = { information: number; debug: number; @@ -1152,11 +1159,6 @@ export type LogTemplateResponseModel = { count: number; }; -export type LoggerResponseModel = { - name: string; - level: LogLevelModel; -}; - export type ManifestResponseModel = { name: string; id?: (string) | null; @@ -1185,6 +1187,8 @@ export type MediaConfigurationResponseModel = { export type MediaItemResponseModel = { id: string; isTrashed: boolean; + parent?: ((ReferenceByIdModel) | null); + hasChildren: boolean; mediaType: (MediaTypeReferenceResponseModel); variants: Array<(VariantItemResponseModel)>; }; @@ -1580,15 +1584,15 @@ export type NotificationHeaderModel = { type: EventMessageTypeModel; }; -export type OEmbedResponseModel = { - markup: string; -}; - export type ObjectTypeResponseModel = { name?: (string) | null; id: string; }; +export type OEmbedResponseModel = { + markup: string; +}; + export enum OperatorModel { EQUALS = 'Equals', NOT_EQUALS = 'NotEquals', @@ -1723,14 +1727,14 @@ export type PagedHelpPageResponseModel = { items: Array<(HelpPageResponseModel)>; }; -export type PagedIReferenceResponseModel = { +export type PagedIndexResponseModel = { total: number; - items: Array<(DefaultReferenceResponseModel | DocumentReferenceResponseModel | MediaReferenceResponseModel)>; + items: Array<(IndexResponseModel)>; }; -export type PagedIndexResponseModel = { +export type PagedIReferenceResponseModel = { total: number; - items: Array<(IndexResponseModel)>; + items: Array<(DefaultReferenceResponseModel | DocumentReferenceResponseModel | MediaReferenceResponseModel)>; }; export type PagedLanguageResponseModel = { @@ -1738,6 +1742,11 @@ export type PagedLanguageResponseModel = { items: Array<(LanguageResponseModel)>; }; +export type PagedLoggerResponseModel = { + total: number; + items: Array<(LoggerResponseModel)>; +}; + export type PagedLogMessageResponseModel = { total: number; items: Array<(LogMessageResponseModel)>; @@ -1748,11 +1757,6 @@ export type PagedLogTemplateResponseModel = { items: Array<(LogTemplateResponseModel)>; }; -export type PagedLoggerResponseModel = { - total: number; - items: Array<(LoggerResponseModel)>; -}; - export type PagedMediaCollectionResponseModel = { total: number; items: Array<(MediaCollectionResponseModel)>; @@ -1883,14 +1887,14 @@ export type PagedSavedLogSearchResponseModel = { items: Array<(SavedLogSearchResponseModel)>; }; -export type PagedSearchResultResponseModel = { +export type PagedSearcherResponseModel = { total: number; - items: Array<(SearchResultResponseModel)>; + items: Array<(SearcherResponseModel)>; }; -export type PagedSearcherResponseModel = { +export type PagedSearchResultResponseModel = { total: number; - items: Array<(SearcherResponseModel)>; + items: Array<(SearchResultResponseModel)>; }; export type PagedSegmentResponseModel = { @@ -2171,6 +2175,10 @@ export type ScriptResponseModel = { content: string; }; +export type SearcherResponseModel = { + name: string; +}; + export type SearchResultResponseModel = { id: string; score: number; @@ -2178,10 +2186,6 @@ export type SearchResultResponseModel = { fields: Array<(FieldPresentationModel)>; }; -export type SearcherResponseModel = { - name: string; -}; - export type SecurityConfigurationResponseModel = { passwordConfiguration: (PasswordConfigurationResponseModel); }; @@ -3087,562 +3091,562 @@ export type GetTreeDictionaryRootData = { export type GetTreeDictionaryRootResponse = ((PagedNamedEntityTreeItemResponseModel)); -export type PostDocumentBlueprintData = { - requestBody?: (CreateDocumentBlueprintRequestModel); +export type GetCollectionDocumentByIdData = { + dataTypeId?: string; + filter?: string; + id: string; + orderBy?: string; + orderCulture?: string; + orderDirection?: DirectionModel; + skip?: number; + take?: number; }; -export type PostDocumentBlueprintResponse = (string); +export type GetCollectionDocumentByIdResponse = ((PagedDocumentCollectionResponseModel)); -export type GetDocumentBlueprintByIdData = { - id: string; +export type PostDocumentData = { + requestBody?: (CreateDocumentRequestModel); }; -export type GetDocumentBlueprintByIdResponse = ((DocumentBlueprintResponseModel)); +export type PostDocumentResponse = (string); -export type DeleteDocumentBlueprintByIdData = { +export type GetDocumentByIdData = { id: string; }; -export type DeleteDocumentBlueprintByIdResponse = (string); +export type GetDocumentByIdResponse = ((DocumentResponseModel)); -export type PutDocumentBlueprintByIdData = { +export type DeleteDocumentByIdData = { id: string; - requestBody?: (UpdateDocumentBlueprintRequestModel); }; -export type PutDocumentBlueprintByIdResponse = (string); +export type DeleteDocumentByIdResponse = (string); -export type PutDocumentBlueprintByIdMoveData = { +export type PutDocumentByIdData = { id: string; - requestBody?: (MoveDocumentBlueprintRequestModel); + requestBody?: (UpdateDocumentRequestModel); }; -export type PutDocumentBlueprintByIdMoveResponse = (string); +export type PutDocumentByIdResponse = (string); -export type PostDocumentBlueprintFolderData = { - requestBody?: (CreateFolderRequestModel); +export type GetDocumentByIdAuditLogData = { + id: string; + orderDirection?: DirectionModel; + sinceDate?: string; + skip?: number; + take?: number; }; -export type PostDocumentBlueprintFolderResponse = (string); +export type GetDocumentByIdAuditLogResponse = ((PagedAuditLogResponseModel)); -export type GetDocumentBlueprintFolderByIdData = { +export type PostDocumentByIdCopyData = { id: string; + requestBody?: (CopyDocumentRequestModel); }; -export type GetDocumentBlueprintFolderByIdResponse = ((FolderResponseModel)); +export type PostDocumentByIdCopyResponse = (string); -export type DeleteDocumentBlueprintFolderByIdData = { +export type GetDocumentByIdDomainsData = { id: string; }; -export type DeleteDocumentBlueprintFolderByIdResponse = (string); +export type GetDocumentByIdDomainsResponse = ((DomainsResponseModel)); -export type PutDocumentBlueprintFolderByIdData = { +export type PutDocumentByIdDomainsData = { id: string; - requestBody?: (UpdateFolderResponseModel); + requestBody?: (UpdateDomainsRequestModel); }; -export type PutDocumentBlueprintFolderByIdResponse = (string); +export type PutDocumentByIdDomainsResponse = (string); -export type PostDocumentBlueprintFromDocumentData = { - requestBody?: (CreateDocumentBlueprintFromDocumentRequestModel); +export type PutDocumentByIdMoveData = { + id: string; + requestBody?: (MoveDocumentRequestModel); }; -export type PostDocumentBlueprintFromDocumentResponse = (string); +export type PutDocumentByIdMoveResponse = (string); -export type GetItemDocumentBlueprintData = { - id?: Array<(string)>; +export type PutDocumentByIdMoveToRecycleBinData = { + id: string; }; -export type GetItemDocumentBlueprintResponse = (Array<(DocumentBlueprintItemResponseModel)>); +export type PutDocumentByIdMoveToRecycleBinResponse = (string); -export type GetTreeDocumentBlueprintAncestorsData = { - descendantId?: string; +export type GetDocumentByIdNotificationsData = { + id: string; }; -export type GetTreeDocumentBlueprintAncestorsResponse = (Array<(DocumentBlueprintTreeItemResponseModel)>); +export type GetDocumentByIdNotificationsResponse = (Array<(DocumentNotificationResponseModel)>); -export type GetTreeDocumentBlueprintChildrenData = { - foldersOnly?: boolean; - parentId?: string; - skip?: number; - take?: number; +export type PutDocumentByIdNotificationsData = { + id: string; + requestBody?: (UpdateDocumentNotificationsRequestModel); }; -export type GetTreeDocumentBlueprintChildrenResponse = ((PagedDocumentBlueprintTreeItemResponseModel)); +export type PutDocumentByIdNotificationsResponse = (string); -export type GetTreeDocumentBlueprintRootData = { - foldersOnly?: boolean; - skip?: number; - take?: number; +export type PostDocumentByIdPublicAccessData = { + id: string; + requestBody?: (PublicAccessRequestModel); }; -export type GetTreeDocumentBlueprintRootResponse = ((PagedDocumentBlueprintTreeItemResponseModel)); +export type PostDocumentByIdPublicAccessResponse = (string); -export type PostDocumentTypeData = { - requestBody?: (CreateDocumentTypeRequestModel); +export type DeleteDocumentByIdPublicAccessData = { + id: string; }; -export type PostDocumentTypeResponse = (string); +export type DeleteDocumentByIdPublicAccessResponse = (string); -export type GetDocumentTypeByIdData = { +export type GetDocumentByIdPublicAccessData = { id: string; }; -export type GetDocumentTypeByIdResponse = ((DocumentTypeResponseModel)); +export type GetDocumentByIdPublicAccessResponse = ((PublicAccessResponseModel)); -export type DeleteDocumentTypeByIdData = { +export type PutDocumentByIdPublicAccessData = { id: string; + requestBody?: (PublicAccessRequestModel); }; -export type DeleteDocumentTypeByIdResponse = (string); +export type PutDocumentByIdPublicAccessResponse = (string); -export type PutDocumentTypeByIdData = { +export type PutDocumentByIdPublishData = { id: string; - requestBody?: (UpdateDocumentTypeRequestModel); + requestBody?: (PublishDocumentRequestModel); }; -export type PutDocumentTypeByIdResponse = (string); +export type PutDocumentByIdPublishResponse = (string); -export type GetDocumentTypeByIdAllowedChildrenData = { +export type PutDocumentByIdPublishWithDescendantsData = { id: string; - skip?: number; - take?: number; + requestBody?: (PublishDocumentWithDescendantsRequestModel); }; -export type GetDocumentTypeByIdAllowedChildrenResponse = ((PagedAllowedDocumentTypeModel)); +export type PutDocumentByIdPublishWithDescendantsResponse = (string); -export type GetDocumentTypeByIdBlueprintData = { +export type GetDocumentByIdPublishedData = { id: string; - skip?: number; - take?: number; }; -export type GetDocumentTypeByIdBlueprintResponse = ((PagedDocumentTypeBlueprintItemResponseModel)); +export type GetDocumentByIdPublishedResponse = ((PublishedDocumentResponseModel)); -export type GetDocumentTypeByIdCompositionReferencesData = { +export type GetDocumentByIdReferencedByData = { id: string; + skip?: number; + take?: number; }; -export type GetDocumentTypeByIdCompositionReferencesResponse = (Array<(DocumentTypeCompositionResponseModel)>); +export type GetDocumentByIdReferencedByResponse = ((PagedIReferenceResponseModel)); -export type PostDocumentTypeByIdCopyData = { +export type GetDocumentByIdReferencedDescendantsData = { id: string; - requestBody?: (CopyDocumentTypeRequestModel); + skip?: number; + take?: number; }; -export type PostDocumentTypeByIdCopyResponse = (string); +export type GetDocumentByIdReferencedDescendantsResponse = ((PagedReferenceByIdModel)); -export type GetDocumentTypeByIdExportData = { +export type PutDocumentByIdUnpublishData = { id: string; + requestBody?: (UnpublishDocumentRequestModel); }; -export type GetDocumentTypeByIdExportResponse = (((Blob | File))); +export type PutDocumentByIdUnpublishResponse = (string); -export type PutDocumentTypeByIdImportData = { +export type PutDocumentByIdValidateData = { id: string; - requestBody?: (ImportDocumentTypeRequestModel); + requestBody?: (UpdateDocumentRequestModel); }; -export type PutDocumentTypeByIdImportResponse = (string); +export type PutDocumentByIdValidateResponse = (string); -export type PutDocumentTypeByIdMoveData = { +export type PutUmbracoManagementApiV11DocumentByIdValidate11Data = { id: string; - requestBody?: (MoveDocumentTypeRequestModel); + requestBody?: (ValidateUpdateDocumentRequestModel); }; -export type PutDocumentTypeByIdMoveResponse = (string); +export type PutUmbracoManagementApiV11DocumentByIdValidate11Response = (string); -export type GetDocumentTypeAllowedAtRootData = { +export type GetDocumentAreReferencedData = { + id?: Array<(string)>; skip?: number; take?: number; }; -export type GetDocumentTypeAllowedAtRootResponse = ((PagedAllowedDocumentTypeModel)); +export type GetDocumentAreReferencedResponse = ((PagedReferenceByIdModel)); -export type PostDocumentTypeAvailableCompositionsData = { - requestBody?: (DocumentTypeCompositionRequestModel); +export type GetDocumentConfigurationResponse = ((DocumentConfigurationResponseModel)); + +export type PutDocumentSortData = { + requestBody?: (SortingRequestModel); }; -export type PostDocumentTypeAvailableCompositionsResponse = (Array<(AvailableDocumentTypeCompositionResponseModel)>); +export type PutDocumentSortResponse = (string); -export type GetDocumentTypeConfigurationResponse = ((DocumentTypeConfigurationResponseModel)); +export type GetDocumentUrlsData = { + id?: Array<(string)>; +}; -export type PostDocumentTypeFolderData = { - requestBody?: (CreateFolderRequestModel); +export type GetDocumentUrlsResponse = (Array<(DocumentUrlInfoResponseModel)>); + +export type PostDocumentValidateData = { + requestBody?: (CreateDocumentRequestModel); }; -export type PostDocumentTypeFolderResponse = (string); +export type PostDocumentValidateResponse = (string); -export type GetDocumentTypeFolderByIdData = { - id: string; +export type GetItemDocumentData = { + id?: Array<(string)>; }; -export type GetDocumentTypeFolderByIdResponse = ((FolderResponseModel)); +export type GetItemDocumentResponse = (Array<(DocumentItemResponseModel)>); -export type DeleteDocumentTypeFolderByIdData = { +export type GetItemDocumentSearchData = { + parentId?: string; + query?: string; + skip?: number; + take?: number; +}; + +export type GetItemDocumentSearchResponse = ((PagedModelDocumentItemResponseModel)); + +export type DeleteRecycleBinDocumentResponse = (string); + +export type DeleteRecycleBinDocumentByIdData = { id: string; }; -export type DeleteDocumentTypeFolderByIdResponse = (string); +export type DeleteRecycleBinDocumentByIdResponse = (string); -export type PutDocumentTypeFolderByIdData = { +export type GetRecycleBinDocumentByIdOriginalParentData = { id: string; - requestBody?: (UpdateFolderResponseModel); }; -export type PutDocumentTypeFolderByIdResponse = (string); +export type GetRecycleBinDocumentByIdOriginalParentResponse = ((ReferenceByIdModel)); -export type PostDocumentTypeImportData = { - requestBody?: (ImportDocumentTypeRequestModel); +export type PutRecycleBinDocumentByIdRestoreData = { + id: string; + requestBody?: (MoveMediaRequestModel); }; -export type PostDocumentTypeImportResponse = (string); +export type PutRecycleBinDocumentByIdRestoreResponse = (string); -export type GetItemDocumentTypeData = { - id?: Array<(string)>; +export type GetRecycleBinDocumentChildrenData = { + parentId?: string; + skip?: number; + take?: number; }; -export type GetItemDocumentTypeResponse = (Array<(DocumentTypeItemResponseModel)>); +export type GetRecycleBinDocumentChildrenResponse = ((PagedDocumentRecycleBinItemResponseModel)); -export type GetItemDocumentTypeSearchData = { - query?: string; +export type GetRecycleBinDocumentRootData = { skip?: number; take?: number; }; -export type GetItemDocumentTypeSearchResponse = ((PagedModelDocumentTypeItemResponseModel)); +export type GetRecycleBinDocumentRootResponse = ((PagedDocumentRecycleBinItemResponseModel)); -export type GetTreeDocumentTypeAncestorsData = { +export type GetTreeDocumentAncestorsData = { descendantId?: string; }; -export type GetTreeDocumentTypeAncestorsResponse = (Array<(DocumentTypeTreeItemResponseModel)>); +export type GetTreeDocumentAncestorsResponse = (Array<(DocumentTreeItemResponseModel)>); -export type GetTreeDocumentTypeChildrenData = { - foldersOnly?: boolean; +export type GetTreeDocumentChildrenData = { + dataTypeId?: string; parentId?: string; skip?: number; take?: number; }; -export type GetTreeDocumentTypeChildrenResponse = ((PagedDocumentTypeTreeItemResponseModel)); +export type GetTreeDocumentChildrenResponse = ((PagedDocumentTreeItemResponseModel)); -export type GetTreeDocumentTypeRootData = { - foldersOnly?: boolean; +export type GetTreeDocumentRootData = { + dataTypeId?: string; skip?: number; take?: number; }; -export type GetTreeDocumentTypeRootResponse = ((PagedDocumentTypeTreeItemResponseModel)); +export type GetTreeDocumentRootResponse = ((PagedDocumentTreeItemResponseModel)); -export type GetDocumentVersionData = { - culture?: string; - documentId: string; - skip?: number; - take?: number; +export type PostDocumentBlueprintData = { + requestBody?: (CreateDocumentBlueprintRequestModel); }; -export type GetDocumentVersionResponse = ((PagedDocumentVersionItemResponseModel)); +export type PostDocumentBlueprintResponse = (string); -export type GetDocumentVersionByIdData = { +export type GetDocumentBlueprintByIdData = { id: string; }; -export type GetDocumentVersionByIdResponse = ((DocumentVersionResponseModel)); +export type GetDocumentBlueprintByIdResponse = ((DocumentBlueprintResponseModel)); -export type PutDocumentVersionByIdPreventCleanupData = { +export type DeleteDocumentBlueprintByIdData = { id: string; - preventCleanup?: boolean; }; -export type PutDocumentVersionByIdPreventCleanupResponse = (string); +export type DeleteDocumentBlueprintByIdResponse = (string); -export type PostDocumentVersionByIdRollbackData = { - culture?: string; +export type PutDocumentBlueprintByIdData = { id: string; + requestBody?: (UpdateDocumentBlueprintRequestModel); }; -export type PostDocumentVersionByIdRollbackResponse = (string); +export type PutDocumentBlueprintByIdResponse = (string); -export type GetCollectionDocumentByIdData = { - dataTypeId?: string; - filter?: string; +export type PutDocumentBlueprintByIdMoveData = { id: string; - orderBy?: string; - orderCulture?: string; - orderDirection?: DirectionModel; - skip?: number; - take?: number; + requestBody?: (MoveDocumentBlueprintRequestModel); }; -export type GetCollectionDocumentByIdResponse = ((PagedDocumentCollectionResponseModel)); +export type PutDocumentBlueprintByIdMoveResponse = (string); -export type PostDocumentData = { - requestBody?: (CreateDocumentRequestModel); +export type PostDocumentBlueprintFolderData = { + requestBody?: (CreateFolderRequestModel); }; -export type PostDocumentResponse = (string); +export type PostDocumentBlueprintFolderResponse = (string); -export type GetDocumentByIdData = { +export type GetDocumentBlueprintFolderByIdData = { id: string; }; -export type GetDocumentByIdResponse = ((DocumentResponseModel)); +export type GetDocumentBlueprintFolderByIdResponse = ((FolderResponseModel)); -export type DeleteDocumentByIdData = { +export type DeleteDocumentBlueprintFolderByIdData = { id: string; }; -export type DeleteDocumentByIdResponse = (string); +export type DeleteDocumentBlueprintFolderByIdResponse = (string); -export type PutDocumentByIdData = { +export type PutDocumentBlueprintFolderByIdData = { id: string; - requestBody?: (UpdateDocumentRequestModel); + requestBody?: (UpdateFolderResponseModel); }; -export type PutDocumentByIdResponse = (string); +export type PutDocumentBlueprintFolderByIdResponse = (string); -export type GetDocumentByIdAuditLogData = { - id: string; - orderDirection?: DirectionModel; - sinceDate?: string; - skip?: number; - take?: number; +export type PostDocumentBlueprintFromDocumentData = { + requestBody?: (CreateDocumentBlueprintFromDocumentRequestModel); }; -export type GetDocumentByIdAuditLogResponse = ((PagedAuditLogResponseModel)); +export type PostDocumentBlueprintFromDocumentResponse = (string); -export type PostDocumentByIdCopyData = { - id: string; - requestBody?: (CopyDocumentRequestModel); +export type GetItemDocumentBlueprintData = { + id?: Array<(string)>; }; -export type PostDocumentByIdCopyResponse = (string); +export type GetItemDocumentBlueprintResponse = (Array<(DocumentBlueprintItemResponseModel)>); -export type GetDocumentByIdDomainsData = { - id: string; +export type GetTreeDocumentBlueprintAncestorsData = { + descendantId?: string; }; -export type GetDocumentByIdDomainsResponse = ((DomainsResponseModel)); +export type GetTreeDocumentBlueprintAncestorsResponse = (Array<(DocumentBlueprintTreeItemResponseModel)>); -export type PutDocumentByIdDomainsData = { - id: string; - requestBody?: (UpdateDomainsRequestModel); +export type GetTreeDocumentBlueprintChildrenData = { + foldersOnly?: boolean; + parentId?: string; + skip?: number; + take?: number; }; -export type PutDocumentByIdDomainsResponse = (string); +export type GetTreeDocumentBlueprintChildrenResponse = ((PagedDocumentBlueprintTreeItemResponseModel)); -export type PutDocumentByIdMoveData = { - id: string; - requestBody?: (MoveDocumentRequestModel); +export type GetTreeDocumentBlueprintRootData = { + foldersOnly?: boolean; + skip?: number; + take?: number; }; -export type PutDocumentByIdMoveResponse = (string); +export type GetTreeDocumentBlueprintRootResponse = ((PagedDocumentBlueprintTreeItemResponseModel)); -export type PutDocumentByIdMoveToRecycleBinData = { - id: string; +export type PostDocumentTypeData = { + requestBody?: (CreateDocumentTypeRequestModel); }; -export type PutDocumentByIdMoveToRecycleBinResponse = (string); +export type PostDocumentTypeResponse = (string); -export type GetDocumentByIdNotificationsData = { +export type GetDocumentTypeByIdData = { id: string; }; -export type GetDocumentByIdNotificationsResponse = (Array<(DocumentNotificationResponseModel)>); +export type GetDocumentTypeByIdResponse = ((DocumentTypeResponseModel)); -export type PutDocumentByIdNotificationsData = { +export type DeleteDocumentTypeByIdData = { id: string; - requestBody?: (UpdateDocumentNotificationsRequestModel); }; -export type PutDocumentByIdNotificationsResponse = (string); +export type DeleteDocumentTypeByIdResponse = (string); -export type PostDocumentByIdPublicAccessData = { +export type PutDocumentTypeByIdData = { id: string; - requestBody?: (PublicAccessRequestModel); + requestBody?: (UpdateDocumentTypeRequestModel); }; -export type PostDocumentByIdPublicAccessResponse = (string); +export type PutDocumentTypeByIdResponse = (string); -export type DeleteDocumentByIdPublicAccessData = { +export type GetDocumentTypeByIdAllowedChildrenData = { id: string; + skip?: number; + take?: number; }; -export type DeleteDocumentByIdPublicAccessResponse = (string); +export type GetDocumentTypeByIdAllowedChildrenResponse = ((PagedAllowedDocumentTypeModel)); -export type GetDocumentByIdPublicAccessData = { +export type GetDocumentTypeByIdBlueprintData = { id: string; + skip?: number; + take?: number; }; -export type GetDocumentByIdPublicAccessResponse = ((PublicAccessResponseModel)); +export type GetDocumentTypeByIdBlueprintResponse = ((PagedDocumentTypeBlueprintItemResponseModel)); -export type PutDocumentByIdPublicAccessData = { +export type GetDocumentTypeByIdCompositionReferencesData = { id: string; - requestBody?: (PublicAccessRequestModel); }; -export type PutDocumentByIdPublicAccessResponse = (string); +export type GetDocumentTypeByIdCompositionReferencesResponse = (Array<(DocumentTypeCompositionResponseModel)>); -export type PutDocumentByIdPublishData = { +export type PostDocumentTypeByIdCopyData = { id: string; - requestBody?: (PublishDocumentRequestModel); + requestBody?: (CopyDocumentTypeRequestModel); }; -export type PutDocumentByIdPublishResponse = (string); +export type PostDocumentTypeByIdCopyResponse = (string); -export type PutDocumentByIdPublishWithDescendantsData = { +export type GetDocumentTypeByIdExportData = { id: string; - requestBody?: (PublishDocumentWithDescendantsRequestModel); }; -export type PutDocumentByIdPublishWithDescendantsResponse = (string); +export type GetDocumentTypeByIdExportResponse = (((Blob | File))); -export type GetDocumentByIdPublishedData = { +export type PutDocumentTypeByIdImportData = { id: string; + requestBody?: (ImportDocumentTypeRequestModel); }; -export type GetDocumentByIdPublishedResponse = ((PublishedDocumentResponseModel)); +export type PutDocumentTypeByIdImportResponse = (string); -export type GetDocumentByIdReferencedByData = { +export type PutDocumentTypeByIdMoveData = { id: string; - skip?: number; - take?: number; + requestBody?: (MoveDocumentTypeRequestModel); }; -export type GetDocumentByIdReferencedByResponse = ((PagedIReferenceResponseModel)); +export type PutDocumentTypeByIdMoveResponse = (string); -export type GetDocumentByIdReferencedDescendantsData = { - id: string; +export type GetDocumentTypeAllowedAtRootData = { skip?: number; take?: number; }; -export type GetDocumentByIdReferencedDescendantsResponse = ((PagedReferenceByIdModel)); +export type GetDocumentTypeAllowedAtRootResponse = ((PagedAllowedDocumentTypeModel)); -export type PutDocumentByIdUnpublishData = { - id: string; - requestBody?: (UnpublishDocumentRequestModel); +export type PostDocumentTypeAvailableCompositionsData = { + requestBody?: (DocumentTypeCompositionRequestModel); }; -export type PutDocumentByIdUnpublishResponse = (string); - -export type PutDocumentByIdValidateData = { - id: string; - requestBody?: (UpdateDocumentRequestModel); -}; +export type PostDocumentTypeAvailableCompositionsResponse = (Array<(AvailableDocumentTypeCompositionResponseModel)>); -export type PutDocumentByIdValidateResponse = (string); +export type GetDocumentTypeConfigurationResponse = ((DocumentTypeConfigurationResponseModel)); -export type PutUmbracoManagementApiV11DocumentByIdValidate11Data = { - id: string; - requestBody?: (ValidateUpdateDocumentRequestModel); +export type PostDocumentTypeFolderData = { + requestBody?: (CreateFolderRequestModel); }; -export type PutUmbracoManagementApiV11DocumentByIdValidate11Response = (string); +export type PostDocumentTypeFolderResponse = (string); -export type GetDocumentAreReferencedData = { - id?: Array<(string)>; - skip?: number; - take?: number; +export type GetDocumentTypeFolderByIdData = { + id: string; }; -export type GetDocumentAreReferencedResponse = ((PagedReferenceByIdModel)); - -export type GetDocumentConfigurationResponse = ((DocumentConfigurationResponseModel)); +export type GetDocumentTypeFolderByIdResponse = ((FolderResponseModel)); -export type PutDocumentSortData = { - requestBody?: (SortingRequestModel); +export type DeleteDocumentTypeFolderByIdData = { + id: string; }; -export type PutDocumentSortResponse = (string); +export type DeleteDocumentTypeFolderByIdResponse = (string); -export type GetDocumentUrlsData = { - id?: Array<(string)>; +export type PutDocumentTypeFolderByIdData = { + id: string; + requestBody?: (UpdateFolderResponseModel); }; -export type GetDocumentUrlsResponse = (Array<(DocumentUrlInfoResponseModel)>); +export type PutDocumentTypeFolderByIdResponse = (string); -export type PostDocumentValidateData = { - requestBody?: (CreateDocumentRequestModel); +export type PostDocumentTypeImportData = { + requestBody?: (ImportDocumentTypeRequestModel); }; -export type PostDocumentValidateResponse = (string); +export type PostDocumentTypeImportResponse = (string); -export type GetItemDocumentData = { +export type GetItemDocumentTypeData = { id?: Array<(string)>; }; -export type GetItemDocumentResponse = (Array<(DocumentItemResponseModel)>); +export type GetItemDocumentTypeResponse = (Array<(DocumentTypeItemResponseModel)>); -export type GetItemDocumentSearchData = { - parentId?: string; +export type GetItemDocumentTypeSearchData = { query?: string; skip?: number; take?: number; }; -export type GetItemDocumentSearchResponse = ((PagedModelDocumentItemResponseModel)); - -export type DeleteRecycleBinDocumentResponse = (string); - -export type DeleteRecycleBinDocumentByIdData = { - id: string; -}; - -export type DeleteRecycleBinDocumentByIdResponse = (string); +export type GetItemDocumentTypeSearchResponse = ((PagedModelDocumentTypeItemResponseModel)); -export type GetRecycleBinDocumentByIdOriginalParentData = { - id: string; +export type GetTreeDocumentTypeAncestorsData = { + descendantId?: string; }; -export type GetRecycleBinDocumentByIdOriginalParentResponse = ((ReferenceByIdModel)); +export type GetTreeDocumentTypeAncestorsResponse = (Array<(DocumentTypeTreeItemResponseModel)>); -export type PutRecycleBinDocumentByIdRestoreData = { - id: string; - requestBody?: (MoveMediaRequestModel); +export type GetTreeDocumentTypeChildrenData = { + foldersOnly?: boolean; + parentId?: string; + skip?: number; + take?: number; }; -export type PutRecycleBinDocumentByIdRestoreResponse = (string); +export type GetTreeDocumentTypeChildrenResponse = ((PagedDocumentTypeTreeItemResponseModel)); -export type GetRecycleBinDocumentChildrenData = { - parentId?: string; +export type GetTreeDocumentTypeRootData = { + foldersOnly?: boolean; skip?: number; take?: number; }; -export type GetRecycleBinDocumentChildrenResponse = ((PagedDocumentRecycleBinItemResponseModel)); +export type GetTreeDocumentTypeRootResponse = ((PagedDocumentTypeTreeItemResponseModel)); -export type GetRecycleBinDocumentRootData = { +export type GetDocumentVersionData = { + culture?: string; + documentId: string; skip?: number; take?: number; }; -export type GetRecycleBinDocumentRootResponse = ((PagedDocumentRecycleBinItemResponseModel)); +export type GetDocumentVersionResponse = ((PagedDocumentVersionItemResponseModel)); -export type GetTreeDocumentAncestorsData = { - descendantId?: string; +export type GetDocumentVersionByIdData = { + id: string; }; -export type GetTreeDocumentAncestorsResponse = (Array<(DocumentTreeItemResponseModel)>); +export type GetDocumentVersionByIdResponse = ((DocumentVersionResponseModel)); -export type GetTreeDocumentChildrenData = { - dataTypeId?: string; - parentId?: string; - skip?: number; - take?: number; +export type PutDocumentVersionByIdPreventCleanupData = { + id: string; + preventCleanup?: boolean; }; -export type GetTreeDocumentChildrenResponse = ((PagedDocumentTreeItemResponseModel)); +export type PutDocumentVersionByIdPreventCleanupResponse = (string); -export type GetTreeDocumentRootData = { - dataTypeId?: string; - skip?: number; - take?: number; +export type PostDocumentVersionByIdRollbackData = { + culture?: string; + id: string; }; -export type GetTreeDocumentRootResponse = ((PagedDocumentTreeItemResponseModel)); +export type PostDocumentVersionByIdRollbackResponse = (string); export type PostDynamicRootQueryData = { requestBody?: (DynamicRootRequestModel); @@ -3834,183 +3838,19 @@ export type DeleteLogViewerSavedSearchByNameData = { }; export type DeleteLogViewerSavedSearchByNameResponse = (string); - -export type GetLogViewerValidateLogsSizeData = { - endDate?: string; - startDate?: string; -}; - -export type GetLogViewerValidateLogsSizeResponse = (unknown); - -export type GetManifestManifestResponse = (Array<(ManifestResponseModel)>); - -export type GetManifestManifestPrivateResponse = (Array<(ManifestResponseModel)>); - -export type GetManifestManifestPublicResponse = (Array<(ManifestResponseModel)>); - -export type GetItemMediaTypeData = { - id?: Array<(string)>; -}; - -export type GetItemMediaTypeResponse = (Array<(MediaTypeItemResponseModel)>); - -export type GetItemMediaTypeAllowedData = { - fileExtension?: string; - skip?: number; - take?: number; -}; - -export type GetItemMediaTypeAllowedResponse = ((PagedModelMediaTypeItemResponseModel)); - -export type GetItemMediaTypeFoldersData = { - skip?: number; - take?: number; -}; - -export type GetItemMediaTypeFoldersResponse = ((PagedModelMediaTypeItemResponseModel)); - -export type GetItemMediaTypeSearchData = { - query?: string; - skip?: number; - take?: number; -}; - -export type GetItemMediaTypeSearchResponse = ((PagedModelMediaTypeItemResponseModel)); - -export type PostMediaTypeData = { - requestBody?: (CreateMediaTypeRequestModel); -}; - -export type PostMediaTypeResponse = (string); - -export type GetMediaTypeByIdData = { - id: string; -}; - -export type GetMediaTypeByIdResponse = ((MediaTypeResponseModel)); - -export type DeleteMediaTypeByIdData = { - id: string; -}; - -export type DeleteMediaTypeByIdResponse = (string); - -export type PutMediaTypeByIdData = { - id: string; - requestBody?: (UpdateMediaTypeRequestModel); -}; - -export type PutMediaTypeByIdResponse = (string); - -export type GetMediaTypeByIdAllowedChildrenData = { - id: string; - skip?: number; - take?: number; -}; - -export type GetMediaTypeByIdAllowedChildrenResponse = ((PagedAllowedMediaTypeModel)); - -export type GetMediaTypeByIdCompositionReferencesData = { - id: string; -}; - -export type GetMediaTypeByIdCompositionReferencesResponse = (Array<(MediaTypeCompositionResponseModel)>); - -export type PostMediaTypeByIdCopyData = { - id: string; - requestBody?: (CopyMediaTypeRequestModel); -}; - -export type PostMediaTypeByIdCopyResponse = (string); - -export type GetMediaTypeByIdExportData = { - id: string; -}; - -export type GetMediaTypeByIdExportResponse = (((Blob | File))); - -export type PutMediaTypeByIdImportData = { - id: string; - requestBody?: (ImportMediaTypeRequestModel); -}; - -export type PutMediaTypeByIdImportResponse = (string); - -export type PutMediaTypeByIdMoveData = { - id: string; - requestBody?: (MoveMediaTypeRequestModel); -}; - -export type PutMediaTypeByIdMoveResponse = (string); - -export type GetMediaTypeAllowedAtRootData = { - skip?: number; - take?: number; -}; - -export type GetMediaTypeAllowedAtRootResponse = ((PagedAllowedMediaTypeModel)); - -export type PostMediaTypeAvailableCompositionsData = { - requestBody?: (MediaTypeCompositionRequestModel); -}; - -export type PostMediaTypeAvailableCompositionsResponse = (Array<(AvailableMediaTypeCompositionResponseModel)>); - -export type GetMediaTypeConfigurationResponse = ((MediaTypeConfigurationResponseModel)); - -export type PostMediaTypeFolderData = { - requestBody?: (CreateFolderRequestModel); -}; - -export type PostMediaTypeFolderResponse = (string); - -export type GetMediaTypeFolderByIdData = { - id: string; -}; - -export type GetMediaTypeFolderByIdResponse = ((FolderResponseModel)); - -export type DeleteMediaTypeFolderByIdData = { - id: string; -}; - -export type DeleteMediaTypeFolderByIdResponse = (string); - -export type PutMediaTypeFolderByIdData = { - id: string; - requestBody?: (UpdateFolderResponseModel); -}; - -export type PutMediaTypeFolderByIdResponse = (string); - -export type PostMediaTypeImportData = { - requestBody?: (ImportMediaTypeRequestModel); -}; - -export type PostMediaTypeImportResponse = (string); - -export type GetTreeMediaTypeAncestorsData = { - descendantId?: string; -}; - -export type GetTreeMediaTypeAncestorsResponse = (Array<(MediaTypeTreeItemResponseModel)>); - -export type GetTreeMediaTypeChildrenData = { - foldersOnly?: boolean; - parentId?: string; - skip?: number; - take?: number; + +export type GetLogViewerValidateLogsSizeData = { + endDate?: string; + startDate?: string; }; -export type GetTreeMediaTypeChildrenResponse = ((PagedMediaTypeTreeItemResponseModel)); +export type GetLogViewerValidateLogsSizeResponse = (unknown); -export type GetTreeMediaTypeRootData = { - foldersOnly?: boolean; - skip?: number; - take?: number; -}; +export type GetManifestManifestResponse = (Array<(ManifestResponseModel)>); -export type GetTreeMediaTypeRootResponse = ((PagedMediaTypeTreeItemResponseModel)); +export type GetManifestManifestPrivateResponse = (Array<(ManifestResponseModel)>); + +export type GetManifestManifestPublicResponse = (Array<(ManifestResponseModel)>); export type GetCollectionMediaData = { dataTypeId?: string; @@ -4197,116 +4037,169 @@ export type GetTreeMediaRootData = { export type GetTreeMediaRootResponse = ((PagedMediaTreeItemResponseModel)); -export type GetItemMemberGroupData = { +export type GetItemMediaTypeData = { id?: Array<(string)>; }; -export type GetItemMemberGroupResponse = (Array<(MemberGroupItemResponseModel)>); +export type GetItemMediaTypeResponse = (Array<(MediaTypeItemResponseModel)>); -export type GetMemberGroupData = { +export type GetItemMediaTypeAllowedData = { + fileExtension?: string; skip?: number; take?: number; }; -export type GetMemberGroupResponse = ((PagedMemberGroupResponseModel)); +export type GetItemMediaTypeAllowedResponse = ((PagedModelMediaTypeItemResponseModel)); -export type PostMemberGroupData = { - requestBody?: (CreateMemberGroupRequestModel); +export type GetItemMediaTypeFoldersData = { + skip?: number; + take?: number; }; -export type PostMemberGroupResponse = (string); +export type GetItemMediaTypeFoldersResponse = ((PagedModelMediaTypeItemResponseModel)); -export type GetMemberGroupByIdData = { +export type GetItemMediaTypeSearchData = { + query?: string; + skip?: number; + take?: number; +}; + +export type GetItemMediaTypeSearchResponse = ((PagedModelMediaTypeItemResponseModel)); + +export type PostMediaTypeData = { + requestBody?: (CreateMediaTypeRequestModel); +}; + +export type PostMediaTypeResponse = (string); + +export type GetMediaTypeByIdData = { id: string; }; -export type GetMemberGroupByIdResponse = ((MemberGroupResponseModel)); +export type GetMediaTypeByIdResponse = ((MediaTypeResponseModel)); -export type DeleteMemberGroupByIdData = { +export type DeleteMediaTypeByIdData = { id: string; }; -export type DeleteMemberGroupByIdResponse = (string); +export type DeleteMediaTypeByIdResponse = (string); -export type PutMemberGroupByIdData = { +export type PutMediaTypeByIdData = { id: string; - requestBody?: (UpdateMemberGroupRequestModel); + requestBody?: (UpdateMediaTypeRequestModel); }; -export type PutMemberGroupByIdResponse = (string); +export type PutMediaTypeByIdResponse = (string); -export type GetTreeMemberGroupRootData = { +export type GetMediaTypeByIdAllowedChildrenData = { + id: string; skip?: number; take?: number; }; -export type GetTreeMemberGroupRootResponse = ((PagedNamedEntityTreeItemResponseModel)); +export type GetMediaTypeByIdAllowedChildrenResponse = ((PagedAllowedMediaTypeModel)); -export type GetItemMemberTypeData = { - id?: Array<(string)>; +export type GetMediaTypeByIdCompositionReferencesData = { + id: string; }; -export type GetItemMemberTypeResponse = (Array<(MemberTypeItemResponseModel)>); +export type GetMediaTypeByIdCompositionReferencesResponse = (Array<(MediaTypeCompositionResponseModel)>); -export type GetItemMemberTypeSearchData = { - query?: string; - skip?: number; - take?: number; +export type PostMediaTypeByIdCopyData = { + id: string; + requestBody?: (CopyMediaTypeRequestModel); }; -export type GetItemMemberTypeSearchResponse = ((PagedModelMemberTypeItemResponseModel)); +export type PostMediaTypeByIdCopyResponse = (string); -export type PostMemberTypeData = { - requestBody?: (CreateMemberTypeRequestModel); +export type GetMediaTypeByIdExportData = { + id: string; }; -export type PostMemberTypeResponse = (string); +export type GetMediaTypeByIdExportResponse = (((Blob | File))); -export type GetMemberTypeByIdData = { +export type PutMediaTypeByIdImportData = { id: string; + requestBody?: (ImportMediaTypeRequestModel); }; -export type GetMemberTypeByIdResponse = ((MemberTypeResponseModel)); +export type PutMediaTypeByIdImportResponse = (string); -export type DeleteMemberTypeByIdData = { +export type PutMediaTypeByIdMoveData = { id: string; + requestBody?: (MoveMediaTypeRequestModel); }; -export type DeleteMemberTypeByIdResponse = (string); +export type PutMediaTypeByIdMoveResponse = (string); -export type PutMemberTypeByIdData = { +export type GetMediaTypeAllowedAtRootData = { + skip?: number; + take?: number; +}; + +export type GetMediaTypeAllowedAtRootResponse = ((PagedAllowedMediaTypeModel)); + +export type PostMediaTypeAvailableCompositionsData = { + requestBody?: (MediaTypeCompositionRequestModel); +}; + +export type PostMediaTypeAvailableCompositionsResponse = (Array<(AvailableMediaTypeCompositionResponseModel)>); + +export type GetMediaTypeConfigurationResponse = ((MediaTypeConfigurationResponseModel)); + +export type PostMediaTypeFolderData = { + requestBody?: (CreateFolderRequestModel); +}; + +export type PostMediaTypeFolderResponse = (string); + +export type GetMediaTypeFolderByIdData = { id: string; - requestBody?: (UpdateMemberTypeRequestModel); }; -export type PutMemberTypeByIdResponse = (string); +export type GetMediaTypeFolderByIdResponse = ((FolderResponseModel)); -export type GetMemberTypeByIdCompositionReferencesData = { +export type DeleteMediaTypeFolderByIdData = { id: string; }; -export type GetMemberTypeByIdCompositionReferencesResponse = (Array<(MemberTypeCompositionResponseModel)>); +export type DeleteMediaTypeFolderByIdResponse = (string); -export type PostMemberTypeByIdCopyData = { +export type PutMediaTypeFolderByIdData = { id: string; + requestBody?: (UpdateFolderResponseModel); }; -export type PostMemberTypeByIdCopyResponse = (string); +export type PutMediaTypeFolderByIdResponse = (string); -export type PostMemberTypeAvailableCompositionsData = { - requestBody?: (MemberTypeCompositionRequestModel); +export type PostMediaTypeImportData = { + requestBody?: (ImportMediaTypeRequestModel); }; -export type PostMemberTypeAvailableCompositionsResponse = (Array<(AvailableMemberTypeCompositionResponseModel)>); +export type PostMediaTypeImportResponse = (string); -export type GetMemberTypeConfigurationResponse = ((MemberTypeConfigurationResponseModel)); +export type GetTreeMediaTypeAncestorsData = { + descendantId?: string; +}; -export type GetTreeMemberTypeRootData = { +export type GetTreeMediaTypeAncestorsResponse = (Array<(MediaTypeTreeItemResponseModel)>); + +export type GetTreeMediaTypeChildrenData = { + foldersOnly?: boolean; + parentId?: string; skip?: number; take?: number; }; -export type GetTreeMemberTypeRootResponse = ((PagedMemberTypeTreeItemResponseModel)); +export type GetTreeMediaTypeChildrenResponse = ((PagedMediaTypeTreeItemResponseModel)); + +export type GetTreeMediaTypeRootData = { + foldersOnly?: boolean; + skip?: number; + take?: number; +}; + +export type GetTreeMediaTypeRootResponse = ((PagedMediaTypeTreeItemResponseModel)); export type GetFilterMemberData = { filter?: string; @@ -4322,59 +4215,170 @@ export type GetFilterMemberData = { export type GetFilterMemberResponse = ((PagedMemberResponseModel)); -export type GetItemMemberData = { +export type GetItemMemberData = { + id?: Array<(string)>; +}; + +export type GetItemMemberResponse = (Array<(MemberItemResponseModel)>); + +export type GetItemMemberSearchData = { + query?: string; + skip?: number; + take?: number; +}; + +export type GetItemMemberSearchResponse = ((PagedModelMemberItemResponseModel)); + +export type PostMemberData = { + requestBody?: (CreateMemberRequestModel); +}; + +export type PostMemberResponse = (string); + +export type GetMemberByIdData = { + id: string; +}; + +export type GetMemberByIdResponse = ((MemberResponseModel)); + +export type DeleteMemberByIdData = { + id: string; +}; + +export type DeleteMemberByIdResponse = (string); + +export type PutMemberByIdData = { + id: string; + requestBody?: (UpdateMemberRequestModel); +}; + +export type PutMemberByIdResponse = (string); + +export type PutMemberByIdValidateData = { + id: string; + requestBody?: (UpdateMemberRequestModel); +}; + +export type PutMemberByIdValidateResponse = (string); + +export type GetMemberConfigurationResponse = ((MemberConfigurationResponseModel)); + +export type PostMemberValidateData = { + requestBody?: (CreateMemberRequestModel); +}; + +export type PostMemberValidateResponse = (string); + +export type GetItemMemberGroupData = { + id?: Array<(string)>; +}; + +export type GetItemMemberGroupResponse = (Array<(MemberGroupItemResponseModel)>); + +export type GetMemberGroupData = { + skip?: number; + take?: number; +}; + +export type GetMemberGroupResponse = ((PagedMemberGroupResponseModel)); + +export type PostMemberGroupData = { + requestBody?: (CreateMemberGroupRequestModel); +}; + +export type PostMemberGroupResponse = (string); + +export type GetMemberGroupByIdData = { + id: string; +}; + +export type GetMemberGroupByIdResponse = ((MemberGroupResponseModel)); + +export type DeleteMemberGroupByIdData = { + id: string; +}; + +export type DeleteMemberGroupByIdResponse = (string); + +export type PutMemberGroupByIdData = { + id: string; + requestBody?: (UpdateMemberGroupRequestModel); +}; + +export type PutMemberGroupByIdResponse = (string); + +export type GetTreeMemberGroupRootData = { + skip?: number; + take?: number; +}; + +export type GetTreeMemberGroupRootResponse = ((PagedNamedEntityTreeItemResponseModel)); + +export type GetItemMemberTypeData = { id?: Array<(string)>; }; -export type GetItemMemberResponse = (Array<(MemberItemResponseModel)>); +export type GetItemMemberTypeResponse = (Array<(MemberTypeItemResponseModel)>); -export type GetItemMemberSearchData = { +export type GetItemMemberTypeSearchData = { query?: string; skip?: number; take?: number; }; -export type GetItemMemberSearchResponse = ((PagedModelMemberItemResponseModel)); +export type GetItemMemberTypeSearchResponse = ((PagedModelMemberTypeItemResponseModel)); -export type PostMemberData = { - requestBody?: (CreateMemberRequestModel); +export type PostMemberTypeData = { + requestBody?: (CreateMemberTypeRequestModel); }; -export type PostMemberResponse = (string); +export type PostMemberTypeResponse = (string); -export type GetMemberByIdData = { +export type GetMemberTypeByIdData = { id: string; }; -export type GetMemberByIdResponse = ((MemberResponseModel)); +export type GetMemberTypeByIdResponse = ((MemberTypeResponseModel)); -export type DeleteMemberByIdData = { +export type DeleteMemberTypeByIdData = { id: string; }; -export type DeleteMemberByIdResponse = (string); +export type DeleteMemberTypeByIdResponse = (string); -export type PutMemberByIdData = { +export type PutMemberTypeByIdData = { id: string; - requestBody?: (UpdateMemberRequestModel); + requestBody?: (UpdateMemberTypeRequestModel); }; -export type PutMemberByIdResponse = (string); +export type PutMemberTypeByIdResponse = (string); -export type PutMemberByIdValidateData = { +export type GetMemberTypeByIdCompositionReferencesData = { id: string; - requestBody?: (UpdateMemberRequestModel); }; -export type PutMemberByIdValidateResponse = (string); +export type GetMemberTypeByIdCompositionReferencesResponse = (Array<(MemberTypeCompositionResponseModel)>); -export type GetMemberConfigurationResponse = ((MemberConfigurationResponseModel)); +export type PostMemberTypeByIdCopyData = { + id: string; +}; -export type PostMemberValidateData = { - requestBody?: (CreateMemberRequestModel); +export type PostMemberTypeByIdCopyResponse = (string); + +export type PostMemberTypeAvailableCompositionsData = { + requestBody?: (MemberTypeCompositionRequestModel); }; -export type PostMemberValidateResponse = (string); +export type PostMemberTypeAvailableCompositionsResponse = (Array<(AvailableMemberTypeCompositionResponseModel)>); + +export type GetMemberTypeConfigurationResponse = ((MemberTypeConfigurationResponseModel)); + +export type GetTreeMemberTypeRootData = { + skip?: number; + take?: number; +}; + +export type GetTreeMemberTypeRootResponse = ((PagedMemberTypeTreeItemResponseModel)); export type PostModelsBuilderBuildResponse = (string); @@ -4593,6 +4597,14 @@ export type PostRedirectManagementStatusData = { export type PostRedirectManagementStatusResponse = (string); +export type GetRelationByRelationTypeIdData = { + id: string; + skip?: number; + take?: number; +}; + +export type GetRelationByRelationTypeIdResponse = ((PagedRelationResponseModel)); + export type GetItemRelationTypeData = { id?: Array<(string)>; }; @@ -4612,14 +4624,6 @@ export type GetRelationTypeByIdData = { export type GetRelationTypeByIdResponse = ((RelationTypeResponseModel)); -export type GetRelationByRelationTypeIdData = { - id: string; - skip?: number; - take?: number; -}; - -export type GetRelationByRelationTypeIdResponse = ((PagedRelationResponseModel)); - export type GetItemScriptData = { path?: Array<(string)>; }; @@ -4976,99 +4980,6 @@ export type PostUpgradeAuthorizeResponse = (string); export type GetUpgradeSettingsResponse = ((UpgradeSettingsResponseModel)); -export type PostUserDataData = { - requestBody?: (CreateUserDataRequestModel); -}; - -export type PostUserDataResponse = (string); - -export type GetUserDataData = { - groups?: Array<(string)>; - identifiers?: Array<(string)>; - skip?: number; - take?: number; -}; - -export type GetUserDataResponse = ((PagedUserDataResponseModel)); - -export type PutUserDataData = { - requestBody?: (UpdateUserDataRequestModel); -}; - -export type PutUserDataResponse = (string); - -export type GetUserDataByIdData = { - id: string; -}; - -export type GetUserDataByIdResponse = ((UserDataModel)); - -export type GetFilterUserGroupData = { - filter?: string; - skip?: number; - take?: number; -}; - -export type GetFilterUserGroupResponse = ((PagedUserGroupResponseModel)); - -export type GetItemUserGroupData = { - id?: Array<(string)>; -}; - -export type GetItemUserGroupResponse = (Array<(UserGroupItemResponseModel)>); - -export type DeleteUserGroupData = { - requestBody?: (DeleteUserGroupsRequestModel); -}; - -export type DeleteUserGroupResponse = (string); - -export type PostUserGroupData = { - requestBody?: (CreateUserGroupRequestModel); -}; - -export type PostUserGroupResponse = (string); - -export type GetUserGroupData = { - skip?: number; - take?: number; -}; - -export type GetUserGroupResponse = ((PagedUserGroupResponseModel)); - -export type GetUserGroupByIdData = { - id: string; -}; - -export type GetUserGroupByIdResponse = ((UserGroupResponseModel)); - -export type DeleteUserGroupByIdData = { - id: string; -}; - -export type DeleteUserGroupByIdResponse = (string); - -export type PutUserGroupByIdData = { - id: string; - requestBody?: (UpdateUserGroupRequestModel); -}; - -export type PutUserGroupByIdResponse = (string); - -export type DeleteUserGroupByIdUsersData = { - id: string; - requestBody?: Array<(ReferenceByIdModel)>; -}; - -export type DeleteUserGroupByIdUsersResponse = (string); - -export type PostUserGroupByIdUsersData = { - id: string; - requestBody?: Array<(ReferenceByIdModel)>; -}; - -export type PostUserGroupByIdUsersResponse = (string); - export type GetFilterUserData = { filter?: string; orderBy?: UserOrderModel; @@ -5298,6 +5209,99 @@ export type PostUserUnlockData = { export type PostUserUnlockResponse = (string); +export type PostUserDataData = { + requestBody?: (CreateUserDataRequestModel); +}; + +export type PostUserDataResponse = (string); + +export type GetUserDataData = { + groups?: Array<(string)>; + identifiers?: Array<(string)>; + skip?: number; + take?: number; +}; + +export type GetUserDataResponse = ((PagedUserDataResponseModel)); + +export type PutUserDataData = { + requestBody?: (UpdateUserDataRequestModel); +}; + +export type PutUserDataResponse = (string); + +export type GetUserDataByIdData = { + id: string; +}; + +export type GetUserDataByIdResponse = ((UserDataModel)); + +export type GetFilterUserGroupData = { + filter?: string; + skip?: number; + take?: number; +}; + +export type GetFilterUserGroupResponse = ((PagedUserGroupResponseModel)); + +export type GetItemUserGroupData = { + id?: Array<(string)>; +}; + +export type GetItemUserGroupResponse = (Array<(UserGroupItemResponseModel)>); + +export type DeleteUserGroupData = { + requestBody?: (DeleteUserGroupsRequestModel); +}; + +export type DeleteUserGroupResponse = (string); + +export type PostUserGroupData = { + requestBody?: (CreateUserGroupRequestModel); +}; + +export type PostUserGroupResponse = (string); + +export type GetUserGroupData = { + skip?: number; + take?: number; +}; + +export type GetUserGroupResponse = ((PagedUserGroupResponseModel)); + +export type GetUserGroupByIdData = { + id: string; +}; + +export type GetUserGroupByIdResponse = ((UserGroupResponseModel)); + +export type DeleteUserGroupByIdData = { + id: string; +}; + +export type DeleteUserGroupByIdResponse = (string); + +export type PutUserGroupByIdData = { + id: string; + requestBody?: (UpdateUserGroupRequestModel); +}; + +export type PutUserGroupByIdResponse = (string); + +export type DeleteUserGroupByIdUsersData = { + id: string; + requestBody?: Array<(ReferenceByIdModel)>; +}; + +export type DeleteUserGroupByIdUsersResponse = (string); + +export type PostUserGroupByIdUsersData = { + id: string; + requestBody?: Array<(ReferenceByIdModel)>; +}; + +export type PostUserGroupByIdUsersResponse = (string); + export type GetItemWebhookData = { id?: Array<(string)>; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/dompurify/index.ts b/src/Umbraco.Web.UI.Client/src/external/dompurify/index.ts index ce91fb59165f..06cd2ae825b9 100644 --- a/src/Umbraco.Web.UI.Client/src/external/dompurify/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/dompurify/index.ts @@ -1,3 +1,3 @@ import DOMPurify from 'dompurify'; - export { DOMPurify }; +export type { Config } from 'dompurify'; diff --git a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts index ecb84ae91ac8..4397dee0f96c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/monaco-editor/index.ts @@ -1,34 +1,25 @@ /* eslint-disable */ // @ts-ignore import styles from 'monaco-editor/min/vs/editor/editor.main.css?inline'; -// @ts-ignore -import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker'; -// @ts-ignore -import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker.js?worker'; -// @ts-ignore -import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker.js?worker'; -// @ts-ignore -import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker.js?worker'; -// @ts-ignore -import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker.js?worker'; /* eslint-enable */ const initializeWorkers = () => { self.MonacoEnvironment = { getWorker(workerId: string, label: string): Promise | Worker { + let url = '/umbraco/backoffice/monaco-editor/esm/vs/editor/editor.worker.js'; if (label === 'json') { - return new jsonWorker(); + url = '/umbraco/backoffice/monaco-editor/esm/vs/language/json/json.worker.js'; } if (label === 'css' || label === 'scss' || label === 'less') { - return new cssWorker(); + url = '/umbraco/backoffice/monaco-editor/esm/vs/language/css/css.worker.js'; } if (label === 'html' || label === 'handlebars' || label === 'razor') { - return new htmlWorker(); + url = '/umbraco/backoffice/monaco-editor/esm/vs/language/html/html.worker.js'; } if (label === 'typescript' || label === 'javascript') { - return new tsWorker(); + url = '/umbraco/backoffice/monaco-editor/esm/vs/language/typescript/ts.worker.js'; } - return new editorWorker(); + return new Worker(url, { name: workerId, type: 'module' }); }, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts b/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts index 9ee6c84ac154..1f390ce8900c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import * as base64 from '@umbraco-cms/backoffice/external/base64-js'; +import { fromByteArray } from '@umbraco-cms/backoffice/external/base64-js'; import { AppAuthError } from './errors.js'; @@ -31,7 +31,7 @@ export function bufferToString(buffer: Uint8Array) { } export function urlSafe(buffer: Uint8Array): string { - const encoded = base64.fromByteArray(new Uint8Array(buffer)); + const encoded = fromByteArray(new Uint8Array(buffer)); return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } diff --git a/src/Umbraco.Web.UI.Client/src/libs/formatting-api/formatting.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/formatting-api/formatting.controller.ts index 427e44e0a3e7..828f9d5712a8 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/formatting-api/formatting.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/formatting-api/formatting.controller.ts @@ -1,15 +1,15 @@ -import { DOMPurify } from '@umbraco-cms/backoffice/external/dompurify'; +import { DOMPurify, type Config } from '@umbraco-cms/backoffice/external/dompurify'; import { Marked } from '@umbraco-cms/backoffice/external/marked'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api'; const UmbMarked = new Marked({ gfm: true, breaks: true }); const UmbDomPurify = DOMPurify(window); -const UmbDomPurifyConfig: DOMPurify.Config = { USE_PROFILES: { html: true } }; +const UmbDomPurifyConfig: Config = { USE_PROFILES: { html: true } }; UmbDomPurify.addHook('afterSanitizeAttributes', function (node) { // set all elements owning target to target=_blank - if ('target' in node) { + if ('target' in node && node instanceof HTMLElement) { node.setAttribute('target', '_blank'); } }); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts index 9ad279f72275..6bc4f57c42db 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts @@ -105,6 +105,8 @@ const itemMapper = (model: UmbMockDocumentBlueprintModel): DocumentItemResponseM isProtected: model.isProtected, isTrashed: model.isTrashed, variants: model.variants, + hasChildren: model.hasChildren, + parent: model.parent, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts index 5cace7dd5080..82a086af6f33 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts @@ -130,6 +130,8 @@ const itemMapper = (model: UmbMockDocumentModel): DocumentItemResponseModel => { isProtected: model.isProtected, isTrashed: model.isTrashed, variants: model.variants, + hasChildren: model.hasChildren, + parent: model.parent, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts index f8e81cd0dc08..05fd677fb8ae 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts @@ -102,6 +102,8 @@ const itemMapper = (model: UmbMockMediaModel): MediaItemResponseModel => { id: model.id, isTrashed: model.isTrashed, variants: model.variants, + hasChildren: model.hasChildren, + parent: model.parent, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json index 2cd9c3caeecd..a60655b596cf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json @@ -334,11 +334,11 @@ }, { "name": "icon-checkbox-dotted", - "file": "box-select.svg" + "file": "square-dashed.svg" }, { "name": "icon-checkbox-empty", - "file": "box-select.svg", + "file": "square-dashed.svg", "legacy": true }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.ts index ee76324f331b..7afad8f10d89 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-brackets.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-brackets.ts index f18a17203c8b..4c0af7fc64b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-brackets.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-brackets.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - - - - + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-burn.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-burn.ts index d42b9d52125f..0dbaa4aa3c44 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-burn.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-burn.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diagonal-arrow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diagonal-arrow.ts index 498452f67c83..22715e4f3376 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diagonal-arrow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diagonal-arrow.ts @@ -1,4 +1,4 @@ -export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diamond.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diamond.ts index 9e7bb33501a5..b469e94aa2e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diamond.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-diamond.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-help-alt.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-help-alt.ts index 1e9aac7d150b..4e655a4c6204 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-help-alt.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-help-alt.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-infinity.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-infinity.ts index bd750c189128..dbded888db6f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-infinity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-infinity.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-load.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-load.ts index 5d94d3239c6d..1c30410203ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-load.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-load.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-last.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-last.ts index 1e1e89ab6c7c..ac456be0db91 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-last.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-last.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-top.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-top.ts index 6e364344dc0f..b0b46ad78e96 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-top.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-top.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation.ts index 0f468b662947..f020df154d10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation.ts @@ -1,4 +1,4 @@ -export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - - - - + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigational-arrow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigational-arrow.ts index 986f46da6bed..2d3c5d705736 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigational-arrow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigational-arrow.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts index bf9f34a255a4..775b2745dc97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-origami.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-add.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-add.ts index 562e2844d790..d018b16ae818 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-add.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-add.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-re-post.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-re-post.ts index 061c1260f2f9..65fbddf05471 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-re-post.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-re-post.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linejoin="round" > - + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-science.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-science.ts index 5c6f524a0ba2..2d85cf838e15 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-science.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-science.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stop-alt.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stop-alt.ts index fc295cd23d4b..6f47d8077636 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stop-alt.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stop-alt.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-justify.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-justify.ts index 13a803830a3b..cf824e18ff96 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-justify.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-justify.ts @@ -1,4 +1,4 @@ -export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-left.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-left.ts index 37fde997fc81..92da76f23410 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-left.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-left.ts @@ -1,4 +1,4 @@ -export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-right.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-right.ts index 587b13f99d69..241efde4551e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-right.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-text-align-right.ts @@ -1,4 +1,4 @@ -export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-theater.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-theater.ts index c5d8ce31c537..fb24b069b99c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-theater.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-theater.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-media.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-media.ts index ad3de32f3700..a26d687222bd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-media.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-media.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` stroke-linecap="round" stroke-linejoin="round" > - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wifi.ts b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wifi.ts index 247c934b293c..afb3806d4040 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wifi.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wifi.ts @@ -1,4 +1,4 @@ -export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` +export default ` readdirSync(path).filter((folder) => lstatSync(`${path}/${folder}`).isDirectory()); const createModuleDescriptors = (folderName) => readFolders(`./src/${folderName}`).map((moduleName) => { @@ -78,7 +83,6 @@ const libraries = allowed.map((module) => { plugins: [ commonjs(), nodeResolve({ preferBuiltins: false, browser: true }), - webWorkerLoader({ target: 'browser', pattern: /^(.+)\?worker$/ }), // Replace the vite specific inline query with nothing so that the import is valid replace({ preventAssignment: true, diff --git a/src/Umbraco.Web.UI.Client/vite.config.ts b/src/Umbraco.Web.UI.Client/vite.config.ts index 4ecc0d2ab281..53747768db1d 100644 --- a/src/Umbraco.Web.UI.Client/vite.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.config.ts @@ -5,10 +5,6 @@ import viteTSConfigPaths from 'vite-tsconfig-paths'; export const plugins: PluginOption[] = [ viteStaticCopy({ targets: [ - { - src: 'src/shared/icon-registry/icons/*.js', - dest: 'icons', - }, { src: 'public-assets/App_Plugins/*.js', dest: 'App_Plugins', @@ -37,6 +33,10 @@ export const plugins: PluginOption[] = [ src: 'node_modules/msw/lib/iife/**/*', dest: 'umbraco/backoffice/msw', }, + { + src: 'node_modules/monaco-editor/esm/**/*', + dest: 'umbraco/backoffice/monaco-editor/esm', + }, ], }), viteTSConfigPaths(), diff --git a/src/Umbraco.Web.UI.Login/package-lock.json b/src/Umbraco.Web.UI.Login/package-lock.json index 3243df6d5574..875e953abc33 100644 --- a/src/Umbraco.Web.UI.Login/package-lock.json +++ b/src/Umbraco.Web.UI.Login/package-lock.json @@ -6,11 +6,11 @@ "": { "name": "login", "devDependencies": { - "@umbraco-cms/backoffice": "^14.3.1", - "msw": "^2.3.0", - "typescript": "^5.4.5", - "vite": "^5.4.6", - "vite-tsconfig-paths": "^4.3.2" + "@umbraco-cms/backoffice": "^15.0.0", + "msw": "^2.6.4", + "typescript": "^5.6.3", + "vite": "^5.4.11", + "vite-tsconfig-paths": "^5.1.2" }, "engines": { "node": ">=20.8", @@ -18,12 +18,13 @@ } }, "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", "dev": true, + "license": "ISC", "dependencies": { - "cookie": "^0.5.0" + "cookie": "^0.7.2" } }, "node_modules/@bundled-es-modules/statuses": { @@ -414,32 +415,34 @@ } }, "node_modules/@inquirer/confirm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", - "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz", + "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "@inquirer/core": "^10.1.0", + "@inquirer/type": "^3.0.1" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", - "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.0.tgz", + "integrity": "sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.6", - "@inquirer/type": "^2.0.0", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.5", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", @@ -449,37 +452,27 @@ "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/@inquirer/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", - "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", - "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@inquirer/figures": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", - "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", - "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, + "license": "MIT", "engines": { "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" } }, "node_modules/@lit-labs/ssr-dom-shim": { @@ -487,6 +480,7 @@ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/@lit/reactive-element": { @@ -494,16 +488,18 @@ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@mswjs/interceptors": { - "version": "0.35.8", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.8.tgz", - "integrity": "sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ==", + "version": "0.36.10", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.36.10.tgz", + "integrity": "sha512-GXrJgakgJW3DWKueebkvtYgGKkxA7s0u5B0P5syJM5rvQUnrpLPigvci8Hukl7yEM+sU06l+er2Fgvx/gmiRgg==", "dev": true, + "license": "MIT", "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", @@ -520,13 +516,15 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, + "license": "MIT", "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" @@ -536,7 +534,16 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.22.4", @@ -746,6 +753,549 @@ "win32" ] }, + "node_modules/@tiptap/core": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.9.1.tgz", + "integrity": "sha512-tifnLL/ARzQ6/FGEJjVwj9UT3v+pENdWHdk9x6F3X0mB1y0SeCjV21wpFLYESzwNdBPAj8NMp8Behv7dBnhIfw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.9.1.tgz", + "integrity": "sha512-Y0jZxc/pdkvcsftmEZFyG+73um8xrx6/DMfgUcNg3JAM63CISedNcr+OEI11L0oFk1KFT7/aQ9996GM6Kubdqg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.9.1.tgz", + "integrity": "sha512-e2P1zGpnnt4+TyxTC5pX/lPxPasZcuHCYXY0iwQ3bf8qRQQEjDfj3X7EI+cXqILtnhOiviEOcYmeu5op2WhQDg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.9.1.tgz", + "integrity": "sha512-0hizL/0j9PragJObjAWUVSuGhN1jKjCFnhLQVRxtx4HutcvS/lhoWMvFg6ZF8xqWgIa06n6A7MaknQkqhTdhKA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.9.1.tgz", + "integrity": "sha512-WQqcVGe7i/E+yO3wz5XQteU1ETNZ00euUEl4ylVVmH2NM4Dh0KDjEhbhHlCM0iCfLUo7jhjC7dmS+hMdPUb+Tg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.9.1.tgz", + "integrity": "sha512-A/50wPWDqEUUUPhrwRKILP5gXMO5UlQ0F6uBRGYB9CEVOREam9yIgvONOnZVJtszHqOayjIVMXbH/JMBeq11/g==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.9.1.tgz", + "integrity": "sha512-1a+HCoDPnBttjqExfYLwfABq8MYdiowhy/wp8eCxVb6KGFEENO53KapstISvPzqH7eOi+qRjBB1KtVYb/ZXicg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.9.1.tgz", + "integrity": "sha512-wJZspSmJRkDBtPkzFz1g7gvZOEOayk8s93UHsgbJxcV4VWHYleZ5XhT74sZunSjefNDm3qC6v2BSgLp3vNHVKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.9.1.tgz", + "integrity": "sha512-jsRBmX01vr+5H02GljiHMo0n5H1vzoMLmFarxe0Yq2d2l9G/WV2VWX2XnGliqZAYWd1bI0phs7uLQIN3mxGQTw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.9.1.tgz", + "integrity": "sha512-fCuaOD/b7nDjm47PZ58oanq7y4ccS2wjPh42Qm0B0yipu/1fmC8eS1SmaXmk28F89BLtuL6uOCtR1spe+lZtlQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.9.1.tgz", + "integrity": "sha512-SjZowzLixOFaCrV2cMaWi1mp8REK0zK1b3OcVx7bCZfVSmsOETJyrAIUpCKA8o60NwF7pwhBg0MN8oXlNKMeFw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.9.1.tgz", + "integrity": "sha512-wp9qR1NM+LpvyLZFmdNaAkDq0d4jDJ7z7Fz7icFQPu31NVxfQYO3IXNmvJDCNu8hFAbImpA5aG8MBuwzRo0H9w==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.9.1.tgz", + "integrity": "sha512-ydUhABeaBI1CoJp+/BBqPhXINfesp1qMNL/jiDcMsB66fsD4nOyphpAJT7FaRFZFtQVF06+nttBtFZVkITQVqg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-image": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.9.1.tgz", + "integrity": "sha512-aGqJnsuS8oagIhsx7wetm8jw4NEDsOV0OSx4FQ4VPlUqWlnzK0N+erFKKJmXTdAxL8PGzoPSlITFH63MV3eV3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.9.1.tgz", + "integrity": "sha512-VkNA6Vz96+/+7uBlsgM7bDXXx4b62T1fDam/3UKifA72aD/fZckeWrbT7KrtdUbzuIniJSbA0lpTs5FY29+86Q==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.9.1.tgz", + "integrity": "sha512-yG+e3e8cCCN9dZjX4ttEe3e2xhh58ryi3REJV4MdiEkOT9QF75Bl5pUbMIS4tQ8HkOr04QBFMHKM12kbSxg1BA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.9.1.tgz", + "integrity": "sha512-6O4NtYNR5N2Txi4AC0/4xMRJq9xd4+7ShxCZCDVL0WDVX37IhaqMO7LGQtA6MVlYyNaX4W1swfdJaqrJJ5HIUw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.9.1.tgz", + "integrity": "sha512-6J9jtv1XP8dW7/JNSH/K4yiOABc92tBJtgCsgP8Ep4+fjfjdj4HbjS1oSPWpgItucF2Fp/VF8qg55HXhjxHjTw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.9.1.tgz", + "integrity": "sha512-JOmT0xd4gd3lIhLwrsjw8lV+ZFROKZdIxLi0Ia05XSu4RLrrvWj0zdKMSB+V87xOWfSB3Epo95zAvnPox5Q16A==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-placeholder": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.9.1.tgz", + "integrity": "sha512-Q/w3OOg/C6jGBf4QKEWKF9k+iaCQCgPoaIg2IDTPx8QmaxRfgoVE5Csd+oTOY/brdmSNXOxykZWEci6OJP+MbA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.9.1.tgz", + "integrity": "sha512-V5aEXdML+YojlPhastcu7w4biDPwmzy/fWq0T2qjfu5Te/THcqDmGYVBKESBm5x6nBy5OLkanw2O+KHu2quDdg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-subscript": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.9.1.tgz", + "integrity": "sha512-jjfuHmF2dCUAtHmJH2K/7HhOCleM3aPVOI/UsBBYa8xM4mDU4xuW1O5sLAr2JWcB1xxyk9YKcBWwyRq+b1ENFA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-superscript": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.9.1.tgz", + "integrity": "sha512-7cgAPpUNgO/3QdvCN9/6dWP6JQC641o8dSgkyv0XzVv0nxISck4SU+2eADRYQLyP2s4M3xuSEFhCCiKZleK2yA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-table": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.9.1.tgz", + "integrity": "sha512-OmWZFZOSZwSSEvoVUkDsRFyCXTYei/pV396Xjv9pfFzXQkVbfq/CjTp61zvb/9mmEz3rcfvfG7G39eRlZTvBNg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-table-cell": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.9.1.tgz", + "integrity": "sha512-/wrcniLdhMhs5M2NDetFcfq510N5to7YKK+52KOXNotBI8K/GjMmGmtwWEKPITD0/RgYrXzpMcta/O+/0OCOPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-table-header": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.9.1.tgz", + "integrity": "sha512-KtI01636Du1IB/I3pe9ZJWKkOc6INqAaIw+RFirRCnd8Xnik7tJfAwdhXzoPRcer6ViZmlzSrM2dkwaZCF7gcw==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-table-row": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.9.1.tgz", + "integrity": "sha512-Wq7QlI/S5iX4UCAdX+ok/szegVMbvrM3H8o6jwO+G4p8JJt6iv7ZmEnJ19xIINhmiKsrdanqH9FFK4tQ3yvQ0A==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.9.1.tgz", + "integrity": "sha512-3wo9uCrkLVLQFgbw2eFU37QAa1jq1/7oExa+FF/DVxdtHRS9E2rnUZ8s2hat/IWzvPUHXMwo3Zg2XfhoamQpCA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-align": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.9.1.tgz", + "integrity": "sha512-oUp0XnwJpAImcOVV68vsY2CpkHpRZ3gzWfIRTuy+aYitQim3xDKis/qfWQUWZsANp9/TZ0VyjtkZxNMwOfcu1g==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-style": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.9.1.tgz", + "integrity": "sha512-LAxc0SeeiPiAVBwksczeA7BJSZb6WtVpYhy5Esvy9K0mK5kttB4KxtnXWeQzMIJZQbza65yftGKfQlexf/Y7yg==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-underline": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.9.1.tgz", + "integrity": "sha512-IrUsIqKPgD7GcAjr4D+RC0WvLHUDBTMkD8uPNEoeD1uH9t9zFyDfMRPnx/z3/6Gf6fTh3HzLcHGibiW2HiMi2A==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.9.1.tgz", + "integrity": "sha512-mvV86fr7kEuDYEApQ2uMPCKL2uagUE0BsXiyyz3KOkY1zifyVm1fzdkscb24Qy1GmLzWAIIihA+3UHNRgYdOlQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.0", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.22.3", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.4.0", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.0", + "prosemirror-view": "^1.34.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.9.1.tgz", + "integrity": "sha512-nsw6UF/7wDpPfHRhtGOwkj1ipIEiWZS1VGw+c14K61vM1CNj0uQ4jogbHwHZqN1dlL5Hh+FCqUHDPxG6ECbijg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@tiptap/core": "^2.9.1", + "@tiptap/extension-blockquote": "^2.9.1", + "@tiptap/extension-bold": "^2.9.1", + "@tiptap/extension-bullet-list": "^2.9.1", + "@tiptap/extension-code": "^2.9.1", + "@tiptap/extension-code-block": "^2.9.1", + "@tiptap/extension-document": "^2.9.1", + "@tiptap/extension-dropcursor": "^2.9.1", + "@tiptap/extension-gapcursor": "^2.9.1", + "@tiptap/extension-hard-break": "^2.9.1", + "@tiptap/extension-heading": "^2.9.1", + "@tiptap/extension-history": "^2.9.1", + "@tiptap/extension-horizontal-rule": "^2.9.1", + "@tiptap/extension-italic": "^2.9.1", + "@tiptap/extension-list-item": "^2.9.1", + "@tiptap/extension-ordered-list": "^2.9.1", + "@tiptap/extension-paragraph": "^2.9.1", + "@tiptap/extension-strike": "^2.9.1", + "@tiptap/extension-text": "^2.9.1", + "@tiptap/extension-text-style": "^2.9.1", + "@tiptap/pm": "^2.9.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", @@ -775,20 +1325,40 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@types/node": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/node": { "version": "22.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", "dev": true, + "peer": true, "dependencies": { "undici-types": "~6.19.2" } @@ -819,32 +1389,45 @@ "dev": true, "peer": true }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, "node_modules/@umbraco-cms/backoffice": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-14.3.1.tgz", - "integrity": "sha512-96C1yj5JA6T66Bpk7XLh3JW0Exhp5hlCeunt1yaxPxnvLtFS40BK8xjSTcFteTNkFhdKGlugoyFl/AGE1lCqHg==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-15.0.0.tgz", + "integrity": "sha512-uBuxc94G56+5AAibeyp/Ozg488EG0SVyARoo7Q0lZ6G5Dd+JdeFr840rLqSuU6DIv8+9lJnZTsf3NhKMnqzYFw==", "dev": true, + "license": "MIT", + "workspaces": [ + "./src/packages/*" + ], "engines": { "node": ">=20.9 <21", "npm": ">=10.1 < 11" }, "peerDependencies": { + "@tiptap/core": "^2.8.0", + "@tiptap/extension-image": "^2.8.0", + "@tiptap/extension-link": "^2.8.0", + "@tiptap/extension-placeholder": "^2.8.0", + "@tiptap/extension-subscript": "^2.8.0", + "@tiptap/extension-superscript": "^2.8.0", + "@tiptap/extension-table": "^2.8.0", + "@tiptap/extension-table-cell": "^2.8.0", + "@tiptap/extension-table-header": "^2.8.0", + "@tiptap/extension-table-row": "^2.8.0", + "@tiptap/extension-text-align": "^2.8.0", + "@tiptap/extension-text-style": "^2.8.0", + "@tiptap/extension-underline": "^2.8.0", + "@tiptap/pm": "^2.8.0", + "@tiptap/starter-kit": "^2.8.0", "@types/diff": "^5.2.1", "@types/dompurify": "^3.0.5", "@types/uuid": "^10.0.0", - "@umbraco-ui/uui": "^v1.10.0", - "@umbraco-ui/uui-css": "^v1.10.0", + "@umbraco-ui/uui": "^1.11.0", + "@umbraco-ui/uui-css": "^1.11.0", "base64-js": "^1.5.1", "diff": "^5.2.0", "dompurify": "^3.1.6", "element-internals-polyfill": "^1.3.11", - "lit": "^3.1.4", + "lit": "^3.2.0", "marked": "^14.1.0", "monaco-editor": "^0.50.0", "rxjs": "^7.8.1", @@ -854,980 +1437,1063 @@ } }, "node_modules/@umbraco-ui/uui": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.10.0.tgz", - "integrity": "sha512-Jkbqcgo78naFjp4/QBfuxqbr7WXFvZHq5RTHNMa7SAzb/EavdWp6mBLL2Txu9259ZASIdnlsuqyrKX6giiY+Kw==", - "dev": true, - "peer": true, - "dependencies": { - "@umbraco-ui/uui-action-bar": "1.10.0", - "@umbraco-ui/uui-avatar": "1.10.0", - "@umbraco-ui/uui-avatar-group": "1.10.0", - "@umbraco-ui/uui-badge": "1.10.0", - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-boolean-input": "1.10.0", - "@umbraco-ui/uui-box": "1.10.0", - "@umbraco-ui/uui-breadcrumbs": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-button-group": "1.10.0", - "@umbraco-ui/uui-button-inline-create": "1.10.0", - "@umbraco-ui/uui-card": "1.10.0", - "@umbraco-ui/uui-card-block-type": "1.10.0", - "@umbraco-ui/uui-card-content-node": "1.10.0", - "@umbraco-ui/uui-card-media": "1.10.0", - "@umbraco-ui/uui-card-user": "1.10.0", - "@umbraco-ui/uui-caret": "1.10.0", - "@umbraco-ui/uui-checkbox": "1.10.0", - "@umbraco-ui/uui-color-area": "1.10.0", - "@umbraco-ui/uui-color-picker": "1.10.0", - "@umbraco-ui/uui-color-slider": "1.10.0", - "@umbraco-ui/uui-color-swatch": "1.10.0", - "@umbraco-ui/uui-color-swatches": "1.10.0", - "@umbraco-ui/uui-combobox": "1.10.0", - "@umbraco-ui/uui-combobox-list": "1.10.0", - "@umbraco-ui/uui-css": "1.10.0", - "@umbraco-ui/uui-dialog": "1.10.0", - "@umbraco-ui/uui-dialog-layout": "1.10.0", - "@umbraco-ui/uui-file-dropzone": "1.10.0", - "@umbraco-ui/uui-file-preview": "1.10.0", - "@umbraco-ui/uui-form": "1.10.0", - "@umbraco-ui/uui-form-layout-item": "1.10.0", - "@umbraco-ui/uui-form-validation-message": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-icon-registry": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0", - "@umbraco-ui/uui-input": "1.10.0", - "@umbraco-ui/uui-input-file": "1.10.0", - "@umbraco-ui/uui-input-lock": "1.10.0", - "@umbraco-ui/uui-input-password": "1.10.0", - "@umbraco-ui/uui-keyboard-shortcut": "1.10.0", - "@umbraco-ui/uui-label": "1.10.0", - "@umbraco-ui/uui-loader": "1.10.0", - "@umbraco-ui/uui-loader-bar": "1.10.0", - "@umbraco-ui/uui-loader-circle": "1.10.0", - "@umbraco-ui/uui-menu-item": "1.10.0", - "@umbraco-ui/uui-modal": "1.10.0", - "@umbraco-ui/uui-pagination": "1.10.0", - "@umbraco-ui/uui-popover": "1.10.0", - "@umbraco-ui/uui-popover-container": "1.10.0", - "@umbraco-ui/uui-progress-bar": "1.10.0", - "@umbraco-ui/uui-radio": "1.10.0", - "@umbraco-ui/uui-range-slider": "1.10.0", - "@umbraco-ui/uui-ref": "1.10.0", - "@umbraco-ui/uui-ref-list": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0", - "@umbraco-ui/uui-ref-node-data-type": "1.10.0", - "@umbraco-ui/uui-ref-node-document-type": "1.10.0", - "@umbraco-ui/uui-ref-node-form": "1.10.0", - "@umbraco-ui/uui-ref-node-member": "1.10.0", - "@umbraco-ui/uui-ref-node-package": "1.10.0", - "@umbraco-ui/uui-ref-node-user": "1.10.0", - "@umbraco-ui/uui-scroll-container": "1.10.0", - "@umbraco-ui/uui-select": "1.10.0", - "@umbraco-ui/uui-slider": "1.10.0", - "@umbraco-ui/uui-symbol-expand": "1.10.0", - "@umbraco-ui/uui-symbol-file": "1.10.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.10.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.10.0", - "@umbraco-ui/uui-symbol-folder": "1.10.0", - "@umbraco-ui/uui-symbol-lock": "1.10.0", - "@umbraco-ui/uui-symbol-more": "1.10.0", - "@umbraco-ui/uui-symbol-sort": "1.10.0", - "@umbraco-ui/uui-table": "1.10.0", - "@umbraco-ui/uui-tabs": "1.10.0", - "@umbraco-ui/uui-tag": "1.10.0", - "@umbraco-ui/uui-textarea": "1.10.0", - "@umbraco-ui/uui-toast-notification": "1.10.0", - "@umbraco-ui/uui-toast-notification-container": "1.10.0", - "@umbraco-ui/uui-toast-notification-layout": "1.10.0", - "@umbraco-ui/uui-toggle": "1.10.0", - "@umbraco-ui/uui-visually-hidden": "1.10.0" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.11.0.tgz", + "integrity": "sha512-1mX7adcpAZRswPA1p64kqE83Rg5cbZsYM/b/OyUcObaL2cIuBCVvjjuUjgkL2el993GptIzl05XVocdj1dDCeQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-avatar-group": "1.11.0", + "@umbraco-ui/uui-badge": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-box": "1.11.0", + "@umbraco-ui/uui-breadcrumbs": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0", + "@umbraco-ui/uui-button-inline-create": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-card-block-type": "1.11.0", + "@umbraco-ui/uui-card-content-node": "1.11.0", + "@umbraco-ui/uui-card-media": "1.11.0", + "@umbraco-ui/uui-card-user": "1.11.0", + "@umbraco-ui/uui-caret": "1.11.0", + "@umbraco-ui/uui-checkbox": "1.11.0", + "@umbraco-ui/uui-color-area": "1.11.0", + "@umbraco-ui/uui-color-picker": "1.11.0", + "@umbraco-ui/uui-color-slider": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0", + "@umbraco-ui/uui-color-swatches": "1.11.0", + "@umbraco-ui/uui-combobox": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-dialog": "1.11.0", + "@umbraco-ui/uui-dialog-layout": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-file-preview": "1.11.0", + "@umbraco-ui/uui-form": "1.11.0", + "@umbraco-ui/uui-form-layout-item": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0", + "@umbraco-ui/uui-input-file": "1.11.0", + "@umbraco-ui/uui-input-lock": "1.11.0", + "@umbraco-ui/uui-input-password": "1.11.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.11.0", + "@umbraco-ui/uui-label": "1.11.0", + "@umbraco-ui/uui-loader": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-loader-circle": "1.11.0", + "@umbraco-ui/uui-menu-item": "1.11.0", + "@umbraco-ui/uui-modal": "1.11.0", + "@umbraco-ui/uui-pagination": "1.11.0", + "@umbraco-ui/uui-popover": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-progress-bar": "1.11.0", + "@umbraco-ui/uui-radio": "1.11.0", + "@umbraco-ui/uui-range-slider": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0", + "@umbraco-ui/uui-ref-list": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0", + "@umbraco-ui/uui-ref-node-data-type": "1.11.0", + "@umbraco-ui/uui-ref-node-document-type": "1.11.0", + "@umbraco-ui/uui-ref-node-form": "1.11.0", + "@umbraco-ui/uui-ref-node-member": "1.11.0", + "@umbraco-ui/uui-ref-node-package": "1.11.0", + "@umbraco-ui/uui-ref-node-user": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-select": "1.11.0", + "@umbraco-ui/uui-slider": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0", + "@umbraco-ui/uui-symbol-lock": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0", + "@umbraco-ui/uui-symbol-sort": "1.11.0", + "@umbraco-ui/uui-table": "1.11.0", + "@umbraco-ui/uui-tabs": "1.11.0", + "@umbraco-ui/uui-tag": "1.11.0", + "@umbraco-ui/uui-textarea": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0", + "@umbraco-ui/uui-toast-notification-container": "1.11.0", + "@umbraco-ui/uui-toast-notification-layout": "1.11.0", + "@umbraco-ui/uui-toggle": "1.11.0", + "@umbraco-ui/uui-visually-hidden": "1.11.0" } }, "node_modules/@umbraco-ui/uui-action-bar": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.10.0.tgz", - "integrity": "sha512-f4nQx/s4XRtnQA3p/Q+qOhMi5zdK2ZUz7rh0qAT9Qi+Y24uLwnMabLWlnMRqyDe5z5/DTMoYDKaKhRWTjVFjzw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.11.0.tgz", + "integrity": "sha512-lhWw7CiLL2FIXVOWgmAt8yeb625HYWXceMQMEwhlic4bp/jpVmrbYGuKl4SyubR4ws6ein4Uzzy1EWfT5K+kFQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button-group": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.10.0.tgz", - "integrity": "sha512-JwCoFF/lLkLwRWYRYDoi8w7qHp3bFZQvCu9unQ8QQg/XZVULbiDGwZnSJoMPRdNo6fpN/hx8gDszYDn1tMkCaw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.11.0.tgz", + "integrity": "sha512-ixM8Kx9rE15iWYJgk28mEGeNvVDag/I8mZH/lceuq5Mm0EhUbG6gJGPkUSkDSNTnDRijkjwlF4oeCO+8nA+DRw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-avatar-group": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.10.0.tgz", - "integrity": "sha512-JMx0cBIsKfhSSf/I0rBNw3jxjKOMw3UJEDL0YTOEBUhtsVIXf7LSQlJ8977vzJuO7a3PjlhWx8F7lhukRzL3aw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.11.0.tgz", + "integrity": "sha512-/edFijQFzOsNMBbhg8eu0imhDnLE4MSoC30o4dQ4bI3XCtGLfJh1BiOgA+TLUU1vH7D0NIvidzH49+OOIUrvMg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-avatar": "1.10.0", - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-badge": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.10.0.tgz", - "integrity": "sha512-x+UsAQknE3kT7yxAhzS38ILqvDzKdEmYxlYES4dqR5Cj/Vc4iMZTY4pRd1UJEBsC5G/tLlquDGbXG9IZCgCk/w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.11.0.tgz", + "integrity": "sha512-7VMZzUZ+CYaFhsCe8XS8VgadBhXZtJh0ilZ695YG9Q9IAbAVyeART59VwRzO/1kS0hfCj10DPEKp8IPMbePWEA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-base": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.10.0.tgz", - "integrity": "sha512-0t6BpQmXPgSdjDhb3rQEYcJJtkE50w5rZppsOFXyossaBxfijfTK9JRVc95JRzpLn/a5iQyhuxdUx9r85t71HA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.11.0.tgz", + "integrity": "sha512-w7HQDNtEt0qnu+psrwxvrdNxUT08qZ1fYygqH9yeKFyE5GMDvYlL1TWU696Lo72LTbTdSMm/ka9b2QBJv1ZJxA==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-boolean-input": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.10.0.tgz", - "integrity": "sha512-Xe+B1E+RJCHmSK3aE/ZHVjZwJkijNOh4Un+x42oZX2XQqTz57aafBVY5HSrY7/N8n0xvSY1HCc6sG9wJyXXfMQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.11.0.tgz", + "integrity": "sha512-3r/lMYSrFzrw6EclCRjJADtf+1yAYPcz5QRQ4yD7WxLD/Kb338HRgQ50pMG5Jwq28cdDha4n7aNx7mGInrHD3g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-box": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.10.0.tgz", - "integrity": "sha512-BF/AUdGTjRxf4OqdVapMkKNkRLbnHTvuYMEhXDxhHT19prB8ZQQLzjDiX1WW9+q8owq3LPVMxoRjT/+AATpsEA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.11.0.tgz", + "integrity": "sha512-gYiERouKMpFy/n/6LDh9ckzWpUa2vBmCsWS41Gskct3WZNSVdApZ3g2yvE9ZoJoJB2Q26JfbKShuw0BaJkEFxg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-css": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-breadcrumbs": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.10.0.tgz", - "integrity": "sha512-yXzTPi/CTb48QQjgFhFUgO5yM2fe/f7gOiPcXKUelLFbCnWV+HpvO+5QdE9fklJd9rTLb7OuxBVsTU96j90fPA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.11.0.tgz", + "integrity": "sha512-wRTtuZAKb0z2Mi3P3wb1CcIO1ExnnFD8vCsHxiTEAjb2e2VzEaEwnnugHnr8chxlOKiTPyX8NtsBXDLTnL/TRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.10.0.tgz", - "integrity": "sha512-zCTVTPMkBG6zQpSzHALOjSlsQu4e1SZCciZoC2bD6aZ6nQbx1C9z8mgIGsNt8lGQqzU5GnF1nVGwIfFn6MEq7Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.11.0.tgz", + "integrity": "sha512-/9B8Rsar9OE9NP84fXBzu5HkEIvXuEtmoaa37QQq9STgLyqrqRMxj6Mt47k69tQgh79HDNu+nwc8A5Gv+h+HHA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-group": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.10.0.tgz", - "integrity": "sha512-8Fmrs920fExYhvAvm7LtKfwNqwE4bAjqTeNYUoisthbKcme2//po1w4II6RLYGLfq39A6mcEpn9IptjIsPF67g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.11.0.tgz", + "integrity": "sha512-TW2OioMnjyTCjJA6lJhoX80SyeEb/R2BK6Py82/ZCifnVQ2QFWZ6PtIcnqGT+b0x95xTvzc19f+z4N841wYc8g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-button-inline-create": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.10.0.tgz", - "integrity": "sha512-MBQLGhBZJzhUxzrFvbAtBZkK5zlZkS1nR1vBTQEqunORjbooo6JEeTBrlPRk7HDPJpWWsqB6uIe0m2UQ8rBAPA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.11.0.tgz", + "integrity": "sha512-hoKR3sj5V4kzJ9qR0xe5q6giz41QmcPVQRP+qd90BjpxefezgnN2fud+RC59ZbhssAmep031b1pONRZyFr+6ow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.10.0.tgz", - "integrity": "sha512-ozWuLFJanivYDybnJgvPomPPwhCxPHg2NatpNGxLnDnn0VCJVwQQ4vvejrjdHTGknjITmFaGweZbJG3a4q+G1g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.11.0.tgz", + "integrity": "sha512-MIesvjoBVgSNo+2ManDIpLtWXwsO3emhsloQH+nMoyU/ryy/HZMe/p4HRx/leZmM17HG3KXm2j8GpLHie8bU+w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-block-type": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.10.0.tgz", - "integrity": "sha512-9BMH9Z5jS75++onPuGIODcsHFS+bCuEKjgTOqmCDZfU7BIMLMJH/+OW2Uzwqoh+4If41Yumm2TiOSwxo6KOOdw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.11.0.tgz", + "integrity": "sha512-kZeFGwSwjdD+M9HwzJ+1bScFCnS3AV36RzXDc6YklVPh63PKlt+wDmiIDd2I4+jHp8NC1buzUz/2dkmZVYOYrg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-card": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-content-node": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.10.0.tgz", - "integrity": "sha512-iJQucR2IDC6OQFuCsqHjUlt6ze/X6n0ZQm/nDnSZofVTRRFOJb95T0CA6Ytm4Atuz3K0kkLr4AcKsb10/6Zayw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.11.0.tgz", + "integrity": "sha512-iEzCVOpucAoCQnDYaGaq2k38zXUax+09gUypt907h0YPc6vRoTou5N5masvxZYyRYJrtWxv5kFs+MtLynREjGA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-card": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-media": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.10.0.tgz", - "integrity": "sha512-zWL+/cnQRVFpvWPUOhHjirW9WxBRpC5tFfdE1SunvKBNkKhygGsPTq+b/Te9dI024ZLyaazej57NkpylGeNSOA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.11.0.tgz", + "integrity": "sha512-uOdN0iu5OKsOtxhTSE8epuUMo2iXq6FEVqBPQBHAmAFELDFyNf2UBwnBxnrTuU6RJ0jbGuLTqQQM7Gv8vD6Kjg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-card": "1.10.0", - "@umbraco-ui/uui-symbol-file": "1.10.0", - "@umbraco-ui/uui-symbol-folder": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-card-user": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.10.0.tgz", - "integrity": "sha512-e6LRpSfgKzbKo2pSKL5Ku9jaB5P6lowiV0/0l/uGHkvXfFfuCUVoMPjQncuCcaMcGW7Q2g5lkXNgOOXtiuyw0A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.11.0.tgz", + "integrity": "sha512-/6No4e+eLqCmivNeCHlLfmChKb6F8asv9pgZdi6mUr44TOc44OGvvuF1vONslf9f4B2eKbRTFmFwGVIfWpjOAw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-avatar": "1.10.0", - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-card": "1.10.0" + "@umbraco-ui/uui-avatar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-card": "1.11.0" } }, "node_modules/@umbraco-ui/uui-caret": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.10.0.tgz", - "integrity": "sha512-XCsvDV5CKZ5wy1zdjEQ849411B/fCkENRmqCiqnHa1+JFAVgbb1AA1+gjb+lz4EWpE1CfiL556mYjt1ZznwFZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.11.0.tgz", + "integrity": "sha512-Lq+zBOMeobRvFPhEps03efcy+NFOm27w5jqwJ/4ad2TbEMLTBLdSose/3ZqPV4nvTPMlWButRIFo3Nrp+4jL/Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-checkbox": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.10.0.tgz", - "integrity": "sha512-1NPLxyGGJcWuU0tXzw/FpQrwjEfBzrO4yTkss+kRbryi9yrxJgxfOsug+JIHSEfiFjQoSDU/mvoirPxa5xhGIg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.11.0.tgz", + "integrity": "sha512-bOfJXJ5LMiGCMD37A3mzYjiGTIvzjREN2AhtqGLbwcrAgj662WVhw0aQobo2+iIwaMUIAvl3kNS8930XDeUe/A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-boolean-input": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-area": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.10.0.tgz", - "integrity": "sha512-zmJseESe9KmFmJrrI+/l1a2RLOZWuRNp8MTjhuaf7p9HBopOeYyhC4vXgf/6VPa+y5uZyitRM6d/yUQmL7CxsA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.11.0.tgz", + "integrity": "sha512-R1fWHHk7BPilveIF7vPWECAHz/FPKIdvqllYu9f/oJ3RWm7DJtfcNI+Eb7hwkPR/Uj8ug7SkcL4ZvXOG30Ux4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", + "@umbraco-ui/uui-base": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-picker": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.10.0.tgz", - "integrity": "sha512-MYDaO+pBUTH7lpdjH5RQivqEc4JqFcpTD0qEqyk7iyU5vHJ7HcYLng5fiNuEhavVGhN6f0Ee10bAq7cWx3ZKyA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.11.0.tgz", + "integrity": "sha512-EHU2DXmET3ehRQMwkVtS+nyrfIm8c9cu01GDQR6GFzRNl3G7nUKKdK0LyRQUEm7bSXbWpwctGz6qzB9/MCuxBg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-popover-container": "1.10.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-slider": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.10.0.tgz", - "integrity": "sha512-Y6u5G7YVHMVC28rmggFYGSdB3A3MO6wZ2GL1YJjzzO8smRRAjtYkOkkbHYSKgn4Mao9K2BHn4DuZVizhWQe8Aw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.11.0.tgz", + "integrity": "sha512-E2mW4hvARy4C7ETZ4PUCgeUPgSvw4HEPX1CpOWl32vM85R4F/K/RdS6OsSP3GHO/8oBYPjlLfX8betMrf4+3+Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-color-swatch": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.10.0.tgz", - "integrity": "sha512-BazYXqGeScvYsHuOZlnT0Yi8xRH1XfQYaHJEpzvSR4tfdUPqM4fGbLdnFNgDrCPaZziIbkuGltpz/lK/JeN9ew==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.11.0.tgz", + "integrity": "sha512-BeCyW9FyVmjE2W8u3k5bPwkRUIVbudK2q9VTKmIcnkwsZz8wv6dDpFoFb92So8YSzMhdiVIRQ14fnphHwMHfWQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", "colord": "^2.9.3" } }, "node_modules/@umbraco-ui/uui-color-swatches": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.10.0.tgz", - "integrity": "sha512-q5vcDckApfL730m59ihiAOwvojMg5t/EHAAqzyKrPO2rqUXB1+SYukWAc7pu12V0Yvqvl6in4zqcyNK8uPdT6g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.11.0.tgz", + "integrity": "sha512-t+BKLHKlnFdSB/AB0vihqMl7EuIUI1M+m7q07E/or+BX7juV2H+sVAwWdYiOlCjpC5wqi1RAKh41tPWyslc/vQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-color-swatch": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-color-swatch": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.10.0.tgz", - "integrity": "sha512-Z86/u0PAIUepTL0J7+H1kiJzXFEoHJcaFJQpExFMp6AbCEP11m1Fz17oHipz7uCWQ0DlImrSQcBq+7ed/Y1OLQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.11.0.tgz", + "integrity": "sha512-Z+cfhxoK6/tGdErNc1rvrT9NDjuZPJ/SHAJlm83ziPvbWxTGVgjf75nqNZ3z6VW9EVWWJ0Fstz2VTzo4K0mcRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-combobox-list": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-popover-container": "1.10.0", - "@umbraco-ui/uui-scroll-container": "1.10.0", - "@umbraco-ui/uui-symbol-expand": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-combobox-list": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-scroll-container": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-combobox-list": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.10.0.tgz", - "integrity": "sha512-5TBt/C6eDyd8TDYVS7oXE0hjDvTqbskjMNBsUTzZwWWGr1G8LtRliEVEc48akSrWSFmNf799OPQhNLWQnJ1UEA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.11.0.tgz", + "integrity": "sha512-XV59sGG4NYZq6llWC3OqxxpR44Cavwfn+/7ee8kTBPmjWhzvS5XijDCGQxhrLcIK74L6OnqrfLcUgItPQUA3Dg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-css": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.10.0.tgz", - "integrity": "sha512-bsUBvFGzPzAMegNpznYIzW1CBgxmN2pXfbsgQLpaDJIE8GIW3Y+AW4RNSZV4Tf0uDWIxVlbvI/NruRGLuoCKhA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.11.0.tgz", + "integrity": "sha512-DpYKHmA4/te9gYUTLfLNgp0sotkq9TJQ9XkBzXJerwye+IzZdKhIsCWf/m5S6jf065MPjncEtwBgxDdvvB8DrQ==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "lit": ">=2.8.0" } }, "node_modules/@umbraco-ui/uui-dialog": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.10.0.tgz", - "integrity": "sha512-Pkm+YShZbZWHtZ7j27uvabTt33MiAeLL8b/HkTppSCbcVqZ0F/TvUxNBVy0N0mlgvU8c0Zei8b4TPSDfeNnxEQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.11.0.tgz", + "integrity": "sha512-aEpitRE2an8YGm/s0QDfGW/0ccWlnqgA9DhrosZ7kxTElj7BVMQOGVh/nQKBjf+finOGThjvTCM33eksmgPaOw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-css": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-dialog-layout": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.10.0.tgz", - "integrity": "sha512-Jdk7FFoyhKqwK8n3+T13CuJUsJ0X/gG0e9XKUC9DdcnJsw5WYx4BhyqPyQpw+7uTZ9GMBSMZ4PMzN30KbMNcvg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.11.0.tgz", + "integrity": "sha512-z7ZTDonZ/mEJ6u/WH7De/NzT4IZ+zgqR0mJn4ypsf8T0ixB/r7aDHZG9cTP9hG4gnUag8VNbdashMCroDLSYNA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-dropzone": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.10.0.tgz", - "integrity": "sha512-2LubyWBGElIVbgyJ+dwxZlAVbO6H3RI0geCQkC52j7KJyR/hZ/G4nFoGw4RFUaL7n7wsWHmyTVQsEalgczdCbg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.11.0.tgz", + "integrity": "sha512-oV/SKvKuSze7eTbALCU0sCGmzMe8JgVQrrOPwWpepO/x2VHlWTNQbBQpsFmTOksR89Qx8NlK3Umo84i1RkeF1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-symbol-file-dropzone": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.11.0" } }, "node_modules/@umbraco-ui/uui-file-preview": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.10.0.tgz", - "integrity": "sha512-1r7BSSF7JHPC3t9YIRCKfchK7jK+43Y9WTHi8lyi2ZpNt3Kju42OQIB9eyFm1+MdJsZi2VkEcBCWTo1wveUasw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.11.0.tgz", + "integrity": "sha512-ZgJb3rdlKHo3iu9XZwy+elzhcBfZXb1LzoRIsLuanVHYeq/pbSXFtw8cJYJ3a65dnA6ryvGbY2m5TrWw39slMg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-symbol-file": "1.10.0", - "@umbraco-ui/uui-symbol-file-thumbnail": "1.10.0", - "@umbraco-ui/uui-symbol-folder": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-symbol-file": "1.11.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.11.0", + "@umbraco-ui/uui-symbol-folder": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.10.0.tgz", - "integrity": "sha512-ByJQV+Lr0iNwth4GXxckoeXtnpRQ1Gnqfo2/Bu53EdEpnpfomrzB6su4AIdaswtHPD+RoM6JVGNtlfzPGtcVvQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.11.0.tgz", + "integrity": "sha512-+RqU/N8FUfbvmNPYCOyjS5e4H86dsT7h4A/2+NT2HmuyFObeXhCFMyp/60Kpfb6X7wJtnw1qa8go3zb8Gv5cpw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-layout-item": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.10.0.tgz", - "integrity": "sha512-VdbEhx84mgrWm8puo6RagY9LsaR+kfGp8yPzuzuFXKvWNtKNucT+OmB8OoU6cWJfNahQ89evYeSicIJKakHivw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.11.0.tgz", + "integrity": "sha512-o8V+S7mNoTV5mceCaTtY6+dFhzpJAxcR/e+1kN7yq6SfiabVjfW6EBqQYAnVc/hT9WfS3AUgO/8YFdr1CKOTqA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-form-validation-message": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-form-validation-message": "1.11.0" } }, "node_modules/@umbraco-ui/uui-form-validation-message": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.10.0.tgz", - "integrity": "sha512-TlSvmNAxWmkg5ncKyBrTtMSDvUnGCyn1BxvNfaz8pp4KqGu/sd1a0hBp/80dCa025XH7BJ3d87Kyp9UXLRQi0A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.11.0.tgz", + "integrity": "sha512-VxkPNQNPbMNMX/cPzrkekdGC7QUlyb9aH4feGe1RzD33hRc9FQufoTxS4gjSeX6yemjYu/78nqroBAMzIEmvUg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.10.0.tgz", - "integrity": "sha512-nsZyJfcF9MpRXahZ2DS/kzPfJzY3Xql5I/xjjFaS8JEIkT81HzOy1D9bo8AoDrL7VzyaspCbDgLM6R1yhNhlMg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.11.0.tgz", + "integrity": "sha512-aH7tKlqfkMRU4+T8neSedU+YpHuFEhDe2ckHuqILw3iK1/j56Y0lUeoabkh1y/SWRZwydkkOjIhwDFIv48Ceag==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.10.0.tgz", - "integrity": "sha512-v/ajwASl4jVSiuGgn4uYetV5NxNghtdZXD7DV0+Lu2u9sV8wIOvk89pWAFsAwDT593/p9/H3p5CoRIzyCmCDIA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.11.0.tgz", + "integrity": "sha512-NbNDV35f1rSgKK2xFV/CPAdLPLhAFThilCPGraMY260WNIFwpcbP8n+PQ1dzNSec6xhIEMV4AC4Y5SvK/z54LA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0" } }, "node_modules/@umbraco-ui/uui-icon-registry-essential": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.10.0.tgz", - "integrity": "sha512-0MdN0A4Mz8O1bT22JlHPesvbqMVM+RomtcsHh+DhN3l0RxfamlrSZLEWMavRODq/ign0vfhQ0Zo4iS3fjqzaeg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.11.0.tgz", + "integrity": "sha512-WU5LRcjDFeGlr/Dq540IHLC1mMLgEkMJXjCNOb2d/7jLP3FHDs0T4qJGgzILYfeX7fDjQCnxkWVfaDmGGikSWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon-registry": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.10.0.tgz", - "integrity": "sha512-dnK43VZo7RMOquO8Ih+wurqwlHMmGQ0vdYfc8/DIy3RAeT6+G5ZYJyWmZ3u5jJJ7lBauLJfPVOJAH7BdNPIhmA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.11.0.tgz", + "integrity": "sha512-DWe25cOCtYvRgqShL/UL4OnTRSbIZgTLp1JSdzLzSFxNm3PO2mAhYZuOMdGCjDkjv0G2lszmaqd7Ix8Xw+51ZA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-file": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.10.0.tgz", - "integrity": "sha512-GU6cZDEHU5MUQIsQnLAndg2sZ1B4EPPPqI45V2Ynh9ZQUq5OVI+uEyNleiac8yYCM0+w80FE3asJYYETu5inHg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.11.0.tgz", + "integrity": "sha512-u19lW5F7aiMN/D3wHhqJgqdreKaHJDoZ76A37nys2kItNWHvpoFbRrHkAaaN9RQVrl0rwmx3R6Sbs+IWFuTCJA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-action-bar": "1.10.0", - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-file-dropzone": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0" + "@umbraco-ui/uui-action-bar": "1.11.0", + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-file-dropzone": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-lock": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.10.0.tgz", - "integrity": "sha512-nIY/lT/sN6R0jSTk27h42CqQcFHEI3JZgzlQz9sb0Z8HZ+uybuh5MWLuElWdDh+3V2On+fKKZUuXVcHERsWfww==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.11.0.tgz", + "integrity": "sha512-VCpLcFZ+OOeCubczsQsxrhqj3iPdq7o81YMxckd+BLiqU0O5nDxioSuZf5WeU7zttkTE64a0NYu0fKaRC7hLOA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-input": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-input-password": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.10.0.tgz", - "integrity": "sha512-uffOb2+O/wTk2RgYZmdFZTJwCwhPm56l9/YGkZ+p9O4QBhTIrwEndfdQjGLCo+qj0/skuG0sMzKyWZTbJTRb+Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.11.0.tgz", + "integrity": "sha512-doilXxlrc8v6BUtXUhlrno2aQSzlApUw1B9nnG2TuFOxoJ3iynJV6p6CcwPNlNPEYzPeiHFOaizPeDaZWZYmRg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0", - "@umbraco-ui/uui-input": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0", + "@umbraco-ui/uui-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-keyboard-shortcut": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.10.0.tgz", - "integrity": "sha512-hr3puURGR8DgHOAOa9vzXKFx+WAxfBbQtcg+xw4PHgCDEDV9wLbvnqBOVdP5DrIp3atLCHW355i8T/Fv8ffPqA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.11.0.tgz", + "integrity": "sha512-wRhfCnjjmZzs2gVoF1gZXNvIooPH8Qytr7UE6ijr6rDWbkDsltjhHocsPpcBAu1LUhqmqmlXDPHOOnc4sraL4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-label": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.10.0.tgz", - "integrity": "sha512-VD8daFTnNgnTgDG8sFmq6JaMMWLDYsTyR5Jl6twrC09GgD2YOn1lFw7mOYpNpKwJv1i5yngXbaT6QCQ+uU1NFg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.11.0.tgz", + "integrity": "sha512-xeVOm9gGyPERnmwjmBNiqsfHFU4ROn6wGIEg6bV/CRdz0sjOKBHMYjdH+hg00kRQjj8oYt52HK4dVos8lDDYZg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.10.0.tgz", - "integrity": "sha512-VDxYhwkojD52zI2PfFAoPI5m83KeU7AILFqDqjySIr5uqjrHv3DlE6BjbfqQHivIvgRKSNlSukukROJZ+bsPiQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.11.0.tgz", + "integrity": "sha512-BoNCOFV+CXwMH/WEwVo5ADj6QXg1tIRPtzVtN3gZGTcDizbqp20171JtkeW3IvOpE6s9Gypn22bv1sUI+ZZOFA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-bar": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.10.0.tgz", - "integrity": "sha512-66BVb/Y2mkb7jHMeQhHGuAuxZ54n2IOeGZ8yVYIs44+U8tXb792Mq6Tr1zgEIzvvmWdfajAjnglhR9hfmijdoQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.11.0.tgz", + "integrity": "sha512-WSIGG4Xlb/SuhnMmL0yd5ZaFUUdHR1UnZ6vv9ja5ORug88AnvPTNMY/53u2ilSh6NT0GCPXWFAbVgIZDn5KaFA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-loader-circle": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.10.0.tgz", - "integrity": "sha512-Beg5+Kt3QpPnC31gYMHI2IkVlk8+EU7fzyXSBq+PIaRhhWF8WO0pjsnsXrY0SxrBfSO4qqcGPaB7VDjD/Q4u6g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.11.0.tgz", + "integrity": "sha512-78xMkQVPUxSwEbvUIdg7L6lamliVKS+NVh+ZRGB+U3HG5t+kwXlcjgaQ4ebdkB7LgLvqrT41GEbXPsmk8hVKKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-menu-item": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.10.0.tgz", - "integrity": "sha512-DJHBKkp8gWP4x/r0k8NiI8QFQmJscD8iaSKMbRkIBm8cb/Lk7hF/szlo67j1rfoV7iRrGvYhL17p+JaoJ9FyqQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.11.0.tgz", + "integrity": "sha512-SMbTptyJdLCh03pSa1MflC0im6c7jaRdjb3p6exQ7cz++TdoLveJyOKAWaJ2TvaAShoaLOdlVHRD88sXcuj2Eg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-loader-bar": "1.10.0", - "@umbraco-ui/uui-symbol-expand": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-loader-bar": "1.11.0", + "@umbraco-ui/uui-symbol-expand": "1.11.0" } }, "node_modules/@umbraco-ui/uui-modal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.10.0.tgz", - "integrity": "sha512-Z13sfDV47aDlr7cpsD3YTFpbr1vhFJ/icpSBTKm6oJs4koiG+ZuiVjt//qLqS3eBL8UXgz6rVL5Q+DcWmJOn3Q==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.11.0.tgz", + "integrity": "sha512-rNq8lhzKj4bk4EMgAIlnHcaQX0W7kQhHWBeJahvLL6jNMmiMGtN/ZtE0efG5tx1r4dixTPbiXXGAl8qMqgTIig==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-pagination": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.10.0.tgz", - "integrity": "sha512-PP0Dsa++77fxv7SqZmRRs8EzKNBQCubPV2t6AEN33fGXjYW83STMJN0BLwZ4za46KbInImAorIbkWA3kEetZQQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.11.0.tgz", + "integrity": "sha512-aQf9MH4BlBbR9r+u4jbknuivhXPrwn65YjLkO3gDDfVfeSSu+ZsrNxReUVnVehF+bP55htcxgwC/lKDJldHVEQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-button-group": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-button-group": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.10.0.tgz", - "integrity": "sha512-gPEVFVeFqa76bGwzkxc8Gjt5EbLKd2WgUeFGIBrP8+ZscbDyP/eG6bXjfUSBweXedPFxmlN/Ng3Dtz+KU2QIGQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.11.0.tgz", + "integrity": "sha512-ZHjkuJ1z8P/zLFeBf8LB8+c/JXm6YK5SORVnZfIlF8MZSDLanFlST62uOT7dcop96yihI/zIr7O5vO8OEw44bw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-popover-container": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.10.0.tgz", - "integrity": "sha512-YguOGWH7XfD7tsopKoh5S6UgymufLna/1xxsBt88/FdF/m1xzHHmrgqWy/GnNycXgGgSulJ3fYe1OG2JhIOHRQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.11.0.tgz", + "integrity": "sha512-i90xXibf8BfP4Yd5Bp4wOfjnFEWQ2Qmn9vnDOWcxmsM9q7NQFx7m4287jJCMtfz2DUbj0VIFJlA2rffWnnSJzw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-progress-bar": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.10.0.tgz", - "integrity": "sha512-ymOWS5R8l3xU3NOPCXAb2gsRvHVjgu6zCGyUreDj0Lz1glagkPKM2evttui9ixoVV8CR7SxAj3hK6t+PXp2ubA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.11.0.tgz", + "integrity": "sha512-ZTRlebLZV19wvNS5TtX+Ku/1cXgAXBR9anYydx/+e2sXQeotwsak74vHqVgNYTzFqD+8EuRlwYJOI4kMer8COw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-radio": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.10.0.tgz", - "integrity": "sha512-ZvC7wgVB4Odn7n8oYsyXOLeIGhx6Ej/Np67Eqg3l+YSxee+SZzBKIHnqSo6BrgaNDSuSS+gWXS8vREGss1UVjg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.11.0.tgz", + "integrity": "sha512-s2KhChBWMlpUThSAm7HGPcbCFXJ7vQTTgSw1e+VED/p/xwKhMrcMiwGX1s4fRTXt4tnCm8AcbMSkhfrW4DW8IA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-range-slider": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.10.0.tgz", - "integrity": "sha512-suYF7UnErKmWyjnPdua6GwmzUe+FovKMyePKISk17gicoiCfked1ygQi0w7YFPJeo7hScx1MA9sUpvh6TVDrkw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.11.0.tgz", + "integrity": "sha512-ReU+Xh8VEH9L+ap4Zwo4+TFWDodoiU5iNkkM0NwbHMz/PLiBE0tVKD5wgppkJKnTRxDxS3MG98C+3DOvXqO2ZQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.10.0.tgz", - "integrity": "sha512-dDbpHYQeMQGF/3pudcj0B6y3ATN8/IQqF9fWlbz/L4H9oAxmiiFgujwXpzLqLx2j9IQvw+pbOx2fi7rVpKsMfw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.11.0.tgz", + "integrity": "sha512-gAtI3/FgcUmmUPSNY9HMGnlMSby9PrcZ1hJRFmv+b86Ducc+4ljmsro97noTexYG1zttDPMkvYGFqOeE5bAeDQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-list": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.10.0.tgz", - "integrity": "sha512-XvDCMM4WTEADKqV/QIqy9gzFe1M6w6XQjX5dVE64Luc2lEjvzKf+/LKcJaoULJsd72roh31MbXNvCO6AdGTqdA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.11.0.tgz", + "integrity": "sha512-c0DLRyNs/sRKPqmnjY6QAfuPa8+etQpXK683gJEn5R4zwcJGGPFzRf6BD9nIcecAAnbL+MFd6cgCBZWlDq/BJA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.10.0.tgz", - "integrity": "sha512-gRu81TImEcJdJ1PKs7glmFXWwP4NkkuvEg0EDXEZoS1ORK7Ms/rLgjecnjruTU2oqxlEiTeSpy3fvw8Ybc+Wyg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.11.0.tgz", + "integrity": "sha512-/+kpfFBb1su5/7egIAHQfeCm3+VQuMrwt07evovAeAM6YAdZsEcv8l2B0V09uKIcJJn/eJOfVVWlqWqi+qQazg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-ref": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-ref": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-data-type": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.10.0.tgz", - "integrity": "sha512-4PxcAdF8wgKfBepHL5xmUKB6i1i5lbHKJUOPmo67N/Vj/xPeBfc899mfv9zFxHV2i5q7FGrxexDEkjtvp2QkYg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.11.0.tgz", + "integrity": "sha512-MED2t6TvjNgzLhV2aaWf/WJ6qA5fhWgFC11hCfEDdjqzhot7TrL4yI/YRDaEJXcYjb5rivod+c346ejSL9+Eog==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-document-type": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.10.0.tgz", - "integrity": "sha512-sKqOGeqbLoJfOrstQebwNv/Mu+Zn5MJOUEyhKgYU04Xh5alpQuEm8G1fmrWYlR3RVeN0APGhl8zC0GJToThw4g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.11.0.tgz", + "integrity": "sha512-S2kzH14m508FBkYalKsWEPLT2xShqryxuSs6caiYAi3cXm5MJq04phvRxl9Yo7h74PESojmZWHjRquPfCLEHog==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-form": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.10.0.tgz", - "integrity": "sha512-c7fJdsNswUnbCl92zWSU6cxKoimPKqNstoHGcDXfy0GTW0pPQqdL/Ux2ymuY84U1HfJxMsc+hC21KVmG/N0oxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.11.0.tgz", + "integrity": "sha512-S1RobwV2O69eyw5sDRrJJDcFNF49hfZ/UcsluK9snPBe080Hzcqjl8bp+6AnH5NyicVwwDW43s6KImXhlIhtVw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-member": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.10.0.tgz", - "integrity": "sha512-ZrSb8b6/hizqqlKtcaCxg0A/L8hBblxiXpMuxx+vD0ihYLJt6fYBFo6NI2KGqAztTd/5/Bih+7Ayy33gh7+0Eg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.11.0.tgz", + "integrity": "sha512-rFqPLY2xnFNFaGgPvneYHapLbnmNhUBaGYnSBe8GJkywz1YFBfdJKj7OftKiqMVWidNz32fejGEUouj9zztxyw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-package": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.10.0.tgz", - "integrity": "sha512-yaHAx0NOWIBDs+eHqvKMIgqHvTIRvPEj0O9c8smTDPaXNiIpTdzikRoqbFfp9QoPipK2Yzgtdzx6FxwnkOldJw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.11.0.tgz", + "integrity": "sha512-ykakG0czZnDdCMy5bRawizwYTu4J267vM1bJrfUa22+hSMKGMy/o4oKS+aKQ2Rh5eUlfBq80iylLDhn4rdmJ6A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-ref-node-user": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.10.0.tgz", - "integrity": "sha512-+gFVF/gY3VU6NqwI1Ns54Ly7LNEIlTh891MTLxum/3WidyhCQfHEjlFpjEtyBYafWY2/dS54/9ST7wg8+wLFlQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.11.0.tgz", + "integrity": "sha512-mrvjf+0usJmJRtTwg90bvLZvftBLG6IQPUxPqWEN7cYbwnDnT0GDn/5qA8Yx9+eND+xMU/I3Dvke9XOyLXfT9Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-ref-node": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-ref-node": "1.11.0" } }, "node_modules/@umbraco-ui/uui-scroll-container": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.10.0.tgz", - "integrity": "sha512-BX/ECh7lsJPbNzQD6N43bMyNTk4EROG6L9LbQja/YUYB6/9CH/uaOpve31vFyykjQTi84QFf/C4zWcuLAfQHPg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.11.0.tgz", + "integrity": "sha512-e+8Fnc2rFtRdv52DpZW0UC9CnxzhXmIqRldYjTpbaL6Xjg9qNSdeW5AvJNk+fgufL6LJOO6NUXs6ixTp8eiOIA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-select": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.10.0.tgz", - "integrity": "sha512-J2Oif7zwWaGvmV+04B6oAi37+AWsId9sfBy9LHswuovoe4wOf2mwIiSXRfJZ7hODfoS9g8y9Y/usX09CZhPZVA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.11.0.tgz", + "integrity": "sha512-slTOIvJZMMtCnVEhBVjAs1MPQBb1BAAa6R+DOoslC4aqA1yEgXWQmFu0xVZqiN0NTz3kqEF5zfexumVJ5f79LQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-slider": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.10.0.tgz", - "integrity": "sha512-opDTKBsfzzOlQzTCx+HYGnYWHGgPYtyFCHdHzsfJAl9o010mIMLmiujqD/VLifKYfKETXFJuRjWMhpSIAn3msQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.11.0.tgz", + "integrity": "sha512-sxWZCvznmTkpJ+VyoIjMRsVQuYC2SMnTWFd+7xrg3pk5SRySNxhZhyQUyf5jI1hAzrW9ATySDZlaRYCOMsC7uA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-expand": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.10.0.tgz", - "integrity": "sha512-hmZrRLaGGaNM65vuUI6bfAIHMfN59Ba3bpiHcEXUvtS1lMsyydGgfZlVuzW7ZlUUEdRj3FRhdwyATuTVUDkhCg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.11.0.tgz", + "integrity": "sha512-bFGp9Dhp8heBfNnu3ozw9DOIfwjkVcKNfHLSts6wg+J3vLW4x0y9jLfxSyvArQQUcUHKsgOzEHoNw6igYDpDJw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.10.0.tgz", - "integrity": "sha512-DitXeZrr2X5bRNqP8Etxdg/0oN0PKwxOVdOndAUxvW/5nSQMEPu6YBR4VBPwvTBrO/O3aXW7fe99yMnQ0mILKg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.11.0.tgz", + "integrity": "sha512-AK411VsceFqOAGtvlK2VcyTqwPbYVdqJkXbTbsSxYVhIB2jMVISppwlefqerx4zbPASBp4aeIN54PZWN+Y3dfw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.10.0.tgz", - "integrity": "sha512-jTF+20vxDQzhpcuqEFbub+5EkCgEZb7OVYBhgxCUW9SftoB5EWaGYR+9lpz5FNjqBQJi5FTR08oji8gFEbmiEA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.11.0.tgz", + "integrity": "sha512-Tma0hziyVM3ZXUduL97i8s3zs5JjbZi9lbydPx7foL/vAhEdP7fov8OXF1kMBhYIEieT11td/9ARxKlDOaLojQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.10.0.tgz", - "integrity": "sha512-ZbXqXD8MyrHPMTgqwSy81mjaSgb8ZYgkZ6a7M2WNWqL5cpzQ7URUUuT/3U+VDreMexyl9Yy60soWbr2zrjBuqQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.11.0.tgz", + "integrity": "sha512-22JNF2zs9iumu5JTsn6WmvyMqOwjrZ5/tfeL8+4ZnrxWM5CmJ7neKTm5BHoJyj0oM1wML2NWAc4McbWNOXktrg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-folder": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.10.0.tgz", - "integrity": "sha512-7gCGuIl8WPwZKVjR5+Tcb5CjAFL7i9kdbpKdDXGpComyZUpfIzy+2Eeb6H0N1P7M6c9gWJkvl06hghI7XJpz+A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.11.0.tgz", + "integrity": "sha512-NcQQupEQASwp8pyxVFG6v7rCvNAbgtE2R9IDlLl5yC/k3449TZ/NiEgMaSlmNhexBEc4SCoTMD9IuaEBo4vmZg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-lock": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.10.0.tgz", - "integrity": "sha512-8kziG7cQxd0Xjo3XdBBorZ7AwFw0joI7xJCTsFbymIvwRYp5hiJbrj2Kmf4kxs2rCcXPaWjI9D9nr/41EJqO2A==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.11.0.tgz", + "integrity": "sha512-1PsxVXj5zT3vXOcb+LP6/bgfGOt0aUmIoAGtV6mO/QHb1XPmOB07xrRzkk7CX+VixOCIdkTGYNU/CFjPJwLsow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-more": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.10.0.tgz", - "integrity": "sha512-Hp2/BP8JDatgI/WVxfriZ/5IhlzvxFOyBzKNi/EIGPQYvMRofdp0GAI1UhT5MmWe6J5R/q9v106CWaDSNUP9pw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.11.0.tgz", + "integrity": "sha512-72OwXzXAm9XXLB/+qGhtl7IRzrq/2uDdMFG93EMJs0NM3MU0EM0Ild7MuIAPecGiCGjBYn/iyZmWhYMDhS/KOA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-symbol-sort": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.10.0.tgz", - "integrity": "sha512-J6EyHkY0hT7ZcZrh3JhCXlKnHE6xC9CXzIZ3EJ0lIPZOBLOql2okut0g/ZdP5s4JM7zGOEUEwEFwO+duxxacYA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.11.0.tgz", + "integrity": "sha512-Y+PQc77PvmVOGAaPGRTYrtLI3MCV/BqE9hl0f+yGZYK/C97r3ogGQxMguU5zThf49EOEL3VmB/WWS/HEFblsjA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-table": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.10.0.tgz", - "integrity": "sha512-AoqRaRAfI/WokEuDtE1utl5HVh05l/4+gpUWUj1vzyTNoVeBH3pMxg93ZDlus5pntNavP4foYl4GyTlPSVXcXg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.11.0.tgz", + "integrity": "sha512-AXKMARK9WtyuU9T72LGprhBQXpYKw4rWGoGQwUjRk4lwdQD8WKeY3kfIIcaeabBiK5FPnZaEoCpxIkmPt77n2w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tabs": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.10.0.tgz", - "integrity": "sha512-97kkyWEyTvbNVFvcsD4Q9Av2SSwlRN+bdTZe+v1s4gROLJTef9UXs53N68WcjjPZvjBuVL0MpcxZ6kYTs9oxOg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.11.0.tgz", + "integrity": "sha512-IyB1qao2G3T5UNBj3Kw9EL7ikjAp8COvHVH8eTD+fjx1PbrNJmDl6utTV6tpysxLkT7UQ3o6QtjxstDtlUSqsg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-popover-container": "1.10.0", - "@umbraco-ui/uui-symbol-more": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-popover-container": "1.11.0", + "@umbraco-ui/uui-symbol-more": "1.11.0" } }, "node_modules/@umbraco-ui/uui-tag": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.10.0.tgz", - "integrity": "sha512-CtR6XcvM9DXBhZrVmngeT2aMsx5D38DnJCDLZlxcNyqbfL7U6FH8QGTWO9Htepln/hPr48VyTMV0yHs/mKfpHQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.11.0.tgz", + "integrity": "sha512-TGMkL7J+PPOq0dZiXnj5Y7f6+c/IJl71I2cme75cE/SkzoI01hr1KvEEThHT83yn64PPqews8ZCh1fKwmI1tmw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-textarea": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.10.0.tgz", - "integrity": "sha512-hZKAhzDYqGVGqR2aZ+TsE/YygfKXOUs8i0OGeecUEuiEsL18+Js5Y2qyeb8pq5GUE2Mu6nJx2FkH8KThRCoLug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.11.0.tgz", + "integrity": "sha512-g4ciGte7YgHJkzhkLPn4xiGfjHXFbUWa86S4bg3WricucdF20EReLRc6I2jW7mo8lL+h+y8wLcIIQ8CquscLsQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.10.0.tgz", - "integrity": "sha512-dVPSRVPDblNDeqKMEVZx2PePyn/qfKtq6pu5k6gqh5aQhYZt2GyyV/oHELgf+VYNzzfgdN65w2cd78i3Ug5fVw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.11.0.tgz", + "integrity": "sha512-5Mhhwn5z/IdlO3iuMMM8HYlDXg9GM23NxCykDcNGpGxMW0TeMFNLNxsBqm+5fOsNYjL2vhv3utPZyeE57ulyQA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-button": "1.10.0", - "@umbraco-ui/uui-css": "1.10.0", - "@umbraco-ui/uui-icon": "1.10.0", - "@umbraco-ui/uui-icon-registry-essential": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-button": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0", + "@umbraco-ui/uui-icon": "1.11.0", + "@umbraco-ui/uui-icon-registry-essential": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-container": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.10.0.tgz", - "integrity": "sha512-s+Uxe+IDLvzg+cj1+icFzVYU+8UB/XgFZetLOI7PLe5edbvFVwld0UmminQ9n1KYbyxGOnxvvhCgBfrgpiFkLw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.11.0.tgz", + "integrity": "sha512-Y0LunmaTU/06i6mZF/RmopCDvsZMbgYlayJ3K7w6qkqXeJCnLg9cWHQSmOvIz9DJPO84NOcoYCwsLo4DRYa8WQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-toast-notification": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-toast-notification": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toast-notification-layout": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.10.0.tgz", - "integrity": "sha512-TY6DUEDqXXvNpe7O/j1fanBeWxyeV6Mc9jpXY2ERXrDCaPKL1uEUl2ouIrOCBw5OQMJsoZBU8ZtZmkGRRjlu4w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.11.0.tgz", + "integrity": "sha512-lYuYhtgnO4ELs+qxc2bt6JPBdm+RYhcujMTpx8sSgCYPkHiwxnZt9WEfQQJe4wcwNyuGyMTcwn2d6BKMYgqP9g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-css": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-css": "1.11.0" } }, "node_modules/@umbraco-ui/uui-toggle": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.10.0.tgz", - "integrity": "sha512-uSBf7j1f66rKHnfYXzJdkEDAx0WLukMpQ8zD7ZhvsZ6fEfNP31JbWDaWM7quHshXhk05/wVOgU7fa+6D7sCleA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.11.0.tgz", + "integrity": "sha512-ZWafhMLnR/Z55U4Nw2mUYiPOWrIcSYS4Oay388ZuEKZmfQ0iwGYGSBo4awn3OeY/mVoY88QY6R2siRq9jABKig==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0", - "@umbraco-ui/uui-boolean-input": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0", + "@umbraco-ui/uui-boolean-input": "1.11.0" } }, "node_modules/@umbraco-ui/uui-visually-hidden": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.10.0.tgz", - "integrity": "sha512-Jp+tg8v2Ujth+HSP8W/JZth6QaeqWO2qbLhCCifEwvU4M7/ehmavcm+JnFx8zICkHrSsyL+p7yH4iXJ3H4eGOQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.11.0.tgz", + "integrity": "sha512-IxZwVLvX311+iupaupA36C6Ea3Aox/KAh/C5hE81qN+fNI/A8CZxr4OHHEvnQj4VcL0gTG0qt4PbxSR4hRfxmw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@umbraco-ui/uui-base": "1.10.0" + "@umbraco-ui/uui-base": "1.11.0" } }, "node_modules/ansi-escapes": { @@ -1835,6 +2501,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -1850,6 +2517,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1881,6 +2549,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1923,6 +2599,7 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } @@ -1981,17 +2658,27 @@ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -2039,6 +2726,20 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -2086,6 +2787,20 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2152,13 +2867,34 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz", + "integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==", + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/lit": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.0.tgz", - "integrity": "sha512-s6tI33Lf6VpDu7u4YqsSX78D28bYQulM+VAzsGch4fx2H0eLZnJsUBsPWmGYSGoKDNbjtRv02rio1o+UdPVwvw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", + "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@lit/reactive-element": "^2.0.4", @@ -2167,10 +2903,11 @@ } }, "node_modules/lit-element": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.0.tgz", - "integrity": "sha512-gSejRUQJuMQjV2Z59KAS/D4iElUhwKpIyJvZ9w+DIagIQjfJnhR20h2Q5ddpzXGS+fF0tMZ/xEYGMnKmaI/iww==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", @@ -2179,15 +2916,35 @@ } }, "node_modules/lit-html": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.0.tgz", - "integrity": "sha512-pwT/HwoxqI9FggTrYVarkBKFN9MlTUpLrDHubTmW4SrkL3kkqW5gxwbxMMUnbbRHBC0WTZnYHcjDSCM559VyfA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "@types/trusted-types": "^2.0.2" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, "node_modules/marked": { "version": "14.1.3", "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.3.tgz", @@ -2201,6 +2958,14 @@ "node": ">= 18" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/monaco-editor": { "version": "0.50.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.50.0.tgz", @@ -2215,17 +2980,19 @@ "dev": true }, "node_modules/msw": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.9.tgz", - "integrity": "sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.6.4.tgz", + "integrity": "sha512-Pm4LmWQeytDsNCR+A7gt39XAdtH6zQb6jnIKRig0FlvYOn8eksn3s1nXxUfz5KYUjbckof7Z4p2ewzgffPoCbg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", + "@bundled-es-modules/cookie": "^2.0.1", "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.35.8", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.36.5", + "@open-draft/deferred-promise": "^2.2.0", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", @@ -2233,10 +3000,10 @@ "graphql": "^16.8.1", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", + "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", + "type-fest": "^4.26.1", "yargs": "^17.7.2" }, "bin": { @@ -2258,12 +3025,13 @@ } }, "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/nanoid": { @@ -2284,11 +3052,20 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/outvariant": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "6.3.0", @@ -2330,6 +3107,237 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.2.tgz", + "integrity": "sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", + "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz", + "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", + "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz", + "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.1.tgz", + "integrity": "sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", + "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.36.0.tgz", + "integrity": "sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2345,6 +3353,17 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -2401,6 +3420,14 @@ "fsevents": "~2.3.2" } }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -2416,6 +3443,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -2445,7 +3473,8 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", @@ -2554,10 +3583,11 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2566,11 +3596,20 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/universalify": { "version": "0.2.0", @@ -2606,10 +3645,11 @@ } }, "node_modules/vite": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", - "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -2665,10 +3705,11 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", - "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.2.tgz", + "integrity": "sha512-gEIbKfJzSEv0yR3XS2QEocKetONoWkbROj6hGx0FHM18qKUojhvcokQsxQx5nMkelZq2n37zbSGCJn+FSODSjA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", @@ -2683,11 +3724,20 @@ } } }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2738,6 +3788,7 @@ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, diff --git a/src/Umbraco.Web.UI.Login/package.json b/src/Umbraco.Web.UI.Login/package.json index ceb9301e860c..479a6a83e195 100644 --- a/src/Umbraco.Web.UI.Login/package.json +++ b/src/Umbraco.Web.UI.Login/package.json @@ -15,11 +15,11 @@ "dependencies": { }, "devDependencies": { - "@umbraco-cms/backoffice": "^14.3.1", - "msw": "^2.3.0", - "typescript": "^5.4.5", - "vite": "^5.4.6", - "vite-tsconfig-paths": "^4.3.2" + "@umbraco-cms/backoffice": "^15.0.0", + "msw": "^2.6.4", + "typescript": "^5.6.3", + "vite": "^5.4.11", + "vite-tsconfig-paths": "^5.1.2" }, "msw": { "workerDirectory": "public" diff --git a/src/Umbraco.Web.UI.Login/src/localization/manifests.ts b/src/Umbraco.Web.UI.Login/src/localization/manifests.ts index 14b72cb9f9c4..94ca59c460da 100644 --- a/src/Umbraco.Web.UI.Login/src/localization/manifests.ts +++ b/src/Umbraco.Web.UI.Login/src/localization/manifests.ts @@ -1,74 +1,72 @@ -import type { ManifestLocalization } from "@umbraco-cms/backoffice/extension-registry"; - -export const manifests: ManifestLocalization[] = [ - { - type: "localization", - alias: "Umb.Auth.Localization.En", - name: "English", - weight: 0, - js: () => import("./lang/en.js"), - meta: { - culture: "en", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.EnUs", - name: "English (US)", - weight: 0, - js: () => import("./lang/en-us.js"), - meta: { - culture: "en-us", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.DaDk", - name: "Danish (DK)", - weight: 0, - js: () => import("./lang/da-dk.js"), - meta: { - culture: "da-dk", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.DeDe", - name: "German (DE)", - weight: 0, - js: () => import("./lang/de-de.js"), - meta: { - culture: "de-de", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.NlNl", - name: "Dutch (NL)", - weight: 0, - js: () => import("./lang/nl-nl.js"), - meta: { - culture: "nl-nl", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.SvSe", - name: "Swedish (SE)", - weight: 0, - js: () => import("./lang/sv-se.js"), - meta: { - culture: "sv-se", - } - }, - { - type: "localization", - alias: "Umb.Auth.Localization.NbNo", - name: "Norwegian Bokmål (NO)", - weight: 0, - js: () => import("./lang/nb-no.js"), - meta: { - culture: "nb-no", - } - }, -] +export const manifests: UmbExtensionManifest[] = [ + { + type: 'localization', + alias: 'Umb.Auth.Localization.En', + name: 'English', + weight: 0, + js: () => import('./lang/en.js'), + meta: { + culture: 'en', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.EnUs', + name: 'English (US)', + weight: 0, + js: () => import('./lang/en-us.js'), + meta: { + culture: 'en-us', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.DaDk', + name: 'Danish (DK)', + weight: 0, + js: () => import('./lang/da-dk.js'), + meta: { + culture: 'da-dk', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.DeDe', + name: 'German (DE)', + weight: 0, + js: () => import('./lang/de-de.js'), + meta: { + culture: 'de-de', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.NlNl', + name: 'Dutch (NL)', + weight: 0, + js: () => import('./lang/nl-nl.js'), + meta: { + culture: 'nl-nl', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.SvSe', + name: 'Swedish (SE)', + weight: 0, + js: () => import('./lang/sv-se.js'), + meta: { + culture: 'sv-se', + }, + }, + { + type: 'localization', + alias: 'Umb.Auth.Localization.NbNo', + name: 'Norwegian Bokmål (NO)', + weight: 0, + js: () => import('./lang/nb-no.js'), + meta: { + culture: 'nb-no', + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Login/tsconfig.json b/src/Umbraco.Web.UI.Login/tsconfig.json index 8a25c3d5b93c..9d5549c656f0 100644 --- a/src/Umbraco.Web.UI.Login/tsconfig.json +++ b/src/Umbraco.Web.UI.Login/tsconfig.json @@ -1,23 +1,24 @@ { - "compilerOptions": { - "target": "ES2022", - "experimentalDecorators": true, - "useDefineForClassFields": false, - "module": "ESNext", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "skipLibCheck": true, + "compilerOptions": { + "target": "ES2022", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "types": ["@umbraco-cms/backoffice/extension-registry"], - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, - /* Linting */ - "strict": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - }, - "include": ["src"] + /* Linting */ + "strict": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true + }, + "include": ["src"] } From 16a5f8d138c1c5c2987ae83a835b6c7c54d681c5 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 25 Nov 2024 18:16:19 +0100 Subject: [PATCH 100/167] Media Picker: only allow navigating to folders/media with children + other fixes (#17617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * only allow navigating into folders or item with children * export media search provider * mark search on media item repo as deprecated * use media search provider for searching * rename method * change the look of the upload button * only render checkbox if we are not in the root * clear search when navigating * add type * set value so it gets updated when cleared * default to search within an item * hide breadcrumb if searching in root * scope search on server * Update media-picker-modal.element.ts * hide breadcrumb when doing a global search within another item * add selection mode * remove unused state * handle start node when searching * fix if wrong order * fix type error * pass start node to breadcrumb * handle start node in breadcrumb * make start node optional * map data * clean up * Update media-picker-folder-path.element.ts * add searching load indicator * don't show unique in detail * Add information to item response model * Update OpenApi.json * generate new server models * update mocks * move interface to types * add hasChildren and parent to media item model interface * fix import * map data * map media item * treat tree item and search result the same * Fix: bump uui version (#17626) * lint fix * temp fix for media selection * UX corrections for media selection * temp uui fix for media picker modal * fix table selection mode * fix search from when having a start node * remove private * wait for all missing parts before create table items --------- Co-authored-by: nikolajlauridsen Co-authored-by: Niels Lyngsø --- .../document-blueprint.db.ts | 2 + .../src/mocks/data/document/document.db.ts | 2 + .../src/mocks/data/media/media.db.ts | 2 + .../core/components/table/table.element.ts | 33 ++- .../content-type-workspace-context-base.ts | 7 +- .../src/packages/core/models/index.ts | 1 + .../packages/core/sorter/sorter.controller.ts | 2 +- .../entity-detail-workspace-editor.element.ts | 2 +- .../document-type-workspace.context.ts | 5 +- .../item/document-item.server.data-source.ts | 16 +- .../documents/repository/item/types.ts | 13 +- .../search/document-search.repository.ts | 2 +- .../document-search.server.data-source.ts | 20 +- .../search/document.search-provider.ts | 5 +- .../documents/documents/search/types.ts | 5 + .../language/workspace/language-root/paths.ts | 2 +- .../language-workspace-editor.element.ts | 2 +- .../workspace/media-type-workspace.context.ts | 4 +- .../media-grid-collection-view.element.ts | 7 +- .../media-table-collection-view.element.ts | 12 +- .../input-media/input-media.element.ts | 1 - .../src/packages/media/media/index.ts | 7 +- .../media-picker-folder-path.element.ts | 45 ++- .../media-picker-modal.element.ts | 271 +++++++++++++----- .../repository/item/media-item.repository.ts | 7 + .../item/media-item.server.data-source.ts | 15 +- .../media/media/repository/item/types.ts | 7 +- .../src/packages/media/media/search/index.ts | 2 + .../media/search/media-search.repository.ts | 2 +- .../search/media-search.server.data-source.ts | 15 +- .../media/search/media.search-provider.ts | 6 +- .../src/packages/media/media/search/types.ts | 5 + .../member-type-workspace.context.ts | 2 +- 33 files changed, 371 insertions(+), 158 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/search/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts index 6bc4f57c42db..dd0416a99a76 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts @@ -101,9 +101,11 @@ const itemMapper = (model: UmbMockDocumentBlueprintModel): DocumentItemResponseM icon: model.documentType.icon, id: model.documentType.id, }, + hasChildren: model.hasChildren, id: model.id, isProtected: model.isProtected, isTrashed: model.isTrashed, + parent: model.parent, variants: model.variants, hasChildren: model.hasChildren, parent: model.parent, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts index 82a086af6f33..79d16d747eb1 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts @@ -126,9 +126,11 @@ const itemMapper = (model: UmbMockDocumentModel): DocumentItemResponseModel => { icon: model.documentType.icon, id: model.documentType.id, }, + hasChildren: model.hasChildren, id: model.id, isProtected: model.isProtected, isTrashed: model.isTrashed, + parent: model.parent, variants: model.variants, hasChildren: model.hasChildren, parent: model.parent, diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts index 05fd677fb8ae..bbc564af50d6 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts @@ -99,8 +99,10 @@ const itemMapper = (model: UmbMockMediaModel): MediaItemResponseModel => { icon: model.mediaType.icon, id: model.mediaType.id, }, + hasChildren: model.hasChildren, id: model.id, isTrashed: model.isTrashed, + parent: model.parent, variants: model.variants, hasChildren: model.hasChildren, parent: model.parent, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index aab20a4fe606..468d7782f3ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -146,6 +146,18 @@ export class UmbTableElement extends LitElement { this.dispatchEvent(new UmbTableOrderedEvent()); } + private _selectAllRows() { + this.selection = this.items.map((item: UmbTableItem) => item.id); + this._selectionMode = true; + this.dispatchEvent(new UmbTableSelectedEvent()); + } + + private _deselectAllRows() { + this.selection = []; + this._selectionMode = false; + this.dispatchEvent(new UmbTableDeselectedEvent()); + } + private _selectRow(key: string) { this.selection = [...this.selection, key]; this._selectionMode = this.selection.length > 0; @@ -158,16 +170,14 @@ export class UmbTableElement extends LitElement { this.dispatchEvent(new UmbTableDeselectedEvent()); } - private _selectAllRows() { - this.selection = this.items.map((item: UmbTableItem) => item.id); - this._selectionMode = true; - this.dispatchEvent(new UmbTableSelectedEvent()); - } - - private _deselectAllRows() { - this.selection = []; - this._selectionMode = false; - this.dispatchEvent(new UmbTableDeselectedEvent()); + #onClickRow(key: string) { + if (this._selectionMode) { + if (this._isSelected(key)) { + this._deselectRow(key); + } else { + this._selectRow(key); + } + } } override render() { @@ -234,7 +244,8 @@ export class UmbTableElement extends LitElement { ?select-only=${this._selectionMode} ?selected=${this._isSelected(item.id)} @selected=${() => this._selectRow(item.id)} - @deselected=${() => this._deselectRow(item.id)}> + @deselected=${() => this._deselectRow(item.id)} + @click=${() => this.#onClickRow(item.id)}> ${this._renderRowCheckboxCell(item)} ${this.columns.map((column) => this._renderRowCell(column, item))} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context-base.ts index 88088bd72fde..93dee1c48c5b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/content-type-workspace-context-base.ts @@ -1,3 +1,6 @@ +import type { UmbContentTypeCompositionModel, UmbContentTypeDetailModel, UmbContentTypeSortModel } from '../types.js'; +import { UmbContentTypeStructureManager } from '../structure/index.js'; +import type { UmbContentTypeWorkspaceContext } from './content-type-workspace-context.interface.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import { @@ -6,10 +9,7 @@ import { type UmbEntityDetailWorkspaceContextCreateArgs, type UmbRoutableWorkspaceContext, } from '@umbraco-cms/backoffice/workspace'; -import type { UmbContentTypeWorkspaceContext } from './content-type-workspace-context.interface.js'; -import type { UmbContentTypeCompositionModel, UmbContentTypeDetailModel, UmbContentTypeSortModel } from '../types.js'; import { UmbValidationContext } from '@umbraco-cms/backoffice/validation'; -import { UmbContentTypeStructureManager } from '../structure/index.js'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import { jsonStringComparison, type Observable } from '@umbraco-cms/backoffice/observable-api'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; @@ -221,7 +221,6 @@ export abstract class UmbContentTypeWorkspaceContextBase< * Sets the compositions of the content type * @param { string } compositions The compositions of the content type * @returns { void } - * */ public setCompositions(compositions: Array) { this.structure.updateOwnerContentType({ compositions } as Partial); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts index c1f1a5034e84..c992d6388f2e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/models/index.ts @@ -14,6 +14,7 @@ export interface UmbNumberRangeValueType { max?: number; } +// TODO: this needs to use the UmbEntityUnique so we ensure that unique can be null export interface UmbReferenceByUnique { unique: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.ts index c8e22a1f75a5..d8546c5e4ddc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/sorter/sorter.controller.ts @@ -203,7 +203,7 @@ export type UmbSorterConfig = Partial, 'ignorerSelector' | 'containerSelector' | 'identifier'>>; /** - + * @class UmbSorterController * @implements {UmbControllerInterface} * @description This controller can make user able to sort items. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/global-components/entity-detail-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/global-components/entity-detail-workspace-editor.element.ts index 8add4ff8b902..e57bc1d2c7d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/global-components/entity-detail-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/entity-detail/global-components/entity-detail-workspace-editor.element.ts @@ -1,5 +1,5 @@ -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_ENTITY_DETAIL_WORKSPACE_CONTEXT } from '../entity-detail-workspace.context-token.js'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { css, customElement, html, ifDefined, nothing, property, state } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-entity-detail-workspace-editor') diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type/document-type-workspace.context.ts index 2c1c805d2a23..625c98657679 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type/document-type-workspace.context.ts @@ -7,7 +7,9 @@ import { } from '../../paths.js'; import type { UmbDocumentTypeDetailModel } from '../../types.js'; import { UMB_DOCUMENT_TYPE_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element.js'; +import { UMB_DOCUMENT_TYPE_WORKSPACE_ALIAS } from './constants.js'; import { UmbContentTypeWorkspaceContextBase } from '@umbraco-cms/backoffice/content-type'; import { UmbWorkspaceIsNewRedirectController, @@ -18,8 +20,6 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import type { UmbPathPatternTypeAsEncodedParamsType } from '@umbraco-cms/backoffice/router'; -import { UMB_DOCUMENT_TYPE_WORKSPACE_ALIAS } from './constants.js'; -import { UMB_DOCUMENT_TYPE_DETAIL_REPOSITORY_ALIAS } from '../../repository/index.js'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; import { UmbTemplateDetailRepository } from '@umbraco-cms/backoffice/template'; @@ -185,6 +185,7 @@ export class UmbDocumentTypeWorkspaceContext /** * @deprecated Use the createScaffold method instead. Will be removed in 17. + * @param presetAlias * @param {UmbEntityModel} parent * @memberof UmbMediaTypeWorkspaceContext */ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts index 7b0370f60bb3..14e808545fa8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/document-item.server.data-source.ts @@ -32,15 +32,18 @@ const getItems = (uniques: Array) => DocumentService.getItemDocument({ i const mapper = (item: DocumentItemResponseModel): UmbDocumentItemModel => { return { - entityType: UMB_DOCUMENT_ENTITY_TYPE, - unique: item.id, - isTrashed: item.isTrashed, - isProtected: item.isProtected, documentType: { - unique: item.documentType.id, - icon: item.documentType.icon, collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, + icon: item.documentType.icon, + unique: item.documentType.id, }, + entityType: UMB_DOCUMENT_ENTITY_TYPE, + hasChildren: item.hasChildren, + isProtected: item.isProtected, + isTrashed: item.isTrashed, + name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + parent: item.parent ? { unique: item.parent.id } : null, + unique: item.id, variants: item.variants.map((variant) => { return { culture: variant.culture || null, @@ -48,6 +51,5 @@ const mapper = (item: DocumentItemResponseModel): UmbDocumentItemModel => { state: variant.state, }; }), - name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts index 18e03a54622a..f1077ccaf85f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/item/types.ts @@ -1,18 +1,21 @@ import type { UmbDocumentEntityType } from '../../entity.js'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbDocumentItemModel { - entityType: UmbDocumentEntityType; - name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. - unique: string; - isTrashed: boolean; - isProtected: boolean; documentType: { unique: string; icon: string; collection: UmbReferenceByUnique | null; }; + entityType: UmbDocumentEntityType; + hasChildren: boolean; + isProtected: boolean; + isTrashed: boolean; + name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + parent: { unique: UmbEntityUnique } | null; // TODO: Use UmbReferenceByUnique when it support unique as null + unique: string; variants: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts index c5471d0e5d80..3e34af40ff38 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.repository.ts @@ -1,5 +1,5 @@ import { UmbDocumentSearchServerDataSource } from './document-search.server.data-source.js'; -import type { UmbDocumentSearchItemModel } from './document.search-provider.js'; +import type { UmbDocumentSearchItemModel } from './types.js'; import type { UmbSearchRepository, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts index aeb27b182288..961fdfd54da8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/search/document-search.server.data-source.ts @@ -1,5 +1,5 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; -import type { UmbDocumentSearchItemModel } from './document.search-provider.js'; +import type { UmbDocumentSearchItemModel } from './types.js'; import type { UmbSearchDataSource, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; @@ -40,16 +40,19 @@ export class UmbDocumentSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { - href: '/section/content/workspace/document/edit/' + item.id, - entityType: UMB_DOCUMENT_ENTITY_TYPE, - unique: item.id, - isTrashed: item.isTrashed, - isProtected: item.isProtected, documentType: { - unique: item.documentType.id, - icon: item.documentType.icon, collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, + icon: item.documentType.icon, + unique: item.documentType.id, }, + entityType: UMB_DOCUMENT_ENTITY_TYPE, + hasChildren: item.hasChildren, + href: '/section/content/workspace/document/edit/' + item.id, + isProtected: item.isProtected, + isTrashed: item.isTrashed, + name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + parent: item.parent ? { unique: item.parent.id } : null, + unique: item.id, variants: item.variants.map((variant) => { return { culture: variant.culture || null, @@ -57,7 +60,6 @@ export class UmbDocumentSearchServerDataSource implements UmbSearchDataSource 0} + ?select-only=${this._selection.length > 0} ?selected=${this.#isSelected(item)} href=${this.#getEditUrl(item)} @selected=${() => this.#onSelect(item)} @@ -136,6 +136,11 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { font-style: italic; } + /** TODO: Remove this fix when UUI gets upgrade to 1.3 */ + umb-imaging-thumbnail { + pointer-events: none; + } + #media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts index 7e1206cb2e05..24f349cec207 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/views/table/media-table-collection-view.element.ts @@ -64,6 +64,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { collectionContext.workspacePathBuilder, (builder) => { this._workspacePathBuilder = builder; + this.#createTableItems(); }, 'observePath', ); @@ -86,7 +87,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { this.#collectionContext.items, (items) => { this._items = items; - this.#createTableItems(this._items); + this.#createTableItems(); }, '_observeItems', ); @@ -117,12 +118,17 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { } } - #createTableItems(items: Array) { + #createTableItems() { + this._tableItems = []; + + if (this._items === undefined) return; + if (this._workspacePathBuilder === undefined) return; + if (this._tableColumns.length === 0) { this.#createTableHeadings(); } - this._tableItems = items.map((item) => { + this._tableItems = this._items.map((item) => { if (!item.unique) throw new Error('Item id is missing.'); const data = diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts index 01223f0fdd6e..6eeaf1c8090d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/components/input-media/input-media.element.ts @@ -246,7 +246,6 @@ export class UmbInputMediaElement extends UmbFormControlMixin ({ name: item.name, unique: item.unique, entityType: item.entityType })), - ]; - return; + ).data || [] + : []; + + const paths: Array = items.map((item) => ({ + name: item.name, + unique: item.unique, + entityType: item.entityType, + })); + + if (!this.startNode) { + paths.unshift(root); } - this._paths = [root]; + + this._paths = [...paths]; } #goToFolder(entity: UmbMediaPathModel) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/modals/media-picker/media-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/modals/media-picker/media-picker-modal.element.ts index eac3c2bfa30c..4336c76a65ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/modals/media-picker/media-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/modals/media-picker/media-picker-modal.element.ts @@ -1,40 +1,57 @@ -import { UmbMediaItemRepository } from '../../repository/index.js'; +import { UmbMediaItemRepository, type UmbMediaItemModel } from '../../repository/index.js'; import { UmbMediaTreeRepository } from '../../tree/media-tree.repository.js'; import { UMB_MEDIA_ROOT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDropzoneElement } from '../../dropzone/dropzone.element.js'; -import type { UmbMediaCardItemModel, UmbMediaPathModel } from './types.js'; +import type { UmbMediaTreeItemModel } from '../../tree/index.js'; +import { UmbMediaSearchProvider, type UmbMediaSearchItemModel } from '../../search/index.js'; +import type { UmbMediaPathModel } from './types.js'; import type { UmbMediaPickerFolderPathElement } from './components/media-picker-folder-path.element.js'; import type { UmbMediaPickerModalData, UmbMediaPickerModalValue } from './media-picker-modal.token.js'; -import { css, html, customElement, state, repeat, ifDefined, query } from '@umbraco-cms/backoffice/external/lit'; +import { + css, + html, + customElement, + state, + repeat, + ifDefined, + query, + type PropertyValues, + nothing, +} from '@umbraco-cms/backoffice/external/lit'; import { debounce } from '@umbraco-cms/backoffice/utils'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UMB_CONTENT_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/content'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { isUmbracoFolder } from '@umbraco-cms/backoffice/media-type'; +import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; import '@umbraco-cms/backoffice/imaging'; const root: UmbMediaPathModel = { name: 'Media', unique: null, entityType: UMB_MEDIA_ROOT_ENTITY_TYPE }; +// TODO: investigate how we can reuse the picker-search-field element, picker context etc. @customElement('umb-media-picker-modal') export class UmbMediaPickerModalElement extends UmbModalBaseElement< UmbMediaPickerModalData, UmbMediaPickerModalValue > { - #mediaTreeRepository = new UmbMediaTreeRepository(this); // used to get file structure - #mediaItemRepository = new UmbMediaItemRepository(this); // used to search + #mediaTreeRepository = new UmbMediaTreeRepository(this); + #mediaItemRepository = new UmbMediaItemRepository(this); + #mediaSearchProvider = new UmbMediaSearchProvider(this); #dataType?: { unique: string }; @state() - private _selectableFilter: (item: UmbMediaCardItemModel) => boolean = () => true; + private _selectableFilter: (item: UmbMediaTreeItemModel | UmbMediaSearchItemModel) => boolean = () => true; - #mediaItemsCurrentFolder: Array = []; + @state() + private _currentChildren: Array = []; @state() - private _mediaFilteredList: Array = []; + private _searchResult: Array = []; @state() - private _searchOnlyThisFolder = false; + private _searchFrom: UmbEntityModel | undefined; @state() private _searchQuery = ''; @@ -42,6 +59,15 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< @state() private _currentMediaEntity: UmbMediaPathModel = root; + @state() + private _isSelectionMode = false; + + @state() + private _startNode: UmbMediaItemModel | undefined; + + @state() + _searching: boolean = false; + @query('#dropzone') private _dropzone!: UmbDropzoneElement; @@ -57,21 +83,33 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< override async connectedCallback(): Promise { super.connectedCallback(); + if (this.data?.pickableFilter) { + this._selectableFilter = this.data?.pickableFilter; + } + } - if (this.data?.pickableFilter) this._selectableFilter = this.data?.pickableFilter; + protected override async firstUpdated(_changedProperties: PropertyValues): Promise { + super.firstUpdated(_changedProperties); if (this.data?.startNode) { const { data } = await this.#mediaItemRepository.requestItems([this.data.startNode]); + this._startNode = data?.[0]; + + if (this._startNode) { + this._currentMediaEntity = { + name: this._startNode.name, + unique: this._startNode.unique, + entityType: this._startNode.entityType, + }; - if (data?.length) { - this._currentMediaEntity = { name: data[0].name, unique: data[0].unique, entityType: data[0].entityType }; + this._searchFrom = { unique: this._startNode.unique, entityType: this._startNode.entityType }; } } - this.#loadMediaFolder(); + this.#loadChildrenOfCurrentMediaItem(); } - async #loadMediaFolder() { + async #loadChildrenOfCurrentMediaItem() { const { data } = await this.#mediaTreeRepository.requestTreeItemsOf({ parent: { unique: this._currentMediaEntity.unique, @@ -82,78 +120,117 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< take: 100, }); - this.#mediaItemsCurrentFolder = data?.items ?? []; - this.#filterMediaItems(); + this._currentChildren = data?.items ?? []; } - #onOpen(item: UmbMediaCardItemModel) { + #onOpen(item: UmbMediaTreeItemModel | UmbMediaSearchItemModel) { + this.#clearSearch(); + this._currentMediaEntity = { name: item.name, unique: item.unique, entityType: UMB_MEDIA_ROOT_ENTITY_TYPE, }; - this.#loadMediaFolder(); + + // If the user has navigated into an item, we default to search only within that item. + this._searchFrom = this._currentMediaEntity.unique + ? { unique: this._currentMediaEntity.unique, entityType: this._currentMediaEntity.entityType } + : undefined; + + this.#loadChildrenOfCurrentMediaItem(); } - #onSelected(item: UmbMediaCardItemModel) { + #onSelected(item: UmbMediaTreeItemModel | UmbMediaSearchItemModel) { const selection = this.data?.multiple ? [...this.value.selection, item.unique!] : [item.unique!]; + this._isSelectionMode = selection.length > 0; this.modalContext?.setValue({ selection }); } - #onDeselected(item: UmbMediaCardItemModel) { + #onDeselected(item: UmbMediaTreeItemModel | UmbMediaSearchItemModel) { const selection = this.value.selection.filter((value) => value !== item.unique); + this._isSelectionMode = selection.length > 0; this.modalContext?.setValue({ selection }); } - async #filterMediaItems() { + #clearSearch() { + this._searchQuery = ''; + this._searchResult = []; + } + + async #searchMedia() { if (!this._searchQuery) { - // No search query, show all media items in current folder. - this._mediaFilteredList = this.#mediaItemsCurrentFolder; + this.#clearSearch(); + this._searching = false; return; } const query = this._searchQuery; - const { data } = await this.#mediaItemRepository.search({ query, skip: 0, take: 100 }); + const { data } = await this.#mediaSearchProvider.search({ query, searchFrom: this._searchFrom }); if (!data) { // No search results. - this._mediaFilteredList = []; - return; - } - - if (this._searchOnlyThisFolder) { - // Don't have to map urls here, because we already have everything loaded within this folder. - this._mediaFilteredList = this.#mediaItemsCurrentFolder.filter((media) => - data.find((item) => item.unique === media.unique), - ); + this._searchResult = []; + this._searching = false; return; } // Map urls for search results as we are going to show for all folders (as long they aren't trashed). - this._mediaFilteredList = data.filter((found) => found.isTrashed === false); + this._searchResult = data.items; + this._searching = false; } #debouncedSearch = debounce(() => { - this.#filterMediaItems(); + this.#searchMedia(); }, 500); #onSearch(e: UUIInputEvent) { this._searchQuery = (e.target.value as string).toLocaleLowerCase(); + this._searching = true; this.#debouncedSearch(); } #onPathChange(e: CustomEvent) { - this._currentMediaEntity = (e.target as UmbMediaPickerFolderPathElement).currentMedia || { - unique: null, - entityType: UMB_MEDIA_ROOT_ENTITY_TYPE, - }; - this.#loadMediaFolder(); + const newPath = e.target as UmbMediaPickerFolderPathElement; + + if (newPath.currentMedia) { + this._currentMediaEntity = newPath.currentMedia; + } else if (this._startNode) { + this._currentMediaEntity = { + name: this._startNode.name, + unique: this._startNode.unique, + entityType: this._startNode.entityType, + }; + } else { + this._currentMediaEntity = root; + } + + if (this._currentMediaEntity.unique) { + this._searchFrom = { unique: this._currentMediaEntity.unique, entityType: this._currentMediaEntity.entityType }; + } else { + this._searchFrom = undefined; + } + + this.#loadChildrenOfCurrentMediaItem(); + } + + #allowNavigateToMedia(item: UmbMediaTreeItemModel | UmbMediaSearchItemModel): boolean { + return isUmbracoFolder(item.mediaType.unique) || item.hasChildren; + } + + #onSearchFromChange(e: CustomEvent) { + const checked = (e.target as HTMLInputElement).checked; + + if (checked) { + this._searchFrom = { unique: this._currentMediaEntity.unique, entityType: this._currentMediaEntity.entityType }; + } else { + this._searchFrom = undefined; + } } override render() { return html` - ${this.#renderBody()} ${this.#renderPath()} + ${this.#renderBody()} ${this.#renderBreadcrumb()}
    this.#loadMediaFolder()} .parentUnique=${this._currentMediaEntity.unique}> - ${ - !this._mediaFilteredList.length - ? html`

    ${this.localize.term('content_listViewNoItems')}

    ` - : html`
    - ${repeat( - this._mediaFilteredList, - (item) => item.unique, - (item) => this.#renderCard(item), - )} -
    ` - } -
    `; + this.#loadChildrenOfCurrentMediaItem()} + .parentUnique=${this._currentMediaEntity.unique}> + ${this._searchQuery ? this.#renderSearchResult() : this.#renderCurrentChildren()} `; + } + + #renderSearchResult() { + return html` + ${!this._searchResult.length && !this._searching + ? html`

    ${this.localize.term('content_listViewNoItems')}

    ` + : html`
    + ${repeat( + this._searchResult, + (item) => item.unique, + (item) => this.#renderCard(item), + )} +
    `} + `; + } + + #renderCurrentChildren() { + return html` + ${!this._currentChildren.length + ? html`

    ${this.localize.term('content_listViewNoItems')}

    ` + : html`
    + ${repeat( + this._currentChildren, + (item) => item.unique, + (item) => this.#renderCard(item), + )} +
    `} + `; } #renderToolbar() { @@ -192,23 +290,35 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< - + @input=${this.#onSearch} + value=${this._searchQuery}> +
    + ${this._searching + ? html`` + : html``} +
    - (this._searchOnlyThisFolder = !this._searchOnlyThisFolder)} - label=${this.localize.term('general_excludeFromSubFolders')}> + + ${this._currentMediaEntity.unique && this._currentMediaEntity.unique !== this._startNode?.unique + ? html`` + : nothing}
this._dropzone.browse()} label=${this.localize.term('general_upload')} - look="primary"> + look="outline" + color="default">
`; } - #renderCard(item: UmbMediaCardItemModel) { - const disabled = !this._selectableFilter(item); + #renderCard(item: UmbMediaTreeItemModel | UmbMediaSearchItemModel) { + const canNavigate = this.#allowNavigateToMedia(item); + const selectable = this._selectableFilter(item); + const disabled = !(selectable || canNavigate); return html` this.#onSelected(item)} @deselected=${() => this.#onDeselected(item)} ?selected=${this.value?.selection?.find((value) => value === item.unique)} - ?selectable=${!disabled}> + ?selectable=${selectable} + ?select-only=${this._isSelectionMode || canNavigate === false}> `; } @@ -244,16 +370,17 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< #search { flex: 1; } + #search uui-input { width: 100%; margin-bottom: var(--uui-size-3); } - #search uui-icon { - height: 100%; - display: flex; - align-items: stretch; - padding-left: var(--uui-size-3); + + #searching-indicator { + margin-left: 7px; + margin-top: 4px; } + #media-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); @@ -261,6 +388,12 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< gap: var(--uui-size-space-5); padding-bottom: 5px; /** The modal is a bit jumpy due to the img card focus/hover border. This fixes the issue. */ } + + /** TODO: Remove this fix when UUI gets upgrade to 1.3 */ + umb-imaging-thumbnail { + pointer-events: none; + } + umb-icon { font-size: var(--uui-size-8); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts index 032103dc2387..178d7a6e17ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/media-item.repository.ts @@ -12,6 +12,13 @@ export class UmbMediaItemRepository extends UmbItemRepositoryBase) => MediaService.getItemMedia({ id: uni const mapper = (item: MediaItemResponseModel): UmbMediaItemModel => { return { entityType: UMB_MEDIA_ENTITY_TYPE, - unique: item.id, + hasChildren: item.hasChildren, isTrashed: item.isTrashed, + unique: item.id, mediaType: { unique: item.mediaType.id, icon: item.mediaType.icon, collection: item.mediaType.collection ? { unique: item.mediaType.collection.id } : null, }, + name: item.variants[0]?.name, // TODO: get correct variant name + parent: item.parent ? { unique: item.parent.id } : null, variants: item.variants.map((variant) => { return { culture: variant.culture || null, name: variant.name, }; }), - name: item.variants[0]?.name, // TODO: get correct variant name }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts index 5dd1780a064a..8aa5ce0232ca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/item/types.ts @@ -1,17 +1,20 @@ import type { UmbMediaEntityType } from '../../entity.js'; +import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity'; import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbMediaItemModel { entityType: UmbMediaEntityType; - unique: string; + hasChildren: boolean; isTrashed: boolean; + unique: string; mediaType: { unique: string; icon: string; collection: UmbReferenceByUnique | null; }; - variants: Array; name: string; // TODO: get correct variant name + parent: { unique: UmbEntityUnique } | null; // TODO: Use UmbReferenceByUnique when it support unique as null + variants: Array; } export interface UmbMediaItemVariantModel { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/index.ts new file mode 100644 index 000000000000..b00dda3055b6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/index.ts @@ -0,0 +1,2 @@ +export * from './media.search-provider.js'; +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts index cda2d907f4c9..d47162bcbe7b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.repository.ts @@ -1,5 +1,5 @@ import { UmbMediaSearchServerDataSource } from './media-search.server.data-source.js'; -import type { UmbMediaSearchItemModel } from './media.search-provider.js'; +import type { UmbMediaSearchItemModel } from './types.js'; import type { UmbSearchRepository, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts index 93f8357e0427..5edc2a27373d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media-search.server.data-source.ts @@ -1,5 +1,5 @@ import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; -import type { UmbMediaSearchItemModel } from './media.search-provider.js'; +import type { UmbMediaSearchItemModel } from './types.js'; import type { UmbSearchDataSource, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; @@ -33,28 +33,31 @@ export class UmbMediaSearchServerDataSource implements UmbSearchDataSource = data.items.map((item) => { return { - href: '/section/media/workspace/media/edit/' + item.id, entityType: UMB_MEDIA_ENTITY_TYPE, - unique: item.id, + hasChildren: item.hasChildren, + href: '/section/media/workspace/media/edit/' + item.id, isTrashed: item.isTrashed, + unique: item.id, mediaType: { - unique: item.mediaType.id, - icon: item.mediaType.icon, collection: item.mediaType.collection ? { unique: item.mediaType.collection.id } : null, + icon: item.mediaType.icon, + unique: item.mediaType.id, }, + name: item.variants[0]?.name, // TODO: get correct variant name + parent: item.parent ? { unique: item.parent.id } : null, variants: item.variants.map((variant) => { return { culture: variant.culture || null, name: variant.name, }; }), - name: item.variants[0]?.name, // TODO: get correct variant name }; }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts index 973ab4df26aa..fa9439674e67 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/media.search-provider.ts @@ -1,12 +1,8 @@ -import type { UmbMediaItemModel } from '../index.js'; import { UmbMediaSearchRepository } from './media-search.repository.js'; +import type { UmbMediaSearchItemModel } from './types.js'; import type { UmbSearchProvider, UmbSearchRequestArgs } from '@umbraco-cms/backoffice/search'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -export interface UmbMediaSearchItemModel extends UmbMediaItemModel { - href: string; -} - export class UmbMediaSearchProvider extends UmbControllerBase implements UmbSearchProvider { #repository = new UmbMediaSearchRepository(this); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/search/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/types.ts new file mode 100644 index 000000000000..a0d28611aa2e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/search/types.ts @@ -0,0 +1,5 @@ +import type { UmbMediaItemModel } from '../repository/index.js'; + +export interface UmbMediaSearchItemModel extends UmbMediaItemModel { + href: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts index a32e6ff96dd9..c96f5a1c212b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace.context.ts @@ -2,6 +2,7 @@ import { UMB_MEMBER_TYPE_DETAIL_REPOSITORY_ALIAS } from '../repository/detail/in import type { UmbMemberTypeDetailModel } from '../types.js'; import { UMB_MEMBER_TYPE_ENTITY_TYPE } from '../index.js'; import { UmbMemberTypeWorkspaceEditorElement } from './member-type-workspace-editor.element.js'; +import { UMB_MEMBER_TYPE_WORKSPACE_ALIAS } from './manifests.js'; import { type UmbRoutableWorkspaceContext, UmbWorkspaceIsNewRedirectController, @@ -11,7 +12,6 @@ import { type UmbContentTypeWorkspaceContext, UmbContentTypeWorkspaceContextBase, } from '@umbraco-cms/backoffice/content-type'; -import { UMB_MEMBER_TYPE_WORKSPACE_ALIAS } from './manifests.js'; import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity'; type EntityDetailModel = UmbMemberTypeDetailModel; From 87ab29aa3941f67e630a6d3b7ecd2b1d0581e33e Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 25 Nov 2024 18:23:08 +0100 Subject: [PATCH 101/167] Updated nuget packages (#17632) --- Directory.Packages.props | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index b5e032d22789..a1ccfa6765e7 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,7 +3,6 @@ true - @@ -11,7 +10,6 @@ - @@ -37,20 +35,18 @@ - - - - + + @@ -77,11 +73,10 @@ - + - + - @@ -95,7 +90,7 @@ - + @@ -103,4 +98,4 @@ - + \ No newline at end of file From e42fa14da56d45310321d2e1e9972f00f1ea1657 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 26 Nov 2024 08:38:10 +0100 Subject: [PATCH 102/167] generate management api types --- .../src/external/backend-api/src/types.gen.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts index 2f2b1909e313..05a782015ecb 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/types.gen.ts @@ -1634,7 +1634,7 @@ export type PackageDefinitionResponseModel = { languages: Array<(string)>; dictionaryItems: Array<(string)>; id: string; - packagePath: string; + readonly packagePath: string; }; export type PackageMigrationStatusResponseModel = { @@ -2072,10 +2072,10 @@ export type RelationReferenceModel = { export type RelationResponseModel = { id: string; relationType: (ReferenceByIdModel); - parent: (RelationReferenceModel); - child: (RelationReferenceModel); - createDate: string; - comment?: (string) | null; + readonly parent: (RelationReferenceModel); + readonly child: (RelationReferenceModel); + readonly createDate: string; + readonly comment?: (string) | null; }; export type RelationTypeItemResponseModel = { @@ -2592,7 +2592,7 @@ export type UpdatePackageRequestModel = { scripts: Array<(string)>; languages: Array<(string)>; dictionaryItems: Array<(string)>; - packagePath: string; + readonly packagePath: string; }; export type UpdatePartialViewRequestModel = { From b6551d63b70b683b826072a927fd0e395683a0bf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 26 Nov 2024 08:38:21 +0100 Subject: [PATCH 103/167] fix merge error --- .../src/mocks/data/document-blueprint/document-blueprint.db.ts | 2 -- .../src/mocks/data/document/document.db.ts | 2 -- src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts | 2 -- 3 files changed, 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts index dd0416a99a76..68800650b1d3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts @@ -107,8 +107,6 @@ const itemMapper = (model: UmbMockDocumentBlueprintModel): DocumentItemResponseM isTrashed: model.isTrashed, parent: model.parent, variants: model.variants, - hasChildren: model.hasChildren, - parent: model.parent, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts index 79d16d747eb1..52240a55ccbc 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document/document.db.ts @@ -132,8 +132,6 @@ const itemMapper = (model: UmbMockDocumentModel): DocumentItemResponseModel => { isTrashed: model.isTrashed, parent: model.parent, variants: model.variants, - hasChildren: model.hasChildren, - parent: model.parent, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts index bbc564af50d6..9f160d7a356a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/media/media.db.ts @@ -104,8 +104,6 @@ const itemMapper = (model: UmbMockMediaModel): MediaItemResponseModel => { isTrashed: model.isTrashed, parent: model.parent, variants: model.variants, - hasChildren: model.hasChildren, - parent: model.parent, }; }; From 134ec77da05a3ccb48dec268d0c340c01baf2274 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 26 Nov 2024 09:08:22 +0100 Subject: [PATCH 104/167] fix: should check specifically for if pathname is undefined or empty --- .../packages/core/utils/path/has-own-opener.function.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts index 3fda364240ed..5d4ee2ce53bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts @@ -22,11 +22,12 @@ export function hasOwnOpener(pathname?: string, windowLike: Window = globalThis. return false; } - if (pathname && openerLocation.pathname.startsWith(pathname)) { - return true; + // If there is a pathname, check if the opener has the same pathname + if (typeof pathname !== 'undefined' && !openerLocation.pathname.startsWith(pathname)) { + return false; } - return false; + return true; } catch { // If there is a security error, it means that the opener is from a different origin, so we let it fall through return false; From 1b3782f2b0ad8533101d2a498944acca345ce6c0 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 26 Nov 2024 09:08:22 +0100 Subject: [PATCH 105/167] fix: should check specifically for if pathname is undefined or empty --- .../packages/core/utils/path/has-own-opener.function.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts index 3fda364240ed..5d4ee2ce53bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts @@ -22,11 +22,12 @@ export function hasOwnOpener(pathname?: string, windowLike: Window = globalThis. return false; } - if (pathname && openerLocation.pathname.startsWith(pathname)) { - return true; + // If there is a pathname, check if the opener has the same pathname + if (typeof pathname !== 'undefined' && !openerLocation.pathname.startsWith(pathname)) { + return false; } - return false; + return true; } catch { // If there is a security error, it means that the opener is from a different origin, so we let it fall through return false; From 72596bd853544847ff038944d0a09b75ee1416e8 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 26 Nov 2024 09:08:22 +0100 Subject: [PATCH 106/167] fix: should check specifically for if pathname is undefined or empty --- .../packages/core/utils/path/has-own-opener.function.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts index 3fda364240ed..5d4ee2ce53bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/has-own-opener.function.ts @@ -22,11 +22,12 @@ export function hasOwnOpener(pathname?: string, windowLike: Window = globalThis. return false; } - if (pathname && openerLocation.pathname.startsWith(pathname)) { - return true; + // If there is a pathname, check if the opener has the same pathname + if (typeof pathname !== 'undefined' && !openerLocation.pathname.startsWith(pathname)) { + return false; } - return false; + return true; } catch { // If there is a security error, it means that the opener is from a different origin, so we let it fall through return false; From 29837fe59dea611bfe7b435bf4af229fa6e30a95 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 26 Nov 2024 09:55:51 +0100 Subject: [PATCH 107/167] Fixes routing issues (#17572) * Child of second root should also hide root path and backoffice needs to show all domains for each language. * Fixes routing issues based on findings https://github.com/umbraco/Umbraco-CMS/pull/17572#issuecomment-2486219574 * Revert "Fixes routing issues based on findings https://github.com/umbraco/Umbraco-CMS/pull/17572#issuecomment-2486219574" This reverts commit ba7fb5cc904fbe602450ac109e1821282b7f69d6. * Fix urls of descendants of non-first roots do not show the root urlsegment when HideTopLevel is true --- .../Services/DocumentUrlService.cs | 191 +++++++++++++----- ...ument-workspace-view-info-links.element.ts | 29 +-- .../Services/DocumentUrlServiceTest.cs | 39 ++++ ...cumentUrlServiceTest_hidetoplevel_false.cs | 29 +++ 4 files changed, 222 insertions(+), 66 deletions(-) diff --git a/src/Umbraco.Core/Services/DocumentUrlService.cs b/src/Umbraco.Core/Services/DocumentUrlService.cs index 95e93c58eb2b..58af9805f1c5 100644 --- a/src/Umbraco.Core/Services/DocumentUrlService.cs +++ b/src/Umbraco.Core/Services/DocumentUrlService.cs @@ -393,7 +393,19 @@ public async Task DeleteUrlsFromCacheAsync(IEnumerable documentKeysEnumera return GetTopMostRootKey(isDraft, culture); } - // Otherwise we have to find the root items (or child of the first root when hideTopLevelNodeFromPath is true) and follow the url segments in them to get to correct document key + // Special case for all top level nodes except the first (that will have /) + if (runnerKey is null && urlSegments.Length == 1 && hideTopLevelNodeFromPath is true) + { + IEnumerable rootKeys = GetKeysInRoot(false, isDraft, culture); + Guid? rootKeyWithUrlSegment = GetChildWithUrlSegment(rootKeys, urlSegments.First(), culture, isDraft); + + if (rootKeyWithUrlSegment is not null) + { + return rootKeyWithUrlSegment; + } + } + + // Otherwise we have to find the root items (or child of the roots when hideTopLevelNodeFromPath is true) and follow the url segments in them to get to correct document key for (var index = 0; index < urlSegments.Length; index++) { var urlSegment = urlSegments[index]; @@ -447,7 +459,7 @@ public string GetLegacyRouteFormat(Guid documentKey, string? culture, bool isDra var cultureOrDefault = string.IsNullOrWhiteSpace(culture) is false ? culture : _languageService.GetDefaultIsoCodeAsync().GetAwaiter().GetResult(); Guid[] ancestorsOrSelfKeysArray = ancestorsOrSelfKeys as Guid[] ?? ancestorsOrSelfKeys.ToArray(); - IDictionary ancestorOrSelfKeyToDomains = ancestorsOrSelfKeysArray.ToDictionary(x => x, ancestorKey => + ILookup ancestorOrSelfKeyToDomains = ancestorsOrSelfKeysArray.ToLookup(x => x, ancestorKey => { Attempt idAttempt = _idKeyMap.GetIdForKey(ancestorKey, UmbracoObjectTypes.Document); @@ -466,13 +478,11 @@ public string GetLegacyRouteFormat(Guid documentKey, string? culture, bool isDra foreach (Guid ancestorOrSelfKey in ancestorsOrSelfKeysArray) { - if (ancestorOrSelfKeyToDomains.TryGetValue(ancestorOrSelfKey, out Domain? domain)) + var domains = ancestorOrSelfKeyToDomains[ancestorOrSelfKey].WhereNotNull(); + if (domains.Any()) { - if (domain is not null) - { - foundDomain = domain; - break; - } + foundDomain = domains.First();// What todo here that is better? + break; } if (_cache.TryGetValue(CreateCacheKey(ancestorOrSelfKey, cultureOrDefault, isDraft), out PublishedDocumentUrlSegment? publishedDocumentUrlSegment)) @@ -528,7 +538,7 @@ public async Task> ListUrlsAsync(Guid contentKey) var cultures = languages.ToDictionary(x=>x.IsoCode); Guid[] ancestorsOrSelfKeysArray = ancestorsOrSelfKeys as Guid[] ?? ancestorsOrSelfKeys.ToArray(); - Dictionary>> ancestorOrSelfKeyToDomains = ancestorsOrSelfKeysArray.ToDictionary(x => x, async ancestorKey => + Dictionary>> ancestorOrSelfKeyToDomains = ancestorsOrSelfKeysArray.ToDictionary(x => x, async ancestorKey => { Attempt idAttempt = _idKeyMap.GetIdForKey(ancestorKey, UmbracoObjectTypes.Document); @@ -537,35 +547,43 @@ public async Task> ListUrlsAsync(Guid contentKey) return null; } IEnumerable domains = _domainCacheService.GetAssigned(idAttempt.Result, false); - return domains.ToDictionary(x => x.Culture!); + return domains.ToLookup(x => x.Culture!); })!; foreach ((string culture, ILanguage language) in cultures) { - var urlSegments = new List(); - Domain? foundDomain = null; + var urlSegments = new List(); + List foundDomains = new List(); - var hasUrlInCulture = true; - foreach (Guid ancestorOrSelfKey in ancestorsOrSelfKeysArray) - { - if (ancestorOrSelfKeyToDomains.TryGetValue(ancestorOrSelfKey, out Task>? domainDictionaryTask)) + var hasUrlInCulture = true; + foreach (Guid ancestorOrSelfKey in ancestorsOrSelfKeysArray) + { + var domainLookup = await ancestorOrSelfKeyToDomains[ancestorOrSelfKey]; + if (domainLookup.Any()) { - Dictionary domainDictionary = await domainDictionaryTask; - if (domainDictionary.TryGetValue(culture, out Domain? domain)) + var domains = domainLookup[culture]; + foreach (Domain domain in domains) { - Attempt domainKeyAttempt = _idKeyMap.GetKeyForId(domain.ContentId, UmbracoObjectTypes.Document); + Attempt domainKeyAttempt = + _idKeyMap.GetKeyForId(domain.ContentId, UmbracoObjectTypes.Document); if (domainKeyAttempt.Success) { if (_publishStatusQueryService.IsDocumentPublished(domainKeyAttempt.Result, culture)) { - foundDomain = domain; - break; + foundDomains.Add(domain); } } } + + if (foundDomains.Any()) + { + break; + } } - if (_cache.TryGetValue(CreateCacheKey(ancestorOrSelfKey, culture, false), out PublishedDocumentUrlSegment? publishedDocumentUrlSegment)) + if (_cache.TryGetValue( + CreateCacheKey(ancestorOrSelfKey, culture, false), + out PublishedDocumentUrlSegment? publishedDocumentUrlSegment)) { urlSegments.Add(publishedDocumentUrlSegment.UrlSegment); } @@ -573,34 +591,75 @@ public async Task> ListUrlsAsync(Guid contentKey) { hasUrlInCulture = false; } - } + } + + //If we did not find a domain and this is not the default language, then the content is not routable + if (foundDomains.Any() is false && language.IsDefault is false) + { + continue; + } - //If we did not find a domain and this is not the default language, then the content is not routable - if (foundDomain is null && language.IsDefault is false) - { - continue; - } - var isRootFirstItem = GetTopMostRootKey(false, culture) == ancestorsOrSelfKeysArray.Last(); + var isRootFirstItem = GetTopMostRootKey(false, culture) == ancestorsOrSelfKeysArray.Last(); + + var leftToRight = _globalSettings.ForceCombineUrlPathLeftToRight + || CultureInfo.GetCultureInfo(culture).TextInfo.IsRightToLeft is false; + if (leftToRight) + { + urlSegments.Reverse(); + } + + // If no domain was found, we need to add a null domain to the list to make sure we check for no domains. + if (foundDomains.Any() is false) + { + foundDomains.Add(null); + } + + foreach (Domain? foundDomain in foundDomains) + { + var foundUrl = GetFullUrl(isRootFirstItem, urlSegments, foundDomain, leftToRight); + + if (foundDomain is not null) + { + // if we found a domain, it should be safe to show url + result.Add(new UrlInfo( + text: foundUrl, + isUrl: hasUrlInCulture, + culture: culture + )); + } + else + { + // otherwise we need to ensure that no other page has the same url + // e.g. a site with two roots that both have a child with the same name + Guid? documentKeyByRoute = GetDocumentKeyByRoute(foundUrl, culture, foundDomain?.ContentId, false); + if (contentKey.Equals(documentKeyByRoute)) + { + result.Add(new UrlInfo( + text: foundUrl, + isUrl: hasUrlInCulture, + culture: culture + )); + } + else + { + result.Add(new UrlInfo( + text: "Conflict: Other page has the same url", + isUrl: false, + culture: culture + )); + } + } - var leftToRight = _globalSettings.ForceCombineUrlPathLeftToRight - || CultureInfo.GetCultureInfo(culture).TextInfo.IsRightToLeft is false; - if (leftToRight) - { - urlSegments.Reverse(); - } - result.Add(new UrlInfo( - text: GetFullUrl(isRootFirstItem, urlSegments, foundDomain, leftToRight), - isUrl: hasUrlInCulture, - culture: culture - )); + } } return result; } + private string GetFullUrl(bool isRootFirstItem, List segments, Domain? foundDomain, bool leftToRight) { var urlSegments = new List(segments); @@ -610,7 +669,7 @@ private string GetFullUrl(bool isRootFirstItem, List segments, Domain? f return foundDomain.Name.EnsureEndsWith("/") + string.Join('/', urlSegments); } - var hideTopLevel = _globalSettings.HideTopLevelNodeFromPath && isRootFirstItem; + var hideTopLevel = HideTopLevel(_globalSettings.HideTopLevelNodeFromPath, isRootFirstItem, urlSegments); if (leftToRight) { return '/' + string.Join('/', urlSegments.Skip(hideTopLevel ? 1 : 0)); @@ -624,6 +683,21 @@ private string GetFullUrl(bool isRootFirstItem, List segments, Domain? f return '/' + string.Join('/', urlSegments); } + private bool HideTopLevel(bool hideTopLevelNodeFromPath, bool isRootFirstItem, List urlSegments) + { + if (hideTopLevelNodeFromPath is false) + { + return false; + } + + if(isRootFirstItem is false && urlSegments.Count == 1) + { + return false; + } + + return true; + } + public async Task CreateOrUpdateUrlSegmentsWithDescendantsAsync(Guid key) { var id = _idKeyMap.GetIdForKey(key, UmbracoObjectTypes.Document).Result; @@ -646,7 +720,7 @@ public async Task CreateOrUpdateUrlSegmentsAsync(Guid key) } } - private IEnumerable GetKeysInRoot(bool addFirstLevelChildren, bool isDraft, string culture) + private IEnumerable GetKeysInRoot(bool considerFirstLevelAsRoot, bool isDraft, string culture) { if (_documentNavigationQueryService.TryGetRootKeys(out IEnumerable rootKeysEnumerable) is false) { @@ -655,13 +729,10 @@ private IEnumerable GetKeysInRoot(bool addFirstLevelChildren, bool isDraft IEnumerable rootKeys = rootKeysEnumerable as Guid[] ?? rootKeysEnumerable.ToArray(); - foreach (Guid rootKey in rootKeys) + if (considerFirstLevelAsRoot) { - yield return rootKey; - } + yield return rootKeys.First(); - if (addFirstLevelChildren) - { foreach (Guid rootKey in rootKeys) { if (isDraft is false && IsContentPublished(rootKey, culture) is false) @@ -677,6 +748,13 @@ private IEnumerable GetKeysInRoot(bool addFirstLevelChildren, bool isDraft } } } + else + { + foreach (Guid rootKey in rootKeys) + { + yield return rootKey; + } + } } @@ -710,11 +788,7 @@ private IEnumerable GetChildKeys(Guid documentKey) return Enumerable.Empty(); } - /// - /// Gets the top most root key. - /// - /// The top most root key. - private Guid? GetTopMostRootKey(bool isDraft, string culture) + private IEnumerable GetRootKeys(bool isDraft, string culture) { if (_documentNavigationQueryService.TryGetRootKeys(out IEnumerable rootKeys)) { @@ -722,11 +796,20 @@ private IEnumerable GetChildKeys(Guid documentKey) { if (isDraft || IsContentPublished(rootKey, culture)) { - return rootKey; + yield return rootKey; } } } - return null; + } + + + /// + /// Gets the top most root key. + /// + /// The top most root key. + private Guid? GetTopMostRootKey(bool isDraft, string culture) + { + return GetRootKeys(isDraft, culture).Cast().FirstOrDefault(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-links.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-links.element.ts index 7165a5a78613..18e6b48db92b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-links.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-links.element.ts @@ -22,7 +22,7 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement { private _variantOptions?: Array; @state() - private _lookup: Record = {}; + private _lookup: Record = {}; constructor() { super(); @@ -56,7 +56,10 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement { if (data?.length) { data[0].urls.forEach((item) => { if (item.culture && item.url) { - this._lookup[item.culture] = item.url; + if(this._lookup[item.culture] == null){ + this._lookup[item.culture] = []; + } + this._lookup[item.culture].push(item.url); } }); this.requestUpdate('_lookup'); @@ -108,18 +111,20 @@ export class UmbDocumentWorkspaceViewInfoLinksElement extends UmbLitElement { #renderUrl(variantOption: UmbDocumentVariantOptionModel) { const varies = !!variantOption.culture; const culture = varies ? variantOption.culture! : variantOption.language.unique; - const url = this._lookup[culture]; + const urls = this._lookup[culture]; return when( - url, + urls && urls.length >= 1, () => html` - - - ${varies ? culture : nothing} - ${url} - - - - `, + ${urls.map((url) => + html` + + + ${varies ? culture : nothing} + ${url} + + + ` + )}`, () => html`