Getting the Main Menu management (IndexPOST) wired up. Manage/create still needs validation.

--HG--
branch : dev
This commit is contained in:
Nathan Heskew
2010-02-16 14:04:23 -08:00
parent 84e277231a
commit 578cdcb38d
8 changed files with 93 additions and 24 deletions

View File

@@ -1,8 +1,11 @@
using System.Linq; using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Core.Navigation.Drivers; using Orchard.Core.Navigation.Drivers;
using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.Models;
using Orchard.Core.Navigation.Services;
using Orchard.Core.Navigation.ViewModels; using Orchard.Core.Navigation.ViewModels;
using Orchard.Localization; using Orchard.Localization;
using Orchard.UI.Navigation; using Orchard.UI.Navigation;
@@ -12,10 +15,12 @@ using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
namespace Orchard.Core.Navigation.Controllers { namespace Orchard.Core.Navigation.Controllers {
[ValidateInput(false)] [ValidateInput(false)]
public class AdminController : Controller, IUpdateModel { public class AdminController : Controller, IUpdateModel {
private readonly IMenuService _menuService;
private readonly IOrchardServices _services; private readonly IOrchardServices _services;
private readonly INavigationManager _navigationManager; private readonly INavigationManager _navigationManager;
public AdminController(IOrchardServices services, INavigationManager navigationManager) { public AdminController(IMenuService menuService, IOrchardServices services, INavigationManager navigationManager) {
_menuService = menuService;
_services = services; _services = services;
_navigationManager = navigationManager; _navigationManager = navigationManager;
T = NullLocalizer.Instance; T = NullLocalizer.Instance;
@@ -30,17 +35,43 @@ namespace Orchard.Core.Navigation.Controllers {
if (model == null) if (model == null)
model = new NavigationManagementViewModel(); model = new NavigationManagementViewModel();
if (model.Menu == null || model.Menu.Count() < 1) if (model.MenuItemEntries == null || model.MenuItemEntries.Count() < 1)
model.Menu = _navigationManager.BuildMenu("main"); model.MenuItemEntries = _menuService.Get().Select(menuPart => CreateMenuItemEntries(menuPart)).OrderBy(menuPartEntry => menuPartEntry.MenuItem.Position, new PositionComparer()).ToList();
return View("Index", model); return View("Index", model);
} }
[HttpPost, ActionName("Index")] [HttpPost, ActionName("Index")]
public ActionResult IndexPOST() { public ActionResult IndexPOST(IList<MenuItemEntry> menuItemEntries) {
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();
foreach (var menuItemEntry in menuItemEntries) {
MenuPart menuPart = _menuService.Get(menuItemEntry.MenuItemId);
menuPart.MenuText = menuItemEntry.MenuItem.Text;
menuPart.MenuPosition = menuItemEntry.MenuItem.Position;
if (menuPart.Is<MenuItem>())
menuPart.As<MenuItem>().Url = menuItemEntry.MenuItem.Url;
_services.ContentManager.UpdateEditorModel(menuPart, this);
}
return RedirectToAction("Index");
}
private static MenuItemEntry CreateMenuItemEntries(MenuPart menuPart) {
return new MenuItemEntry {
MenuItem = new UI.Navigation.MenuItem {
Text = menuPart.MenuText,
Position = menuPart.MenuPosition,
Url = menuPart.As<MenuItem>().Url
},
MenuItemId = menuPart.Id
};
}
public ActionResult Create() {
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
@@ -49,17 +80,17 @@ namespace Orchard.Core.Navigation.Controllers {
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();
var menuItem = _services.ContentManager.New<MenuItem>(MenuItemDriver.ContentType.Name); var menuPart = _services.ContentManager.New<MenuPart>(MenuItemDriver.ContentType.Name);
model.MenuItem = _services.ContentManager.UpdateEditorModel(menuItem, this); model.MenuItem = _services.ContentManager.UpdateEditorModel(menuPart, this);
if (!ModelState.IsValid) { if (!ModelState.IsValid) {
_services.TransactionManager.Cancel(); _services.TransactionManager.Cancel();
return Index(new NavigationManagementViewModel {NewMenuItem = model}); return Index(new NavigationManagementViewModel {NewMenuItem = model});
} }
if (string.IsNullOrEmpty(menuItem.As<MenuPart>().MenuPosition)) if (string.IsNullOrEmpty(menuPart.MenuPosition))
menuItem.As<MenuPart>().MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main")); menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
menuItem.As<MenuPart>().OnMainMenu = true; menuPart.OnMainMenu = true;
_services.ContentManager.Create(model.MenuItem.Item.ContentItem); _services.ContentManager.Create(model.MenuItem.Item.ContentItem);
@@ -67,8 +98,8 @@ namespace Orchard.Core.Navigation.Controllers {
} }
//[ValidateAntiForgeryTokenOrchard, ActionName("Delete")] //[ValidateAntiForgeryTokenOrchard, ActionName("Delete")]
[HttpPost, ActionName("Delete")] [HttpPost]
public ActionResult DeletePOST(int menuItemId) public ActionResult Delete(int menuItemId)
{ {
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
return new HttpUnauthorizedResult(); return new HttpUnauthorizedResult();

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Core.Navigation.Models; using Orchard.Core.Navigation.Models;
using Orchard.Core.Navigation.Records; using Orchard.Core.Navigation.Records;
@@ -6,7 +7,7 @@ using Orchard.UI.Navigation;
using MenuItem=Orchard.Core.Navigation.Models.MenuItem; using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
namespace Orchard.Core.Navigation.Services { namespace Orchard.Core.Navigation.Services {
public class MainMenu : INavigationProvider { public class MainMenu : INavigationProvider, IMenuService {
private readonly IContentManager _contentManager; private readonly IContentManager _contentManager;
public MainMenu(IContentManager contentManager) { public MainMenu(IContentManager contentManager) {
@@ -15,6 +16,14 @@ namespace Orchard.Core.Navigation.Services {
public string MenuName { get { return "main"; } } public string MenuName { get { return "main"; } }
public IEnumerable<MenuPart> Get() {
return _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
}
public MenuPart Get(int menuPartId) {
return _contentManager.Get<MenuPart>(menuPartId);
}
public void GetNavigation(NavigationBuilder builder) { public void GetNavigation(NavigationBuilder builder) {
IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List(); IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
foreach (var menuPart in menuParts) { foreach (var menuPart in menuParts) {
@@ -34,4 +43,9 @@ namespace Orchard.Core.Navigation.Services {
} }
} }
} }
public interface IMenuService : IDependency {
IEnumerable<MenuPart> Get();
MenuPart Get(int menuPartId);
}
} }

View File

@@ -3,6 +3,6 @@ using Orchard.Mvc.ViewModels;
namespace Orchard.Core.Navigation.ViewModels { namespace Orchard.Core.Navigation.ViewModels {
public class CreateMenuItemViewModel : AdminViewModel { public class CreateMenuItemViewModel : AdminViewModel {
public ContentItemViewModel<MenuItem> MenuItem { get; set; } public ContentItemViewModel<MenuPart> MenuItem { get; set; }
} }
} }

View File

@@ -0,0 +1,8 @@
using Orchard.UI.Navigation;
namespace Orchard.Core.Navigation.ViewModels {
public class MenuItemEntry {
public MenuItem MenuItem { get; set; }
public int MenuItemId { get; set; }
}
}

View File

@@ -1,7 +1,14 @@
using Orchard.Mvc.ViewModels; using System.Collections.Generic;
using System.Linq;
using Orchard.Mvc.ViewModels;
namespace Orchard.Core.Navigation.ViewModels { namespace Orchard.Core.Navigation.ViewModels {
public class NavigationManagementViewModel : AdminViewModel { public class NavigationManagementViewModel : AdminViewModel {
public NavigationManagementViewModel() {
MenuItemEntries = Enumerable.Empty<MenuItemEntry>().ToList();
}
public CreateMenuItemViewModel NewMenuItem { get; set; } public CreateMenuItemViewModel NewMenuItem { get; set; }
public IList<MenuItemEntry> MenuItemEntries { get; set; }
} }
} }

View File

@@ -1,8 +1,7 @@
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<NavigationManagementViewModel>" %> <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<NavigationManagementViewModel>" %>
<%@ Import Namespace="Orchard.ContentManagement"%> <%@ Import Namespace="Orchard.ContentManagement"%>
<%@ Import Namespace="Orchard.Core.Navigation.Models"%> <%@ Import Namespace="Orchard.Core.Navigation.Models"%>
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%><% <%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%>
var menu = Model.Menu.FirstOrDefault(); %>
<h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><% <h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><%
using (Html.BeginFormAntiForgeryPost()) { %> using (Html.BeginFormAntiForgeryPost()) { %>
<table class="items"> <table class="items">
@@ -21,13 +20,16 @@ using (Html.BeginFormAntiForgeryPost()) { %>
</tr> </tr>
</thead> </thead>
<tbody><% <tbody><%
foreach (var menuItem in menu.Items) { %> var menuPartEntryIndex = 0;
foreach (var menuPartEntry in Model.MenuItemEntries) {
var i = menuPartEntryIndex; %>
<tr> <tr>
<td><%=Html.TextBox("text", menuItem.Text) %></td> <td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Text) %>" value="<%=menuPartEntry.MenuItem.Text %>" /></td>
<td><%=Html.TextBox("position", menuItem.Position) %></td> <td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Position) %>" value="<%=menuPartEntry.MenuItem.Position %>" /></td>
<td><%=Html.TextBox("url", menuItem.Url) %></td> <td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Url) %>" value="<%=menuPartEntry.MenuItem.Url %>" /></td>
<td><a href="#" class="remove button">delete</a></td> <td><input type="hidden" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItemId) %>" value="<%=menuPartEntry.MenuItemId %>" /><a href="#" class="remove button">delete</a></td>
</tr><% </tr><%
++menuPartEntryIndex;
} %> } %>
</tbody> </tbody>
</table> </table>

View File

@@ -118,6 +118,7 @@
<Compile Include="Navigation\Services\MainMenu.cs" /> <Compile Include="Navigation\Services\MainMenu.cs" />
<Compile Include="Navigation\Filters\MainMenuFilter.cs" /> <Compile Include="Navigation\Filters\MainMenuFilter.cs" />
<Compile Include="Navigation\ViewModels\CreateMenuItemViewModel.cs" /> <Compile Include="Navigation\ViewModels\CreateMenuItemViewModel.cs" />
<Compile Include="Navigation\ViewModels\MenuItemEntry.cs" />
<Compile Include="Navigation\ViewModels\NavigationManagementViewModel.cs" /> <Compile Include="Navigation\ViewModels\NavigationManagementViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Scheduling\Records\ScheduledTaskRecord.cs" /> <Compile Include="Scheduling\Records\ScheduledTaskRecord.cs" />

View File

@@ -9,7 +9,7 @@ namespace Orchard.Utility {
var topMenuItem = menuItems.FirstOrDefault(); var topMenuItem = menuItems.FirstOrDefault();
if (topMenuItem != null) { if (topMenuItem != null) {
var maxMenuItem = topMenuItem.Items.OrderByDescending(mi => mi.Position, new PositionComparer()).FirstOrDefault(); var maxMenuItem = topMenuItem.Items.Where(PositionHasMojorNumber).OrderByDescending(mi => mi.Position, new PositionComparer()).FirstOrDefault();
var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim() != ""); var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim() != "");
if (positionParts.Count() > 0) { if (positionParts.Count() > 0) {
int result; int result;
@@ -21,5 +21,11 @@ namespace Orchard.Utility {
return "1"; return "1";
} }
private static bool PositionHasMojorNumber(MenuItem mi) {
int foo;
var major = mi.Position.Split('.')[0];
return !string.IsNullOrEmpty(major) && int.TryParse(major, out foo);
}
} }
} }