summaryrefslogtreecommitdiff
path: root/Omni/Jr/Web.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Omni/Jr/Web.hs')
-rw-r--r--Omni/Jr/Web.hs44
1 files changed, 43 insertions, 1 deletions
diff --git a/Omni/Jr/Web.hs b/Omni/Jr/Web.hs
index f556e1b..72de7db 100644
--- a/Omni/Jr/Web.hs
+++ b/Omni/Jr/Web.hs
@@ -61,6 +61,7 @@ type API =
:> QueryParam "type" Text
:> Get '[Lucid.HTML] TaskListPage
:<|> "kb" :> Get '[Lucid.HTML] KBPage
+ :<|> "epics" :> Get '[Lucid.HTML] EpicsPage
:<|> "tasks" :> Capture "id" Text :> Get '[Lucid.HTML] TaskDetailPage
:<|> "tasks" :> Capture "id" Text :> "status" :> ReqBody '[FormUrlEncoded] StatusForm :> Post '[Lucid.HTML] StatusBadgePartial
:<|> "tasks" :> Capture "id" Text :> "description" :> ReqBody '[FormUrlEncoded] DescriptionForm :> PostRedirect
@@ -130,6 +131,8 @@ data StatsPage = StatsPage TaskCore.TaskStats (Maybe Text)
newtype KBPage = KBPage [TaskCore.Task]
+newtype EpicsPage = EpicsPage [TaskCore.Task]
+
newtype RecentActivityPartial = RecentActivityPartial [TaskCore.Task]
newtype ReadyCountPartial = ReadyCountPartial Int
@@ -214,7 +217,7 @@ navbar =
Lucid.div_ [Lucid.class_ "navbar-dropdown"] <| do
Lucid.button_ [Lucid.class_ "navbar-dropdown-btn"] "Plans ▾"
Lucid.div_ [Lucid.class_ "navbar-dropdown-content"] <| do
- Lucid.a_ [Lucid.href_ "/tasks?type=Epic", Lucid.class_ "navbar-dropdown-item"] "Epics"
+ Lucid.a_ [Lucid.href_ "/epics", Lucid.class_ "navbar-dropdown-item"] "Epics"
Lucid.a_ [Lucid.href_ "/kb", Lucid.class_ "navbar-dropdown-item"] "KB"
Lucid.a_ [Lucid.href_ "/stats", Lucid.class_ "navbar-link"] "Stats"
@@ -387,6 +390,37 @@ instance Lucid.ToHtml KBPage where
Just desc ->
Lucid.p_ [Lucid.class_ "kb-preview"] (Lucid.toHtml (Text.take 200 desc <> "..."))
+instance Lucid.ToHtml EpicsPage where
+ toHtmlRaw = Lucid.toHtml
+ toHtml (EpicsPage tasks) =
+ Lucid.doctypehtml_ <| do
+ pageHead "Epics - Jr"
+ Lucid.body_ <| do
+ navbar
+ Lucid.div_ [Lucid.class_ "container"] <| do
+ Lucid.h1_ <| Lucid.toHtml ("Epics (" <> tshow (length tasks) <> ")")
+ Lucid.p_ [Lucid.class_ "info-msg"] "All epics (large, multi-task projects)."
+ if null tasks
+ then Lucid.p_ [Lucid.class_ "empty-msg"] "No epics found."
+ else Lucid.div_ [Lucid.class_ "task-list"] <| traverse_ renderEpicCard tasks
+ where
+ renderEpicCard :: (Monad m) => TaskCore.Task -> Lucid.HtmlT m ()
+ renderEpicCard t =
+ Lucid.a_
+ [ Lucid.class_ "task-card task-card-link",
+ Lucid.href_ ("/tasks/" <> TaskCore.taskId t)
+ ]
+ <| do
+ Lucid.div_ [Lucid.class_ "task-header"] <| do
+ Lucid.span_ [Lucid.class_ "task-id"] (Lucid.toHtml (TaskCore.taskId t))
+ statusBadge (TaskCore.taskStatus t)
+ Lucid.span_ [Lucid.class_ "priority"] (Lucid.toHtml (tshow (TaskCore.taskPriority t)))
+ Lucid.p_ [Lucid.class_ "task-title"] (Lucid.toHtml (TaskCore.taskTitle t))
+ case TaskCore.taskDescription t of
+ Nothing -> pure ()
+ Just desc ->
+ Lucid.p_ [Lucid.class_ "kb-preview"] (Lucid.toHtml (Text.take 200 desc <> "..."))
+
instance Lucid.ToHtml TaskListPage where
toHtmlRaw = Lucid.toHtml
toHtml (TaskListPage tasks filters) =
@@ -1239,6 +1273,7 @@ server =
:<|> statsHandler
:<|> taskListHandler
:<|> kbHandler
+ :<|> epicsHandler
:<|> taskDetailHandler
:<|> taskStatusHandler
:<|> taskDescriptionHandler
@@ -1304,6 +1339,13 @@ server =
let epicTasks = filter (\t -> TaskCore.taskType t == TaskCore.Epic) allTasks
pure (KBPage epicTasks)
+ epicsHandler :: Servant.Handler EpicsPage
+ epicsHandler = do
+ allTasks <- liftIO TaskCore.loadTasks
+ let epicTasks = filter (\t -> TaskCore.taskType t == TaskCore.Epic) allTasks
+ sortedEpics = List.sortBy (compare `on` TaskCore.taskPriority) epicTasks
+ pure (EpicsPage sortedEpics)
+
parseStatus :: Text -> Maybe TaskCore.Status
parseStatus = readMaybe <. Text.unpack