From 0ddf5f70d614c76839c56462ac79319de95a861d Mon Sep 17 00:00:00 2001 From: Erik Porter Date: Mon, 15 Feb 2010 14:01:13 -0800 Subject: [PATCH] Hooked up a default value for position when a new menu item is added or a menu part is turned on for a content item --HG-- branch : dev --- .../Navigation/Controllers/AdminController.cs | 10 ++++++-- .../Core/Navigation/Drivers/MenuItemDriver.cs | 15 ++++++----- .../Core/Navigation/Drivers/MenuPartDriver.cs | 14 ++++++++--- .../Navigation/Handlers/MenuItemHandler.cs | 3 ++- src/Orchard/Orchard.csproj | 1 + src/Orchard/Utility/Position.cs | 25 +++++++++++++++++++ 6 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 src/Orchard/Utility/Position.cs diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index 1d5224e01..cc35b3ad2 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -1,9 +1,12 @@ -using System.Web.Mvc; +using System.Linq; +using System.Web.Mvc; using Orchard.ContentManagement; +using Orchard.Core.Navigation.Drivers; using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.ViewModels; using Orchard.Localization; using Orchard.UI.Navigation; +using Orchard.Utility; using MenuItem=Orchard.Core.Navigation.Models.MenuItem; namespace Orchard.Core.Navigation.Controllers { @@ -24,7 +27,7 @@ namespace Orchard.Core.Navigation.Controllers { if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Not allowed to manage the main menu"))) return new HttpUnauthorizedResult(); - var model = new ViewModels.NavigationManagementViewModel { Menu = _navigationManager.BuildMenu("main") }; + var model = new NavigationManagementViewModel { Menu = _navigationManager.BuildMenu("main") }; return View(model); } @@ -50,7 +53,10 @@ namespace Orchard.Core.Navigation.Controllers { return Index(); } + if (string.IsNullOrEmpty(menuItem.As().MenuPosition)) + menuItem.As().MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main")); menuItem.As().OnMainMenu = true; + _services.ContentManager.Create(model.MenuItem.Item.ContentItem); return RedirectToAction("Index"); diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs index fbbb41ea1..3dcac5b8d 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs @@ -1,21 +1,20 @@ using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.Core.Navigation.Models; using Orchard.Security; -namespace Orchard.Core.Navigation.Models { +namespace Orchard.Core.Navigation.Drivers { [UsedImplicitly] public class MenuItemDriver : ContentItemDriver { - private readonly IOrchardServices _orchardServices; private readonly IAuthorizationService _authorizationService; public readonly static ContentType ContentType = new ContentType { - Name = "menuitem", - DisplayName = "Menu Item" - }; + Name = "menuitem", + DisplayName = "Menu Item" + }; - public MenuItemDriver(IOrchardServices orchardServices, IAuthorizationService authorizationService) { - _orchardServices = orchardServices; + public MenuItemDriver(IAuthorizationService authorizationService) { _authorizationService = authorizationService; } @@ -40,4 +39,4 @@ namespace Orchard.Core.Navigation.Models { return null; } } -} +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs index 03fee2409..74c057ec0 100644 --- a/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs @@ -1,15 +1,20 @@ using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.Core.Navigation.Models; using Orchard.Security; +using Orchard.UI.Navigation; +using Orchard.Utility; -namespace Orchard.Core.Navigation.Models { +namespace Orchard.Core.Navigation.Drivers { [UsedImplicitly] public class MenuPartDriver : ContentPartDriver { private readonly IAuthorizationService _authorizationService; + private readonly INavigationManager _navigationManager; - public MenuPartDriver(IAuthorizationService authorizationService) { + public MenuPartDriver(IAuthorizationService authorizationService, INavigationManager navigationManager) { _authorizationService = authorizationService; + _navigationManager = navigationManager; } public virtual IUser CurrentUser { get; set; } @@ -25,8 +30,11 @@ namespace Orchard.Core.Navigation.Models { if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, CurrentUser, part)) return null; + if (string.IsNullOrEmpty(part.MenuPosition)) + part.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main")); + updater.TryUpdateModel(part, Prefix, null, null); return ContentPartTemplate(part, "Parts/Navigation.EditMenuPart").Location("primary", "9"); } } -} +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs b/src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs index 71464ec8d..6a5f1bc43 100644 --- a/src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs +++ b/src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs @@ -1,4 +1,5 @@ -using Orchard.Core.Navigation.Records; +using Orchard.Core.Navigation.Drivers; +using Orchard.Core.Navigation.Records; using Orchard.Data; using Orchard.ContentManagement.Handlers; diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 2383f12e1..ad9c1c81d 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -344,6 +344,7 @@ + diff --git a/src/Orchard/Utility/Position.cs b/src/Orchard/Utility/Position.cs new file mode 100644 index 000000000..dfca78590 --- /dev/null +++ b/src/Orchard/Utility/Position.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Orchard.UI.Navigation; + +namespace Orchard.Utility { + public static class Position { + public static string GetNext(IEnumerable menuItems) { + //TODO: (erikpo) Clean up query to not hardcode to exclude 99, which is the admin menu item as of right now + var maxMenuItem = menuItems.FirstOrDefault().Items.Where(mi => mi.Position != "99").OrderByDescending(mi => mi.Position, new PositionComparer()).FirstOrDefault(); + + if (maxMenuItem != null) { + var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim() != ""); + if (positionParts.Count() > 0) { + int result; + if (int.TryParse(positionParts.ElementAt(0), out result)) { + return (result + 1).ToString(); + } + } + } + + return "1"; + } + } +} \ No newline at end of file