Adding the ability to put (CSS) classes on menu items.

Making use of it by adding a "collapsed" class to the admin menu's settings
top-level item to have it collapse by default (with some adjustment to the admin.js)

work item: 17599

--HG--
branch : 1.x
This commit is contained in:
Nathan Heskew
2011-04-06 14:09:54 -07:00
parent cc72b6d245
commit 5f28ffaa86
7 changed files with 56 additions and 15 deletions

View File

@@ -21,7 +21,7 @@ namespace Orchard.Core.Settings {
builder.AddImageSet("settings")
.Add(T("Settings"), "99",
menu => menu.Add(T("General"), "0", item => item.Action("Index", "Admin", new { area = "Settings", groupInfoId = "Index" })
.Permission(StandardPermissions.SiteOwner)));
.Permission(StandardPermissions.SiteOwner)), new [] {"collapsed"});
var site = _siteService.GetSiteSettings();
if (site == null)

View File

@@ -23,7 +23,8 @@
}
if ((settings.remember && "closed" === $.orchard.setting(__cookieName, { key: settings.key + "-" + controller.text(), path: settings.path }))
|| settings.collapse) {
|| settings.collapse
|| (controller.closest("li").hasClass("collapsed") && !(settings.remember && "open" === $.orchard.setting(__cookieName, { key: settings.key + "-" + controller.text(), path: settings.path })))) {
glyph.addClass("closed").data("controllees").hide();
}
else if (settings.collapse) {

View File

@@ -192,7 +192,7 @@ namespace Orchard.UI.Navigation {
/// <param name="menuItem">The menu item to build the shape for.</param>
/// <returns>The menu item shape.</returns>
protected dynamic BuildMenuItemShape(dynamic shapeFactory, dynamic parentShape, dynamic menu, MenuItem menuItem) {
return shapeFactory.MenuItem()
var menuItemShape = shapeFactory.MenuItem()
.Text(menuItem.Text)
.IdHint(menuItem.IdHint)
.Href(menuItem.Href)
@@ -203,6 +203,11 @@ namespace Orchard.UI.Navigation {
.Item(menuItem)
.Menu(menu)
.Parent(parentShape);
foreach (var className in menuItem.Classes)
menuItemShape.Classes.Add(className);
return menuItemShape;
}
/// <summary>
@@ -214,7 +219,7 @@ namespace Orchard.UI.Navigation {
/// <param name="menuItem">The menu item to build the shape for.</param>
/// <returns>The menu item shape.</returns>
protected dynamic BuildLocalMenuItemShape(dynamic shapeFactory, dynamic parentShape, dynamic menu, MenuItem menuItem) {
return shapeFactory.LocalMenuItem()
var menuItemShape = shapeFactory.LocalMenuItem()
.Text(menuItem.Text)
.IdHint(menuItem.IdHint)
.Href(menuItem.Href)
@@ -225,6 +230,11 @@ namespace Orchard.UI.Navigation {
.Item(menuItem)
.Menu(menu)
.Parent(parentShape);
foreach (var className in menuItem.Classes)
menuItemShape.Classes.Add(className);
return menuItemShape;
}
public void OnResultExecuted(ResultExecutedContext filterContext) { }

View File

@@ -6,12 +6,14 @@ using Orchard.Security.Permissions;
namespace Orchard.UI.Navigation {
public class MenuItem {
private IList<string> _classes = new List<string>();
public MenuItem() {
Permissions = Enumerable.Empty<Permission>();
LinkToFirstChild = true;
}
public LocalizedString Text { get; set; }
public LocalizedString Text { get; set; }
public string IdHint { get; set; }
public string Url { get; set; }
public string Href { get; set; }
@@ -22,5 +24,13 @@ namespace Orchard.UI.Navigation {
public RouteValueDictionary RouteValues { get; set; }
public IEnumerable<MenuItem> Items { get; set; }
public IEnumerable<Permission> Permissions { get; set; }
}
public IList<string> Classes {
get { return _classes; }
set {
if (value == null)
return;
_classes = value;
}
}
}
}

View File

@@ -9,27 +9,33 @@ namespace Orchard.UI.Navigation {
private readonly IList<string> _imageSets = new List<string>();
IEnumerable<MenuItem> Contained { get; set; }
public NavigationBuilder Add(LocalizedString caption, string position, Action<NavigationItemBuilder> itemBuilder) {
public NavigationBuilder Add(LocalizedString caption, string position, Action<NavigationItemBuilder> itemBuilder, IEnumerable<string> classes = null) {
var childBuilder = new NavigationItemBuilder();
childBuilder.Caption(caption);
childBuilder.Position(position);
itemBuilder(childBuilder);
Contained = (Contained ?? Enumerable.Empty<MenuItem>()).Concat(childBuilder.Build());
if (classes != null) {
foreach (var className in classes)
childBuilder.AddClass(className);
}
return this;
}
public NavigationBuilder Add(LocalizedString caption, Action<NavigationItemBuilder> itemBuilder) {
return Add(caption, null, itemBuilder);
public NavigationBuilder Add(LocalizedString caption, Action<NavigationItemBuilder> itemBuilder, IEnumerable<string> classes = null) {
return Add(caption, null, itemBuilder, classes);
}
public NavigationBuilder Add(Action<NavigationItemBuilder> itemBuilder) {
return Add(null, null, itemBuilder);
public NavigationBuilder Add(Action<NavigationItemBuilder> itemBuilder, IEnumerable<string> classes = null) {
return Add(null, null, itemBuilder, classes);
}
public NavigationBuilder Add(LocalizedString caption, string position) {
return Add(caption, position, x=> { });
public NavigationBuilder Add(LocalizedString caption, string position, IEnumerable<string> classes = null) {
return Add(caption, position, x=> { }, classes);
}
public NavigationBuilder Add(LocalizedString caption) {
return Add(caption, null, x => { });
public NavigationBuilder Add(LocalizedString caption, IEnumerable<string> classes = null) {
return Add(caption, null, x => { }, classes);
}
public NavigationBuilder AddImageSet(string imageSet) {

View File

@@ -32,6 +32,18 @@ namespace Orchard.UI.Navigation {
return this;
}
public NavigationItemBuilder AddClass(string className) {
if (!_item.Classes.Contains(className))
_item.Classes.Add(className);
return this;
}
public NavigationItemBuilder RemoveClass(string className) {
if (_item.Classes.Contains(className))
_item.Classes.Remove(className);
return this;
}
public NavigationItemBuilder LinkToFirstChild(bool value) {
_item.LinkToFirstChild = value;
return this;

View File

@@ -77,6 +77,7 @@ namespace Orchard.UI.Navigation {
LocalNav = item.LocalNav,
Text = item.Text,
IdHint = item.IdHint,
Classes = item.Classes,
Url = item.Url,
LinkToFirstChild = item.LinkToFirstChild,
Href = item.Href
@@ -145,6 +146,7 @@ namespace Orchard.UI.Navigation {
var joined = new MenuItem {
Text = items.First().Text,
IdHint = items.Select(x => x.IdHint).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)),
Classes = items.Select(x => x.Classes).FirstOrDefault(x => x != null && x.Count > 0),
Url = items.Select(x => x.Url).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)),
Href = items.Select(x => x.Href).FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)),
LinkToFirstChild = items.First().LinkToFirstChild,