src/main/scala/net/tz/lift/model/JodaTimeField.scala
author Tomas Zeman <tzeman@volny.cz>
Thu, 24 May 2012 11:19:26 +0200
changeset 99 49eb72a46208
parent 24 149113e059bd
permissions -rw-r--r--
e45557248ba12a15 Services
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package net.tz.lift.model
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import java.util.Calendar
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    19
import net.liftweb.common._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
import net.liftweb.http._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import net.liftweb.record._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import net.liftweb.record.field._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    23
import net.liftweb.util._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
import net.liftweb.util.Helpers._
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    25
import org.joda.time.{DateTime, DateMidnight}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
import org.joda.time.base.AbstractDateTime
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
import org.joda.time.format.DateTimeFormat
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
import scala.xml.{Elem, Text, Unparsed}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
/**
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    31
 * Joda date time field. Renders view in Czech format; renders form as 3 text
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
 * fields w/ css classes: <code>date</code>, <code>hour</code>,
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
 * <code>minute</code> to be rendered via CSS (date picker etc.).
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
 */
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
class JodaDateTimeField[T <: Record[T]](rec: T) extends DateTimeField(rec) {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
  override def setFromAny(in: Any): Box[Calendar] = in match {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
    case dt: AbstractDateTime => setBox(Full(dt.toGregorianCalendar))
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
    case x => super.setFromAny(x)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
  }
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
  def set(dt: AbstractDateTime): Calendar = set(dt.toGregorianCalendar)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
  def dateTime = new DateTime(get)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
  private def mdt = dateTime.toMutableDateTime
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
  override def asHtml = Text(AsDateTime(dateTime))
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    48
  override def toForm = Full(
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    49
    SHtml.text(AsDateMidnight(dateTime.toDateMidnight), { s =>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    50
      val v = mdt
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    51
      AsDateMidnight(s) foreach { in =>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    52
        v.setYear(in.getYear)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    53
        v.setMonthOfYear(in.getMonthOfYear)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
        v.setDayOfMonth(in.getDayOfMonth)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
      }
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    56
      set(v.toGregorianCalendar) }, "class" -> "date") ++ Unparsed("&nbsp;") ++
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    57
    SHtml.selectObj[Int]((0 to 23) map { v => (v, "%02d".format(v)) },
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    58
      Full(dateTime.getHourOfDay), { h =>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
      val v = mdt
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
      v.setHourOfDay(h)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
      set(v.toGregorianCalendar) }, "class" -> "hour") ++ Text(":") ++
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
    SHtml.selectObj[Int](Range(0, 60, minuteStep) map { v =>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
      (v, "%02d".format(v)) },
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
      Full(dateTime.getMinuteOfHour / minuteStep * minuteStep), { m =>
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
      val v = mdt
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
      v.setMinuteOfHour(m)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
      set(v.toGregorianCalendar) }, "class" -> "minute")
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
  )
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
  val minuteStep: Int = 5
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
/**
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
 * Joda date field.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
 */
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
class JodaDateMidnightField[T <: Record[T]](rec: T) extends DateTimeField(rec) {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
  override def setFromAny(in: Any): Box[Calendar] = in match {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
    case dt: AbstractDateTime => setBox(Full(dt.toGregorianCalendar))
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
    case x => super.setFromAny(x)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    80
  }
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    81
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    82
  def set(dt: AbstractDateTime): Calendar = set(dt.toGregorianCalendar)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
  def date = new DateMidnight(get)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    85
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    86
  override def asHtml = Text(AsDateMidnight(date))
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    87
  override def toForm = Full(SHtml.text(AsDateMidnight(date),
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    88
    s => setBox(AsDateMidnight(s) map {_.toGregorianCalendar}),
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    89
    "class" -> "date"))
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    90
}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    91
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    92
/**
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    93
 * Optional Joda date field.
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    94
 */
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    95
class OptionalJodaDateMidnightField[T <: Record[T]](rec: T) extends
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    96
  OptionalDateTimeField(rec) {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    97
  override def setFromAny(in: Any): Box[Calendar] = in match {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    98
    case dt: AbstractDateTime => setBox(Full(dt.toGregorianCalendar))
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
    99
    case x => super.setFromAny(x)
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   100
  }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   101
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   102
  def set(dt: Box[AbstractDateTime]): Box[Calendar] =
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   103
    set(dt map(_.toGregorianCalendar))
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   104
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   105
  def date = get map(new DateMidnight(_))
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   106
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   107
  override def toString = date map(AsDateMidnight(_)) getOrElse ""
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   108
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   109
  override def asHtml = Text(toString)
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   110
  override def toForm = Full(SHtml.text(toString,
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   111
    s => setBox(AsDateMidnight(s) map {_.toGregorianCalendar}),
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   112
    "class" -> "date"))
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   113
}
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   114
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   115
/**
24
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   116
 * Joda date-time converters.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   117
 */
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
object AsDateTime {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   119
  val fmt = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm")
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   120
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   121
  def apply(d: DateTime): String = fmt.print(d)
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   122
  def apply(s: String): Box[DateTime] = tryo { fmt.parseDateTime(s) }
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   123
}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   124
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   125
/**
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   126
 * Joda date converters.
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   127
 */
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   128
object AsDateMidnight {
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   129
  val fmt = DateTimeFormat.forPattern("dd.MM.yyyy")
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   130
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   131
  def apply(d: DateMidnight): String = fmt.print(d)
99
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   132
  def apply(s: String): Box[DateMidnight] = s match {
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   133
    case null | "" => Empty
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   134
    case s => tryo { fmt.parseDateTime(s).toDateMidnight }
49eb72a46208 e45557248ba12a15 Services
Tomas Zeman <tzeman@volny.cz>
parents: 24
diff changeset
   135
  }
24
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   136
}
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   137
149113e059bd JodaTime field
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   138
// vim: set ts=2 sw=2 et: