Converting local navs to a new core shape (AKA making louis happy :))

--HG--
branch : dev
This commit is contained in:
Andre Rodrigues
2011-02-11 14:13:38 -08:00
parent 042968453b
commit 14a7ada113
10 changed files with 118 additions and 14 deletions

View File

@@ -77,10 +77,10 @@ namespace Orchard.Tests.UI.Navigation {
menu => menu
.Add(new LocalizedString("A"), "0", subMenu => subMenu.Action("Index", "Admin", new { area = "Area" })
.Add(new LocalizedString("B"), "0", item => item.Action("Index", "Admin", new { area = "Area" }))
.Add(new LocalizedString("C"), "1", item => item.Action("Index", "Admin", new { area = "Area" }).LocalTask())))
.Add(new LocalizedString("D"), "1", subMenu => subMenu.Action("Index", "Admin", new { area = "Area" }).LocalTask()
.Add(new LocalizedString("C"), "1", item => item.Action("Index", "Admin", new { area = "Area" }).LocalNav())))
.Add(new LocalizedString("D"), "1", subMenu => subMenu.Action("Index", "Admin", new { area = "Area" }).LocalNav()
.Add(new LocalizedString("E"), "0", item => item.Action("Index", "Admin", new { area = "Area" }))
.Add(new LocalizedString("F"), "1", item => item.Action("Index", "Admin", new { area = "Area" }).LocalTask()));
.Add(new LocalizedString("F"), "1", item => item.Action("Index", "Admin", new { area = "Area" }).LocalNav()));
return navigationBuilder;
}
@@ -92,11 +92,11 @@ namespace Orchard.Tests.UI.Navigation {
.Add(new LocalizedString("A"), "0", item => item.Action(SecondLevel1Action, "Admin", new { area = "Area" }))
.Add(new LocalizedString("B"), "1",
subMenu => subMenu
.Add(new LocalizedString("C"), "0", item => item.Action(ThirdLevel1Action, "Admin", new { area = "Area" }).LocalTask())
.Add(new LocalizedString("C"), "0", item => item.Action(ThirdLevel1Action, "Admin", new { area = "Area" }).LocalNav())
.Add(new LocalizedString("D"), "1",
subSubMenu => subSubMenu.LocalTask()
.Add(new LocalizedString("E"), "0", item => item.Action(FourthLevel1Action, "Admin", new { area = "Area" }).LocalTask())
.Add(new LocalizedString("F"), "1", item => item.Action(FourthLevel2Action, "Admin", new { area = "Area" }).LocalTask())
subSubMenu => subSubMenu.LocalNav()
.Add(new LocalizedString("E"), "0", item => item.Action(FourthLevel1Action, "Admin", new { area = "Area" }).LocalNav())
.Add(new LocalizedString("F"), "1", item => item.Action(FourthLevel2Action, "Admin", new { area = "Area" }).LocalNav())
.Add(new LocalizedString("G"), "2", item => item.Action(FourthLevel3Action, "Admin", new { area = "Area" }))
.Add(new LocalizedString("W"), "3", item => item.Action(FourthLevel4Action, "Admin", new { area = "Area" })))));

View File

@@ -372,6 +372,12 @@
<ItemGroup>
<Content Include="Shapes\Views\ShapeResult\Display.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Shapes\Views\LocalMenu.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Shapes\Views\LocalMenuItem.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -85,6 +85,22 @@ namespace Orchard.Core.Shapes {
menuItem.Metadata.Alternates.Add("MenuItem__" + menu.MenuName);
});
builder.Describe("LocalMenu")
.OnDisplaying(displaying => {
var menu = displaying.Shape;
string menuName = menu.MenuName;
menu.Classes.Add("localmenu-" + menuName.HtmlClassify());
menu.Classes.Add("localmenu");
menu.Metadata.Alternates.Add("LocalMenu__" + menuName);
});
builder.Describe("LocalMenuItem")
.OnDisplaying(displaying => {
var menuItem = displaying.Shape;
var menu = menuItem.Menu;
menuItem.Metadata.Alternates.Add("LocalMenuItem__" + menu.MenuName);
});
// 'List' shapes start with several empty collections
builder.Describe("List")
.OnCreated(created => {

View File

@@ -0,0 +1,10 @@
@{
// Model is Model.Menu from the layout (Layout.Menu)
var tag = Tag(Model, "ul");
}
<nav>
@tag.StartElement
@* see MenuItem shape template *@
@DisplayChildren(Model)
@tag.EndElement
</nav>

View File

@@ -0,0 +1,22 @@
@{
// odd formatting in this file is to cause more attractive results in the output.
var items = (IEnumerable<dynamic>)Enumerable.Cast<dynamic>(Model);
}
@{
if (!HasText(Model.Text)) {
@DisplayChildren(Model)
} else {
if (Model.Href.TrimEnd('/').ToUpperInvariant() == Request.Path.TrimEnd('/').ToUpperInvariant()) {
Model.Classes.Add("current");
}
var tag = Tag(Model, "li");
@tag.StartElement
<a href="@Model.Href">@Model.Text</a>
if (items.Any()) {
<ul>
@DisplayChildren(Model)
</ul>
}
@tag.EndElement
}
}

View File

@@ -301,12 +301,15 @@ form.link button:hover {
padding:.4em 0 0 .4em;
font-size:1.308em;
}
.menu-local-admin li {
.localmenu li {
display: inline;
}
.menu-local-admin li.middle {
.localmenu li.middle {
padding-left: 10px;
}
.localmenu li.selected {
font-weight: bold;
}
.section-new {
border-top:1px solid #d3d3d3;
border-bottom:1px solid #d3d3d3;

View File

@@ -120,7 +120,7 @@
<Content Include="TheThemeMachine\Placement.info" />
</ItemGroup>
<ItemGroup>
<Content Include="TheAdmin\Views\Menu__local_admin.cshtml" />
<Content Include="TheAdmin\Views\LocalMenu.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -46,12 +46,19 @@ namespace Orchard.UI.Navigation {
workContext.Layout.Navigation.Add(menuShape);
// Populate local nav
dynamic localMenuShape = _shapeFactory.Menu().MenuName(string.Format("local_{0}", menuName));
dynamic localMenuShape = _shapeFactory.LocalMenu().MenuName(string.Format("local_{0}", menuName));
PopulateLocalMenu(_shapeFactory, localMenuShape, localMenuShape, selectedPath);
workContext.Layout.LocalNavigation.Add(localMenuShape);
}
private void PopulateMenu(dynamic shapeFactory, dynamic parentShape, dynamic menu, IEnumerable<MenuItem> menuItems) {
/// <summary>
/// Populates the menu shapes.
/// </summary>
/// <param name="shapeFactory">The shape factory.</param>
/// <param name="parentShape">The menu parent shape.</param>
/// <param name="menu">The menu shape.</param>
/// <param name="menuItems">The current level to populate.</param>
protected void PopulateMenu(dynamic shapeFactory, dynamic parentShape, dynamic menu, IEnumerable<MenuItem> menuItems) {
foreach (MenuItem menuItem in menuItems) {
dynamic menuItemShape = BuildMenuItemShape(shapeFactory, parentShape, menu, menuItem);
@@ -75,7 +82,26 @@ namespace Orchard.UI.Navigation {
// find childs tabs and expand them
if (parentMenuItem != null && parentMenuItem.Items != null && parentMenuItem.Items.Any()) {
PopulateMenu(shapeFactory, parentShape, menu, parentMenuItem.Items);
PopulateLocalMenu(shapeFactory, parentShape, menu, parentMenuItem.Items);
}
}
/// <summary>
/// Populates the local menu shapes.
/// </summary>
/// <param name="shapeFactory">The shape factory.</param>
/// <param name="parentShape">The menu parent shape.</param>
/// <param name="menu">The menu shape.</param>
/// <param name="menuItems">The current level to populate.</param>
protected void PopulateLocalMenu(dynamic shapeFactory, dynamic parentShape, dynamic menu, IEnumerable<MenuItem> menuItems) {
foreach (MenuItem menuItem in menuItems) {
dynamic menuItemShape = BuildLocalMenuItemShape(shapeFactory, parentShape, menu, menuItem);
if (menuItem.Items != null && menuItem.Items.Any()) {
PopulateLocalMenu(shapeFactory, menuItemShape, menu, menuItem.Items);
}
parentShape.Add(menuItemShape, menuItem.Position);
}
}
@@ -165,6 +191,27 @@ namespace Orchard.UI.Navigation {
.Parent(parentShape);
}
/// <summary>
/// Builds a local menu item shape.
/// </summary>
/// <param name="shapeFactory">The shape factory.</param>
/// <param name="parentShape">The parent shape.</param>
/// <param name="menu">The menu shape.</param>
/// <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()
.Text(menuItem.Text)
.Href(menuItem.Href)
.LinkToFirstChild(menuItem.LinkToFirstChild)
.LocalNav(menuItem.LocalNav)
.Selected(menuItem.Selected)
.RouteValues(menuItem.RouteValues)
.Item(menuItem)
.Menu(menu)
.Parent(parentShape);
}
public void OnResultExecuted(ResultExecutedContext filterContext) { }
}
}

View File

@@ -38,7 +38,7 @@ namespace Orchard.UI.Navigation {
return this;
}
public NavigationItemBuilder LocalTask(bool value = true) {
public NavigationItemBuilder LocalNav(bool value = true) {
_item.LocalNav = value;
return this;
}