src/main/scala/fis/pm/ui/TaskSnippet.scala
changeset 104 ef29ecada49d
parent 103 6a2a19785cd8
child 105 66aeb6b3a3a7
equal deleted inserted replaced
103:6a2a19785cd8 104:ef29ecada49d
    37 
    37 
    38   private val listM = Menu("task.list", l10n("Tasks")) / prefix >>
    38   private val listM = Menu("task.list", l10n("Tasks")) / prefix >>
    39     Title(_ => i18n("Tasks")) >>
    39     Title(_ => i18n("Tasks")) >>
    40     locTpl("task/list") >> Snippet("list", list)
    40     locTpl("task/list") >> Snippet("list", list)
    41 
    41 
    42   private val listUnfinishedM = Menu("task.list-unfinished",
       
    43     l10n("tasks.unfinished")) / prefix >>
       
    44     Title(_ => i18n("Tasks")) >>
       
    45     new TaskReport(() => from(PmSchema.taskT, CodeListSchema.cli)((t, i) =>
       
    46       where(t.stateFld === i.id and TaskState.unfinishedClause(i))
       
    47       select(t) orderBy(t.deadline asc))) >>
       
    48     locTpl("task/list") >> Snippet("list", list) >> Hidden
       
    49 
       
    50   private val listAllM = Menu("task.list-all",
       
    51     l10n("tasks.all")) / prefix / "all" >>
       
    52     Title(_ => i18n("All Tasks")) >>
       
    53     new TaskReport(() => PmSchema.tasks) >>
       
    54     locTpl("task/list") >> Snippet("list", list) >> Hidden
       
    55 
       
    56   private val viewPre = Menu.param[Task]("task.view", l10n("Task"), parse,
    42   private val viewPre = Menu.param[Task]("task.view", l10n("Task"), parse,
    57     encode) / prefix / * >> Title(t => i18n("Task %s", t.linkName)) >>
    43     encode) / prefix / * >> Title(t => i18n("Task %s", t.linkName)) >>
    58     locTpl("task/view") >> Snippet("panel", panel) >>
    44     locTpl("task/view") >> Snippet("panel", panel) >>
    59     Snippet("attachments", attachmentsTable) >>
    45     Snippet("attachments", attachmentsTable) >>
    60     Snippet("comments", comments) >> Hidden
    46     Snippet("comments", comments) >> Hidden
    85   private lazy val viewLoc = viewM.toLoc
    71   private lazy val viewLoc = viewM.toLoc
    86   private lazy val editLoc = editM.toLoc
    72   private lazy val editLoc = editM.toLoc
    87   private lazy val deleteLoc = deleteM.toLoc
    73   private lazy val deleteLoc = deleteM.toLoc
    88   private lazy val postCommentLoc = postCommentM.toLoc
    74   private lazy val postCommentLoc = postCommentM.toLoc
    89 
    75 
    90   val menu = listM submenus(listUnfinishedM, listAllM, viewM, editM, deleteM,
    76   val menu = listM submenus(viewM, editM, deleteM, postCommentM,
    91     postCommentM, attachments.menu)
    77     attachments.menu)
    92 
    78 
    93   private def cur = viewLoc.currentValue or editLoc.currentValue or
    79   private def cur = viewLoc.currentValue or editLoc.currentValue or
    94     deleteLoc.currentValue or postCommentLoc.currentValue
    80     deleteLoc.currentValue or postCommentLoc.currentValue
    95 
    81 
       
    82   private def allQp: Boolean = (S param "all") flatMap(asBoolean(_)) openOr false
       
    83   private def allQp(url: String, all: Boolean) =
       
    84     all.box(appendQueryParameters(url, List("all" -> "1"))) openOr url
       
    85 
    96   private def list: CssTr = {
    86   private def list: CssTr = {
    97     val curM = Box(for {
    87     "li" #> (List(false, true) map { b =>
    98       m <- List(listUnfinishedM, listAllM)
    88       val html = <li><a href={allQp(url.list, b)}>{
    99       cur <- S.location
    89         l10n(if (b) "tasks.all" else "tasks.unfinished")}</a></li>
   100       loc <- SiteMap.findAndTestLoc(m.name) if cur.calcDefaultHref == loc.calcDefaultHref
    90       (b == allQp).box(html % ("class" -> "active")) openOr html
   101     } yield m) openOr listUnfinishedM
    91     }) &
   102 
    92     ".content *" #> _TaskTable(allQp.box(PmSchema.tasks) openOr
   103     "li" #> (List(listUnfinishedM, listAllM) map { m => 
    93       from(PmSchema.taskT, CodeListSchema.cli)((t, i) =>
   104       val nav = (new SecNavMenu(m)).toHtml
    94       where(t.stateFld === i.id and TaskState.unfinishedClause(i))
   105       (m == curM).box(addAttributes(nav, "class" -> "active")) openOr nav }) &
    95       select(t) orderBy(t.deadline asc)))
   106     ".content *" #> curM.params.flatMap {
       
   107       case v: TaskReport => _TaskTable(v.tasks)
       
   108       case _ => Nil
       
   109     }
       
   110   }
    96   }
   111 
    97 
   112   private def panel: CssTr = "*" #> cur.map { t => ViewPanel(fields(t)) }
    98   private def panel: CssTr = "*" #> cur.map { t => ViewPanel(fields(t)) }
   113 
    99 
   114   private def comments: CssTr = "*" #> cur.map { t =>
   100   private def comments: CssTr = "*" #> cur.map { t =>
   117   private def attachmentsTable: CssTr = "*" #> cur.map { t =>
   103   private def attachmentsTable: CssTr = "*" #> cur.map { t =>
   118     attachments.table(t)(TaskAttachments(t)) }
   104     attachments.table(t)(TaskAttachments(t)) }
   119 
   105 
   120   object url {
   106   object url {
   121     def view: Task => Box[String] = (viewLoc.calcHref _) andThen (Box !! _)
   107     def view: Task => Box[String] = (viewLoc.calcHref _) andThen (Box !! _)
       
   108     def list: String = listM.loc.calcDefaultHref
   122   }
   109   }
   123 
   110 
   124   private def fields(t: Task) = List(t.ident, t.name, t.project, t.taskType,
   111   private def fields(t: Task) = List(t.ident, t.name, t.project, t.taskType,
   125     t.stateFld, t.createdBy, t.createdAt, t.deadline, t.responsible, t.note)
   112     t.stateFld, t.createdBy, t.createdAt, t.deadline, t.responsible, t.note)
   126 
   113