mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-03 03:58:13 +08:00
Refactoring some Menu concerns
Simplify navigation admin controller for inserting a new menu item Removed null top-level main menu item Avoid use of content part in view model for post Enable HasText to recognize LocalizedString Flatten TextHint comparison for deduplicating menu items Remove L1 Crop from NavigationManager --HG-- branch : dev
This commit is contained in:
@@ -85,23 +85,26 @@ namespace Orchard.Core.Navigation.Controllers {
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult Create(CreateMenuItemViewModel model) {
|
||||
public ActionResult Create(NavigationManagementViewModel model) {
|
||||
if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu")))
|
||||
return new HttpUnauthorizedResult();
|
||||
|
||||
var menuPart = _services.ContentManager.New<MenuPart>("MenuItem");
|
||||
model.MenuItem = _services.ContentManager.UpdateEditor(menuPart, this);
|
||||
menuPart.OnMainMenu = true;
|
||||
menuPart.MenuText = model.NewMenuItem.Text;
|
||||
menuPart.MenuPosition = model.NewMenuItem.Position;
|
||||
if (string.IsNullOrEmpty(menuPart.MenuPosition))
|
||||
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
||||
|
||||
var menuItem = menuPart.As<MenuItemPart>();
|
||||
menuItem.Url = model.NewMenuItem.Url;
|
||||
|
||||
if (!ModelState.IsValid) {
|
||||
_services.TransactionManager.Cancel();
|
||||
return Index(new NavigationManagementViewModel { NewMenuItem = model });
|
||||
return View("Index", model);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(menuPart.MenuPosition))
|
||||
menuPart.MenuPosition = Position.GetNext(_navigationManager.BuildMenu("main"));
|
||||
menuPart.OnMainMenu = true;
|
||||
|
||||
_services.ContentManager.Create(model.MenuItem);
|
||||
_services.ContentManager.Create(menuPart);
|
||||
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
@@ -19,18 +19,13 @@ namespace Orchard.Core.Navigation.Services {
|
||||
public void GetNavigation(NavigationBuilder builder) {
|
||||
var menuParts = _contentManager.Query<MenuPart, MenuPartRecord>().Where(x => x.OnMainMenu).List();
|
||||
foreach (var menuPart in menuParts) {
|
||||
if (menuPart != null ) {
|
||||
if (menuPart != null) {
|
||||
var part = menuPart;
|
||||
|
||||
if (part.Is<MenuItemPart>())
|
||||
builder.Add(
|
||||
menu => menu.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, nib => nib.Url(part.As<MenuItemPart>().Url)));
|
||||
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Url(part.As<MenuItemPart>().Url));
|
||||
else
|
||||
builder.Add(
|
||||
menu =>
|
||||
menu.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition,
|
||||
nib =>
|
||||
nib.Action(_contentManager.GetItemMetadata(part.ContentItem).DisplayRouteValues)));
|
||||
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Action(_contentManager.GetItemMetadata(part.ContentItem).DisplayRouteValues));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,6 @@ using Orchard.ContentManagement;
|
||||
|
||||
namespace Orchard.Core.Navigation.ViewModels {
|
||||
public class CreateMenuItemViewModel {
|
||||
public IContent MenuItem { get; set; }
|
||||
public MenuItemEntry MenuItem { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ namespace Orchard.Core.Navigation.ViewModels {
|
||||
MenuItemEntries = Enumerable.Empty<MenuItemEntry>().ToList();
|
||||
}
|
||||
|
||||
public CreateMenuItemViewModel NewMenuItem { get; set; }
|
||||
public MenuItemEntry NewMenuItem { get; set; }
|
||||
public IList<MenuItemEntry> MenuItemEntries { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,15 +52,15 @@
|
||||
<tr>
|
||||
<td>
|
||||
<label for="MenuText">@T("Text")</label>
|
||||
@Html.EditorFor(nmvm => nmvm.NewMenuItem.MenuItem.As<MenuPart>().MenuText)
|
||||
@Html.EditorFor(m => m.NewMenuItem.Text)
|
||||
</td>
|
||||
<td>
|
||||
<label for="MenuPosition">@T("Position")</label>
|
||||
@Html.EditorFor(nmvm => nmvm.NewMenuItem.MenuItem.As<MenuPart>().MenuPosition)
|
||||
@Html.EditorFor(m => m.NewMenuItem.Position)
|
||||
</td>
|
||||
<td>
|
||||
<label for="Url">@T("Url")</label>
|
||||
@Html.EditorFor(nmvm => nmvm.NewMenuItem.MenuItem.As<MenuItemPart>().Url)
|
||||
@Html.EditorFor(m => m.NewMenuItem.Url)
|
||||
</td>
|
||||
<td><button class="add" type="submit">@T("Add")</button></td>
|
||||
</tr>
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace Orchard.Mvc.ViewEngines.Razor {
|
||||
}
|
||||
|
||||
public bool HasText(object thing) {
|
||||
return !string.IsNullOrWhiteSpace(thing as string);
|
||||
return !string.IsNullOrWhiteSpace(Convert.ToString(thing));
|
||||
}
|
||||
|
||||
public OrchardTagBuilder Tag(dynamic shape, string tagName) {
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace Orchard.Mvc {
|
||||
}
|
||||
|
||||
public bool HasText(object thing) {
|
||||
return !string.IsNullOrWhiteSpace(thing as string);
|
||||
return !string.IsNullOrWhiteSpace(Convert.ToString(thing));
|
||||
}
|
||||
|
||||
public OrchardTagBuilder Tag(dynamic shape, string tagName) {
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace Orchard.Mvc {
|
||||
}
|
||||
|
||||
public bool HasText(object thing) {
|
||||
return !string.IsNullOrWhiteSpace(thing as string);
|
||||
return !string.IsNullOrWhiteSpace(Convert.ToString(thing));
|
||||
}
|
||||
|
||||
public OrchardTagBuilder Tag(dynamic shape, string tagName) {
|
||||
|
||||
@@ -4,10 +4,10 @@ using System.Linq;
|
||||
namespace Orchard.UI.Navigation {
|
||||
public class MenuItemComparer : IEqualityComparer<MenuItem> {
|
||||
public bool Equals(MenuItem x, MenuItem y) {
|
||||
if (x.Text != null && y.Text != null) {
|
||||
if (!string.Equals(x.Text.TextHint, y.Text.TextHint)) {
|
||||
return false;
|
||||
}
|
||||
var xTextHint = x.Text == null ? null : x.Text.TextHint;
|
||||
var yTextHint = y.Text == null ? null : y.Text.TextHint;
|
||||
if (!string.Equals(xTextHint, yTextHint)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(x.Url) && !string.IsNullOrWhiteSpace(y.Url)) {
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace Orchard.UI.Navigation {
|
||||
|
||||
public IEnumerable<MenuItem> BuildMenu(string menuName) {
|
||||
var sources = GetSources(menuName);
|
||||
return FinishMenu(Crop(Reduce(Merge(sources))).ToArray());
|
||||
return FinishMenu(Reduce(Merge(sources)).ToArray());
|
||||
}
|
||||
|
||||
public IEnumerable<string> BuildImageSets(string menuName) {
|
||||
@@ -57,9 +57,6 @@ namespace Orchard.UI.Navigation {
|
||||
return url;
|
||||
}
|
||||
|
||||
private static IEnumerable<MenuItem> Crop(IEnumerable<MenuItem> items) {
|
||||
return items.Where(item => item.Items.Any() || item.RouteValues != null);
|
||||
}
|
||||
|
||||
private IEnumerable<MenuItem> Reduce(IEnumerable<MenuItem> items) {
|
||||
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
|
||||
|
||||
@@ -7,19 +7,17 @@ using Orchard.UI.Navigation;
|
||||
namespace Orchard.Utility {
|
||||
public static class Position {
|
||||
public static string GetNext(IEnumerable<MenuItem> menuItems) {
|
||||
var topMenuItem = menuItems.FirstOrDefault();
|
||||
|
||||
if (topMenuItem != null) {
|
||||
var maxMenuItem = topMenuItem.Items.Where(PositionHasMojorNumber).OrderByDescending(mi => mi.Position, new FlatPositionComparer()).FirstOrDefault();
|
||||
var positionParts = maxMenuItem.Position.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim().Length > 0);
|
||||
if (positionParts.Count() > 0) {
|
||||
int result;
|
||||
if (int.TryParse(positionParts.ElementAt(0), out result)) {
|
||||
return (result + 1).ToString();
|
||||
}
|
||||
var maxMenuItem = menuItems.Where(PositionHasMojorNumber).OrderByDescending(mi => mi.Position, new FlatPositionComparer()).FirstOrDefault();
|
||||
var positionParts = maxMenuItem.Position.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Where(s => s.Trim().Length > 0);
|
||||
if (positionParts.Count() > 0) {
|
||||
int result;
|
||||
if (int.TryParse(positionParts.ElementAt(0), out result)) {
|
||||
return (result + 1).ToString();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return "1";
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user