src/main/scala/fis/pm/ui/TaskSnippet.scala
changeset 81 c7d21399c726
child 83 f7553032b302
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/scala/fis/pm/ui/TaskSnippet.scala	Fri Apr 27 12:04:35 2012 +0200
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package fis.pm.ui
+
+import fis.base.ui._
+import fis.pm.model._
+import net.liftweb.common._
+import net.liftweb.http._
+import net.liftweb.sitemap._
+import net.liftweb.sitemap.Loc._
+import net.liftweb.util._
+import net.liftweb.util.Helpers._
+import net.tz.lift.model._
+import net.tz.lift.snippet._
+import scala.xml.{Elem, NodeSeq, Text}
+
+object TaskSnippet extends TaskCrud with EntitySnippet[Task] {
+  val prefix = "task"
+
+  private val listM = Menu("task.list", l10n("Tasks")) / prefix >>
+    Title(_ => i18n("Tasks")) >>
+    locTpl("entity/list") >> Snippet("list", ClearNodes) >> Hidden
+
+  private val viewPre = Menu.param[Task]("task.view", l10n("Task"), parse,
+    encode) / prefix / * >> Title(t => i18n("Task %s", t.linkName)) >>
+    locTpl("entity/view") >> Snippet("panel", panel) >> Hidden
+
+  private val editPre = Menu.param[Task]("task.edit", l10n("Edit"), parse,
+    encode) / prefix / * / EDIT >>
+    Title(t => i18n("Edit task %s", t.linkName)) >>
+    locTpl("entity/form") >> Snippet("form", form) >> Hidden
+
+  private val deletePre = Menu.param[Task]("task.delete", l10n("Delete"),
+    parse, encode) / prefix / * / DELETE >>
+    Title(t => i18n("Delete task %s", t.linkName)) >>
+    locTpl("entity/delete") >> Snippet("form", deleteF) >> Hidden
+
+  private val viewM = viewPre >> (SecNav(editPre) + deletePre).build
+  private val editM = editPre >> SecNav(viewPre).build
+  private val deleteM = deletePre >> SecNav(viewPre).build
+
+  private lazy val viewLoc = viewM.toLoc
+  private lazy val editLoc = editM.toLoc
+  private lazy val deleteLoc = deleteM.toLoc
+
+  val menu = listM submenus(viewM, editM, deleteM)
+
+  private def cur = viewLoc.currentValue or editLoc.currentValue or
+    deleteLoc.currentValue
+
+  private def panel: CssTr = "*" #> cur.map { c => ViewPanel(fields(c)) }
+
+  object url {
+    def view: Task => Box[String] = (viewLoc.calcHref _) andThen (Box !! _)
+  }
+
+  private def fields(t: Task) = List(t.name, t.project, t.taskType, t.stateFld,
+    t.createdBy, t.createdAt, t.deadline, t.responsible, t.note)
+
+  private case class TaskLink(t: Task) extends EntityLink[Task](t, url.view)
+
+  EntityLink.register[Task](TaskLink(_))
+
+  private object form extends TaskForm {
+
+    override def localSetup() {
+      cur.foreach(task(_))
+    }
+
+    protected def onSuccess(t: Task) {
+      S.redirectTo(viewLoc.calcHref(t))
+    }
+  }
+
+  private object deleteF extends HorizontalScreen with CancelButton with
+    DeleteButton {
+
+    val confirm = field(l10n("Really delete this task?"), false)
+
+    def finish() {
+      for {
+        t <- deleteLoc.currentValue if confirm
+        p <- t.project.vend
+        u <- ProjectSnippet.url.view(p)
+        r <- delete(t)
+        n <- r.box(t.linkName)
+      } {
+        S notice l10n("Task %s deleted.", n)
+        S redirectTo u
+      }
+    }
+  }
+
+}
+
+// vim: set ts=2 sw=2 et: