diff --git a/src/Umbraco.Core/Services/ContentTypeService.cs b/src/Umbraco.Core/Services/ContentTypeService.cs index b35434492a..26c4440b8f 100644 --- a/src/Umbraco.Core/Services/ContentTypeService.cs +++ b/src/Umbraco.Core/Services/ContentTypeService.cs @@ -77,6 +77,37 @@ namespace Umbraco.Core.Services } } + public Attempt> RenameContentTypeContainer(int id, string name, int userId = 0) + { + return RenameTypeContainer(id, name, Constants.ObjectTypes.DocumentTypeContainerGuid); + } + + private Attempt> RenameTypeContainer(int id, string name, Guid typeCode) + { + var evtMsgs = EventMessagesFactory.Get(); + var uow = UowProvider.GetUnitOfWork(); + using (var repo = RepositoryFactory.CreateEntityContainerRepository(uow, typeCode)) + { + try + { + var container = repo.Get(id); + + container.Name = name; + + repo.AddOrUpdate(container); + uow.Commit(); + + uow.Events.Dispatch(SavedContentTypeContainer, this, new SaveEventArgs(container, evtMsgs), "RenamedContainer"); + + return Attempt.Succeed(new OperationStatus(container, OperationStatusType.Success, evtMsgs)); + } + catch (Exception ex) + { + return Attempt.Fail(new OperationStatus(null, OperationStatusType.FailedExceptionThrown, evtMsgs), ex); + } + } + } + public Attempt> CreateMediaTypeContainer(int parentId, string name, int userId = 0) { var evtMsgs = EventMessagesFactory.Get(); @@ -116,6 +147,11 @@ namespace Umbraco.Core.Services } } + public Attempt> RenameMediaTypeContainer(int id, string name, int userId = 0) + { + return RenameTypeContainer(id, name, Constants.ObjectTypes.MediaTypeContainerGuid); + } + public Attempt SaveContentTypeContainer(EntityContainer container, int userId = 0) { return SaveContainer( diff --git a/src/Umbraco.Core/Services/IContentTypeService.cs b/src/Umbraco.Core/Services/IContentTypeService.cs index f470bbce05..0e80526b93 100644 --- a/src/Umbraco.Core/Services/IContentTypeService.cs +++ b/src/Umbraco.Core/Services/IContentTypeService.cs @@ -29,6 +29,7 @@ namespace Umbraco.Core.Services Attempt ValidateComposition(IContentTypeComposition compo); Attempt> CreateContentTypeContainer(int parentId, string name, int userId = 0); + Attempt> RenameContentTypeContainer(int id, string name, int userId = 0); Attempt> CreateMediaTypeContainer(int parentId, string name, int userId = 0); Attempt SaveContentTypeContainer(EntityContainer container, int userId = 0); Attempt SaveMediaTypeContainer(EntityContainer container, int userId = 0); @@ -307,5 +308,6 @@ namespace Umbraco.Core.Services Attempt> MoveContentType(IContentType toMove, int containerId); Attempt> CopyMediaType(IMediaType toCopy, int containerId); Attempt> CopyContentType(IContentType toCopy, int containerId); + Attempt> RenameMediaTypeContainer(int id, string name, int userId = 0); } } \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 365b4dfd44..8bfcdfcc5a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -266,6 +266,17 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateContainer", { parentId: parentId, name: name })), 'Failed to create a folder under parent id ' + parentId); + }, + + renameContainer: function(id, name) { + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", + "PostRenameContainer", + { id: id, name: name })), + "Failed to rename the folder with id " + id + ); + } }; 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 117edef77f..06df2e0695 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 @@ -203,6 +203,17 @@ function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { "PostCreateContainer", { parentId: parentId, name: name })), 'Failed to create a folder under parent id ' + parentId); + }, + + renameContainer: function (id, name) { + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", + "PostRenameContainer", + { id: id, name: name })), + "Failed to rename the folder with id " + id + ); + } }; diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.controller.js b/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.controller.js new file mode 100644 index 0000000000..49e9591496 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.controller.js @@ -0,0 +1,63 @@ +angular.module("umbraco") + .controller("Umbraco.Editors.ContentTypeContainers.RenameController", + [ + "$scope", + "$injector", + "navigationService", + "notificationsService", + "localizationService", + function (scope, injector, navigationService, notificationsService, localizationService) { + var notificationHeader; + + function reportSuccessAndClose(treeName) { + var lastComma = scope.currentNode.path.lastIndexOf(","), + path = lastComma === -1 + ? scope.currentNode.path + : scope.currentNode.path.substring(0, lastComma - 1); + + navigationService.syncTree({ + tree: treeName, + path: path, + forceReload: true, + activate: true + }); + + localizationService.localize( + "renamecontainer_folderWasRenamed", + [scope.currentNode.name, scope.model.folderName]) + .then(function (msg) { + notificationsService.showNotification({ + type: 0, + header: notificationHeader, + message: msg + }); + }); + + navigationService.hideMenu(); + } + + localizationService.localize("renamecontainer_renamed") + .then(function (s) { notificationHeader = s; }); + + scope.model = { + folderName: scope.currentNode.name + } + + scope.renameContainer = function (resourceKey, treeName) { + var resource = injector.get(resourceKey); + + resource.renameContainer(scope.currentNode.id, scope.model.folderName) + .then(function () { + reportSuccessAndClose(treeName); + }, function (err) { + scope.error = err; + + if (angular.isArray(err.data.notifications)) { + for (var i = 0; i < err.data.notifications.length; i++) { + notificationsService.showNotification(err.data.notifications[i]); + } + } + }); + } + } + ]); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.html new file mode 100644 index 0000000000..f739cadb71 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/rename.html @@ -0,0 +1,22 @@ + + diff --git a/src/Umbraco.Web.UI.Client/src/views/mediatypes/rename.html b/src/Umbraco.Web.UI.Client/src/views/mediatypes/rename.html new file mode 100644 index 0000000000..5f027cf607 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/mediatypes/rename.html @@ -0,0 +1,21 @@ + diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index a96cf205b5..4b0f697e4a 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -29,6 +29,7 @@ Unpublish Reload Republish entire site + Rename Restore Set permissions for the page %0% Choose where to move @@ -431,6 +432,11 @@ Create custom list view Remove custom list view + + Renamed + Enter a new folder name here + %0% was renamed to %1% + Add prevalue Database datatype diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index f0e67ac14b..8581e28d6d 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -182,6 +182,15 @@ namespace Umbraco.Web.Editors : Request.CreateNotificationValidationErrorResponse(result.Exception.Message); } + public HttpResponseMessage PostRenameContainer(int id, string name) + { + var result = Services.ContentTypeService.RenameContentTypeContainer(id, name, Security.CurrentUser.Id); + + return result + ? Request.CreateResponse(HttpStatusCode.OK, result.Result) //return the id + : Request.CreateNotificationValidationErrorResponse(result.Exception.Message); + } + public DocumentTypeDisplay PostSave(DocumentTypeSave contentTypeSave) { var savedCt = PerformPostSave( diff --git a/src/Umbraco.Web/Editors/MediaTypeController.cs b/src/Umbraco.Web/Editors/MediaTypeController.cs index 2ad7aa3206..43312fb7c3 100644 --- a/src/Umbraco.Web/Editors/MediaTypeController.cs +++ b/src/Umbraco.Web/Editors/MediaTypeController.cs @@ -170,6 +170,16 @@ namespace Umbraco.Web.Editors : Request.CreateNotificationValidationErrorResponse(result.Exception.Message); } + public HttpResponseMessage PostRenameContainer(int id, string name) + { + + var result = Services.ContentTypeService.RenameMediaTypeContainer(id, name, Security.CurrentUser.Id); + + return result + ? Request.CreateResponse(HttpStatusCode.OK, result.Result) //return the id + : Request.CreateNotificationValidationErrorResponse(result.Exception.Message); + } + public MediaTypeDisplay PostSave(MediaTypeSave contentTypeSave) { var savedCt = PerformPostSave( diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 7f3a6dfddf..a84ba91bd1 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -100,7 +100,12 @@ namespace Umbraco.Web.Trees //can delete doc type menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias)), true); } - menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); + + menu.Items.Add(new MenuItem("rename", Services.TextService.Localize(String.Format("actions/{0}", "rename"))) + { + Icon = "icon icon-edit" + }); } else { diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index e402b5d64b..dc2e2a195d 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -94,6 +94,11 @@ namespace Umbraco.Web.Trees menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias))); } menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), hasSeparator: true); + + menu.Items.Add(new MenuItem("rename", Services.TextService.Localize(String.Format("actions/{0}", "rename"))) + { + Icon = "icon icon-edit" + }); } else {