From cebebb9f0d59023eb92ef965412e9fd3475f3038 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 15:02:08 +0200 Subject: [PATCH 01/26] Add action menu to create member type container --- src/Umbraco.Core/Constants-Icons.cs | 60 +++++----- src/Umbraco.Core/Constants-ObjectTypes.cs | 2 + src/Umbraco.Core/Constants-UdiEntityType.cs | 4 + src/Umbraco.Core/Models/UmbracoObjectTypes.cs | 52 +++++---- .../Trees/MediaTypeTreeController.cs | 3 +- .../MemberTypeAndGroupTreeControllerBase.cs | 61 +++++++++- .../src/views/mediaTypes/create.controller.js | 9 +- .../src/views/mediaTypes/create.html | 6 +- .../views/memberTypes/create.controller.js | 14 ++- .../src/views/memberTypes/create.html | 110 +++++++++++------- 10 files changed, 211 insertions(+), 110 deletions(-) diff --git a/src/Umbraco.Core/Constants-Icons.cs b/src/Umbraco.Core/Constants-Icons.cs index 5cfc2808fc45..aeae64591006 100644 --- a/src/Umbraco.Core/Constants-Icons.cs +++ b/src/Umbraco.Core/Constants-Icons.cs @@ -5,62 +5,62 @@ public static partial class Constants public static class Icons { /// - /// System default icon + /// System default icon. /// public const string DefaultIcon = Content; /// - /// System blueprint icon + /// System blueprint icon. /// public const string Blueprint = "icon-blueprint"; /// - /// System content icon + /// System content icon. /// public const string Content = "icon-document"; /// - /// System content type icon + /// System content type icon. /// public const string ContentType = "icon-item-arrangement"; /// - /// System data type icon + /// System data type icon. /// public const string DataType = "icon-autofill"; /// - /// System dictionary icon + /// System dictionary icon. /// public const string Dictionary = "icon-book-alt"; /// - /// System generic folder icon + /// System generic folder icon. /// public const string Folder = "icon-folder"; /// - /// System language icon + /// System language icon. /// public const string Language = "icon-globe"; /// - /// System logviewer icon + /// System logviewer icon. /// public const string LogViewer = "icon-box-alt"; /// - /// System list view icon + /// System list view icon. /// public const string ListView = "icon-thumbnail-list"; /// - /// System macro icon + /// System macro icon. /// public const string Macro = "icon-settings-alt"; /// - /// System media file icon + /// System media file icon. /// public const string MediaFile = "icon-document"; @@ -70,92 +70,92 @@ public static class Icons public const string MediaVideo = "icon-video"; /// - /// System media audio icon + /// System media audio icon. /// public const string MediaAudio = "icon-sound-waves"; /// - /// System media article icon + /// System media article icon. /// public const string MediaArticle = "icon-article"; /// - /// System media vector icon + /// System media vector icon. /// public const string MediaVectorGraphics = "icon-picture"; /// - /// System media folder icon + /// System media folder icon. /// public const string MediaFolder = "icon-folder"; /// - /// System media image icon + /// System media image icon. /// public const string MediaImage = "icon-picture"; /// - /// System media type icon + /// System media type icon. /// public const string MediaType = "icon-thumbnails"; /// - /// System member icon + /// System member icon. /// public const string Member = "icon-user"; /// - /// System member group icon + /// System member group icon. /// public const string MemberGroup = "icon-users-alt"; /// - /// System member type icon + /// System member type icon. /// public const string MemberType = "icon-users"; /// - /// System packages icon + /// System packages icon. /// public const string Packages = "icon-box"; /// - /// System property editor icon + /// System property editor icon. /// public const string PartialView = "icon-article"; /// - /// System property editor icon + /// System property editor icon. /// public const string PropertyEditor = "icon-autofill"; /// - /// Relation type icon + /// Relation type icon. /// public const string RelationType = "icon-trafic"; /// - /// Script type icon + /// Script type icon. /// public const string Script = "icon-script"; /// - /// Stylesheet type icon + /// Stylesheet type icon. /// public const string Stylesheet = "icon-brackets"; /// - /// System member icon + /// System member icon. /// public const string Template = "icon-layout"; /// - /// System user icon + /// System user icon. /// public const string User = "icon-user"; /// - /// System user group icon + /// System user group icon. /// public const string UserGroup = "icon-users"; } diff --git a/src/Umbraco.Core/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs index 049a536690ff..6513bf944d79 100644 --- a/src/Umbraco.Core/Constants-ObjectTypes.cs +++ b/src/Umbraco.Core/Constants-ObjectTypes.cs @@ -73,6 +73,8 @@ public static class Strings public const string MediaTypeContainer = "42AEF799-B288-4744-9B10-BE144B73CDC4"; + public const string MemberTypeContainer = "59EF5767-7223-4ABC-B229-72821DC711B9"; + public const string ContentItem = "10E2B09F-C28B-476D-B77A-AA686435E44A"; public const string ContentItemType = "7A333C54-6F43-40A4-86A2-18688DC7E532"; diff --git a/src/Umbraco.Core/Constants-UdiEntityType.cs b/src/Umbraco.Core/Constants-UdiEntityType.cs index f65c29051614..65dc8c7d08e8 100644 --- a/src/Umbraco.Core/Constants-UdiEntityType.cs +++ b/src/Umbraco.Core/Constants-UdiEntityType.cs @@ -37,11 +37,15 @@ public static class UdiEntityType // TODO: What is this? This alias is only used for the blue print tree to render the blueprint's document type, it's not a real udi type public const string DocumentTypeBluePrints = "document-type-blueprints"; + public const string MediaType = "media-type"; public const string MediaTypeContainer = "media-type-container"; + public const string DataType = "data-type"; public const string DataTypeContainer = "data-type-container"; + public const string MemberType = "member-type"; + public const string MemberTypeContainer = "member-type-container"; public const string MemberGroup = "member-group"; public const string RelationType = "relation-type"; diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs index acc9888bf4b2..cdeefc379553 100644 --- a/src/Umbraco.Core/Models/UmbracoObjectTypes.cs +++ b/src/Umbraco.Core/Models/UmbracoObjectTypes.cs @@ -8,19 +8,19 @@ namespace Umbraco.Cms.Core.Models; public enum UmbracoObjectTypes { /// - /// Default value + /// Default value. /// Unknown, /// - /// Root + /// Root. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.SystemRoot)] [FriendlyName("Root")] ROOT, /// - /// Document + /// Document. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.Document, typeof(IContent))] [FriendlyName("Document")] @@ -28,7 +28,7 @@ public enum UmbracoObjectTypes Document, /// - /// Media + /// Media. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.Media, typeof(IMedia))] [FriendlyName("Media")] @@ -36,7 +36,7 @@ public enum UmbracoObjectTypes Media, /// - /// Member Type + /// Member Type. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.MemberType, typeof(IMemberType))] [FriendlyName("Member Type")] @@ -44,7 +44,7 @@ public enum UmbracoObjectTypes MemberType, /// - /// Template + /// Template. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.Template, typeof(ITemplate))] [FriendlyName("Template")] @@ -52,7 +52,7 @@ public enum UmbracoObjectTypes Template, /// - /// Member Group + /// Member Group. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.MemberGroup, typeof(IMemberGroup))] [FriendlyName("Member Group")] @@ -60,7 +60,7 @@ public enum UmbracoObjectTypes MemberGroup, /// - /// "Media Type + /// "Media Type. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.MediaType, typeof(IMediaType))] [FriendlyName("Media Type")] @@ -68,7 +68,7 @@ public enum UmbracoObjectTypes MediaType, /// - /// Document Type + /// Document Type. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.DocumentType, typeof(IContentType))] [FriendlyName("Document Type")] @@ -76,14 +76,14 @@ public enum UmbracoObjectTypes DocumentType, /// - /// Recycle Bin + /// Recycle Bin. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.ContentRecycleBin)] [FriendlyName("Recycle Bin")] RecycleBin, /// - /// Member + /// Member. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.Member, typeof(IMember))] [FriendlyName("Member")] @@ -91,7 +91,7 @@ public enum UmbracoObjectTypes Member, /// - /// Data Type + /// Data Type. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.DataType, typeof(IDataType))] [FriendlyName("Data Type")] @@ -99,7 +99,7 @@ public enum UmbracoObjectTypes DataType, /// - /// Document type container + /// Document type container. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.DocumentTypeContainer)] [FriendlyName("Document Type Container")] @@ -107,7 +107,7 @@ public enum UmbracoObjectTypes DocumentTypeContainer, /// - /// Media type container + /// Media type container. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.MediaTypeContainer)] [FriendlyName("Media Type Container")] @@ -115,7 +115,15 @@ public enum UmbracoObjectTypes MediaTypeContainer, /// - /// Media type container + /// Member type container. + /// + [UmbracoObjectType(Constants.ObjectTypes.Strings.MemberTypeContainer)] + [FriendlyName("Member Type Container")] + [UmbracoUdiType(Constants.UdiEntityType.MemberTypeContainer)] + MemberTypeContainer, + + /// + /// Media type container. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.DataTypeContainer)] [FriendlyName("Data Type Container")] @@ -123,7 +131,7 @@ public enum UmbracoObjectTypes DataTypeContainer, /// - /// Relation type + /// Relation type. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.RelationType)] [FriendlyName("Relation Type")] @@ -131,35 +139,35 @@ public enum UmbracoObjectTypes RelationType, /// - /// Forms Form + /// Forms Form. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.FormsForm)] [FriendlyName("Form")] FormsForm, /// - /// Forms PreValue + /// Forms PreValue. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.FormsPreValue)] [FriendlyName("PreValue")] FormsPreValue, /// - /// Forms DataSource + /// Forms DataSource. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.FormsDataSource)] [FriendlyName("DataSource")] FormsDataSource, /// - /// Language + /// Language. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.Language)] [FriendlyName("Language")] Language, /// - /// Document Blueprint + /// Document Blueprint. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.DocumentBlueprint, typeof(IContent))] [FriendlyName("DocumentBlueprint")] @@ -167,7 +175,7 @@ public enum UmbracoObjectTypes DocumentBlueprint, /// - /// Reserved Identifier + /// Reserved Identifier. /// [UmbracoObjectType(Constants.ObjectTypes.Strings.IdReservation)] [FriendlyName("Identifier Reservation")] diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index 0732248182b8..c96f3b296fbe 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -113,6 +113,7 @@ protected override ActionResult GetMenuForNode(string id, Fo // root actions menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); menu.Items.Add(new RefreshNode(LocalizedTextService, true)); + return menu; } @@ -133,7 +134,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (container.HasChildren == false) { - // can delete doc type + // can delete media type menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 977205e89339..4fd033cd5739 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; @@ -5,7 +6,9 @@ using Umbraco.Cms.Core.Actions; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Models.Trees; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; @@ -18,19 +21,33 @@ namespace Umbraco.Cms.Web.BackOffice.Trees; [CoreTree] public abstract class MemberTypeAndGroupTreeControllerBase : TreeController { + private readonly IEntityService _entityService; private readonly IMemberTypeService _memberTypeService; + [Obsolete("Use the constructor with IEntityService instead")] protected MemberTypeAndGroupTreeControllerBase( ILocalizedTextService localizedTextService, UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, IMenuItemCollectionFactory menuItemCollectionFactory, IEventAggregator eventAggregator, IMemberTypeService memberTypeService) + : this(localizedTextService, umbracoApiControllerTypeCollection, menuItemCollectionFactory, eventAggregator, memberTypeService, StaticServiceProvider.Instance.GetRequiredService()) + { + } + + protected MemberTypeAndGroupTreeControllerBase( + ILocalizedTextService localizedTextService, + UmbracoApiControllerTypeCollection umbracoApiControllerTypeCollection, + IMenuItemCollectionFactory menuItemCollectionFactory, + IEventAggregator eventAggregator, + IMemberTypeService memberTypeService, + IEntityService entityService) : base(localizedTextService, umbracoApiControllerTypeCollection, eventAggregator) { MenuItemCollectionFactory = menuItemCollectionFactory; _memberTypeService = memberTypeService; + _entityService = entityService; } public IMenuItemCollectionFactory MenuItemCollectionFactory { get; } @@ -56,16 +73,56 @@ protected override ActionResult GetMenuForNode(string id, Fo if (id == Constants.System.RootString) { + // set the default to create + menu.DefaultMenuAlias = ActionNew.ActionAlias; + // root actions - menu.Items.Add(new CreateChildEntity(LocalizedTextService)); + + if (queryStrings["tree"].ToString() == Constants.Trees.MemberGroups) + { + menu.Items.Add(new CreateChildEntity(LocalizedTextService)); + } + else + { + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + } + menu.Items.Add(new RefreshNode(LocalizedTextService, true)); + return menu; } IMemberType? memberType = _memberTypeService.Get(int.Parse(id)); if (memberType != null) { - menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + IEntitySlim? container = _entityService.Get(int.Parse(id, CultureInfo.InvariantCulture), + UmbracoObjectTypes.MemberTypeContainer); + + if (container != null) + { + // set the default to create + menu.DefaultMenuAlias = ActionNew.ActionAlias; + + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + + menu.Items.Add(new MenuItem("rename", LocalizedTextService.Localize("actions", "rename")) + { + Icon = "icon-edit", + UseLegacyIcon = false, + }); + + if (container.HasChildren == false) + { + // can delete member type + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + } + + menu.Items.Add(new RefreshNode(LocalizedTextService, separatorBefore: true)); + } + else + { + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + } } // delete member type/group diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js index 435ece4bb9cd..9fb44e1c796b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js @@ -6,7 +6,7 @@ * @description * The controller for the media type creation dialog */ -function MediaTypesCreateController($scope, $location, navigationService, mediaTypeResource, formHelper, appState, localizationService) { +function MediaTypesCreateController($scope, $location, navigationService, mediaTypeResource, formHelper, appState) { $scope.model = { folderName: "", @@ -14,6 +14,7 @@ function MediaTypesCreateController($scope, $location, navigationService, mediaT }; var node = $scope.currentNode; + var section = appState.getSectionState("currentSection"); $scope.showCreateFolder = function() { $scope.model.creatingFolder = true; @@ -32,9 +33,7 @@ function MediaTypesCreateController($scope, $location, navigationService, mediaT formHelper.resetForm({ scope: $scope, formCtrl: $scope.createFolderForm }); - var section = appState.getSectionState("currentSection"); - - }, function (err) { + }, function(err) { formHelper.resetForm({ scope: $scope, formCtrl: $scope.createFolderForm, hasErrors: true }); $scope.error = err; }); @@ -43,7 +42,7 @@ function MediaTypesCreateController($scope, $location, navigationService, mediaT $scope.createMediaType = function() { $location.search('create', null); - $location.path("/settings/mediaTypes/edit/" + node.id).search("create", "true"); + $location.path("/" + section + "/mediaTypes/edit/" + node.id).search("create", "true"); navigationService.hideMenu(); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html index bd6ef087f4a5..18b6f954f586 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html @@ -15,9 +15,9 @@
umb-auto-focus> - New - Media type - + New + Media type +
  • diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js index 550ad7ed35fc..cb35f5705924 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js @@ -6,7 +6,7 @@ * @description * The controller for the member type creation dialog */ -function MemberTypesCreateController($scope, $location, navigationService, memberTypeResource, formHelper, appState, localizationService) { +function MemberTypesCreateController($scope, $location, navigationService, memberTypeResource, formHelper, appState) { $scope.model = { folderName: "", @@ -23,7 +23,7 @@ function MemberTypesCreateController($scope, $location, navigationService, membe $scope.createContainer = function () { if (formHelper.submitForm({ scope: $scope, - formCtrl: this.createFolderForm + formCtrl: $scope.createFolderForm })) { memberTypeResource.createContainer(node.id, $scope.model.folderName).then(function (folderId) { @@ -31,11 +31,11 @@ function MemberTypesCreateController($scope, $location, navigationService, membe var currPath = node.path ? node.path : "-1"; navigationService.syncTree({ tree: "memberTypes", path: currPath + "," + folderId, forceReload: true, activate: true }); - formHelper.resetForm({ scope: $scope, formCtrl: this.createFolderForm }); + formHelper.resetForm({ scope: $scope, formCtrl: $scope.createFolderForm }); }, function(err) { - formHelper.resetForm({ scope: $scope, formCtrl: this.createFolderForm, hasErrors: true }); - // TODO: Handle errors + formHelper.resetForm({ scope: $scope, formCtrl: $scope.createFolderForm, hasErrors: true }); + $scope.error = err; }); }; } @@ -45,6 +45,10 @@ function MemberTypesCreateController($scope, $location, navigationService, membe $location.path("/" + section + "/memberTypes/edit/" + node.id).search("create", "true"); navigationService.hideMenu(); } + $scope.close = function() { + const showMenu = true; + navigationService.hideDialog(showMenu); + }; } angular.module('umbraco').controller("Umbraco.Editors.MemberTypes.CreateController", MemberTypesCreateController); diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html index 5bcf6c42bf02..f7da766728e2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html @@ -1,50 +1,76 @@
    - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.controller.js index 94781dd5e774..543ee5ea46f3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.controller.js @@ -26,6 +26,23 @@ function MemberTypesDeleteController($scope, memberTypeResource, treeService, na }; + $scope.performContainerDelete = function () { + + //mark it for deletion (used in the UI) + $scope.currentNode.loading = true; + memberTypeResource.deleteContainerById($scope.currentNode.id).then(function () { + $scope.currentNode.loading = false; + + //get the root node before we remove it + var rootNode = treeService.getTreeRoot($scope.currentNode); + + // TODO: Need to sync tree, etc... + treeService.removeNode($scope.currentNode); + navigationService.hideMenu(); + }); + + }; + $scope.cancel = function() { navigationService.hideDialog(); }; @@ -33,7 +50,7 @@ function MemberTypesDeleteController($scope, memberTypeResource, treeService, na $scope.labels = {}; localizationService .format(["contentTypeEditor_yesDelete", "contentTypeEditor_andAllMembers"], "%0% " + $scope.currentNode.name + " %1%") - .then(function (data) { + .then(data => { $scope.labels.deleteConfirm = data; }); diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.html index 5930339d6e15..fdb259bfbabc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/delete.html @@ -2,22 +2,34 @@

    - Are you sure you want to delete {{currentNode.name}}? + Are you sure you want to delete {{currentNode.name}}?

    -

    - - All members - using this member type will be deleted permanently, please confirm you want to delete these as well. -

    + +
    + + +
    -
    +
    +

    + + + All members + + using this member type will be deleted permanently, please confirm you want to delete these as well. +

    - +
    - - + + + +
    +
    From 77f041af311c5b8098e92f764bf4ed21faaad829 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 20:52:56 +0200 Subject: [PATCH 10/26] Containers only needed in member types tree --- .../Trees/MemberTypeAndGroupTreeControllerBase.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 9d18d1a7dc4b..5613407b333f 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -61,7 +61,9 @@ protected override ActionResult GetTreeNodes(string id, Form var nodes = new TreeNodeCollection(); - nodes.AddRange( + if (queryStrings["tree"].ToString() == Constants.Trees.MemberTypes) + { + nodes.AddRange( _entityService.GetChildren(intId, UmbracoObjectTypes.MemberTypeContainer) .OrderBy(entity => entity.Name) .Select(dt => @@ -74,6 +76,7 @@ protected override ActionResult GetTreeNodes(string id, Form node.AdditionalData["jsClickCallback"] = "javascript:void(0);"; return node; })); + } // if the request is for folders only then just return if (queryStrings["foldersonly"].ToString().IsNullOrWhiteSpace() == false && From 14482fb561212de1428d44d400f08d36dd1930cb Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 21:15:22 +0200 Subject: [PATCH 11/26] Add view for rename dialog --- .../src/views/memberTypes/rename.html | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/views/memberTypes/rename.html diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/rename.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/rename.html new file mode 100644 index 000000000000..14e4a7e58cfb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/rename.html @@ -0,0 +1,23 @@ + From 2fc409992d65bd891252f364feb223589c99a24e Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 21:53:11 +0200 Subject: [PATCH 12/26] Adjust move action --- .../Controllers/ContentTypeController.cs | 4 +- .../Controllers/MediaTypeController.cs | 4 +- .../Controllers/MemberTypeController.cs | 14 +++- .../Trees/MediaTypeTreeController.cs | 3 +- .../MemberTypeAndGroupTreeControllerBase.cs | 13 ++-- .../common/resources/membertype.resource.js | 43 ++++++++++++ .../views/documentTypes/move.controller.js | 2 +- .../src/views/mediaTypes/move.controller.js | 2 +- .../src/views/mediaTypes/move.html | 2 +- .../src/views/memberTypes/move.controller.js | 66 ++++++++++++++++++- .../src/views/memberTypes/move.html | 49 +++++++++++++- 11 files changed, 184 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs index c29349a8da2d..a2575400a0f7 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs @@ -628,7 +628,7 @@ public IEnumerable GetAllowedChildren(int contentId) } /// - /// Move the content type + /// Move the content type. /// /// /// @@ -640,7 +640,7 @@ public IActionResult PostMove(MoveOrCopy move) => (type, i) => _contentTypeService.Move(type, i)); /// - /// Copy the content type + /// Copy the content type. /// /// /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs index 4efc62a8235b..07ded531b310 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs @@ -338,7 +338,7 @@ public IActionResult PostRenameContainer(int id, string name) } /// - /// Move the media type + /// Move the media type. /// /// /// @@ -350,7 +350,7 @@ public IActionResult PostMove(MoveOrCopy move) => (type, i) => _mediaTypeService.Move(type, i)); /// - /// Copy the media type + /// Copy the media type. /// /// /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs index bd493a96b81c..18bc6cfb62fa 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs @@ -313,7 +313,19 @@ public IActionResult PostRenameContainer(int id, string name) } /// - /// Copy the member type + /// Move the member type. + /// + /// + /// + [Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] + public IActionResult PostMove(MoveOrCopy move) => + PerformMove( + move, + i => _memberTypeService.Get(i), + (type, i) => _memberTypeService.Move(type, i)); + + /// + /// Copy the member type. /// /// /// diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index c96f3b296fbe..dfe34387b020 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -119,6 +119,7 @@ protected override ActionResult GetMenuForNode(string id, Fo IEntitySlim? container = _entityService.Get(int.Parse(id, CultureInfo.InvariantCulture), UmbracoObjectTypes.MediaTypeContainer); + if (container != null) { // set the default to create @@ -147,7 +148,7 @@ protected override ActionResult GetMenuForNode(string id, Fo menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); - // no move action if this is a child doc type + // no move action if this is a child media type if (parent == null) { menu.Items.Add(LocalizedTextService, hasSeparator: true, opensDialog: true, useLegacyIcon: false); diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 5613407b333f..226a799a8fb4 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -114,11 +114,10 @@ protected override ActionResult GetMenuForNode(string id, Fo return menu; } - IMemberType? memberType = _memberTypeService.Get(int.Parse(id)); - if (memberType != null) + if (queryStrings["tree"].ToString() == Constants.Trees.MemberTypes) { IEntitySlim? container = _entityService.Get(int.Parse(id, CultureInfo.InvariantCulture), - UmbracoObjectTypes.MemberTypeContainer); + UmbracoObjectTypes.MemberTypeContainer); if (container != null) { @@ -143,7 +142,13 @@ protected override ActionResult GetMenuForNode(string id, Fo } else { - menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + IMemberType? ct = _memberTypeService.Get(int.Parse(id)); + + if (ct != null) + { + menu.Items.Add(LocalizedTextService, hasSeparator: true, opensDialog: true, useLegacyIcon: false); + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + } } } diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index b6bcdb306758..3d051953e875 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -132,6 +132,49 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter, local 'Failed to save data for member type id ' + contentType.id); }, + /** + * @ngdoc method + * @name umbraco.resources.memberTypeResource#move + * @methodOf umbraco.resources.memberTypeResource + * + * @description + * Moves a node underneath a new parentId + * + * ##usage + *
    +         * memberTypeResource.move({ parentId: 1244, id: 123 })
    +         *    .then(function() {
    +         *        alert("node was moved");
    +         *    }, function(err){
    +         *      alert("node didnt move:" + err.data.Message);
    +         *    });
    +         * 
    + * @param {Object} args arguments object + * @param {Int} args.idd the ID of the node to move + * @param {Int} args.parentId the ID of the parent node to move to + * @returns {Promise} resourcePromise object. + * + */ + move: function (args) { + if (!args) { + throw "args cannot be null"; + } + if (!args.parentId) { + throw "args.parentId cannot be null"; + } + if (!args.id) { + throw "args.id cannot be null"; + } + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("memberTypeApiBaseUrl", "PostMove"), + { + parentId: args.parentId, + id: args.id + }, { responseType: 'text' }), + 'Failed to move member type'); + }, + copy: function (args) { if (!args) { throw "args cannot be null"; diff --git a/src/Umbraco.Web.UI.Client/src/views/documentTypes/move.controller.js b/src/Umbraco.Web.UI.Client/src/views/documentTypes/move.controller.js index e63656cee3d7..3888af62ecdd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documentTypes/move.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/documentTypes/move.controller.js @@ -1,6 +1,6 @@ angular.module("umbraco") .controller("Umbraco.Editors.DocumentTypes.MoveController", - function ($scope, contentTypeResource, treeService, navigationService, notificationsService, appState, eventsService) { + function ($scope, contentTypeResource, treeService, navigationService, appState, eventsService) { $scope.dialogTreeApi = {}; $scope.source = _.clone($scope.currentNode); diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.controller.js index 263cefea642a..bb63b9a4ce22 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.controller.js @@ -1,6 +1,6 @@ angular.module("umbraco") .controller("Umbraco.Editors.MediaTypes.MoveController", - function ($scope, mediaTypeResource, treeService, navigationService, notificationsService, appState, eventsService) { + function ($scope, mediaTypeResource, treeService, navigationService, appState, eventsService) { $scope.dialogTreeApi = {}; $scope.source = _.clone($scope.currentNode); diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.html b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.html index 6bb1b6fa105d..79dbf2072961 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.html +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/move.html @@ -4,7 +4,7 @@

    - Select the folder to move {{source.name}} to in the tree structure below + Select the folder to move {{source.name}} to in the tree structure below

    diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.controller.js index fe7288f4e2b1..25c3961c838b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.controller.js @@ -1,5 +1,67 @@ angular.module("umbraco") .controller("Umbraco.Editors.MemberTypes.MoveController", - function($scope){ + function ($scope, memberTypeResource, treeService, navigationService, appState, eventsService) { - }); + $scope.dialogTreeApi = {}; + $scope.source = _.clone($scope.currentNode); + + function nodeSelectHandler(args) { + args.event.preventDefault(); + args.event.stopPropagation(); + + if ($scope.target) { + //un-select if there's a current one selected + $scope.target.selected = false; + } + + $scope.target = args.node; + $scope.target.selected = true; + } + + $scope.move = function () { + + $scope.busy = true; + $scope.error = false; + + memberTypeResource.move({ parentId: $scope.target.id, id: $scope.source.id }) + .then(function (path) { + $scope.error = false; + $scope.success = true; + $scope.busy = false; + + //first we need to remove the node that launched the dialog + treeService.removeNode($scope.currentNode); + + //get the currently edited node (if any) + var activeNode = appState.getTreeState("selectedNode"); + + //we need to do a double sync here: first sync to the moved content - but don't activate the node, + //then sync to the currenlty edited content (note: this might not be the content that was moved!!) + + navigationService.syncTree({ tree: "memberTypes", path: path, forceReload: true, activate: false }).then(function (args) { + if (activeNode) { + var activeNodePath = treeService.getPath(activeNode).join(); + //sync to this node now - depending on what was copied this might already be synced but might not be + navigationService.syncTree({ tree: "memberTypes", path: activeNodePath, forceReload: false, activate: true }); + } + }); + + eventsService.emit('app.refreshEditor'); + + }, function (err) { + $scope.success = false; + $scope.error = err; + $scope.busy = false; + + }); + }; + + $scope.onTreeInit = function () { + $scope.dialogTreeApi.callbacks.treeNodeSelect(nodeSelectHandler); + }; + + $scope.close = function () { + navigationService.hideDialog(); + }; + + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.html index 0eeadfab8044..731b4da27435 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.html +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/move.html @@ -1,11 +1,54 @@ -
    +
    +
    -

    - Select the folder to move {{currentNode.name}} to. +

    + Select the folder to move {{source.name}} to in the tree structure below

    + +
    +
    +
    {{error.errorMsg}}
    +
    {{error.data.message}}
    +
    +
    + +
    +
    + {{source.name}} was moved underneath {{target.name}} +
    + +
    + +
    + +
    + + +
    + +
    +
    + + +
    From 006780e9ddef1866ec7328a1abd59518c4461f38 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 22:12:03 +0200 Subject: [PATCH 13/26] Don't add delete action to container --- .../Trees/MediaTypeTreeController.cs | 2 +- .../Trees/MemberTypeAndGroupTreeControllerBase.cs | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index dfe34387b020..9ea247b2ba43 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -136,7 +136,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (container.HasChildren == false) { // can delete media type - menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); } menu.Items.Add(new RefreshNode(LocalizedTextService, separatorBefore: true)); diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 226a799a8fb4..03bf00eec31d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -148,12 +148,14 @@ protected override ActionResult GetMenuForNode(string id, Fo { menu.Items.Add(LocalizedTextService, hasSeparator: true, opensDialog: true, useLegacyIcon: false); menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); } } } - - // delete member type/group - menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + else + { + menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); + } return menu; } From 9462c343570104939153facc779621a266b724c1 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 22:19:24 +0200 Subject: [PATCH 14/26] Formatting --- src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs index f68b4f87830d..880bf59e92e5 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs @@ -154,7 +154,7 @@ protected override ActionResult GetMenuForNode(string id, Fo IEntitySlim? container = _entityService.Get(int.Parse(id, CultureInfo.InvariantCulture), UmbracoObjectTypes.DocumentTypeContainer); if (container != null) { - //set the default to create + // set the default to create menu.DefaultMenuAlias = ActionNew.ActionAlias; menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); @@ -167,7 +167,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (container.HasChildren == false) { - //can delete doc type + // can delete doc type menu.Items.Add(LocalizedTextService, hasSeparator: true, opensDialog: true, useLegacyIcon: false); } From c56331c8bd5f69f6f4a66286308a73779ff88aaa Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 22:32:38 +0200 Subject: [PATCH 15/26] Only allow creating folder at root or in another folder --- .../src/views/mediaTypes/create.controller.js | 5 +++-- .../src/views/mediaTypes/create.html | 9 ++++----- .../src/views/memberTypes/create.controller.js | 5 +++-- .../src/views/memberTypes/create.html | 9 ++++----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js index 9fb44e1c796b..37cf611a8501 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.controller.js @@ -9,8 +9,9 @@ function MediaTypesCreateController($scope, $location, navigationService, mediaTypeResource, formHelper, appState) { $scope.model = { - folderName: "", - creatingFolder: false + allowCreateFolder: $scope.currentNode.parentId === null || $scope.currentNode.nodeType === 'container', + folderName: "", + creatingFolder: false }; var node = $scope.currentNode; diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html index 18b6f954f586..914d38dfbed3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html @@ -10,9 +10,8 @@
      -
    • -
    • -
    • - diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js index cb35f5705924..bbb22dd37d32 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.controller.js @@ -9,8 +9,9 @@ function MemberTypesCreateController($scope, $location, navigationService, memberTypeResource, formHelper, appState) { $scope.model = { - folderName: "", - creatingFolder: false + allowCreateFolder: $scope.currentNode.parentId === null || $scope.currentNode.nodeType === 'container', + folderName: "", + creatingFolder: false }; var node = $scope.currentNode; diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html index f7da766728e2..da3089a94f1e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html @@ -10,9 +10,8 @@
        -
      • -
      • -
      • - From 47b9b9d8c8a5c841f1cb5c89a1274cbaa3ec455b Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 22:53:00 +0200 Subject: [PATCH 16/26] Remove ellipsis --- src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html | 4 +++- src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html index 914d38dfbed3..097f4fee1bed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/create.html @@ -22,7 +22,9 @@
      diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html index da3089a94f1e..971f8a930394 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/create.html @@ -22,7 +22,9 @@
    From 551246f44e81a40a9bb83ff6ec4be9cdbb243147 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 22:53:29 +0200 Subject: [PATCH 17/26] Formatting --- src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs | 4 ++-- .../Trees/MemberTypeAndGroupTreeControllerBase.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index 9ea247b2ba43..0ba0fabeb5ec 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -64,10 +64,10 @@ protected override ActionResult GetTreeNodes(string id, Form .OrderBy(entity => entity.Name) .Select(dt => { - TreeNode node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, Constants.Icons.Folder, - dt.HasChildren, ""); + TreeNode node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, Constants.Icons.Folder, dt.HasChildren, string.Empty); node.Path = dt.Path; node.NodeType = "container"; + // TODO: This isn't the best way to ensure a no operation process for clicking a node but it works for now. node.AdditionalData["jsClickCallback"] = "javascript:void(0);"; return node; diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 03bf00eec31d..4e9fabe466f2 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -68,10 +68,10 @@ protected override ActionResult GetTreeNodes(string id, Form .OrderBy(entity => entity.Name) .Select(dt => { - TreeNode node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, Constants.Icons.Folder, - dt.HasChildren, ""); + TreeNode node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, Constants.Icons.Folder, dt.HasChildren, string.Empty); node.Path = dt.Path; node.NodeType = "container"; + // TODO: This isn't the best way to ensure a no operation process for clicking a node but it works for now. node.AdditionalData["jsClickCallback"] = "javascript:void(0);"; return node; From 1ca7c663208673b2028b3e04da6549c564c2c4a0 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 19 Sep 2023 23:21:22 +0200 Subject: [PATCH 18/26] Modern syntax --- .../Controllers/ContentTypeController.cs | 2 +- src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs | 3 +-- src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs index a2575400a0f7..e693d907552f 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs @@ -458,7 +458,7 @@ public IActionResult PostRenameContainer(int id, string name) } }); - if (!(savedCt.Result is null)) + if (savedCt.Result is not null) { return savedCt.Result; } diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs index 07ded531b310..33098e3ce316 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs @@ -322,14 +322,13 @@ public IActionResult PostRenameContainer(int id, string name) i => _mediaTypeService.Get(i), type => _mediaTypeService.Save(type)); - if (!(savedCt.Result is null)) + if (savedCt.Result is not null) { return savedCt.Result; } MediaTypeDisplay? display = _umbracoMapper.Map(savedCt.Value); - display?.AddSuccessNotification( _localizedTextService.Localize("speechBubbles", "mediaTypeSavedHeader"), string.Empty); diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs index 18bc6cfb62fa..89fa1052bc54 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs @@ -291,14 +291,13 @@ public IActionResult PostRenameContainer(int id, string name) } } - ActionResult savedCt = PerformPostSave( contentTypeSave, i => ct, type => _memberTypeService.Save(type)); - if (!(savedCt.Result is null)) + if (savedCt.Result is not null) { return savedCt.Result; } From 821e54e9494783eee9882187cdb1c641c28fcf47 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 01:23:19 +0200 Subject: [PATCH 19/26] Alternative to GetNodesFromService method for member types for now --- .../Trees/ContentTypeTreeController.cs | 7 ++--- .../Trees/DataTypeTreeController.cs | 11 ++++---- .../Trees/MediaTypeTreeController.cs | 3 +-- .../Trees/MemberGroupTreeController.cs | 3 ++- .../MemberTypeAndGroupTreeControllerBase.cs | 26 ++++++++++++++++++- .../Trees/MemberTypeTreeController.cs | 3 +-- 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs index 880bf59e92e5..53c288f39b9c 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTypeTreeController.cs @@ -54,7 +54,8 @@ public async Task SearchAsync(string query, int pageSize, l protected override ActionResult CreateRootNode(FormCollection queryStrings) { ActionResult rootResult = base.CreateRootNode(queryStrings); - if (!(rootResult.Result is null)) + + if (rootResult.Result is not null) { return rootResult; } @@ -133,7 +134,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (id == Constants.System.RootString) { - //set the default to create + // set the default to create menu.DefaultMenuAlias = ActionNew.ActionAlias; // root actions @@ -167,7 +168,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (container.HasChildren == false) { - // can delete doc type + // can delete document type menu.Items.Add(LocalizedTextService, hasSeparator: true, opensDialog: true, useLegacyIcon: false); } diff --git a/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs index d0164afa0618..27e079833a36 100644 --- a/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/DataTypeTreeController.cs @@ -66,10 +66,10 @@ protected override ActionResult GetTreeNodes(string id, Form .OrderBy(entity => entity.Name) .Select(dt => { - TreeNode node = CreateTreeNode(dt, Constants.ObjectTypes.DataType, id, queryStrings, - Constants.Icons.Folder, dt.HasChildren); + TreeNode node = CreateTreeNode(dt, Constants.ObjectTypes.DataType, id, queryStrings, Constants.Icons.Folder, dt.HasChildren); node.Path = dt.Path; node.NodeType = "container"; + // TODO: This isn't the best way to ensure a no operation process for clicking a node but it works for now. node.AdditionalData["jsClickCallback"] = "javascript:void(0);"; return node; @@ -93,8 +93,7 @@ protected override ActionResult GetTreeNodes(string id, Form .Select(dt => { IDataType dataType = dataTypes[dt.Id]; - TreeNode node = CreateTreeNode(dt.Id.ToInvariantString(), id, queryStrings, dt.Name, - dataType.Editor?.Icon, false); + TreeNode node = CreateTreeNode(dt.Id.ToInvariantString(), id, queryStrings, dt.Name, dataType.Editor?.Icon, false); node.Path = dt.Path; return node; }) @@ -140,7 +139,7 @@ protected override ActionResult GetMenuForNode(string id, Fo if (id == Constants.System.RootString) { - //set the default to create + // set the default to create menu.DefaultMenuAlias = ActionNew.ActionAlias; // root actions @@ -153,7 +152,7 @@ protected override ActionResult GetMenuForNode(string id, Fo UmbracoObjectTypes.DataTypeContainer); if (container != null) { - //set the default to create + // set the default to create menu.DefaultMenuAlias = ActionNew.ActionAlias; menu.Items.Add(LocalizedTextService, opensDialog: true, useLegacyIcon: false); diff --git a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs index 0ba0fabeb5ec..ebc9e0e22786 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MediaTypeTreeController.cs @@ -91,8 +91,7 @@ protected override ActionResult GetTreeNodes(string id, Form // need this check to keep supporting sites where children have already been created. var hasChildren = dt.HasChildren; IMediaType? mt = mediaTypes.FirstOrDefault(x => x.Id == dt.Id); - TreeNode node = CreateTreeNode(dt, Constants.ObjectTypes.MediaType, id, queryStrings, - mt?.Icon ?? Constants.Icons.MediaType, hasChildren); + TreeNode node = CreateTreeNode(dt, Constants.ObjectTypes.MediaType, id, queryStrings, mt?.Icon ?? Constants.Icons.MediaType, hasChildren); node.Path = dt.Path; return node; diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs index 8d457169d233..39b4c78d57aa 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberGroupTreeController.cs @@ -57,7 +57,8 @@ protected override IEnumerable GetTreeNodesFromService(string id, Form protected override ActionResult CreateRootNode(FormCollection queryStrings) { ActionResult rootResult = base.CreateRootNode(queryStrings); - if (!(rootResult.Result is null)) + + if (rootResult.Result is not null) { return rootResult.Result; } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs index 4e9fabe466f2..5e290b4e187e 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeAndGroupTreeControllerBase.cs @@ -14,6 +14,7 @@ using Umbraco.Cms.Core.Trees; using Umbraco.Cms.Web.Common.Attributes; using Umbraco.Extensions; +using static Umbraco.Cms.Core.Constants.Conventions; namespace Umbraco.Cms.Web.BackOffice.Trees; @@ -85,7 +86,30 @@ protected override ActionResult GetTreeNodes(string id, Form return nodes; } - nodes.AddRange(GetTreeNodesFromService(id, queryStrings)); + if (queryStrings["tree"].ToString() == Constants.Trees.MemberTypes) + { + IEnumerable memberTypes = _memberTypeService.GetAll(); + + nodes.AddRange( + _entityService.GetChildren(intId, UmbracoObjectTypes.MemberType) + .OrderBy(entity => entity.Name) + .Select(dt => + { + var hasChildren = dt.HasChildren; + IMemberType? mt = memberTypes.FirstOrDefault(x => x.Id == dt.Id); + TreeNode node = CreateTreeNode(dt, Constants.ObjectTypes.MemberType, id, queryStrings, mt?.Icon ?? Constants.Icons.MemberType, hasChildren); + + node.Path = dt.Path; + return node; + })); + + //nodes.AddRange(GetTreeNodesFromService(id, queryStrings)); + } + else + { + nodes.AddRange(GetTreeNodesFromService(id, queryStrings)); + } + return nodes; } diff --git a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs index 5325e7728ebc..ffa7bd539717 100644 --- a/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/MemberTypeTreeController.cs @@ -67,6 +67,5 @@ public async Task SearchAsync(string query, int pageSize, l protected override IEnumerable GetTreeNodesFromService(string id, FormCollection queryStrings) => _memberTypeService.GetAll() .OrderBy(x => x.Name) - .Select(dt => CreateTreeNode(dt, Constants.ObjectTypes.MemberType, id, queryStrings, - dt?.Icon ?? Constants.Icons.MemberType, false)); + .Select(dt => CreateTreeNode(dt, Constants.ObjectTypes.MemberType, id, queryStrings, dt?.Icon ?? Constants.Icons.MemberType, false)); } From 3fc272940dc80d4aeacf2827c29af046b02b7a14 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 10:15:14 +0200 Subject: [PATCH 20/26] Update save --- .../Controllers/MemberTypeController.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs index 89fa1052bc54..31fcdb29c21c 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs @@ -291,11 +291,10 @@ public IActionResult PostRenameContainer(int id, string name) } } - ActionResult savedCt = - PerformPostSave( - contentTypeSave, - i => ct, - type => _memberTypeService.Save(type)); + ActionResult savedCt = PerformPostSave( + contentTypeSave, + i => _memberTypeService.Get(i), + type => _memberTypeService.Save(type)); if (savedCt.Result is not null) { From d3264aabe27a9c806be8599ddfcf4baf73ff238b Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 10:19:22 +0200 Subject: [PATCH 21/26] Localize many at once --- .../src/views/documentTypes/edit.controller.js | 9 ++++----- .../src/views/mediaTypes/edit.controller.js | 9 ++++----- .../src/views/memberTypes/edit.controller.js | 9 ++++----- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js index d83cf350db97..b3468fc9a861 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js @@ -200,11 +200,10 @@ vm.page.saveButtonState = "busy"; - localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) { - localizationService.localize("modelsBuilder_waitingMessage").then(function (msgValue) { - notificationsService.info(headerValue, msgValue); - }); - }); + localizationService.localizeMany(["modelsBuilder_buildingModels", "modelsBuilder_waitingMessage"]) + .then(values => { + notificationsService.info(values[0], values[1]); + }); contentTypeHelper.generateModels().then(function (result) { diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js index 8c0ce561d9a1..bc61db7d9e33 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js @@ -205,11 +205,10 @@ vm.page.saveButtonState = "busy"; - localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) { - localizationService.localize("modelsBuilder_waitingMessage").then(function(msgValue) { - notificationsService.info(headerValue, msgValue); - }); - }); + localizationService.localizeMany(["modelsBuilder_buildingModels", "modelsBuilder_waitingMessage"]) + .then(values => { + notificationsService.info(values[0], values[1]); + }); contentTypeHelper.generateModels().then(function (result) { diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js index f5658ad1df05..fde7cfa67bc1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js @@ -126,11 +126,10 @@ vm.page.saveButtonState = "busy"; - localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) { - localizationService.localize("modelsBuilder_waitingMessage").then(function(msgValue) { - notificationsService.info(headerValue, msgValue); - }); - }); + localizationService.localizeMany(["modelsBuilder_buildingModels", "modelsBuilder_waitingMessage"]) + .then(values => { + notificationsService.info(values[0], values[1]); + }); contentTypeHelper.generateModels().then(function (result) { From a419e0f3257fb401fe45783335d405adceb9981c Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 10:30:00 +0200 Subject: [PATCH 22/26] Localize many at once --- .../src/views/documentTypes/edit.controller.js | 7 +++---- .../src/views/mediaTypes/edit.controller.js | 9 ++++----- .../src/views/memberTypes/edit.controller.js | 13 ++++++------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js index b3468fc9a861..1f4865436123 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js @@ -364,10 +364,9 @@ editorState.set($scope.content); } else { - localizationService.localize("speechBubbles_validationFailedHeader").then(function (headerValue) { - localizationService.localize("speechBubbles_validationFailedMessage").then(function (msgValue) { - notificationsService.error(headerValue, msgValue); - }); + localizationService.localizeMany(["speechBubbles_validationFailedHeader", "speechBubbles_validationFailedMessage"]) + .then(values => { + notificationsService.error(values[0], values[1]); }); } vm.page.saveButtonState = "error"; diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js index bc61db7d9e33..a863ec7d615a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js @@ -327,11 +327,10 @@ editorState.set($scope.content); } else { - localizationService.localize("speechBubbles_validationFailedHeader").then(function (headerValue) { - localizationService.localize("speechBubbles_validationFailedMessage").then(function (msgValue) { - notificationsService.error(headerValue, msgValue); - }); - }); + localizationService.localizeMany(["speechBubbles_validationFailedHeader", "speechBubbles_validationFailedMessage"]) + .then(values => { + notificationsService.error(values[0], values[1]); + }); } vm.page.saveButtonState = "error"; diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js index fde7cfa67bc1..0be093b6f93e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js @@ -204,7 +204,7 @@ function save() { // only save if there is no overlays open - if(overlayHelper.getNumberOfOverlays() === 0) { + if (overlayHelper.getNumberOfOverlays() === 0) { var deferred = $q.defer(); @@ -221,7 +221,7 @@ }).then(function (data) { //success - if(!infiniteMode) { + if (!infiniteMode) { syncTreeNode(vm.contentType, data.path); } @@ -235,7 +235,7 @@ vm.page.saveButtonState = "success"; - if(infiniteMode && $scope.model.submit) { + if (infiniteMode && $scope.model.submit) { $scope.model.submit(); } @@ -247,10 +247,9 @@ editorState.set($scope.content); } else { - localizationService.localize("speechBubbles_validationFailedHeader").then(function (headerValue) { - localizationService.localize("speechBubbles_validationFailedMessage").then(function (msgValue) { - notificationsService.error(headerValue, msgValue); - }); + localizationService.localizeMany(["speechBubbles_validationFailedHeader", "speechBubbles_validationFailedMessage"]) + .then(values => { + notificationsService.error(values[0], values[1]); }); } From 6ad9b531e5a3de8849cf69e8ee82fe6c3d678307 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 10:57:02 +0200 Subject: [PATCH 23/26] Make GetEmpty for member type take parentId parameter --- .../Controllers/MediaTypeController.cs | 3 +- .../Controllers/MemberTypeController.cs | 32 ++++++++++++++++--- .../common/resources/membertype.resource.js | 4 +-- .../views/documentTypes/edit.controller.js | 2 +- .../src/views/mediaTypes/edit.controller.js | 2 +- .../src/views/memberTypes/edit.controller.js | 2 +- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs index 33098e3ce316..b62d6e7fcb29 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs @@ -262,9 +262,8 @@ public IActionResult GetWhereCompositionIsUsedInContentTypes(GetAvailableComposi return dto; } - /// - /// Returns all media types + /// Returns all media types. /// [Authorize(Policy = AuthorizationPolicies.TreeAccessMediaTypes)] public IEnumerable GetAll() => diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs index 31fcdb29c21c..6128fa83635d 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs @@ -189,14 +189,36 @@ public IActionResult GetWhereCompositionIsUsedInMemberTypes(int contentTypeId) return Ok(result); } - public MemberTypeDisplay? GetEmpty() + //public MemberTypeDisplay? GetEmpty() + //{ + // var ct = new MemberType(_shortStringHelper, -1) + // { + // Icon = Constants.Icons.Member + // }; + + // MemberTypeDisplay? dto = _umbracoMapper.Map(ct); + // return dto; + //} + + [Authorize(Policy = AuthorizationPolicies.TreeAccessMemberTypes)] + public MemberTypeDisplay? GetEmpty(int parentId) { - var ct = new MemberType(_shortStringHelper, -1) + IMemberType mt; + if (parentId != Constants.System.Root) + { + IMemberType? parent = _memberTypeService.Get(parentId); + mt = parent != null + ? new MemberType(_shortStringHelper, parent, string.Empty) + : new MemberType(_shortStringHelper, parentId); + } + else { - Icon = Constants.Icons.Member - }; + mt = new MemberType(_shortStringHelper, parentId); + } - MemberTypeDisplay? dto = _umbracoMapper.Map(ct); + mt.Icon = Constants.Icons.Member; + + MemberTypeDisplay? dto = _umbracoMapper.Map(mt); return dto; } diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index 3d051953e875..c1681039047b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -101,13 +101,13 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter, local 'Failed to delete member type container'); }, - getScaffold: function () { + getScaffold: function (parentId) { return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "memberTypeApiBaseUrl", - "GetEmpty")), + "GetEmpty", { parentId: parentId })), 'Failed to retrieve content type scaffold'); }, diff --git a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js index 1f4865436123..2b95cc49b7f7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/documentTypes/edit.controller.js @@ -404,7 +404,7 @@ // convert icons for content type convertLegacyIcons(contentType); - //set a shared state + // set a shared state editorState.set(contentType); vm.contentType = contentType; diff --git a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js index a863ec7d615a..51e69e90ee27 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediaTypes/edit.controller.js @@ -347,7 +347,7 @@ // convert icons for content type convertLegacyIcons(contentType); - //set a shared state + // set a shared state editorState.set(contentType); vm.contentType = contentType; diff --git a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js index 0be093b6f93e..9ffc04dc5abc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/memberTypes/edit.controller.js @@ -268,7 +268,7 @@ // convert legacy icons convertLegacyIcons(contentType); - //set a shared state + // set a shared state editorState.set(contentType); vm.contentType = contentType; From 0f14d5642e074e88b3ca204074cb2184bbdca12d Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 11:16:50 +0200 Subject: [PATCH 24/26] Make function backwards compatible --- .../src/common/resources/membertype.resource.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index c1681039047b..1a1b137a5359 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -103,6 +103,9 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter, local getScaffold: function (parentId) { + // For backwards compatibility. + parentId = parentId ?? -1; + return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( From ac0eab9d2d8b0bd967eb865deeb3c76d6b54b6a8 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 11:42:45 +0200 Subject: [PATCH 25/26] Update comment --- .../src/common/resources/membertype.resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index 1a1b137a5359..95442739ef0e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -103,7 +103,7 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter, local getScaffold: function (parentId) { - // For backwards compatibility. + // For backwards compatibility since parentId parameter has been added. parentId = parentId ?? -1; return umbRequestHelper.resourcePromise( From e858c33314ebcb77847b45e43cdf3f50cbed3c72 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Wed, 20 Sep 2023 11:50:53 +0200 Subject: [PATCH 26/26] Fix typos --- .../src/common/resources/mediatype.resource.js | 2 +- .../src/common/resources/membertype.resource.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js index 8ca365cf0f65..fce231edfad8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js @@ -208,7 +208,7 @@ function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter, locali * }); * * @param {Object} args arguments object - * @param {Int} args.idd the ID of the node to move + * @param {Int} args.id the ID of the node to move * @param {Int} args.parentId the ID of the parent node to move to * @returns {Promise} resourcePromise object. * diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index 95442739ef0e..7c78b69975cb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -153,7 +153,7 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter, local * }); * * @param {Object} args arguments object - * @param {Int} args.idd the ID of the node to move + * @param {Int} args.id the ID of the node to move * @param {Int} args.parentId the ID of the parent node to move to * @returns {Promise} resourcePromise object. *