From 1c427ed3e72774a6b3a96beb79128e965a43d12a Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Sun, 14 Feb 2010 23:17:26 -0800 Subject: [PATCH] Some work on "Manage Main Menu". Some controller actions stubbed out and create hooked up (validation lacking). --HG-- branch : dev rename : src/Orchard.Web/Core/Navigation/Models/MenuItemDriver.cs => src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs rename : src/Orchard.Web/Core/Navigation/Models/MenuPartDriver.cs => src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs rename : src/Orchard.Web/Core/Navigation/Models/MenuItemHandler.cs => src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs rename : src/Orchard.Web/Core/Navigation/Models/MenuPartHandler.cs => src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs --- .../Navigation/Controllers/AdminController.cs | 59 ++++++++++++++++++- .../{Models => Drivers}/MenuItemDriver.cs | 16 ++++- .../{Models => Drivers}/MenuPartDriver.cs | 0 .../{Models => Handlers}/MenuItemHandler.cs | 0 .../{Models => Handlers}/MenuPartHandler.cs | 0 .../ViewModels/CreateMenuItemViewModel.cs | 8 +++ .../Core/Navigation/Views/Admin/Index.ascx | 29 ++++++--- src/Orchard.Web/Core/Orchard.Core.csproj | 9 +-- .../Themes/TheAdmin/Styles/site.css | 4 -- 9 files changed, 106 insertions(+), 19 deletions(-) rename src/Orchard.Web/Core/Navigation/{Models => Drivers}/MenuItemDriver.cs (53%) rename src/Orchard.Web/Core/Navigation/{Models => Drivers}/MenuPartDriver.cs (100%) rename src/Orchard.Web/Core/Navigation/{Models => Handlers}/MenuItemHandler.cs (100%) rename src/Orchard.Web/Core/Navigation/{Models => Handlers}/MenuPartHandler.cs (100%) create mode 100644 src/Orchard.Web/Core/Navigation/ViewModels/CreateMenuItemViewModel.cs diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index 5dcab4cd0..1d5224e01 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -1,11 +1,14 @@ using System.Web.Mvc; +using Orchard.ContentManagement; +using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.ViewModels; using Orchard.Localization; using Orchard.UI.Navigation; +using MenuItem=Orchard.Core.Navigation.Models.MenuItem; namespace Orchard.Core.Navigation.Controllers { [ValidateInput(false)] - public class AdminController : Controller { + public class AdminController : Controller, IUpdateModel { private readonly IOrchardServices _services; private readonly INavigationManager _navigationManager; @@ -15,12 +18,62 @@ namespace Orchard.Core.Navigation.Controllers { T = NullLocalizer.Instance; } - public Localizer T { get; set; } + private Localizer T { get; set; } public ActionResult Index() { - var model = new NavigationManagementViewModel {Menu = _navigationManager.BuildMenu("main")}; + 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") }; return View(model); } + + [HttpPost, ActionName("Index")] + public ActionResult IndexPOST() { + if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) + return new HttpUnauthorizedResult(); + + return RedirectToAction("Index"); + } + + [HttpPost] + public ActionResult Create(CreateMenuItemViewModel model) { + if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) + return new HttpUnauthorizedResult(); + + var menuItem = _services.ContentManager.New(MenuItemDriver.ContentType.Name); + model.MenuItem = _services.ContentManager.UpdateEditorModel(menuItem, this); + + if (!ModelState.IsValid) { + _services.TransactionManager.Cancel(); + return Index(); + } + + menuItem.As().OnMainMenu = true; + _services.ContentManager.Create(model.MenuItem.Item.ContentItem); + + return RedirectToAction("Index"); + } + + //[ValidateAntiForgeryTokenOrchard, ActionName("Delete")] + [HttpPost, ActionName("Delete")] + public ActionResult DeletePOST(int menuItemId) + { + if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) + return new HttpUnauthorizedResult(); + + //todo -> delete + + return RedirectToAction("Index"); + } + + bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { + return TryUpdateModel(model, prefix, includeProperties, excludeProperties); + } + + void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) { + ModelState.AddModelError(key, errorMessage.ToString()); + } } } diff --git a/src/Orchard.Web/Core/Navigation/Models/MenuItemDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs similarity index 53% rename from src/Orchard.Web/Core/Navigation/Models/MenuItemDriver.cs rename to src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs index f8a00ac92..fbbb41ea1 100644 --- a/src/Orchard.Web/Core/Navigation/Models/MenuItemDriver.cs +++ b/src/Orchard.Web/Core/Navigation/Drivers/MenuItemDriver.cs @@ -1,21 +1,26 @@ using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; +using Orchard.Security; namespace Orchard.Core.Navigation.Models { [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" }; - public MenuItemDriver(IOrchardServices orchardServices) { + public MenuItemDriver(IOrchardServices orchardServices, IAuthorizationService authorizationService) { _orchardServices = orchardServices; + _authorizationService = authorizationService; } + public virtual IUser CurrentUser { get; set; } + protected override ContentType GetContentType() { return ContentType; } @@ -25,5 +30,14 @@ namespace Orchard.Core.Navigation.Models { protected override string GetDisplayText(MenuItem item) { return item.Url; } + + protected override DriverResult Editor(MenuItem item, IUpdateModel updater) { + if (!_authorizationService.TryCheckAccess(Permissions.ManageMainMenu, CurrentUser, item)) + return null; + + updater.TryUpdateModel(item, Prefix, null, null); + + return null; + } } } diff --git a/src/Orchard.Web/Core/Navigation/Models/MenuPartDriver.cs b/src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs similarity index 100% rename from src/Orchard.Web/Core/Navigation/Models/MenuPartDriver.cs rename to src/Orchard.Web/Core/Navigation/Drivers/MenuPartDriver.cs diff --git a/src/Orchard.Web/Core/Navigation/Models/MenuItemHandler.cs b/src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs similarity index 100% rename from src/Orchard.Web/Core/Navigation/Models/MenuItemHandler.cs rename to src/Orchard.Web/Core/Navigation/Handlers/MenuItemHandler.cs diff --git a/src/Orchard.Web/Core/Navigation/Models/MenuPartHandler.cs b/src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs similarity index 100% rename from src/Orchard.Web/Core/Navigation/Models/MenuPartHandler.cs rename to src/Orchard.Web/Core/Navigation/Handlers/MenuPartHandler.cs diff --git a/src/Orchard.Web/Core/Navigation/ViewModels/CreateMenuItemViewModel.cs b/src/Orchard.Web/Core/Navigation/ViewModels/CreateMenuItemViewModel.cs new file mode 100644 index 000000000..17860bbe1 --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/ViewModels/CreateMenuItemViewModel.cs @@ -0,0 +1,8 @@ +using Orchard.Core.Navigation.Models; +using Orchard.Mvc.ViewModels; + +namespace Orchard.Core.Navigation.ViewModels { + public class CreateMenuItemViewModel : AdminViewModel { + public ContentItemViewModel MenuItem { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.ascx b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.ascx index 141f753f5..a6c3ef8aa 100644 --- a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.ascx +++ b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.ascx @@ -1,7 +1,7 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%><% var menu = Model.Menu.FirstOrDefault(); %> -

<%=Html.TitleForPage(T("Edit Main Menu").ToString())%>

<% +

<%=Html.TitleForPage(T("Manage Main Menu").ToString())%>

<% using (Html.BeginFormAntiForgeryPost()) { %> @@ -31,14 +31,29 @@ using (Html.BeginFormAntiForgeryPost()) { %>
<% } - -using (Html.BeginFormAntiForgeryPost()) { %> - +%>

<%=_Encoded("Add New Item") %>

<% +using (Html.BeginFormAntiForgeryPost("/admin/navigation/create", FormMethod.Post)) { %> +
+ + + + + + - - - + + + diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index eb8002ed9..929d5ca63 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -107,16 +107,17 @@ - - + + - - + + + diff --git a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css index 4f6734c87..d6f5a3c07 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Styles/site.css +++ b/src/Orchard.Web/Themes/TheAdmin/Styles/site.css @@ -641,10 +641,6 @@ table.items thead, table.items th { overflow:hidden; text-align:left; } -/* todo: (heskew) hook back up */ -table.items tr.hover { - background-color:#f0f3d6; -} table.items tr.critical {background:#e68585; border:inherit;} table.items tr.warning {background:#fdf5bc; border:inherit;} table.items th, table.items td {