src/main/scala/fis/base/ui/SecNav.scala
author Tomas Zeman <tzeman@volny.cz>
Wed, 30 May 2012 22:51:02 +0200
changeset 100 1fcbeae1f9da
parent 49 c24112f0f084
child 103 6a2a19785cd8
permissions -rw-r--r--
8f7cff383e0a8601 Attachments
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package fis.base.ui
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import net.liftweb.common._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
import net.liftweb.http._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
import net.liftweb.sitemap._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import net.liftweb.sitemap.Loc._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import net.liftweb.sitemap.Menu._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
import net.liftweb.util._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
import net.liftweb.util.Helpers._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
import net.tz.lift.snippet._
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
import scala.xml.NodeSeq
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
/**
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
 * Secondary navigation snippet.
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
 */
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
object SecNav extends SecNav(Nil) {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
  def init() {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
    LiftRules.snippets.append {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
      case List("secnav") => ClearNodes
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
    }
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
  }
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
  val TAG = "secnav"
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
  def apply[T](m: Menuable): SecNav = this + m
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
  def apply[T](p: ParamMenuable[T]): SecNav = this + p
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
}
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
class SecNav(val navs: Seq[SecNavItem]) {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
  def + (i: SecNavItem): SecNav = new SecNav(navs :+ i)
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
  def + (m: Menuable): SecNav = this + (new SecNavMenu(m))
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
  def +[T] (p: ParamMenuable[T]): SecNav = this + (new SecNavLoc(p))
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
  def toCssTr: CssTr = ".items" #> (navs flatMap { _.toHtml })
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
  def build = Snippet(SecNav.TAG, toCssTr)
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
}
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
sealed abstract class SecNavItem {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
  def toHtml: NodeSeq
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
  protected def item(href: String, cnt: NodeSeq) =
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
    <li><a href={href}>{cnt}</a></li>
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
}
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
class SecNavMenu(m: Menuable) extends SecNavItem {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
  def toHtml = (for {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
    l <- SiteMap.findAndTestLoc(m.name)
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
  } yield {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
    item(l.calcDefaultHref, m.linkText.text())
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
  }) toSeq
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
}
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
class SecNavLoc[T](p: ParamMenuable[T]) extends SecNavItem {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
  def toHtml = (for {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
    cur <- S.location
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
    value <- cur.currentValue
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
    l <- SiteMap.findAndTestLoc(p.name)
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
    p <- tryo { (l.asInstanceOf[Loc[T]], value.asInstanceOf[T]) }
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
  } yield {
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
    item(p._1.calcHref(p._2), p._1.linkText(p._2))
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
  }) toSeq
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
}
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
100
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    87
object NavLink {
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    88
  def apply[T](l: Loc[T])(v: T): NodeSeq = {
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    89
    l.testAccess match {
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    90
      case Left(true) => <a href={l.calcHref(v)}>{l.linkText(v)}</a>
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    91
      case _ => NodeSeq.Empty
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    92
    }
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    93
  }
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    94
}
1fcbeae1f9da 8f7cff383e0a8601 Attachments
Tomas Zeman <tzeman@volny.cz>
parents: 49
diff changeset
    95
49
c24112f0f084 Secondary navigation
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
// vim: set ts=2 sw=2 et: