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 }