Instantly share code, notes, and snippets.
Last active
August 29, 2015 14:16
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save 0liver/f60acf8c84cf2ab86397 to your computer and use it in GitHub Desktop.
Orchard Admin Menu
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@using Orchard.Utility.Extensions; | |
@{ | |
Script.Require("jQuery"); | |
Script.Include("admin.js"); | |
IEnumerable<dynamic> firstLevelMenuItems = Model; | |
if (Model.ImageSets != null) { | |
foreach (var imageSet in Model.ImageSets) { | |
RegisterImageSet("menu." + imageSet, Model.MenuName /* style */, 16 /* bounding box */); | |
} | |
} | |
Model.Attributes.Add("role", "navigation"); | |
var tag = Tag(Model, "ul"); | |
} | |
@tag.StartElement | |
@foreach(var firstLevelMenuItem in Model) { | |
IEnumerable<dynamic> secondLevelMenuItems = firstLevelMenuItem; | |
string sectionHeaderText = firstLevelMenuItem.Text.Text; | |
string sectionHeaderTextHint = firstLevelMenuItem.Text.TextHint; | |
var firstOfTheSecond = secondLevelMenuItems.FirstOrDefault(); | |
var itemClassName = HasText(sectionHeaderTextHint) | |
? "navicon-" + sectionHeaderTextHint.HtmlClassify() | |
: "navicon"; | |
var itemId = HasText(firstLevelMenuItem.IdHint) | |
? "navicon-" + firstLevelMenuItem.IdHint | |
: null; | |
IHtmlString sectionHeaderMarkup; | |
if (firstOfTheSecond != null | |
&& firstLevelMenuItem.LinkToFirstChild | |
&& ( | |
firstOfTheSecond.RouteValues != null | |
|| HasText(firstOfTheSecond.Url))) { | |
sectionHeaderMarkup = HasText(itemId) | |
? Html.Link(sectionHeaderText, (string)firstOfTheSecond.Href, new { target = "_blank", @class = itemClassName, id = itemId }) | |
: Html.Link(sectionHeaderText, (string)firstOfTheSecond.Href, new { target = "_blank", @class = itemClassName }); | |
} | |
else if (firstLevelMenuItem.RouteValues != null || HasText(firstLevelMenuItem.Url)) { | |
sectionHeaderMarkup = HasText(itemId) | |
? Html.Link(sectionHeaderText, (string)firstLevelMenuItem.Href, new { target = "_blank", @class = itemClassName, id = itemId }) | |
: Html.Link(sectionHeaderText, (string)firstLevelMenuItem.Href, new { target = "_blank", @class = itemClassName }); | |
} | |
else { | |
// if the header isn't linked and there are no children there's no reason for this item in the menu other than to look pretty | |
if (!secondLevelMenuItems.Any()) { | |
continue; | |
} | |
sectionHeaderMarkup = HasText(itemId) | |
? new HtmlString(string.Format(@"<span class=""{1}"" id=""{2}"">{0}</span>", Html.Encode(sectionHeaderText), Html.Encode(itemClassName), Html.Encode(itemId))) | |
: new HtmlString(string.Format(@"<span class=""{1}"">{0}</span>", Html.Encode(sectionHeaderText), Html.Encode(itemClassName))); | |
} | |
if (firstLevelMenuItem == firstLevelMenuItems.First()) { | |
firstLevelMenuItem.Classes.Add("first"); | |
} | |
if (firstLevelMenuItem == firstLevelMenuItems.Last()) { | |
firstLevelMenuItem.Classes.Add("last"); | |
} | |
if (firstLevelMenuItem.Selected) { | |
firstLevelMenuItem.Classes.Add("selected"); | |
} | |
if (HasText(sectionHeaderTextHint)) { | |
firstLevelMenuItem.Classes.Add("section-" + sectionHeaderTextHint.HtmlClassify()); | |
} | |
var firstLevelTag = Tag(firstLevelMenuItem, "li"); | |
@firstLevelTag.StartElement | |
<h3>@sectionHeaderMarkup</h3> | |
if (secondLevelMenuItems.Count(menuItem => !menuItem.LocalNav) > 1 || !firstLevelMenuItem.LinkToFirstChild) { | |
<ul class="menuItems"> | |
@{ var first = true;} | |
@foreach (var secondLevelMenuItem in secondLevelMenuItems.Where(menuItem => !menuItem.LocalNav)) { | |
if (first && firstLevelMenuItem.LinkToFirstChild) { | |
first = false; | |
continue; | |
} | |
string secondLevelTextHint = secondLevelMenuItem.Text.TextHint; | |
var firstOfTheThird = ((IEnumerable<dynamic>)secondLevelMenuItem.Items).FirstOrDefault(); | |
var secondLevelItemClassName = HasText(secondLevelTextHint) | |
? "subnavicon-" + secondLevelTextHint.HtmlClassify() | |
: "subnavicon"; | |
var secondLevelItemId = HasText(secondLevelMenuItem.IdHint) | |
? "subnavicon-" + secondLevelMenuItem.IdHint | |
: null; | |
if (secondLevelMenuItem.Selected) { | |
secondLevelMenuItem.Classes.Add("selected"); | |
} | |
var secondLevelTag = Tag(secondLevelMenuItem, "li"); | |
var secondLevelUrl = secondLevelMenuItem.Href; | |
if (firstOfTheThird != null && secondLevelMenuItem.LinkToFirstChild && (firstOfTheThird.RouteValues != null || HasText(firstOfTheThird.Url))) { | |
secondLevelUrl = firstOfTheThird.Href; | |
} | |
@secondLevelTag.StartElement | |
if (HasText(secondLevelItemId)) { | |
<a target="_blank" href="@secondLevelUrl" class="@secondLevelItemClassName" id="@secondLevelItemId">@secondLevelMenuItem.Text</a> | |
} | |
else { | |
<a target="_blank" href="@secondLevelUrl" class="@secondLevelItemClassName">@secondLevelMenuItem.Text</a> | |
} | |
@secondLevelTag.EndElement | |
} | |
</ul> | |
} | |
@firstLevelTag.EndElement | |
} | |
@tag.EndElement | |
@using(Script.Foot()) { | |
<script type="text/javascript"> | |
//<![CDATA[ | |
(function ($) { | |
$("@string.Format(".{0} h3", string.Join(".", Model.Classes))").expandoControl(function(controller) { return controller.next(); }, { key: "N42", path: "@Url.Content("~/")" }); | |
})(jQuery); | |
//]]> | |
</script> | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment