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 |