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

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using Orchard.ContentManagement;
using Orchard.Core.Navigation.Models;
using Orchard.Core.Navigation.Records;
@@ -6,7 +7,7 @@ using Orchard.UI.Navigation;
using MenuItem=Orchard.Core.Navigation.Models.MenuItem;
namespace Orchard.Core.Navigation.Services {
public class MainMenu : INavigationProvider {
public class MainMenu : INavigationProvider, IMenuService {
private readonly IContentManager _contentManager;
public MainMenu(IContentManager contentManager) {
@@ -15,6 +16,14 @@ namespace Orchard.Core.Navigation.Services {
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) {
IEnumerable<MenuPart> menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
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 {
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 {
public class NavigationManagementViewModel : AdminViewModel {
public NavigationManagementViewModel() {
MenuItemEntries = Enumerable.Empty<MenuItemEntry>().ToList();
}
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>" %>
<%@ Import Namespace="Orchard.ContentManagement"%>
<%@ Import Namespace="Orchard.Core.Navigation.Models"%>
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%><%
var menu = Model.Menu.FirstOrDefault(); %>
<%@ Import Namespace="Orchard.Core.Navigation.ViewModels"%>
<h1><%=Html.TitleForPage(T("Manage Main Menu").ToString())%></h1><%
using (Html.BeginFormAntiForgeryPost()) { %>
<table class="items">
@@ -21,13 +20,16 @@ using (Html.BeginFormAntiForgeryPost()) { %>
</tr>
</thead>
<tbody><%
foreach (var menuItem in menu.Items) { %>
var menuPartEntryIndex = 0;
foreach (var menuPartEntry in Model.MenuItemEntries) {
var i = menuPartEntryIndex; %>
<tr>
<td><%=Html.TextBox("text", menuItem.Text) %></td>
<td><%=Html.TextBox("position", menuItem.Position) %></td>
<td><%=Html.TextBox("url", menuItem.Url) %></td>
<td><a href="#" class="remove button">delete</a></td>
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Text) %>" value="<%=menuPartEntry.MenuItem.Text %>" /></td>
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Position) %>" value="<%=menuPartEntry.MenuItem.Position %>" /></td>
<td><input type="text" name="<%=Html.NameOf(m => m.MenuItemEntries[i].MenuItem.Url) %>" value="<%=menuPartEntry.MenuItem.Url %>" /></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><%
++menuPartEntryIndex;
} %>
</tbody>
</table>

View File

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

View File

@@ -9,7 +9,7 @@ namespace Orchard.Utility {
var topMenuItem = menuItems.FirstOrDefault();
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() != "");
if (positionParts.Count() > 0) {
int result;
@@ -21,5 +21,11 @@ namespace Orchard.Utility {
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);
}
}
}