From b05d71f76c9b58b77fe927b2c1df1a695de45b16 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 23 Feb 2021 16:09:36 +0100 Subject: [PATCH 01/14] Replaced static events in TreeControllerBase with IEventAggregator notifications --- .../Trees/ApplicationTreeController.cs | 4 +- .../Trees/ContentBlueprintTreeController.cs | 6 +- .../Trees/ContentTreeController.cs | 6 +- .../Trees/ContentTreeControllerBase.cs | 6 +- .../Trees/ContentTypeTreeController.cs | 3 +- .../Trees/DataTypeTreeController.cs | 3 +- .../Trees/DictionaryTreeController.cs | 3 +- .../Trees/FileSystemTreeController.cs | 6 +- .../Trees/FilesTreeController.cs | 8 ++- .../Trees/LanguageTreeController.cs | 6 +- .../Trees/LogViewerTreeController.cs | 6 +- .../Trees/MacrosTreeController.cs | 3 +- .../Trees/MediaTreeController.cs | 6 +- .../Trees/MediaTypeTreeController.cs | 3 +- .../Trees/MemberGroupTreeController.cs | 8 ++- .../Trees/MemberTreeController.cs | 6 +- .../MemberTypeAndGroupTreeControllerBase.cs | 6 +- .../Trees/MemberTypeTreeController.cs | 8 ++- .../Trees/MenuRendering.cs | 36 ++++++++++++ .../Trees/MenuRenderingEventArgs.cs | 25 -------- .../Trees/PackagesTreeController.cs | 6 +- .../Trees/PartialViewMacrosTreeController.cs | 8 ++- .../Trees/PartialViewsTreeController.cs | 6 +- .../Trees/RelationTypeTreeController.cs | 6 +- .../Trees/RootNodeRendering.cs | 22 +++++++ .../Trees/ScriptsTreeController.cs | 8 ++- .../Trees/StylesheetsTreeController.cs | 8 ++- .../Trees/TemplatesTreeController.cs | 6 +- .../Trees/TreeController.cs | 7 ++- .../Trees/TreeControllerBase.cs | 57 ++++--------------- .../Trees/TreeNodeRenderingEventArgs.cs | 16 ------ .../Trees/TreeNodesRendering.cs | 25 ++++++++ .../Trees/TreeNodesRenderingEventArgs.cs | 16 ------ .../Trees/TreeRenderingEventArgs.cs | 15 ----- .../Trees/UserTreeController.cs | 6 +- 35 files changed, 195 insertions(+), 175 deletions(-) create mode 100644 src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs delete mode 100644 src/Umbraco.Web.BackOffice/Trees/MenuRenderingEventArgs.cs create mode 100644 src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs delete mode 100644 src/Umbraco.Web.BackOffice/Trees/TreeNodeRenderingEventArgs.cs create mode 100644 src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs delete mode 100644 src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingEventArgs.cs delete mode 100644 src/Umbraco.Web.BackOffice/Trees/TreeRenderingEventArgs.cs diff --git a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs index 84f2b5f574..8b1fb747a7 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs @@ -265,7 +265,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees } var controller = (TreeControllerBase)result.Value; - var rootNodeResult = controller.GetRootNode(querystring); + var rootNodeResult = await controller.GetRootNode(querystring); if (!(rootNodeResult.Result is null)) { return rootNodeResult.Result; @@ -305,7 +305,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees } var controller = (TreeControllerBase)controllerResult.Value; - return controller.GetNodes(id.ToInvariantString(), querystring); + return await controller.GetNodes(id.ToInvariantString(), querystring); } /// diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs index 4b48902e17..9b6ccf91f6 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentBlueprintTreeController.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Models.Trees; @@ -40,8 +41,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees IMenuItemCollectionFactory menuItemCollectionFactory, IContentService contentService, IContentTypeService contentTypeService, - IEntityService entityService) - : base(localizedTextService, umbracoApiControllerTypeCollection) + IEntityService entityService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory ?? throw new ArgumentNullException(nameof(menuItemCollectionFactory)); _contentService = contentService ?? throw new ArgumentNullException(nameof(contentService)); diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs index 63326a8c7a..6295897d52 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Entities; @@ -58,8 +59,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees IOptions globalSettings, IContentService contentService, IPublicAccessService publicAccessService, - ILocalizationService localizationService) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, entityService, backofficeSecurityAccessor, logger, actionCollection, userService, dataTypeService) + ILocalizationService localizationService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, entityService, backofficeSecurityAccessor, logger, actionCollection, userService, dataTypeService, eventAggregator) { _treeSearcher = treeSearcher; _actions = actions; diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs index 7bb9782c5e..447c896b8a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTreeControllerBase.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Models.Trees; @@ -39,9 +40,10 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILogger logger, ActionCollection actionCollection, IUserService userService, - IDataTypeService dataTypeService + IDataTypeService dataTypeService, + IEventAggregator eventAggregator ) - : base(localizedTextService, umbracoApiControllerTypeCollection) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _entityService = entityService; _backofficeSecurityAccessor = backofficeSecurityAccessor; diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs index 2151141406..cc81af330a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Trees; @@ -30,7 +31,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees private readonly IContentTypeService _contentTypeService; private readonly IEntityService _entityService; - public ContentTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IContentTypeService contentTypeService, IEntityService entityService) : base(localizedTextService, umbracoApiControllerTypeCollection) + public ContentTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IContentTypeService contentTypeService, IEntityService entityService, IEventAggregator eventAggregator) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _treeSearcher = treeSearcher; _menuItemCollectionFactory = menuItemCollectionFactory; diff --git a/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs index 714fb6954c..35876f983a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Trees; @@ -31,7 +32,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees private readonly IDataTypeService _dataTypeService; - public DataTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IEntityService entityService, IDataTypeService dataTypeService) : base(localizedTextService, umbracoApiControllerTypeCollection) + public DataTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IEntityService entityService, IDataTypeService dataTypeService, IEventAggregator eventAggregator) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _treeSearcher = treeSearcher; _menuItemCollectionFactory = menuItemCollectionFactory; diff --git a/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs index 3355cc5312..7dc1f386fe 100644 --- a/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/DictionaryTreeController.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; @@ -28,7 +29,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees private readonly IMenuItemCollectionFactory _menuItemCollectionFactory; private readonly ILocalizationService _localizationService; - public DictionaryTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, ILocalizationService localizationService) : base(localizedTextService, umbracoApiControllerTypeCollection) + public DictionaryTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, ILocalizationService localizationService, IEventAggregator eventAggregator) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory; _localizationService = localizationService; diff --git a/src/Umbraco.Web.BackOffice/Trees/FileSystemTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/FileSystemTreeController.cs index fffa767ad0..9ee334013a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/FileSystemTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/FileSystemTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; @@ -20,9 +21,10 @@ namespace Umbraco.Cms.Web.BackOffice.Trees protected FileSystemTreeController( ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, - IMenuItemCollectionFactory menuItemCollectionFactory + IMenuItemCollectionFactory menuItemCollectionFactory, + IEventAggregator eventAggregator ) - : base(localizedTextService, umbracoApiControllerTypeCollection) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { MenuItemCollectionFactory = menuItemCollectionFactory; } diff --git a/src/Umbraco.Web.BackOffice/Trees/FilesTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/FilesTreeController.cs index e324cddfbc..7caf6256d9 100644 --- a/src/Umbraco.Web.BackOffice/Trees/FilesTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/FilesTreeController.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -18,8 +19,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IPhysicalFileSystem fileSystem) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IPhysicalFileSystem fileSystem, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { FileSystem = fileSystem; } diff --git a/src/Umbraco.Web.BackOffice/Trees/LanguageTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/LanguageTreeController.cs index a3e55a68dc..a0a80a8206 100644 --- a/src/Umbraco.Web.BackOffice/Trees/LanguageTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/LanguageTreeController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; @@ -19,8 +20,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees public LanguageTreeController( ILocalizedTextService textService, - UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection) - : base(textService, umbracoApiControllerTypeCollection) + UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, + IEventAggregator eventAggregator) + : base(textService, umbracoApiControllerTypeCollection, eventAggregator) { } protected override ActionResult GetTreeNodes(string id, FormCollection queryStrings) diff --git a/src/Umbraco.Web.BackOffice/Trees/LogViewerTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/LogViewerTreeController.cs index 7a9eec99fe..e24fcfb09e 100644 --- a/src/Umbraco.Web.BackOffice/Trees/LogViewerTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/LogViewerTreeController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; @@ -18,8 +19,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees { public LogViewerTreeController( ILocalizedTextService localizedTextService, - UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection) - : base(localizedTextService, umbracoApiControllerTypeCollection) + UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { } diff --git a/src/Umbraco.Web.BackOffice/Trees/MacrosTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MacrosTreeController.cs index 8f587bd9a4..c29518473d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MacrosTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MacrosTreeController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -22,7 +23,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees private readonly IMenuItemCollectionFactory _menuItemCollectionFactory; private readonly IMacroService _macroService; - public MacrosTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, IMacroService macroService) : base(localizedTextService, umbracoApiControllerTypeCollection) + public MacrosTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, IMacroService macroService, IEventAggregator eventAggregator) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory; _macroService = macroService; diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTreeController.cs index 74c6ef39d2..2ceeb5b30a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTreeController.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Entities; @@ -45,8 +46,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees IUserService userService, IDataTypeService dataTypeService, UmbracoTreeSearcher treeSearcher, - IMediaService mediaService) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, entityService, backofficeSecurityAccessor, logger, actionCollection, userService, dataTypeService) + IMediaService mediaService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, entityService, backofficeSecurityAccessor, logger, actionCollection, userService, dataTypeService, eventAggregator) { _treeSearcher = treeSearcher; _mediaService = mediaService; diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index 8b1a6c70a1..14681d8735 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Trees; @@ -30,7 +31,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees private readonly IMediaTypeService _mediaTypeService; private readonly IEntityService _entityService; - public MediaTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IMediaTypeService mediaTypeService, IEntityService entityService) : base(localizedTextService, umbracoApiControllerTypeCollection) + public MediaTypeTreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, UmbracoTreeSearcher treeSearcher, IMenuItemCollectionFactory menuItemCollectionFactory, IMediaTypeService mediaTypeService, IEntityService entityService, IEventAggregator eventAggregator) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _treeSearcher = treeSearcher; _menuItemCollectionFactory = menuItemCollectionFactory; diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs index 10379c7991..7445f35f29 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs @@ -1,9 +1,10 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; @@ -24,8 +25,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IMemberGroupService memberGroupService) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IMemberGroupService memberGroupService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { _memberGroupService = memberGroupService; } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTreeController.cs index ad5f21b48e..a0b08b00ea 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Trees; @@ -41,8 +42,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees IMenuItemCollectionFactory menuItemCollectionFactory, IMemberService memberService, IMemberTypeService memberTypeService, - IBackOfficeSecurityAccessor backofficeSecurityAccessor) - : base(localizedTextService, umbracoApiControllerTypeCollection) + IBackOfficeSecurityAccessor backofficeSecurityAccessor, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _treeSearcher = treeSearcher; _menuItemCollectionFactory = menuItemCollectionFactory; diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 35c4d04d9f..94c84accab 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -20,8 +21,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees protected MemberTypeAndGroupTreeControllerBase( ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, - IMenuItemCollectionFactory menuItemCollectionFactory) - : base(localizedTextService, umbracoApiControllerTypeCollection) + IMenuItemCollectionFactory menuItemCollectionFactory, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { MenuItemCollectionFactory = menuItemCollectionFactory; } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs index 731543a96c..8204658f17 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs @@ -1,9 +1,10 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Services; @@ -29,8 +30,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, UmbracoTreeSearcher treeSearcher, - IMemberTypeService memberTypeService) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IMemberTypeService memberTypeService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { _treeSearcher = treeSearcher; _memberTypeService = memberTypeService; diff --git a/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs b/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs new file mode 100644 index 0000000000..202d1464cb --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Trees; + +namespace Umbraco.Cms.Web.BackOffice.Trees +{ + /// + /// A notification that allows developers to modify the menu that is being rendered + /// + /// + /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. + /// + public class MenuRendering : INotification + { + public MenuRendering(string nodeId, MenuItemCollection menu, FormCollection queryStrings) + { + NodeId = nodeId; + Menu = menu; + QueryStrings = queryStrings; + } + + /// + /// The tree node id that the menu is rendering for + /// + public string NodeId { get; } + + /// + /// The menu being rendered + /// + public MenuItemCollection Menu { get; } + + public FormCollection QueryStrings { get; } + + + } +} diff --git a/src/Umbraco.Web.BackOffice/Trees/MenuRenderingEventArgs.cs b/src/Umbraco.Web.BackOffice/Trees/MenuRenderingEventArgs.cs deleted file mode 100644 index 5ec827eb4a..0000000000 --- a/src/Umbraco.Web.BackOffice/Trees/MenuRenderingEventArgs.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Umbraco.Cms.Core.Trees; - -namespace Umbraco.Cms.Web.BackOffice.Trees -{ - public class MenuRenderingEventArgs : TreeRenderingEventArgs - { - /// - /// The tree node id that the menu is rendering for - /// - public string NodeId { get; private set; } - - /// - /// The menu being rendered - /// - public MenuItemCollection Menu { get; private set; } - - public MenuRenderingEventArgs(string nodeId, MenuItemCollection menu, FormCollection queryStrings) - : base(queryStrings) - { - NodeId = nodeId; - Menu = menu; - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Trees/PackagesTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/PackagesTreeController.cs index 4d53671388..e54e33bcb6 100644 --- a/src/Umbraco.Web.BackOffice/Trees/PackagesTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/PackagesTreeController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; @@ -21,8 +22,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees public PackagesTreeController( ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, - IMenuItemCollectionFactory menuItemCollectionFactory) - : base(localizedTextService, umbracoApiControllerTypeCollection) + IMenuItemCollectionFactory menuItemCollectionFactory, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory; } diff --git a/src/Umbraco.Web.BackOffice/Trees/PartialViewMacrosTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/PartialViewMacrosTreeController.cs index 9a31a286e7..6403ec009d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/PartialViewMacrosTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/PartialViewMacrosTreeController.cs @@ -1,5 +1,6 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -30,8 +31,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IFileSystems fileSystems) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, fileSystems) + IFileSystems fileSystems, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, fileSystems, eventAggregator) { FileSystem = fileSystems.MacroPartialsFileSystem; } diff --git a/src/Umbraco.Web.BackOffice/Trees/PartialViewsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/PartialViewsTreeController.cs index b9a592ca31..ad8b9f16b4 100644 --- a/src/Umbraco.Web.BackOffice/Trees/PartialViewsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/PartialViewsTreeController.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Authorization; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -30,8 +31,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IFileSystems fileSystems) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IFileSystems fileSystems, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { FileSystem = fileSystems.PartialViewsFileSystem; } diff --git a/src/Umbraco.Web.BackOffice/Trees/RelationTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/RelationTypeTreeController.cs index f786e68ae0..6da2298e03 100644 --- a/src/Umbraco.Web.BackOffice/Trees/RelationTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/RelationTypeTreeController.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -27,8 +28,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IRelationService relationService) - : base(localizedTextService, umbracoApiControllerTypeCollection) + IRelationService relationService, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory; _relationService = relationService; diff --git a/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs b/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs new file mode 100644 index 0000000000..79269150a0 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Trees; + +namespace Umbraco.Cms.Web.BackOffice.Trees +{ + /// + /// A notification that allows developer to modify the root tree node that is being rendered + /// + public class RootNodeRendering : INotification + { + public TreeNode Node { get; } + + public FormCollection QueryStrings { get; } + + public RootNodeRendering(TreeNode node, FormCollection queryStrings) + { + Node = node; + QueryStrings = queryStrings; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs index 7b0f8a7574..56f1b0ac1d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -22,8 +23,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IFileSystems fileSystems) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IFileSystems fileSystems, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { FileSystem = fileSystems.ScriptsFileSystem; } diff --git a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs index 36d61a6f42..18d1be6a67 100644 --- a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs @@ -1,4 +1,5 @@ -using Umbraco.Cms.Core; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -22,8 +23,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, - IFileSystems fileSystems) - : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory) + IFileSystems fileSystems, + IEventAggregator eventAggregator) + : base(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator) { FileSystem = fileSystems.StylesheetsFileSystem; } diff --git a/src/Umbraco.Web.BackOffice/Trees/TemplatesTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/TemplatesTreeController.cs index 3b0b586e7d..66e57f7234 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TemplatesTreeController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Actions; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Entities; @@ -35,8 +36,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees IMenuItemCollectionFactory menuItemCollectionFactory, ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, - IFileService fileService - ) : base(localizedTextService, umbracoApiControllerTypeCollection) + IFileService fileService, + IEventAggregator eventAggregator + ) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _treeSearcher = treeSearcher; _menuItemCollectionFactory = menuItemCollectionFactory; diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeController.cs b/src/Umbraco.Web.BackOffice/Trees/TreeController.cs index fd5ee6f8d3..b68ff38a7c 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeController.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Collections.Concurrent; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Extensions; @@ -18,8 +19,8 @@ namespace Umbraco.Cms.Web.BackOffice.Trees protected ILocalizedTextService LocalizedTextService { get; } - protected TreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection) - : base(umbracoApiControllerTypeCollection) + protected TreeController(ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IEventAggregator eventAggregator) + : base(umbracoApiControllerTypeCollection, eventAggregator) { LocalizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService)); _treeAttribute = GetTreeAttribute(); diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs index 2e0d2b57b0..082bfb6ef5 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; @@ -27,10 +28,12 @@ namespace Umbraco.Cms.Web.BackOffice.Trees // TODO: Need to set this, but from where? // Presumably not injecting as this will be a base controller for package/solution developers. private readonly UmbracoApiControllerTypeCollection _apiControllers; + private readonly IEventAggregator _eventAggregator; - protected TreeControllerBase(UmbracoApiControllerTypeCollection apiControllers) + protected TreeControllerBase(UmbracoApiControllerTypeCollection apiControllers, IEventAggregator eventAggregator) { _apiControllers = apiControllers; + _eventAggregator = eventAggregator; } /// @@ -85,7 +88,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// /// /// - public ActionResult GetRootNode([ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) + public async Task> GetRootNode([ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) { if (queryStrings == null) queryStrings = FormCollection.Empty; var nodeResult = CreateRootNode(queryStrings); @@ -109,7 +112,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees if (IsDialog(queryStrings)) node.RoutePath = "#"; - OnRootNodeRendering(this, new TreeNodeRenderingEventArgs(node, queryStrings)); + await _eventAggregator.PublishAsync(new RootNodeRendering(node, queryStrings)); return node; } @@ -126,7 +129,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// We are allowing an arbitrary number of query strings to be passed in so that developers are able to persist custom data from the front-end /// to the back end to be used in the query for model data. /// - public ActionResult GetNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) + public async Task> GetNodes(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) { if (queryStrings == null) queryStrings = FormCollection.Empty; var nodesResult = GetTreeNodes(id, queryStrings); @@ -147,7 +150,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees node.RoutePath = "#"; //raise the event - OnTreeNodesRendering(this, new TreeNodesRenderingEventArgs(nodes, queryStrings)); + await _eventAggregator.PublishAsync(new TreeNodesRendering(nodes, queryStrings)); return nodes; } @@ -158,7 +161,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// /// /// - public ActionResult GetMenu(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) + public async Task> GetMenu(string id, [ModelBinder(typeof(HttpQueryStringModelBinder))]FormCollection queryStrings) { if (queryStrings == null) queryStrings = FormCollection.Empty; var menuResult = GetMenuForNode(id, queryStrings); @@ -169,7 +172,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees var menu = menuResult.Value; //raise the event - OnMenuRendering(this, new MenuRenderingEventArgs(id, menu, queryStrings)); + await _eventAggregator.PublishAsync(new MenuRendering(id, menu, queryStrings)); return menu; } @@ -374,45 +377,5 @@ namespace Umbraco.Cms.Web.BackOffice.Trees queryStrings.TryGetValue(TreeQueryStringParameters.Use, out var use); return use == "dialog"; } - - /// - /// An event that allows developers to modify the tree node collection that is being rendered - /// - /// - /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. - /// - public static event TypedEventHandler TreeNodesRendering; - - private static void OnTreeNodesRendering(TreeControllerBase instance, TreeNodesRenderingEventArgs e) - { - var handler = TreeNodesRendering; - handler?.Invoke(instance, e); - } - - /// - /// An event that allows developer to modify the root tree node that is being rendered - /// - public static event TypedEventHandler RootNodeRendering; - - // internal for temp class below - kill eventually! - internal static void OnRootNodeRendering(TreeControllerBase instance, TreeNodeRenderingEventArgs e) - { - var handler = RootNodeRendering; - handler?.Invoke(instance, e); - } - - /// - /// An event that allows developers to modify the menu that is being rendered - /// - /// - /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. - /// - public static event TypedEventHandler MenuRendering; - - private static void OnMenuRendering(TreeControllerBase instance, MenuRenderingEventArgs e) - { - var handler = MenuRendering; - handler?.Invoke(instance, e); - } } } diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeNodeRenderingEventArgs.cs b/src/Umbraco.Web.BackOffice/Trees/TreeNodeRenderingEventArgs.cs deleted file mode 100644 index afd065ffa4..0000000000 --- a/src/Umbraco.Web.BackOffice/Trees/TreeNodeRenderingEventArgs.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Umbraco.Cms.Core.Trees; - -namespace Umbraco.Cms.Web.BackOffice.Trees -{ - public class TreeNodeRenderingEventArgs : TreeRenderingEventArgs - { - public TreeNode Node { get; private set; } - - public TreeNodeRenderingEventArgs(TreeNode node, FormCollection queryStrings) - : base(queryStrings) - { - Node = node; - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs new file mode 100644 index 0000000000..5d4c1ade0b --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Http; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Trees; + +namespace Umbraco.Cms.Web.BackOffice.Trees +{ + /// + /// A notification that allows developers to modify the tree node collection that is being rendered + /// + /// + /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. + /// + public class TreeNodesRendering : INotification + { + public TreeNodeCollection Nodes { get; } + + public FormCollection QueryStrings { get; } + + public TreeNodesRendering(TreeNodeCollection nodes, FormCollection queryStrings) + { + Nodes = nodes; + QueryStrings = queryStrings; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingEventArgs.cs b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingEventArgs.cs deleted file mode 100644 index f0d29a7901..0000000000 --- a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingEventArgs.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Umbraco.Cms.Core.Trees; - -namespace Umbraco.Cms.Web.BackOffice.Trees -{ - public class TreeNodesRenderingEventArgs : TreeRenderingEventArgs - { - public TreeNodeCollection Nodes { get; private set; } - - public TreeNodesRenderingEventArgs(TreeNodeCollection nodes, FormCollection queryStrings) - : base(queryStrings) - { - Nodes = nodes; - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeRenderingEventArgs.cs b/src/Umbraco.Web.BackOffice/Trees/TreeRenderingEventArgs.cs deleted file mode 100644 index 9d8795938f..0000000000 --- a/src/Umbraco.Web.BackOffice/Trees/TreeRenderingEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Microsoft.AspNetCore.Http; - -namespace Umbraco.Cms.Web.BackOffice.Trees -{ - public class TreeRenderingEventArgs : EventArgs - { - public FormCollection QueryStrings { get; private set; } - - public TreeRenderingEventArgs(FormCollection queryStrings) - { - QueryStrings = queryStrings; - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Trees/UserTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/UserTreeController.cs index 6e06f7636d..3afdecf36e 100644 --- a/src/Umbraco.Web.BackOffice/Trees/UserTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/UserTreeController.cs @@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; @@ -21,8 +22,9 @@ namespace Umbraco.Cms.Web.BackOffice.Trees public UserTreeController( IMenuItemCollectionFactory menuItemCollectionFactory, ILocalizedTextService localizedTextService, - UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection - ) : base(localizedTextService, umbracoApiControllerTypeCollection) + UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, + IEventAggregator eventAggregator + ) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { _menuItemCollectionFactory = menuItemCollectionFactory; } From b1aabade556a9abbbb59b5fd7cfaa70b7a0cc8a0 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Tue, 23 Feb 2021 16:20:22 +0100 Subject: [PATCH 02/14] Formatting and comments --- .../Trees/MenuRendering.cs | 19 ++++++++++--------- .../Trees/RootNodeRendering.cs | 12 +++++++++--- .../Trees/TreeNodesRendering.cs | 12 +++++++++--- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs b/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs index 202d1464cb..db0822f8c9 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs @@ -12,13 +12,6 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public class MenuRendering : INotification { - public MenuRendering(string nodeId, MenuItemCollection menu, FormCollection queryStrings) - { - NodeId = nodeId; - Menu = menu; - QueryStrings = queryStrings; - } - /// /// The tree node id that the menu is rendering for /// @@ -29,8 +22,16 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public MenuItemCollection Menu { get; } - public FormCollection QueryStrings { get; } - + /// + /// The query string of the current request + /// + public FormCollection QueryString { get; } + public MenuRendering(string nodeId, MenuItemCollection menu, FormCollection queryString) + { + NodeId = nodeId; + Menu = menu; + QueryString = queryString; + } } } diff --git a/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs b/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs index 79269150a0..9e9e20ec4a 100644 --- a/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs @@ -9,14 +9,20 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public class RootNodeRendering : INotification { + /// + /// The root node being rendered + /// public TreeNode Node { get; } - public FormCollection QueryStrings { get; } + /// + /// The query string of the current request + /// + public FormCollection QueryString { get; } - public RootNodeRendering(TreeNode node, FormCollection queryStrings) + public RootNodeRendering(TreeNode node, FormCollection queryString) { Node = node; - QueryStrings = queryStrings; + QueryString = queryString; } } } diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs index 5d4c1ade0b..aca1a940d5 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs @@ -12,14 +12,20 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public class TreeNodesRendering : INotification { + /// + /// The tree nodes being rendered + /// public TreeNodeCollection Nodes { get; } - public FormCollection QueryStrings { get; } + /// + /// The query string of the current request + /// + public FormCollection QueryString { get; } - public TreeNodesRendering(TreeNodeCollection nodes, FormCollection queryStrings) + public TreeNodesRendering(TreeNodeCollection nodes, FormCollection queryString) { Nodes = nodes; - QueryStrings = queryStrings; + QueryString = queryString; } } } From 06c5ce5bb870156495a25c8fee9a175004c7538e Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Wed, 24 Feb 2021 08:43:50 +0100 Subject: [PATCH 03/14] Replace static editor model events events with IEventAggregator notifications --- .../Editors/EditorModelEventArgs.cs | 47 ------------ .../Filters/EditorModelEventManager.cs | 75 ------------------- .../OutgoingEditorModelEventAttribute.cs | 38 ++++++++-- .../Filters/SendingContentNotification.cs | 19 +++++ .../Filters/SendingDashboardsNotification.cs | 21 ++++++ .../Filters/SendingMediaNotification.cs | 19 +++++ .../Filters/SendingMemberNotification.cs | 19 +++++ .../Filters/SendingUserNotification.cs | 19 +++++ 8 files changed, 127 insertions(+), 130 deletions(-) delete mode 100644 src/Umbraco.Core/Editors/EditorModelEventArgs.cs delete mode 100644 src/Umbraco.Web.BackOffice/Filters/EditorModelEventManager.cs create mode 100644 src/Umbraco.Web.BackOffice/Filters/SendingContentNotification.cs create mode 100644 src/Umbraco.Web.BackOffice/Filters/SendingDashboardsNotification.cs create mode 100644 src/Umbraco.Web.BackOffice/Filters/SendingMediaNotification.cs create mode 100644 src/Umbraco.Web.BackOffice/Filters/SendingMemberNotification.cs create mode 100644 src/Umbraco.Web.BackOffice/Filters/SendingUserNotification.cs diff --git a/src/Umbraco.Core/Editors/EditorModelEventArgs.cs b/src/Umbraco.Core/Editors/EditorModelEventArgs.cs deleted file mode 100644 index da7f0ba9cb..0000000000 --- a/src/Umbraco.Core/Editors/EditorModelEventArgs.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Umbraco.Cms.Core.Web; - -namespace Umbraco.Cms.Core.Editors -{ - public sealed class EditorModelEventArgs : EditorModelEventArgs - { - private readonly EditorModelEventArgs _baseArgs; - private T _model; - - public EditorModelEventArgs(EditorModelEventArgs baseArgs) - : base(baseArgs.Model, baseArgs.UmbracoContext) - { - _baseArgs = baseArgs; - Model = (T)baseArgs.Model; - } - - public EditorModelEventArgs(T model, IUmbracoContext umbracoContext) - : base(model, umbracoContext) - { - Model = model; - } - - public new T Model - { - get => _model; - set - { - _model = value; - if (_baseArgs != null) - _baseArgs.Model = _model; - } - } - } - - public class EditorModelEventArgs : EventArgs - { - public EditorModelEventArgs(object model, IUmbracoContext umbracoContext) - { - Model = model; - UmbracoContext = umbracoContext; - } - - public object Model { get; set; } - public IUmbracoContext UmbracoContext { get; } - } -} diff --git a/src/Umbraco.Web.BackOffice/Filters/EditorModelEventManager.cs b/src/Umbraco.Web.BackOffice/Filters/EditorModelEventManager.cs deleted file mode 100644 index a76b1a4091..0000000000 --- a/src/Umbraco.Web.BackOffice/Filters/EditorModelEventManager.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc.Filters; -using Umbraco.Cms.Core.Dashboards; -using Umbraco.Cms.Core.Editors; -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Models.ContentEditing; - -namespace Umbraco.Cms.Web.BackOffice.Filters -{ - /// - /// Used to emit events for editor models in the back office - /// - public sealed class EditorModelEventManager - { - public static event TypedEventHandler> SendingContentModel; - public static event TypedEventHandler> SendingMediaModel; - public static event TypedEventHandler> SendingMemberModel; - public static event TypedEventHandler> SendingUserModel; - - public static event TypedEventHandler>>> SendingDashboardSlimModel; - - private static void OnSendingDashboardModel(ActionExecutedContext sender, EditorModelEventArgs>> e) - { - var handler = SendingDashboardSlimModel; - handler?.Invoke(sender, e); - } - - private static void OnSendingUserModel(ActionExecutedContext sender, EditorModelEventArgs e) - { - var handler = SendingUserModel; - handler?.Invoke(sender, e); - } - - private static void OnSendingContentModel(ActionExecutedContext sender, EditorModelEventArgs e) - { - var handler = SendingContentModel; - handler?.Invoke(sender, e); - } - - private static void OnSendingMediaModel(ActionExecutedContext sender, EditorModelEventArgs e) - { - var handler = SendingMediaModel; - handler?.Invoke(sender, e); - } - - private static void OnSendingMemberModel(ActionExecutedContext sender, EditorModelEventArgs e) - { - var handler = SendingMemberModel; - handler?.Invoke(sender, e); - } - - /// - /// Based on the type, emit's a specific event - /// - /// - /// - internal static void EmitEvent(ActionExecutedContext sender, EditorModelEventArgs e) - { - if (e.Model is ContentItemDisplay) - OnSendingContentModel(sender, new EditorModelEventArgs(e)); - - if (e.Model is MediaItemDisplay) - OnSendingMediaModel(sender, new EditorModelEventArgs(e)); - - if (e.Model is MemberDisplay) - OnSendingMemberModel(sender, new EditorModelEventArgs(e)); - - if (e.Model is UserDisplay) - OnSendingUserModel(sender, new EditorModelEventArgs(e)); - - if (e.Model is IEnumerable>) - OnSendingDashboardModel(sender, new EditorModelEventArgs>>(e)); - } - } -} diff --git a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs index fe825a1907..40ee00a2b2 100644 --- a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs +++ b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs @@ -1,7 +1,11 @@ -using System; +using System; +using System.Collections.Generic; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; +using Umbraco.Cms.Core.Dashboards; using Umbraco.Cms.Core.Editors; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Web; using Umbraco.Extensions; @@ -25,14 +29,18 @@ namespace Umbraco.Cms.Web.BackOffice.Filters private readonly IBackOfficeSecurityAccessor _backOfficeSecurityAccessor; + private readonly IEventAggregator _eventAggregator; + public OutgoingEditorModelEventFilter( IUmbracoContextAccessor umbracoContextAccessor, - IBackOfficeSecurityAccessor backOfficeSecurityAccessor) + IBackOfficeSecurityAccessor backOfficeSecurityAccessor, IEventAggregator eventAggregator) { _umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); _backOfficeSecurityAccessor = backOfficeSecurityAccessor ?? throw new ArgumentNullException(nameof(backOfficeSecurityAccessor)); + _eventAggregator = eventAggregator + ?? throw new ArgumentNullException(nameof(eventAggregator)); } public void OnActionExecuted(ActionExecutedContext context) @@ -40,18 +48,32 @@ namespace Umbraco.Cms.Web.BackOffice.Filters if (context.Result == null) return; var umbracoContext = _umbracoContextAccessor.GetRequiredUmbracoContext(); - var user = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser; - if (user == null) return; + var currentUser = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser; + if (currentUser == null) return; if (context.Result is ObjectResult objectContent) { var model = objectContent.Value; - if (model != null) + if (model is ContentItemDisplay content) { - var args = new EditorModelEventArgs(model, umbracoContext); - EditorModelEventManager.EmitEvent(context, args); - objectContent.Value = args.Model; + _eventAggregator.Publish(new SendingContentNotification(content, umbracoContext)); + } + else if (model is MediaItemDisplay media) + { + _eventAggregator.Publish(new SendingMediaNotification(media, umbracoContext)); + } + else if (model is MemberDisplay member) + { + _eventAggregator.Publish(new SendingMemberNotification(member, umbracoContext)); + } + else if (model is UserDisplay user) + { + _eventAggregator.Publish(new SendingUserNotification(user, umbracoContext)); + } + else if (model is IEnumerable> dashboards) + { + _eventAggregator.Publish(new SendingDashboardsNotification(dashboards, umbracoContext)); } } } diff --git a/src/Umbraco.Web.BackOffice/Filters/SendingContentNotification.cs b/src/Umbraco.Web.BackOffice/Filters/SendingContentNotification.cs new file mode 100644 index 0000000000..3955c95e54 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Filters/SendingContentNotification.cs @@ -0,0 +1,19 @@ +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Web.BackOffice.Filters +{ + public class SendingContentNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public ContentItemDisplay Content { get; } + + public SendingContentNotification(ContentItemDisplay content, IUmbracoContext umbracoContext) + { + Content = content; + UmbracoContext = umbracoContext; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Filters/SendingDashboardsNotification.cs b/src/Umbraco.Web.BackOffice/Filters/SendingDashboardsNotification.cs new file mode 100644 index 0000000000..cfaa91fc2b --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Filters/SendingDashboardsNotification.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using Umbraco.Cms.Core.Dashboards; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Web.BackOffice.Filters +{ + public class SendingDashboardsNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public IEnumerable> Dashboards { get; } + + public SendingDashboardsNotification(IEnumerable> dashboards, IUmbracoContext umbracoContext) + { + Dashboards = dashboards; + UmbracoContext = umbracoContext; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Filters/SendingMediaNotification.cs b/src/Umbraco.Web.BackOffice/Filters/SendingMediaNotification.cs new file mode 100644 index 0000000000..cc5d7e7620 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Filters/SendingMediaNotification.cs @@ -0,0 +1,19 @@ +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Web.BackOffice.Filters +{ + public class SendingMediaNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public MediaItemDisplay Media { get; } + + public SendingMediaNotification(MediaItemDisplay media, IUmbracoContext umbracoContext) + { + Media = media; + UmbracoContext = umbracoContext; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Filters/SendingMemberNotification.cs b/src/Umbraco.Web.BackOffice/Filters/SendingMemberNotification.cs new file mode 100644 index 0000000000..ea2a1d8927 --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Filters/SendingMemberNotification.cs @@ -0,0 +1,19 @@ +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Web.BackOffice.Filters +{ + public class SendingMemberNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public MemberDisplay Member { get; } + + public SendingMemberNotification(MemberDisplay member, IUmbracoContext umbracoContext) + { + Member = member; + UmbracoContext = umbracoContext; + } + } +} diff --git a/src/Umbraco.Web.BackOffice/Filters/SendingUserNotification.cs b/src/Umbraco.Web.BackOffice/Filters/SendingUserNotification.cs new file mode 100644 index 0000000000..91bbe2f0db --- /dev/null +++ b/src/Umbraco.Web.BackOffice/Filters/SendingUserNotification.cs @@ -0,0 +1,19 @@ +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Cms.Web.BackOffice.Filters +{ + public class SendingUserNotification : INotification + { + public IUmbracoContext UmbracoContext { get; } + + public UserDisplay User { get; } + + public SendingUserNotification(UserDisplay user, IUmbracoContext umbracoContext) + { + User = user; + UmbracoContext = umbracoContext; + } + } +} From 0393a54abf2543c19d98f8af4a7570f668cb3202 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Wed, 24 Feb 2021 08:56:41 +0100 Subject: [PATCH 04/14] Postfixed notifications with "Notifications" for improved discoverability --- .../{MenuRendering.cs => MenuRenderingNotification.cs} | 4 ++-- ...ootNodeRendering.cs => RootNodeRenderingNotification.cs} | 4 ++-- src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs | 6 +++--- ...eNodesRendering.cs => TreeNodesRenderingNotification.cs} | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) rename src/Umbraco.Web.BackOffice/Trees/{MenuRendering.cs => MenuRenderingNotification.cs} (85%) rename src/Umbraco.Web.BackOffice/Trees/{RootNodeRendering.cs => RootNodeRenderingNotification.cs} (81%) rename src/Umbraco.Web.BackOffice/Trees/{TreeNodesRendering.cs => TreeNodesRenderingNotification.cs} (83%) diff --git a/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs b/src/Umbraco.Web.BackOffice/Trees/MenuRenderingNotification.cs similarity index 85% rename from src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs rename to src/Umbraco.Web.BackOffice/Trees/MenuRenderingNotification.cs index db0822f8c9..562708b377 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MenuRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MenuRenderingNotification.cs @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. /// - public class MenuRendering : INotification + public class MenuRenderingNotification : INotification { /// /// The tree node id that the menu is rendering for @@ -27,7 +27,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public FormCollection QueryString { get; } - public MenuRendering(string nodeId, MenuItemCollection menu, FormCollection queryString) + public MenuRenderingNotification(string nodeId, MenuItemCollection menu, FormCollection queryString) { NodeId = nodeId; Menu = menu; diff --git a/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs b/src/Umbraco.Web.BackOffice/Trees/RootNodeRenderingNotification.cs similarity index 81% rename from src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs rename to src/Umbraco.Web.BackOffice/Trees/RootNodeRenderingNotification.cs index 9e9e20ec4a..fcf6a47c35 100644 --- a/src/Umbraco.Web.BackOffice/Trees/RootNodeRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/RootNodeRenderingNotification.cs @@ -7,7 +7,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// /// A notification that allows developer to modify the root tree node that is being rendered /// - public class RootNodeRendering : INotification + public class RootNodeRenderingNotification : INotification { /// /// The root node being rendered @@ -19,7 +19,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public FormCollection QueryString { get; } - public RootNodeRendering(TreeNode node, FormCollection queryString) + public RootNodeRenderingNotification(TreeNode node, FormCollection queryString) { Node = node; QueryString = queryString; diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs index 082bfb6ef5..c0d0550168 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeControllerBase.cs @@ -112,7 +112,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees if (IsDialog(queryStrings)) node.RoutePath = "#"; - await _eventAggregator.PublishAsync(new RootNodeRendering(node, queryStrings)); + await _eventAggregator.PublishAsync(new RootNodeRenderingNotification(node, queryStrings)); return node; } @@ -150,7 +150,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees node.RoutePath = "#"; //raise the event - await _eventAggregator.PublishAsync(new TreeNodesRendering(nodes, queryStrings)); + await _eventAggregator.PublishAsync(new TreeNodesRenderingNotification(nodes, queryStrings)); return nodes; } @@ -172,7 +172,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees var menu = menuResult.Value; //raise the event - await _eventAggregator.PublishAsync(new MenuRendering(id, menu, queryStrings)); + await _eventAggregator.PublishAsync(new MenuRenderingNotification(id, menu, queryStrings)); return menu; } diff --git a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingNotification.cs similarity index 83% rename from src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs rename to src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingNotification.cs index aca1a940d5..1269d2aeab 100644 --- a/src/Umbraco.Web.BackOffice/Trees/TreeNodesRendering.cs +++ b/src/Umbraco.Web.BackOffice/Trees/TreeNodesRenderingNotification.cs @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// /// Developers can add/remove/replace/insert/update/etc... any of the tree items in the collection. /// - public class TreeNodesRendering : INotification + public class TreeNodesRenderingNotification : INotification { /// /// The tree nodes being rendered @@ -22,7 +22,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees /// public FormCollection QueryString { get; } - public TreeNodesRendering(TreeNodeCollection nodes, FormCollection queryString) + public TreeNodesRenderingNotification(TreeNodeCollection nodes, FormCollection queryString) { Nodes = nodes; QueryString = queryString; From f4787f9ae50cd4fcd768a16500b81a2227f8cfdc Mon Sep 17 00:00:00 2001 From: Mole Date: Thu, 25 Feb 2021 12:36:28 +0100 Subject: [PATCH 05/14] Add undo actions to the root node instead of appending them also fix minor UI bug --- .../Packaging/PackageInstallation.cs | 31 ++++++++++++++----- .../src/views/packages/edit.html | 2 +- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs index 1c7de01bb6..5409e2de3f 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs @@ -106,22 +106,39 @@ namespace Umbraco.Cms.Core.Packaging private IEnumerable RunPackageActions(PackageDefinition packageDefinition, IEnumerable actions) { - foreach (var n in actions) + var actionsElement = XElement.Parse(packageDefinition.Actions); + foreach (PackageAction action in actions) { //if there is an undo section then save it to the definition so we can run it at uninstallation - var undo = n.Undo; + var undo = action.Undo; if (undo) - packageDefinition.Actions += n.XmlData.ToString(); + { + actionsElement.Add(action.XmlData); + } + //Run the actions tagged only for 'install' - if (n.RunAt != ActionRunAt.Install) continue; + if (action.RunAt != ActionRunAt.Install) + { + continue; + } - if (n.Alias.IsNullOrWhiteSpace()) continue; + if (action.Alias.IsNullOrWhiteSpace()) + { + continue; + } //run the actions and report errors - if (!_packageActionRunner.RunPackageAction(packageDefinition.Name, n.Alias, n.XmlData, out var err)) - foreach (var e in err) yield return e; + if (!_packageActionRunner.RunPackageAction(packageDefinition.Name, action.Alias, action.XmlData, out var err)) + { + foreach (var e in err) + { + yield return e; + } + } } + + packageDefinition.Actions = actionsElement.ToString(); } private IEnumerable UndoPackageActions(IPackageInfo packageDefinition, IEnumerable actions) diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/edit.html b/src/Umbraco.Web.UI.Client/src/views/packages/edit.html index 27ae599261..f78fc6e97b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/edit.html @@ -175,7 +175,7 @@
umb-expansion-panel__content + text="{{template.name}}">
From a597f5d473ec543618a7e3c2fc7566f1ff7c6eb3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 26 Feb 2021 13:42:03 +1100 Subject: [PATCH 06/14] removes perfolizer dll reference - it has a package reference --- src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index 8b180f5a37..fce12ded71 100644 --- a/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/src/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -36,9 +36,6 @@ 7.3 - - C:\Users\Berg\.nuget\packages\perfolizer\0.2.1\lib\netstandard2.0\Perfolizer.dll - @@ -111,4 +108,4 @@ - + \ No newline at end of file From b21db82929cecc9215c8b9f09153d6d45a85234c Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 26 Feb 2021 14:08:57 +1100 Subject: [PATCH 07/14] missed change for default namespace in the UI project --- src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj index bfc3d31f8e..4f6bb1240f 100644 --- a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj +++ b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj @@ -4,7 +4,7 @@ net5.0 Umbraco.Cms.Web.UI.NetCore latest - Umbraco.Web.UI.NetCore + Umbraco.Cms.Web.UI.NetCore bin\Release\Umbraco.Web.UI.NetCore.xml From 3113efd12236503831a78297e3a1c0b627850eb9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 26 Feb 2021 14:11:00 +1100 Subject: [PATCH 08/14] Adds common.views to view imports --- src/Umbraco.Web.UI.NetCore/Views/_ViewImports.cshtml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.NetCore/Views/_ViewImports.cshtml b/src/Umbraco.Web.UI.NetCore/Views/_ViewImports.cshtml index ad195ac8c3..4f64e600b2 100644 --- a/src/Umbraco.Web.UI.NetCore/Views/_ViewImports.cshtml +++ b/src/Umbraco.Web.UI.NetCore/Views/_ViewImports.cshtml @@ -1,4 +1,5 @@ @using Umbraco.Extensions @using Umbraco.Cms.Web.UI.NetCore @using Umbraco.Cms.Web.Common.PublishedModels +@using Umbraco.Cms.Web.Common.Views @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers From f6cf0893575e8de3f9e43573d47ddc7189269a22 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 26 Feb 2021 15:14:42 +1100 Subject: [PATCH 09/14] Fix a missed namespace change --- src/Umbraco.Infrastructure/Services/Implement/FileService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Services/Implement/FileService.cs b/src/Umbraco.Infrastructure/Services/Implement/FileService.cs index 25445a205d..364454f876 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/FileService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/FileService.cs @@ -32,7 +32,7 @@ namespace Umbraco.Cms.Core.Services.Implement private readonly IHostingEnvironment _hostingEnvironment; private const string PartialViewHeader = "@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage"; - private const string PartialViewMacroHeader = "@inherits Umbraco.Web.Common.Macros.PartialViewMacroPage"; + private const string PartialViewMacroHeader = "@inherits Umbraco.Cms.Web.Common.Macros.PartialViewMacroPage"; public FileService(IScopeProvider uowProvider, ILoggerFactory loggerFactory, IEventMessagesFactory eventMessagesFactory, IStylesheetRepository stylesheetRepository, IScriptRepository scriptRepository, ITemplateRepository templateRepository, From 80a2b4c23853fa4a98a157091f5f0edc117731a8 Mon Sep 17 00:00:00 2001 From: berg Date: Sat, 27 Feb 2021 18:29:59 +0100 Subject: [PATCH 10/14] Fixed cypress test --- .../cypress/integration/Content/content.ts | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/content.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/content.ts index c862708bbe..ecfe3e95d8 100644 --- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/content.ts +++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Content/content.ts @@ -506,7 +506,7 @@ context('Content', () => { const pickerDocTypeName = 'Content picker doc type'; const pickerDocTypeAlias = AliasHelper.toAlias(pickerDocTypeName); const pickedDocTypeName = 'Picked content document type'; - + const pickedDocTypeAlias = AliasHelper.toAlias(pickedDocTypeName); cy.deleteAllContent(); cy.umbracoEnsureDocumentTypeNameNotExists(pickerDocTypeName); cy.umbracoEnsureTemplateNameNotExists(pickerDocTypeName); @@ -515,6 +515,7 @@ context('Content', () => { // Create the content type and content we'll be picking from. const pickedDocType = new DocumentTypeBuilder() .withName(pickedDocTypeName) + .withAlias(pickedDocTypeAlias) .withAllowAsRoot(true) .addGroup() .addTextBoxProperty() @@ -559,19 +560,13 @@ context('Content', () => { cy.saveDocumentType(pickerDocType); // Edit it the template to allow us to verify the rendered view. - cy.editTemplate(pickerDocTypeName, `@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage - @using ContentModels = Umbraco.Web.PublishedModels; + cy.editTemplate(pickerDocTypeName, `@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @{ Layout = null; + var pickedItem = Model.Picker as PickedContentDocumentType; } - @{ - IPublishedContent typedContentPicker = Model.Value("picker"); - if (typedContentPicker != null) - { -

@typedContentPicker.Value("text")

- } - }`); +

@pickedItem.Text

`); // Create content with content picker cy.get('.umb-tree-root-link').rightclick(); From d7d99e5c0058f82370393973dd959d669e8e8ec6 Mon Sep 17 00:00:00 2001 From: berg Date: Sat, 27 Feb 2021 19:26:36 +0100 Subject: [PATCH 11/14] Fixed issue found by cypress test. script/css folders was not deleted because it search in contentroot and not wwwroot --- .../Controllers/CodeFileController.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/CodeFileController.cs b/src/Umbraco.Web.BackOffice/Controllers/CodeFileController.cs index 25f8f21c01..ffdc45d5ac 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/CodeFileController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/CodeFileController.cs @@ -338,7 +338,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers switch (type) { case Constants.Trees.PartialViews: - if (IsDirectory(virtualPath, Constants.SystemDirectories.PartialViews)) + if (IsDirectory(_hostingEnvironment.MapPathContentRoot(Path.Combine(Constants.SystemDirectories.PartialViews, virtualPath)))) { _fileService.DeletePartialViewFolder(virtualPath); return Ok(); @@ -350,7 +350,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return new UmbracoProblemResult("No Partial View or folder found with the specified path", HttpStatusCode.NotFound); case Constants.Trees.PartialViewMacros: - if (IsDirectory(virtualPath, Constants.SystemDirectories.MacroPartials)) + if (IsDirectory(_hostingEnvironment.MapPathContentRoot(Path.Combine(Constants.SystemDirectories.MacroPartials, virtualPath)))) { _fileService.DeletePartialViewMacroFolder(virtualPath); return Ok(); @@ -362,7 +362,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return new UmbracoProblemResult("No Partial View Macro or folder found with the specified path", HttpStatusCode.NotFound); case Constants.Trees.Scripts: - if (IsDirectory(virtualPath, _globalSettings.UmbracoScriptsPath)) + if (IsDirectory(_hostingEnvironment.MapPathWebRoot(Path.Combine(_globalSettings.UmbracoScriptsPath, virtualPath)))) { _fileService.DeleteScriptFolder(virtualPath); return Ok(); @@ -374,7 +374,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers } return new UmbracoProblemResult("No Script or folder found with the specified path", HttpStatusCode.NotFound); case Constants.Trees.Stylesheets: - if (IsDirectory(virtualPath, _globalSettings.UmbracoCssPath)) + if (IsDirectory(_hostingEnvironment.MapPathWebRoot(Path.Combine(_globalSettings.UmbracoCssPath, virtualPath)))) { _fileService.DeleteStyleSheetFolder(virtualPath); return Ok(); @@ -665,9 +665,8 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return value; } - private bool IsDirectory(string virtualPath, string systemDirectory) + private bool IsDirectory(string path) { - var path = _hostingEnvironment.MapPathContentRoot(systemDirectory + "/" + virtualPath); var dirInfo = new DirectoryInfo(path); return dirInfo.Attributes == FileAttributes.Directory; } From cb8fbb9c85970347667154f5f61f066d8e255f40 Mon Sep 17 00:00:00 2001 From: berg Date: Sat, 27 Feb 2021 19:35:37 +0100 Subject: [PATCH 12/14] Removed the modelsbuilder project (that is deleted) from the netcore only sln file --- src/umbraco-netcore-only.sln | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/umbraco-netcore-only.sln b/src/umbraco-netcore-only.sln index 3994d852cf..1bf32cf37b 100644 --- a/src/umbraco-netcore-only.sln +++ b/src/umbraco-netcore-only.sln @@ -124,8 +124,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IssueTemplates", "IssueTemp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Core", "Umbraco.Core\Umbraco.Core.csproj", "{29AA69D9-B597-4395-8D42-43B1263C240A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.ModelsBuilder.Embedded", "Umbraco.ModelsBuilder.Embedded\Umbraco.ModelsBuilder.Embedded.csproj", "{52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Infrastructure", "Umbraco.Infrastructure\Umbraco.Infrastructure.csproj", "{3AE7BF57-966B-45A5-910A-954D7C554441}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.PublishedCache.NuCache", "Umbraco.PublishedCache.NuCache\Umbraco.PublishedCache.NuCache.csproj", "{F6DE8DA0-07CC-4EF2-8A59-2BC81DBB3830}" @@ -158,10 +156,6 @@ Global {29AA69D9-B597-4395-8D42-43B1263C240A}.Debug|Any CPU.Build.0 = Debug|Any CPU {29AA69D9-B597-4395-8D42-43B1263C240A}.Release|Any CPU.ActiveCfg = Release|Any CPU {29AA69D9-B597-4395-8D42-43B1263C240A}.Release|Any CPU.Build.0 = Release|Any CPU - {52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}.Release|Any CPU.Build.0 = Release|Any CPU {3AE7BF57-966B-45A5-910A-954D7C554441}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3AE7BF57-966B-45A5-910A-954D7C554441}.Debug|Any CPU.Build.0 = Debug|Any CPU {3AE7BF57-966B-45A5-910A-954D7C554441}.Release|Any CPU.ActiveCfg = Release|Any CPU From 22ec42a5ab4bef5e03339344339c3861d3c6c6ea Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 1 Mar 2021 13:13:37 +0100 Subject: [PATCH 13/14] Play it safe - revert to sending emails synchronous --- src/Umbraco.Infrastructure/EmailSender.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/EmailSender.cs b/src/Umbraco.Infrastructure/EmailSender.cs index 75f4a61f4d..a21f4c50db 100644 --- a/src/Umbraco.Infrastructure/EmailSender.cs +++ b/src/Umbraco.Infrastructure/EmailSender.cs @@ -54,7 +54,7 @@ namespace Umbraco.Cms.Infrastructure } else { - await client.SendAsync(mailMessage); + client.Send(mailMessage); } await client.DisconnectAsync(true); From 0bdd1cc874cee8a3716b8827cf4f342dc31659c4 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Mon, 1 Mar 2021 13:17:24 +0100 Subject: [PATCH 14/14] Replaced if/else with switch --- .../OutgoingEditorModelEventAttribute.cs | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs index 40ee00a2b2..28f3dfbe60 100644 --- a/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs +++ b/src/Umbraco.Web.BackOffice/Filters/OutgoingEditorModelEventAttribute.cs @@ -55,25 +55,23 @@ namespace Umbraco.Cms.Web.BackOffice.Filters { var model = objectContent.Value; - if (model is ContentItemDisplay content) + switch (model) { - _eventAggregator.Publish(new SendingContentNotification(content, umbracoContext)); - } - else if (model is MediaItemDisplay media) - { - _eventAggregator.Publish(new SendingMediaNotification(media, umbracoContext)); - } - else if (model is MemberDisplay member) - { - _eventAggregator.Publish(new SendingMemberNotification(member, umbracoContext)); - } - else if (model is UserDisplay user) - { - _eventAggregator.Publish(new SendingUserNotification(user, umbracoContext)); - } - else if (model is IEnumerable> dashboards) - { - _eventAggregator.Publish(new SendingDashboardsNotification(dashboards, umbracoContext)); + case ContentItemDisplay content: + _eventAggregator.Publish(new SendingContentNotification(content, umbracoContext)); + break; + case MediaItemDisplay media: + _eventAggregator.Publish(new SendingMediaNotification(media, umbracoContext)); + break; + case MemberDisplay member: + _eventAggregator.Publish(new SendingMemberNotification(member, umbracoContext)); + break; + case UserDisplay user: + _eventAggregator.Publish(new SendingUserNotification(user, umbracoContext)); + break; + case IEnumerable> dashboards: + _eventAggregator.Publish(new SendingDashboardsNotification(dashboards, umbracoContext)); + break; } } }