From 4ce0e6bac3f394c7d6ab141fecf0ad6ea7091b90 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 9 Nov 2015 18:34:14 +0100 Subject: [PATCH] Starts fixing up the doc type folders stuff, fixes permissions settings on the trees, adds error messaging for duplicating folders, removes the click handler for folder nodes --- .../views/documenttypes/create.controller.js | 18 ++++++---- .../src/views/documenttypes/create.html | 5 +++ src/Umbraco.Web/Editors/ContentController.cs | 34 ++++++------------- .../Editors/ContentTypeController.cs | 6 ++-- .../Trees/ContentTypeTreeController.cs | 11 ++++-- .../Trees/MediaTypeTreeController.cs | 2 +- .../Trees/MemberTypeTreeController.cs | 2 +- .../WebApi/HttpRequestMessageExtensions.cs | 17 ++++++++++ 8 files changed, 56 insertions(+), 39 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js index 0c9d027646..4897ad3023 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js @@ -6,11 +6,11 @@ * @description * The controller for the doc type creation dialog */ -function DocumentTypesCreateController($scope, $location, navigationService, contentTypeResource, formHelper, appState) { +function DocumentTypesCreateController($scope, $location, navigationService, contentTypeResource, formHelper, appState, notificationsService) { $scope.model = { folderName: "", - creatingFolder: false + creatingFolder: false, }; var node = $scope.dialogOptions.currentNode; @@ -29,12 +29,18 @@ function DocumentTypesCreateController($scope, $location, navigationService, con formHelper.resetForm({ scope: $scope }); - var section = appState.getSectionState("currentSection"); - $location.path("/" + section + "/documenttypes/list/" + folderId); - + var section = appState.getSectionState("currentSection"); + }, function(err) { - //TODO: Handle errors + $scope.error = err; + + //show any notifications + if (angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } }); }; } diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html index 59c8a3d7ec..a8e4086352 100644 --- a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html @@ -35,6 +35,11 @@
+ +
+
{{error.errorMsg}}
+

{{error.data.message}}

+
diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index f745cd3d06..192b49e2cf 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -602,13 +602,9 @@ namespace Umbraco.Web.Editors //cannot move if the content item is not allowed at the root if (toMove.ContentType.AllowedAsRoot == false) { - var msg = Services.TextService.Localize("moveOrCopy/notAllowedAtRoot"); - var notificationModel = new SimpleNotificationModel - { - Message = msg - }; - notificationModel.AddErrorNotification(msg, ""); - throw new HttpResponseException( Request.CreateValidationErrorResponse(notificationModel)); + throw new HttpResponseException( + Request.CreateNotificationValidationErrorResponse( + Services.TextService.Localize("moveOrCopy/notAllowedAtRoot"))); } } else @@ -619,31 +615,21 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - - //check if the item is allowed under this one if (parent.ContentType.AllowedContentTypes.Select(x => x.Id).ToArray() .Any(x => x.Value == toMove.ContentType.Id) == false) { - var msg = Services.TextService.Localize("moveOrCopy/notAllowedByContentType"); - var notificationModel = new SimpleNotificationModel - { - Message = msg - }; - notificationModel.AddErrorNotification(msg, ""); - throw new HttpResponseException(Request.CreateValidationErrorResponse(notificationModel)); + throw new HttpResponseException( + Request.CreateNotificationValidationErrorResponse( + Services.TextService.Localize("moveOrCopy/notAllowedByContentType"))); } // Check on paths if ((string.Format(",{0},", parent.Path)).IndexOf(string.Format(",{0},", toMove.Id), StringComparison.Ordinal) > -1) - { - var msg = Services.TextService.Localize("moveOrCopy/notAllowedByPath"); - var notificationModel = new SimpleNotificationModel - { - Message = msg - }; - notificationModel.AddErrorNotification(msg, ""); - throw new HttpResponseException(Request.CreateValidationErrorResponse(notificationModel)); + { + throw new HttpResponseException( + Request.CreateNotificationValidationErrorResponse( + Services.TextService.Localize("moveOrCopy/notAllowedByPath"))); } } diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index aac243f727..6ca5eedff7 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -137,18 +137,16 @@ namespace Umbraco.Web.Editors return Request.CreateResponse(HttpStatusCode.OK); } - + public HttpResponseMessage PostCreateFolder(int parentId, string name) { var result = Services.ContentTypeService.CreateFolder(parentId, name, Security.CurrentUser.Id); return result ? Request.CreateResponse(HttpStatusCode.OK, result.Result) //return the id - : Request.CreateValidationErrorResponse(result.Exception.Message); + : Request.CreateNotificationValidationErrorResponse(result.Exception.Message); } - - public ContentTypeDisplay PostSave(ContentTypeSave contentTypeSave) { var savedCt = PerformPostSave( diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 2bb8df94c2..9a048471b8 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -15,7 +15,7 @@ using Umbraco.Core.Services; namespace Umbraco.Web.Trees { - [UmbracoTreeAuthorize(Constants.Trees.DataTypes)] + [UmbracoTreeAuthorize(Constants.Trees.DocumentTypes)] [Tree(Constants.Applications.Settings, Constants.Trees.DocumentTypes, null, sortOrder: 6)] [Umbraco.Web.Mvc.PluginController("UmbracoTrees")] [CoreTree] @@ -36,7 +36,8 @@ namespace Umbraco.Web.Trees var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-folder", dt.HasChildren(), ""); node.Path = dt.Path; node.NodeType = "container"; - + //TODO: This isn't the best way to ensure a noop process for clicking a node but it works for now. + node.AdditionalData["jsClickCallback"] = "javascript:void(0);"; return node; })); @@ -45,7 +46,11 @@ namespace Umbraco.Web.Trees .OrderBy(entity => entity.Name) .Select(dt => { - var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-item-arrangement", false); + var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-item-arrangement", + //NOTE: This is legacy now but we need to support upgrades. From 7.4+ we don't allow 'child' creations since + // this is an organiational thing and we do that with folders now. + dt.HasChildren()); + node.Path = dt.Path; return node; })); diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index 4b721d8e56..1ee5db6458 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -15,7 +15,7 @@ using Umbraco.Core.Services; namespace Umbraco.Web.Trees { - [UmbracoTreeAuthorize(Constants.Trees.DataTypes)] + [UmbracoTreeAuthorize(Constants.Trees.MediaTypes)] [Tree(Constants.Applications.Settings, Constants.Trees.MediaTypes, null, sortOrder:5)] [Umbraco.Web.Mvc.PluginController("UmbracoTrees")] [CoreTree] diff --git a/src/Umbraco.Web/Trees/MemberTypeTreeController.cs b/src/Umbraco.Web/Trees/MemberTypeTreeController.cs index 24f3722c15..a3422f367a 100644 --- a/src/Umbraco.Web/Trees/MemberTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTypeTreeController.cs @@ -12,7 +12,7 @@ using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Trees { - [UmbracoTreeAuthorize(Constants.Trees.DataTypes)] + [UmbracoTreeAuthorize(Constants.Trees.MemberTypes)] [Tree(Constants.Applications.Members, Constants.Trees.MemberTypes, null, sortOrder:2 )] [Umbraco.Web.Mvc.PluginController("UmbracoTrees")] [CoreTree] diff --git a/src/Umbraco.Web/WebApi/HttpRequestMessageExtensions.cs b/src/Umbraco.Web/WebApi/HttpRequestMessageExtensions.cs index bd2290ce17..04035c0017 100644 --- a/src/Umbraco.Web/WebApi/HttpRequestMessageExtensions.cs +++ b/src/Umbraco.Web/WebApi/HttpRequestMessageExtensions.cs @@ -11,6 +11,7 @@ using System.Web.Http; using System.Web.Http.ModelBinding; using Microsoft.Owin; using Umbraco.Core; +using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.WebApi { @@ -107,6 +108,22 @@ namespace Umbraco.Web.WebApi return msg; } + /// + /// Creates an error response with notifications in the result to be displayed in the UI + /// + /// + /// + /// + public static HttpResponseMessage CreateNotificationValidationErrorResponse(this HttpRequestMessage request, string errorMessage) + { + var notificationModel = new SimpleNotificationModel + { + Message = errorMessage + }; + notificationModel.AddErrorNotification(errorMessage, string.Empty); + return request.CreateValidationErrorResponse(notificationModel); + } + /// /// Create a 400 response message indicating that a validation error occurred ///