@@ -31,8 +31,11 @@ import qualified Data.List as List
3131import qualified Data.Map.Strict as Map
3232import qualified Data.Maybe as M
3333import Data.Monoid (Endo (Endo ), appEndo )
34+ import qualified Data.List.NonEmpty as NE
35+ import Data.List.NonEmpty (NonEmpty )
3436import Data.Proxy
3537import qualified Data.Set as Set
38+ import Data.Set (Set )
3639import qualified Data.Text as T
3740import Data.Text (Text )
3841import Data.Time (UTCTime )
@@ -45,6 +48,8 @@ import Data.Vector (Vector)
4548import qualified Data.Vector as V
4649import qualified Data.Version as Ver
4750import GHC.Generics (Rep )
51+ import qualified GHCJS.DOM.Types as DOM
52+ import Language.Javascript.JSaddle (jsNull )
4853import Network.URI
4954-- import Reflex.Dom
5055import Reflex.Dom.Core
@@ -61,6 +66,7 @@ import Servant.Reflex
6166
6267import API
6368import PkgId
69+ import Router
6470
6571
6672main :: IO ()
@@ -100,13 +106,18 @@ utc2unix :: UTCTime -> Int
100106utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double )
101107
102108bodyElement4 :: forall t m . (SupportsServantReflex t m , MonadFix m , MonadIO m , MonadHold t m , PostBuild t m , DomBuilder t m , Adjustable t m , DomBuilderSpace m ~ GhcjsDomSpace ) => m ()
103- bodyElement4 = mdo
104- dynLoc <- browserHistoryWith getLocationUri
105- let dynFrag = decodeFrag . T. pack . uriFragment <$> dynLoc
106-
109+ bodyElement4 = do
110+ -- dynLoc <- browserHistoryWith getLocationUri
111+ -- let dynFrag = decodeFrag . T.pack . uriFragment <$> dynLoc
112+ _ <- runRouteViewT app
113+ pure ()
107114 -- ticker1 <- tickLossy 1 =<< liftIO getCurrentTime
108115-- ticker1cnt <- count ticker1
109116
117+ app :: forall t m . (SetRoute t FragRoute m , SupportsServantReflex t m , MonadFix m , MonadIO m , MonadHold t m , PostBuild t m , DomBuilder t m , Adjustable t m , DomBuilderSpace m ~ GhcjsDomSpace )
118+ => Dynamic t FragRoute
119+ -> m ()
120+ app dynFrag = do
110121 -- top-level PB event
111122 evPB0 <- getPostBuild
112123
@@ -129,11 +140,11 @@ bodyElement4 = mdo
129140 -- pseudo navbar
130141 el " nav" $ do
131142 text " [ "
132- elAttr " a " ( " href " =: " #/" ) $ text " HOME"
143+ routeLink False " #/" ( text " HOME" )
133144 text " | "
134- elAttr " a " ( " href " =: " #/queue" ) $ text " Build Queue"
145+ routeLink False " #/queue" ( text " Build Queue" )
135146 text " | "
136- elAttr " a " ( " href " =: " #/packages" ) $ text " Packages"
147+ routeLink False " #/packages" ( text " Packages" )
137148 text " ]"
138149 text " (current index-state: "
139150 dynText (pkgIdxTsToText <$> dynIdxStLast)
@@ -319,21 +330,23 @@ bodyElement4 = mdo
319330 let dynPkgTags = pkgTagList <$> dynTagPkgs
320331 packagesPageWidget dynPackages0 dynTags dynPkgTags
321332
322- RoutePackage pn -> pure $ do
333+ RoutePackage (pn, idxSt) -> pure $ do
334+
323335 el " h2" $ text (pkgNToText pn)
324336 el " p" $ el " em" $ elAttr " a" (" href" =: (" https://hackage.haskell.org/package/" <> pkgNToText pn)) $
325337 do text " (view on Hackage)"
326338
327339 evPB <- getPostBuild
328-
340+ let
341+ dynIdxStLast' = fmap (\ x -> M. fromMaybe x idxSt) dynIdxStLast
329342 -- single-shot requests
330343 evReports <- getPackageReports (constDyn $ Right pn) evPB
331344 dynReports <- holdDyn mempty evReports
332345
333346 evInfo <- getInfo evPB
334347 dynInfo <- holdDyn (ControllerInfo mempty ) evInfo
335348
336- evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast $> () , evPB])
349+ evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast' $> () , evPB])
337350 dynHist <- holdDyn mempty evHist
338351
339352 evPkgTags <- getPackageTags (constDyn $ Right pn) evPB
@@ -351,11 +364,13 @@ bodyElement4 = mdo
351364 text " for latest index-state "
352365 dynText (pkgIdxTsToText <$> dynIdxStLast)
353366
354- putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
367+ putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast' ) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
355368
356369
357370 let xs = Map. fromList . fmap (\ x -> (x, pkgIdxTsToText x)) . Set. toList <$> dynReports
358- x0 = (\ s -> if Set. null s then PkgIdxTs 0 else Set. findMax s) <$> dynReports
371+ x0 = (\ s -> if Set. null s then PkgIdxTs 0
372+ else (findInitialDropDown idxSt s)) <$> dynReports
373+
359374
360375 let ddCfg = DropdownConfig (updated x0) (constDyn mempty )
361376
@@ -365,7 +380,8 @@ bodyElement4 = mdo
365380 ddReports <- el " p" $ do
366381 evQButton <- button " Queue a build"
367382 text " for the index-state "
368- tmp <- dropdown (PkgIdxTs 0 ) xs ddCfg
383+ uniqReport <- holdUniqDyn dynReports
384+ tmp <- routePkgIdxTs pn (PkgIdxTs 0 ) uniqReport xs ddCfg
369385 text " shown below"
370386
371387 _ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value tmp) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
@@ -396,12 +412,14 @@ bodyElement4 = mdo
396412 pure $ tagPromptlyDyn tVal addResult
397413 pure ()
398414
399- let evReports' = updated (_dropdown_value ddReports)
400- dynIdxSt = ddReports ^. dropdown_value
401-
415+ let dynIdxSt = ddReports ^. dropdown_value
416+ evReports' = updated (_dropdown_value ddReports)
417+ -- evIdxChange = updated dynIdxSt --ddReports ^. dropdown_change
418+
419+ -- display $ holdDyn (PkgIdxTs 0) evIdxChange
402420 evRepSum <- getPackageReportSummary (constDyn $ Right pn) (Right <$> dynIdxSt) (leftmost [evReports' $> () , ticker4 $> () ])
403421 dynRepSum <- holdUniqDyn =<< holdDyn (PkgIdxTsReport pn (PkgIdxTs 0 ) [] mempty ) evRepSum
404-
422+
405423 el " hr" blank
406424
407425 evCellClick <- reportTableWidget dynRepSum dynQRows dynWorkers dynHist dynInfo
@@ -454,35 +472,6 @@ bodyElement4 = mdo
454472 delResult <- deleteTags (constDyn $ Right (TagN tId)) (constDyn $ Right pn) rmTag
455473 pure $ (TagN tId) <$ delResult
456474
457- data FragRoute = RouteHome
458- | RouteQueue
459- | RoutePackages
460- | RoutePackage PkgN
461- | RouteUser UserName
462- | RouteUnknown T. Text
463- deriving (Eq )
464-
465- decodeFrag :: T. Text -> FragRoute
466- decodeFrag frag = case frag of
467- " " -> RouteHome
468- " #" -> RouteHome
469- " #/" -> RouteHome
470- " #/queue" -> RouteQueue
471- " #/packages" -> RoutePackages
472-
473- _ | Just sfx <- T. stripPrefix " #/package/" frag
474- , not (T. null frag)
475- , Just pn <- pkgNFromText sfx
476- -> RoutePackage pn
477-
478- | Just sfx <- T. stripPrefix " #/user/" frag
479- , not (T. null frag)
480- , T. all (\ c -> C. isAsciiLower c || C. isAsciiUpper c || C. isDigit c || c == ' _' ) sfx
481- -> RouteUser sfx
482-
483- | otherwise -> RouteUnknown frag
484-
485-
486475-- | Renders alpha-tabbed package index
487476packagesPageWidget :: forall t m . (MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
488477 => Dynamic t (Vector PkgN )
@@ -533,7 +522,6 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
533522 case Map. lookup pn dpt of
534523 Just tags -> forM tags $ \ (tag0) -> elAttr " a" ((" class" =: " tag-item" ) <> (" data-tag-name" =: (tagNToText tag0))) $ text (tagNToText tag0)
535524 Nothing -> pure ([] )
536-
537525 pure ()
538526 where
539527 evalPkgFilter ' *' = V. takeWhile (\ (PkgN t) -> T. head t < ' A' )
@@ -714,6 +702,12 @@ applyLR (L:xs) (l:ls) rs = l : applyLR xs ls rs
714702applyLR (R : xs) ls (r: rs) = r : applyLR xs ls rs
715703applyLR _ _ _ = error " applyLR"
716704
705+ findInitialDropDown :: Maybe PkgIdxTs -> Set PkgIdxTs -> PkgIdxTs
706+ findInitialDropDown (Just idx) pkgSet = if Set. member idx pkgSet
707+ then Set. foldr (\ a b -> if a == b then a else b) idx pkgSet
708+ else Set. findMax pkgSet
709+ findInitialDropDown Nothing pkgSet = Set. findMax pkgSet
710+
717711toggleTagSet :: TagN -> Set. Set TagN -> Set. Set TagN
718712toggleTagSet tn st = if Set. member tn st then Set. delete tn st else Set. insert tn st
719713
0 commit comments