liftweb-uirouter
angularjs ui-router module for scala liftweb framework
git clone https://9o.is/git/liftweb-uirouter.git
UiMenu.scala
(2659B)
1 package net.liftmodules.uirouter
2 package snippet
3
4 import xml._
5 import net.liftweb._
6 import http._
7 import util._
8 import Helpers._
9 import sitemap._
10 import common._
11
12 /**
13 * Menu so pages can work with UI-router and change with Ajax.
14 */
15 trait UiMenu extends SnippetHelper {
16
17 /**
18 * Creates an HTML anchor tag of a UI-router Menu.
19 */
20 def item(name: String): NodeSeq =
21 (for {
22 loc <- SiteMap.findAndTestLoc(name)
23 link <- loc.createDefaultLink
24 } yield {
25
26 def uiSref(el: Elem): Elem = {
27 if(loc.inGroup_?(net.liftmodules.uirouter.loc.UiRouter.group.head))
28 el % ("ui-sref" -> loc.name.replaceAll(" ","_"))
29 else
30 el
31 }
32
33 val linkText = loc.linkText openOr Text(loc.name)
34 uiSref(<a href={link}>{linkText}</a>)
35
36 }) getOrElse NodeSeq.Empty
37
38 /**
39 * Links an HTML anchor tag of a UI-router Menu.
40 *
41 * Usage:
42 *
43 * <a data-lift="UiRouter.item?name=Settings" href="#">
44 * <img src="example.jpg" />
45 * </a>
46 */
47 def item: CssSel = {
48 val options = (for {
49 name: String <- S.attr("name") ?~ "Item name not specified"
50 } yield for {
51 loc <- SiteMap.findAndTestLoc(name)
52 link <- loc.createDefaultLink
53 } yield {
54 "* [ui-sref]" #> loc.name.replaceAll(" ","_") &
55 "* [href]" #> link
56 }) openOr Empty
57 options
58 }
59
60 /**
61 * Produces a menu ul given a group name.
62 *
63 * Dropdowns for children menus are designed with
64 * Bootstrap 3 and ui-bootstrap.
65 *
66 * Usage:
67 *
68 * <ul data-lift="UiRouter.group?group=topbar"></ul>
69 */
70 def group = {
71 val menus: NodeSeq =
72 for {
73 group <- S.attr("group") ?~ "Group not specified"
74 sitemap <- LiftRules.siteMap ?~ "Sitemap is empty"
75 request <- S.request ?~ "Request is empty"
76 curLoc <- request.location ?~ "Current location is empty"
77 } yield ({
78 sitemap.locForGroup(group) flatMap { loc =>
79 val nonHiddenKids = loc.menu.kids.filterNot(_.loc.hidden)
80
81 if (nonHiddenKids.length == 0) {
82 <li>{item(loc.name)}</li>
83 }
84 else {
85 val dropdown: NodeSeq = nonHiddenKids.map { kid =>
86 <li>{item(kid.loc.name)}</li>
87 }
88
89 <li class="dropdown" on-toggle="toggled(open)">
90 <a href="#" class="dropdown-toggle" ng-disabled="disabled">{loc.linkText.openOr(Text("Empty Name"))} <b class="caret"></b></a>
91 <ul class="dropdown-menu" role="menu">{ dropdown }</ul>
92 </li>
93 }
94 }
95 }): NodeSeq
96
97 "* *" #> menus
98 }
99 }