diff options
Diffstat (limited to 'Omni/Jr/Web.hs')
| -rw-r--r-- | Omni/Jr/Web.hs | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/Omni/Jr/Web.hs b/Omni/Jr/Web.hs index e58992c..465c021 100644 --- a/Omni/Jr/Web.hs +++ b/Omni/Jr/Web.hs @@ -76,7 +76,7 @@ type API = :<|> "tasks" :> Capture "id" Text :> "accept" :> PostRedirect :<|> "tasks" :> Capture "id" Text :> "reject" :> ReqBody '[FormUrlEncoded] RejectForm :> PostRedirect :<|> "tasks" :> Capture "id" Text :> "reset-retries" :> PostRedirect - :<|> "partials" :> "recent-activity" :> Get '[Lucid.HTML] RecentActivityPartial + :<|> "partials" :> "recent-activity" :> QueryParam "offset" Int :> Get '[Lucid.HTML] RecentActivityPartial :<|> "partials" :> "ready-count" :> Get '[Lucid.HTML] ReadyCountPartial :<|> "partials" :> "task-list" @@ -95,7 +95,7 @@ instance Accept CSS where instance MimeRender CSS LazyText.Text where mimeRender _ = LazyText.encodeUtf8 -data HomePage = HomePage TaskCore.TaskStats [TaskCore.Task] [TaskCore.Task] +data HomePage = HomePage TaskCore.TaskStats [TaskCore.Task] [TaskCore.Task] Bool newtype ReadyQueuePage = ReadyQueuePage [TaskCore.Task] @@ -161,7 +161,7 @@ instance FromForm FactCreateForm where data EpicsPage = EpicsPage [TaskCore.Task] [TaskCore.Task] -newtype RecentActivityPartial = RecentActivityPartial [TaskCore.Task] +data RecentActivityPartial = RecentActivityPartial [TaskCore.Task] Int Bool newtype ReadyCountPartial = ReadyCountPartial Int @@ -479,7 +479,7 @@ renderListGroupItem t = instance Lucid.ToHtml HomePage where toHtmlRaw = Lucid.toHtml - toHtml (HomePage stats readyTasks recentTasks) = + toHtml (HomePage stats readyTasks recentTasks hasMoreRecent) = Lucid.doctypehtml_ <| do pageHead "Jr Dashboard" Lucid.body_ <| do @@ -518,11 +518,20 @@ instance Lucid.ToHtml HomePage where Lucid.makeAttribute "hx-get" "/partials/recent-activity", Lucid.makeAttribute "hx-trigger" "every 10s" ] - <| if null recentTasks - then Lucid.p_ [Lucid.class_ "empty-msg"] "No recent tasks." - else - Lucid.div_ [Lucid.class_ "list-group"] - <| traverse_ renderListGroupItem recentTasks + <| do + if null recentTasks + then Lucid.p_ [Lucid.class_ "empty-msg"] "No recent tasks." + else + Lucid.div_ [Lucid.class_ "list-group"] + <| traverse_ renderListGroupItem recentTasks + when hasMoreRecent + <| Lucid.button_ + [ Lucid.class_ "btn btn-secondary load-more-btn", + Lucid.makeAttribute "hx-get" "/partials/recent-activity?offset=5", + Lucid.makeAttribute "hx-target" "closest .recent-activity", + Lucid.makeAttribute "hx-swap" "beforeend" + ] + "Load More" where statCard :: (Monad m) => Text -> Int -> Text -> Text -> Lucid.HtmlT m () statCard label count badgeClass href = @@ -1461,12 +1470,20 @@ instance Lucid.ToHtml StatsPage where instance Lucid.ToHtml RecentActivityPartial where toHtmlRaw = Lucid.toHtml - toHtml (RecentActivityPartial recentTasks) = + toHtml (RecentActivityPartial recentTasks nextOffset hasMore) = if null recentTasks then Lucid.p_ [Lucid.class_ "empty-msg"] "No recent tasks." - else + else do Lucid.div_ [Lucid.class_ "list-group"] <| traverse_ renderListGroupItem recentTasks + when hasMore + <| Lucid.button_ + [ Lucid.class_ "btn btn-secondary load-more-btn", + Lucid.makeAttribute "hx-get" ("/partials/recent-activity?offset=" <> tshow nextOffset), + Lucid.makeAttribute "hx-target" "closest .recent-activity", + Lucid.makeAttribute "hx-swap" "beforeend" + ] + "Load More" instance Lucid.ToHtml ReadyCountPartial where toHtmlRaw = Lucid.toHtml @@ -1706,8 +1723,10 @@ server = stats <- liftIO <| TaskCore.getTaskStats Nothing readyTasks <- liftIO TaskCore.getReadyTasks allTasks <- liftIO TaskCore.loadTasks - let recentTasks = take 5 <| List.sortBy (flip compare `on` TaskCore.taskUpdatedAt) allTasks - pure (HomePage stats readyTasks recentTasks) + let sortedTasks = List.sortBy (flip compare `on` TaskCore.taskUpdatedAt) allTasks + recentTasks = take 5 sortedTasks + hasMoreRecent = length allTasks > 5 + pure (HomePage stats readyTasks recentTasks hasMoreRecent) readyQueueHandler :: Servant.Handler ReadyQueuePage readyQueueHandler = do @@ -1898,11 +1917,16 @@ server = TaskCore.updateTaskStatus tid TaskCore.Open [] pure <| addHeader ("/tasks/" <> tid) NoContent - recentActivityHandler :: Servant.Handler RecentActivityPartial - recentActivityHandler = do + recentActivityHandler :: Maybe Int -> Servant.Handler RecentActivityPartial + recentActivityHandler maybeOffset = do allTasks <- liftIO TaskCore.loadTasks - let recentTasks = take 5 <| List.sortBy (flip compare `on` TaskCore.taskUpdatedAt) allTasks - pure (RecentActivityPartial recentTasks) + let offset = fromMaybe 0 maybeOffset + pageSize = 5 + sortedTasks = List.sortBy (flip compare `on` TaskCore.taskUpdatedAt) allTasks + pageTasks = take pageSize <| drop offset sortedTasks + hasMore = length sortedTasks > offset + pageSize + nextOffset = offset + pageSize + pure (RecentActivityPartial pageTasks nextOffset hasMore) readyCountHandler :: Servant.Handler ReadyCountPartial readyCountHandler = do |
