Created
September 1, 2014 07:59
-
-
Save tuhlmann/bb65690b9c6dd592d1d6 to your computer and use it in GitHub Desktop.
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
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> {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