src/main/scala/fis/pm/ui/TaskSnippet.scala
changeset 103 6a2a19785cd8
parent 101 b6a00fd29998
child 104 ef29ecada49d
--- a/src/main/scala/fis/pm/ui/TaskSnippet.scala	Tue Jun 05 15:40:44 2012 +0200
+++ b/src/main/scala/fis/pm/ui/TaskSnippet.scala	Tue Jun 05 15:40:44 2012 +0200
@@ -17,6 +17,7 @@
 
 import fis.aaa.ui.IfLoggedIn
 import fis.base.ui._
+import fis.cl.model._
 import fis.fs.model._
 import fis.fs.ui._
 import fis.pm.model._
@@ -24,6 +25,7 @@
 import net.liftweb.http._
 import net.liftweb.sitemap._
 import net.liftweb.sitemap.Loc._
+import net.liftweb.squerylrecord.RecordTypeMode._
 import net.liftweb.util._
 import net.liftweb.util.Helpers._
 import net.tz.lift.model._
@@ -35,7 +37,21 @@
 
   private val listM = Menu("task.list", l10n("Tasks")) / prefix >>
     Title(_ => i18n("Tasks")) >>
-    locTpl("entity/list") >> Snippet("list", ClearNodes) >> Hidden
+    locTpl("task/list") >> Snippet("list", list)
+
+  private val listUnfinishedM = Menu("task.list-unfinished",
+    l10n("tasks.unfinished")) / prefix >>
+    Title(_ => i18n("Tasks")) >>
+    new TaskReport(() => from(PmSchema.taskT, CodeListSchema.cli)((t, i) =>
+      where(t.stateFld === i.id and TaskState.unfinishedClause(i))
+      select(t) orderBy(t.deadline asc))) >>
+    locTpl("task/list") >> Snippet("list", list) >> Hidden
+
+  private val listAllM = Menu("task.list-all",
+    l10n("tasks.all")) / prefix / "all" >>
+    Title(_ => i18n("All Tasks")) >>
+    new TaskReport(() => PmSchema.tasks) >>
+    locTpl("task/list") >> Snippet("list", list) >> Hidden
 
   private val viewPre = Menu.param[Task]("task.view", l10n("Task"), parse,
     encode) / prefix / * >> Title(t => i18n("Task %s", t.linkName)) >>
@@ -71,12 +87,28 @@
   private lazy val deleteLoc = deleteM.toLoc
   private lazy val postCommentLoc = postCommentM.toLoc
 
-  val menu = listM submenus(viewM, editM, deleteM, postCommentM,
-    attachments.menu)
+  val menu = listM submenus(listUnfinishedM, listAllM, viewM, editM, deleteM,
+    postCommentM, attachments.menu)
 
   private def cur = viewLoc.currentValue or editLoc.currentValue or
     deleteLoc.currentValue or postCommentLoc.currentValue
 
+  private def list: CssTr = {
+    val curM = Box(for {
+      m <- List(listUnfinishedM, listAllM)
+      cur <- S.location
+      loc <- SiteMap.findAndTestLoc(m.name) if cur.calcDefaultHref == loc.calcDefaultHref
+    } yield m) openOr listUnfinishedM
+
+    "li" #> (List(listUnfinishedM, listAllM) map { m => 
+      val nav = (new SecNavMenu(m)).toHtml
+      (m == curM).box(addAttributes(nav, "class" -> "active")) openOr nav }) &
+    ".content *" #> curM.params.flatMap {
+      case v: TaskReport => _TaskTable(v.tasks)
+      case _ => Nil
+    }
+  }
+
   private def panel: CssTr = "*" #> cur.map { t => ViewPanel(fields(t)) }
 
   private def comments: CssTr = "*" #> cur.map { t =>
@@ -96,6 +128,17 @@
 
   EntityLink.register[Task](TaskLink(_))
 
+  private object _TaskTable extends TaskTable {
+    override def fields(t: Task) = (Seq(identField(t)) ++ EntityLink(t) ++
+      Seq(t.project, t.stateFld, t.deadline, t.responsible, t.note)
+      ) map Delayed(t)
+  }
+
+  private class TaskReport(f: () => Iterable[Task]) extends LocInfo[Iterable[Task]] {
+    def apply() = Full(f)
+    def tasks = f()
+  }
+
   private object form extends TaskForm {
 
     override def localSetup() {