11-- | Top-level routes and views
22module Vira.Web.Pages.IndexPage where
33
4+ import Data.Default (def )
45import Lucid
5- import Servant.API (Get , NamedRoutes , (:>) )
6+ import Servant.API (Get , NamedRoutes , QueryParam , (:>) )
67import Servant.API.ContentTypes.Lucid (HTML )
78import Servant.API.Generic (GenericMode (type (:-) ))
89import Servant.Links (fieldLink , linkURI )
910import Servant.Server.Generic (AsServer )
1011import Vira.App qualified as App
1112import Vira.State.Acid qualified as St
12- import Vira.State.Type qualified as St
13- import Vira.Web.Lucid (AppHtml , runAppHtml )
13+ import Vira.State.Type (BranchQuery (.. ))
14+ import Vira.Web.LinkTo.Type (LinkTo (.. ))
15+ import Vira.Web.Lucid (AppHtml , getLinkUrl , runAppHtml )
1416import Vira.Web.Pages.CachePage qualified as CachePage
1517import Vira.Web.Pages.EnvironmentPage qualified as EnvironmentPage
1618import Vira.Web.Pages.EventsPage qualified as EventsPage
@@ -21,11 +23,12 @@ import Vira.Web.Stack qualified as Web
2123import Vira.Web.Stream.ScopedRefresh qualified as Refresh
2224import Vira.Web.Widgets.JobsListing qualified as W
2325import Vira.Web.Widgets.Layout qualified as W
26+ import Vira.Web.Widgets.Tabs (TabItem (.. ), viraTabs_ )
2427import Web.TablerIcons.Outline qualified as Icon
2528import Prelude hiding (Reader , ask , runReader )
2629
2730data Routes mode = Routes
28- { _home :: mode :- Get '[HTML ] (Html () )
31+ { _home :: mode :- QueryParam " neverBuilt " Bool :> Get '[HTML ] (Html () )
2932 , _repos :: mode :- " r" Servant.API. :> NamedRoutes RegistryPage. Routes
3033 , _jobs :: mode :- " j" Servant.API. :> NamedRoutes JobPage. Routes
3134 , _environment :: mode :- " env" Servant.API. :> NamedRoutes EnvironmentPage. Routes
@@ -40,8 +43,9 @@ handlers :: App.GlobalSettings -> App.ViraRuntimeState -> App.WebSettings -> Rou
4043handlers globalSettings viraRuntimeState webSettings =
4144 Routes
4245 { _home =
43- Web. runAppInServant globalSettings viraRuntimeState webSettings $
44- runAppHtml indexView
46+ Web. runAppInServant globalSettings viraRuntimeState webSettings
47+ . runAppHtml
48+ . indexView
4549 , _repos = RegistryPage. handlers globalSettings viraRuntimeState webSettings
4650 , _jobs = JobPage. handlers globalSettings viraRuntimeState webSettings
4751 , _environment = EnvironmentPage. handlers globalSettings viraRuntimeState webSettings
@@ -54,24 +58,43 @@ handlers globalSettings viraRuntimeState webSettings =
5458activityLimit :: Natural
5559activityLimit = 15
5660
57- indexView :: AppHtml ()
58- indexView = do
61+ indexView :: Maybe Bool -> AppHtml ()
62+ indexView mUnbuilt = do
5963 logoUrl <- W. appLogoUrl
60- activities <- lift $ App. query (St. GetAllBranchesA Nothing Nothing activityLimit)
6164 let linkText = show . linkURI
6265 reposLink = linkText $ fieldLink _repos // RegistryPage. _listing
6366 envLink = linkText $ fieldLink _environment // EnvironmentPage. _view
6467 cacheLink = linkText $ fieldLink _cache // CachePage. _view
6568 W. layout mempty $ do
6669 heroWelcome logoUrl reposLink envLink cacheLink
67- unless (null activities) $
68- viewRecentActivity activities
70+ viewRecentActivity mUnbuilt
71+
72+ viewRecentActivity :: Maybe Bool -> AppHtml ()
73+ viewRecentActivity mNeverBuilt = do
74+ -- Get filtered activities based on neverBuilt flag
75+ let query = def {neverBuilt = mNeverBuilt}
76+ activities <- lift $ App. query (St. QueryBranchDetailsA query activityLimit)
77+ -- Calculate unbuilt count for badge
78+ let unbuiltQuery = def {neverBuilt = Just True }
79+ unbuiltCount <- length <$> lift (App. query (St. QueryBranchDetailsA unbuiltQuery activityLimit))
6980
70- viewRecentActivity :: [St. BranchDetails ] -> AppHtml ()
71- viewRecentActivity activities = do
7281 W. viraSection_ [] $ do
73- h2_ [class_ " text-2xl font-bold text-gray-900 dark:text-gray-100 mb-6" ] " Recent Activity"
74- div_ [] $ do
82+ -- Header with title
83+ h2_ [class_ " text-2xl font-bold text-gray-900 dark:text-gray-100" ] " Recent Activity"
84+
85+ -- Tab bar
86+ allUrl <- lift $ getLinkUrl (Home Nothing )
87+ buildsUrl <- lift $ getLinkUrl (Home (Just False ))
88+ unbuiltUrl <- lift $ getLinkUrl (Home (Just True ))
89+ viraTabs_
90+ []
91+ [ TabItem " All" allUrl (isNothing mNeverBuilt) Nothing
92+ , TabItem " Builds" buildsUrl (mNeverBuilt == Just False ) Nothing
93+ , TabItem " Unbuilt" unbuiltUrl (mNeverBuilt == Just True ) (Just unbuiltCount)
94+ ]
95+
96+ -- Activity list
97+ div_ $ do
7598 forM_ activities $ \ details ->
7699 W. viraBranchDetailsRow_ True details
77100
0 commit comments