src/main/scala/net/datatables/DataTables.scala
author Tomas Zeman <tzeman@volny.cz>
Tue, 24 Apr 2012 16:42:34 +0200
changeset 77 8f0eddd7aa85
permissions -rw-r--r--
Datatables DSL
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
77
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package net.datatables
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import fis.base.ui._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
import net.liftweb.http._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
import net.liftweb.http.js._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import net.liftweb.http.js.JE._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import net.liftweb.http.js.JsCmds._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
import net.liftweb.http.js.jquery._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
import net.liftweb.http.js.jquery.JqJE._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
import net.liftweb.http.js.jquery.JqJsCmds._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
import net.liftweb.json._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
import net.liftweb.json.Extraction._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
import net.liftweb.record.RecordHelpers._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
import net.liftweb.sitemap.Loc.Snippet
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
import net.liftweb.util._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
import net.liftweb.util.Helpers._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
import net.tz.lift.snippet._
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
import scala.xml.NodeSeq
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
/**
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
 * datatables.net typesafe datatable.
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
 */
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
object DataTables {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
  def init() {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
    LiftRules.snippets.append {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
      case List("datatables") => { _ => initHeader(loadTpl) }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
    }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
  protected def loadTpl = 
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
    Templates(List("templates-hidden", "datatables")) openOr NodeSeq.Empty
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
  protected def initHeader: CssTr = {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
    val rows = Props.getInt("datatables.rows") map { i =>
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
      SetExp(JsVar("$.fn.dataTable.defaults.iDisplayLength"), i) }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
    val lang = Props.get("datatables.lang." + CurLanguage.getLanguage) map { l =>
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
      SetExp(JsVar("$.fn.dataTable.defaults.oLanguage.sUrl"), l) }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
    "#datatables-defaults" #> Script((rows ++ lang) toSeq)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
  def onLoad(selector: String, opts: Options): NodeSeq = {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
    val s = Script(JqOnLoad(jsRender(selector, opts)))
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
    <head>
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
      {s}
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
    </head>
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
  def jsRender(selector: String, opts: Options): JsExp =
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
    JqId(selector) ~> fun(opts)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
  private def fun(opts: Options): JsMember = 
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
    new JsRaw("dataTable(%s);".format(opt2js(opts).toJsCmd)) with JsMember
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
  private def opt2js(opts: Options): JsExp = {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
    implicit val formats = DefaultFormats
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
    decompose(opts)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
  case class Options(oLanguage: Option[Language], aoColumnDefs: List[ColumnDef])
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
  {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
    def lang(l: Language) = this.copy(oLanguage = Some(l))
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
    def col(c: ColumnDef) = this.copy(aoColumnDefs = c :: aoColumnDefs)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
  object Options extends Options(None, Nil)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
  case class Language(sUrl: Option[String]) {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
    def url(url: String) = this.copy(sUrl = Some(url))
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
  object Language extends Language(None)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
  case class ColumnDef(sType: Option[String], aTargets: List[Int]) {
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
    def dtype(t: String) = this.copy(sType = Some(t))
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
    def dtype(t: Symbol) = this.copy(sType = Some(t.name))
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
    def target(i: Int) = this.copy(aTargets = i :: aTargets)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
  }
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
  object ColumnDef extends ColumnDef(None, Nil)
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    93
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    94
  val TYPE_EU_DATE = 'eu_date
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    95
}
8f0eddd7aa85 Datatables DSL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    96
// vim: set ts=2 sw=2 et: