private void HandleMove() { PageActionResult result = new PageActionResult(); if (!context.Request.IsAuthenticated) { result.Success = false; result.Message = PageManagerResources.InvalidRequest; RenderPageActionResult(result); log.Info("rejected page move request for anonymous user"); return; } int movedNodeId = -1; int targetNodeId = -1; string position = string.Empty; if (context.Request.Form["position"] != null) { position = context.Request.Form["position"]; } if (context.Request.Form["movedNode"] != null) { int.TryParse(context.Request.Form["movedNode"], out movedNodeId); } if (context.Request.Form["targetNode"] != null) { int.TryParse(context.Request.Form["targetNode"], out targetNodeId); } //log.Info("movedNode = " + movedNodeId); //log.Info("targetNode = " + targetNodeId); //log.Info("position = " + position); if ((movedNodeId == -1) || (targetNodeId == -1) || (string.IsNullOrEmpty(position))) { result.Success = false; result.Message = PageManagerResources.InvalidRequest; RenderPageActionResult(result); log.Info("rejected page move request due to invalid page parameters for user " + currentUserName); return; } LoadSiteMapSettings(); mojoSiteMapNode movedNode = SiteUtils.GetSiteMapNodeForPage(rootNode, movedNodeId); mojoSiteMapNode targetNode = SiteUtils.GetSiteMapNodeForPage(rootNode, targetNodeId); if ((movedNode == null) || (targetNode == null)) { result.Success = false; result.Message = PageManagerResources.InvalidRequest; RenderPageActionResult(result); log.Error("movedNode or targetNode was null for user " + currentUserName); return; } if ( (!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(movedNode.EditRoles)) ) { result.Success = false; result.Message = string.Format( CultureInfo.InvariantCulture, PageManagerResources.MovePageNotAllowedFormat, movedNode.Title); RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } mojoSiteMapNode selectedParentNode = null; PageSettings movedPage; PageSettings targetPage; switch (position) { case "inside": // this case is when moving to a new parent node that doesn't have any children yet // target is the new parent // or when momving to the first position of the current parent if ( (!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(targetNode.CreateChildPageRoles)) ) { result.Success = false; result.Message = string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveToNewParentNotAllowedFormat, targetNode.Title); RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } // change parent page id movedPage = new PageSettings(siteSettings.SiteId, movedNode.PageId); targetPage = new PageSettings(siteSettings.SiteId, targetNode.PageId); movedPage.ParentId = targetPage.PageId; movedPage.ParentGuid = targetPage.PageGuid; movedPage.PageOrder = 0; //reset site map cache movedPage.Save(); ResortChildPages(movedPage.ParentId); CacheHelper.ResetSiteMapCache(); result.Success = true; result.Message = "Success"; // no message is shown for success in the ui RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestLogFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; //break; case "before": // put this page before the target page beneath the same parent as the target if (targetNode.ParentId != movedNode.ParentId) { if (targetNode.ParentId == -1) { //trying to move a page to root if ((!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(siteSettings.RolesThatCanCreateRootPages)) ) { result.Success = false; result.Message = PageManagerResources.MoveToRootNotAllowed; RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } } else { selectedParentNode = SiteUtils.GetSiteMapNodeForPage(rootNode, targetNode.ParentId); if ( (!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(selectedParentNode.CreateChildPageRoles)) ) { result.Success = false; result.Message = string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveToNewParentNotAllowedFormat, targetNode.Title); RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } } movedPage = new PageSettings(siteSettings.SiteId, movedNode.PageId); targetPage = new PageSettings(siteSettings.SiteId, targetNode.PageId); movedPage.ParentId = targetPage.ParentId; movedPage.ParentGuid = targetPage.ParentGuid; // set sort and re-sort movedPage.PageOrder = targetPage.PageOrder - 1; movedPage.Save(); ResortChildPages(targetNode.ParentId); CacheHelper.ResetSiteMapCache(); result.Success = true; result.Message = "Success"; // no message is shown for success in the ui RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestLogFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } else { //parent did not change just sort if allowed to edit movedPage = new PageSettings(siteSettings.SiteId, movedNode.PageId); targetPage = new PageSettings(siteSettings.SiteId, targetNode.PageId); // set sort and re-sort movedPage.PageOrder = targetPage.PageOrder - 1; movedPage.Save(); ResortChildPages(targetNode.ParentId); CacheHelper.ResetSiteMapCache(); result.Success = true; result.Message = "Success"; // no message is shown for success in the ui RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestLogFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } //break; case "after": default: // put this page after the target page beneath the same parent as the target if (targetNode.ParentId != movedNode.ParentId) { if (targetNode.ParentId == -1) { //trying to move a page to root if ( (!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(siteSettings.RolesThatCanCreateRootPages)) ) { result.Success = false; result.Message = PageManagerResources.MoveToRootNotAllowed; RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } } else { selectedParentNode = SiteUtils.GetSiteMapNodeForPage(rootNode, targetNode.ParentId); if ( (!isAdmin && !isContentAdmin && !isSiteEditor) && (!WebUser.IsInRoles(selectedParentNode.CreateChildPageRoles)) ) { result.Success = false; result.Message = string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveToNewParentNotAllowedFormat, targetNode.Title); RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestDeniedFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } } // change parent page id movedPage = new PageSettings(siteSettings.SiteId, movedNode.PageId); targetPage = new PageSettings(siteSettings.SiteId, targetNode.PageId); movedPage.ParentId = targetPage.ParentId; movedPage.ParentGuid = targetPage.ParentGuid; // set sort and re-sort movedPage.PageOrder = targetPage.PageOrder + 1; movedPage.Save(); ResortChildPages(targetNode.ParentId); CacheHelper.ResetSiteMapCache(); result.Success = true; result.Message = "Success"; // no message is shown for success in the ui RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestLogFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } else { //parent did not change just sort movedPage = new PageSettings(siteSettings.SiteId, movedNode.PageId); targetPage = new PageSettings(siteSettings.SiteId, targetNode.PageId); // set sort and re-sort movedPage.PageOrder = targetPage.PageOrder + 1; movedPage.Save(); ResortChildPages(targetNode.ParentId); CacheHelper.ResetSiteMapCache(); result.Success = true; result.Message = "Success"; // no message is shown for success in the ui RenderPageActionResult(result); if (logAllActions) { log.Info( string.Format( CultureInfo.InvariantCulture, PageManagerResources.MoveNodeRequestLogFormat, currentUserName, movedNode.Title, movedNode.PageId, position, targetNode.Title, targetNode.PageId ) ); } return; } //break; } }