Skip to content

Instantly share code, notes, and snippets.

@tuhlmann
Created September 1, 2014 07:59
Show Gist options
  • Save tuhlmann/bb65690b9c6dd592d1d6 to your computer and use it in GitHub Desktop.
Save tuhlmann/bb65690b9c6dd592d1d6 to your computer and use it in GitHub Desktop.
object Menus extends MyBsMenu
trait MyBsMenu extends SnippetHelper {
/**
* Produces a menu UL from a group, for use with Bootstrap.
*/
def group = {
val menus: NodeSeq =
for {
group <- S.attr("group") ?~ "Group not specified"
sitemap <- LiftRules.siteMap ?~ "Sitemap is empty"
request <- S.request ?~ "Request is empty"
curLoc <- request.location ?~ "Current location is empty"
} yield ({
val currentClass = S.attr("current_class").openOr("active")
sitemap.locForGroup(group) flatMap { loc =>
val nonHiddenKids = loc.menu.kids.filterNot(_.loc.hidden)
val styles =
if (curLoc.name == loc.name || loc.menu.kids.exists(_.loc.name == curLoc.name)) currentClass
else ""
if (nonHiddenKids.length == 0) {
<li class={styles+menuCss(loc)}>{buildLink(loc)}</li>
} else {
val dropdown: NodeSeq = nonHiddenKids.map { kid =>
<li>{buildLink(kid.loc)}</li>
}
<li class={styles + " dropdown"}>
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{loc.linkText.openOr(Text("Empty Name"))} <b class="caret"></b></a>
<ul class="dropdown-menu">{ dropdown }</ul>
</li>
}
}
}): NodeSeq
"* *" #> menus
}
def buildLink(loc: Loc[_]): NodeSeq = {
val linkText = loc.linkText openOr Text(loc.name)
val locIcons = findIcons(loc)
val iconSpan = if (locIcons.size > 0) {
<i class={locIcons.flatMap(_.cssIconClass).mkString(" ")}></i>
} else NodeSeq.Empty
<a href={loc.createDefaultLink}>{iconSpan}<span>&nbsp;{linkText}</span></a>
}
def findIcons(loc: Loc[_]): List[LocIcon] = loc.params.filter(p => p.isInstanceOf[LocIcon]).map(_.asInstanceOf[LocIcon])
def menuCss(loc: Loc[_]): String = {
loc.params.filter(p => p.isInstanceOf[ItemCss]).map(_.asInstanceOf[ItemCss]).map(_.css).mkString(" ")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment