@@ -49,6 +49,8 @@ import qualified Data.Vector as V
4949import qualified Data.Version as Ver
5050import GHC.Generics (Rep )
5151import qualified GHCJS.DOM.Types as DOM
52+ import qualified GHCJS.DOM.Window as Window
53+ import qualified GHCJS.DOM as DOM
5254import Language.Javascript.JSaddle (jsNull )
5355import Network.URI
5456-- import Reflex.Dom
@@ -63,6 +65,7 @@ import Reflex.Time
6365import Reflex.Class
6466import Servant.API
6567import Servant.Reflex
68+ import qualified Text.Read as R
6669
6770import API
6871import PkgId
@@ -107,15 +110,13 @@ utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double)
107110
108111bodyElement4 :: 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 ()
109112bodyElement4 = do
110- -- dynLoc <- browserHistoryWith getLocationUri
111- -- let dynFrag = decodeFrag . T.pack . uriFragment <$> dynLoc
112113 _ <- runRouteViewT app
114+
115+ -- (result, changeStateE) <- runSetRouteT $ app RouteHome
113116 pure ()
114- -- ticker1 <- tickLossy 1 =<< liftIO getCurrentTime
115- -- ticker1cnt <- count ticker1
116117
117118app :: 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+ => FragRoute -- Dynamic t FragRoute
119120 -> m ()
120121app dynFrag = do
121122 -- top-level PB event
@@ -156,8 +157,8 @@ app dynFrag = do
156157 _ <- searchBoxWidget dynPackages0
157158 el " hr" blank
158159
159- _ <- dyn $ dynFrag >>= \ case
160- RouteHome -> pure $ do
160+ _ <- case dynFrag of -- dyn $ dynFrag >>= \case
161+ RouteHome -> do
161162 elAttr " div" ((" id" =: " page-home" ) <> (" class" =: " page" )) $ do
162163 divClass " leftcol" $ do
163164 elAttr " h2" (" class" =: " main-header" ) $ text " Welcome"
@@ -205,7 +206,7 @@ app dynFrag = do
205206 text " Cookbook for common build failures"
206207 pure ()
207208
208- RouteQueue -> pure $ do
209+ RouteQueue -> do
209210 evPB <- getPostBuild
210211
211212 let dynUnixTime = utc2unix <$> dynUTCTime
@@ -320,7 +321,7 @@ app dynFrag = do
320321 pure ()
321322 pure ()
322323
323- RoutePackages -> pure $ do
324+ RoutePackages -> do
324325 el " h1" $ text " Packages"
325326 evPB <- getPostBuild
326327 evTags<- getTags (constDyn $ QParamSome False ) evPB
@@ -330,23 +331,24 @@ app dynFrag = do
330331 let dynPkgTags = pkgTagList <$> dynTagPkgs
331332 packagesPageWidget dynPackages0 dynTags dynPkgTags
332333
333- RoutePackage (pn, idxSt) -> pure $ do
334-
334+ RoutePackage (PkgN pkgUri) -> do
335+ let pn = PkgN $ T. takeWhile (/= ' @' ) pkgUri
336+ (intIdx :: Maybe Int ) = R. readMaybe (T. unpack (T. takeWhileEnd (/= ' @' ) pkgUri))
337+ idxSt = PkgIdxTs $ fromMaybe 0 intIdx
335338 el " h2" $ text (pkgNToText pn)
336339 el " p" $ el " em" $ elAttr " a" (" href" =: (" https://hackage.haskell.org/package/" <> pkgNToText pn)) $
337340 do text " (view on Hackage)"
338341
339342 evPB <- getPostBuild
340343 let
341- dynIdxStLast' = fmap (\ x -> M. fromMaybe x idxSt) dynIdxStLast
342344 -- single-shot requests
343345 evReports <- getPackageReports (constDyn $ Right pn) evPB
344346 dynReports <- holdDyn mempty evReports
345347
346348 evInfo <- getInfo evPB
347349 dynInfo <- holdDyn (ControllerInfo mempty ) evInfo
348350
349- evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast' $> () , evPB])
351+ evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast $> () , evPB])
350352 dynHist <- holdDyn mempty evHist
351353
352354 evPkgTags <- getPackageTags (constDyn $ Right pn) evPB
@@ -364,29 +366,25 @@ app dynFrag = do
364366 text " for latest index-state "
365367 dynText (pkgIdxTsToText <$> dynIdxStLast)
366368
367- putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast') (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
368-
369-
370- let xs = Map. fromList . fmap (\ x -> (x, pkgIdxTsToText x)) . Set. toList <$> dynReports
371- x0 = (\ s -> if Set. null s then PkgIdxTs 0
372- else (findInitialDropDown idxSt s)) <$> dynReports
373-
374-
375- let ddCfg = DropdownConfig (updated x0) (constDyn mempty )
369+ putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
376370
377371 let inputAttr = (" class" =: " tag-name" ) <> (" placeholder" =: " insert tag" )
378372 iCfg = TextInputConfig " tag-name" " " never (constDyn inputAttr)
373+ let xs = Map. fromList . fmap (\ x -> (x, pkgIdxTsToText x)) . Set. toList <$> dynReports
379374
380- ddReports <- el " p" $ do
375+ ddReports <- el " p" $ mdo
376+ let maxId = findInitialDropDown idxSt <$> dynReports
377+ ddCfg = (def :: DropdownConfig t PkgIdxTs )
378+ & dropdownConfig_setValue .~ (updated maxId)
379+ initId <- sample $ current maxId
381380 evQButton <- button " Queue a build"
382381 text " for the index-state "
383- uniqReport <- holdUniqDyn dynReports
384- tmp <- routePkgIdxTs pn ( PkgIdxTs 0 ) uniqReport xs ddCfg
382+ dd <- dropdown initId xs ddCfg
383+ routePkgIdxTs pn dynReports (dd ^. dropdown_value)
385384 text " shown below"
385+ _ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value dd) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
386386
387- _ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value tmp) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
388-
389- pure tmp
387+ pure dd
390388
391389 elClass " p" " tagging" $ mdo
392390 let evMapTags = Map. fromList . (fmap (\ t -> (t,t))) . (fmap tagNToText) . V. toList <$> evPkgTags
@@ -434,7 +432,7 @@ app dynFrag = do
434432
435433 pure ()
436434
437- RouteUser u -> pure $ do
435+ RouteUser u -> do
438436 el " h1" (text u)
439437
440438 evPB <- getPostBuild
@@ -447,7 +445,7 @@ app dynFrag = do
447445
448446 pure ()
449447
450- RouteUnknown frag -> pure $ do
448+ RouteUnknown frag -> do
451449 el " p" $ text (" No handler found for " <> T. pack (show frag))
452450 pure ()
453451
@@ -473,7 +471,7 @@ app dynFrag = do
473471 pure $ (TagN tId) <$ delResult
474472
475473-- | Renders alpha-tabbed package index
476- packagesPageWidget :: forall t m . (MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
474+ packagesPageWidget :: forall t m . (SetRoute t FragRoute m , MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
477475 => Dynamic t (Vector PkgN )
478476 -> Dynamic t (Vector TagN )
479477 -> Dynamic t (Map. Map PkgN [TagN ])
@@ -517,7 +515,7 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
517515 pure $ do
518516
519517 el " ol" $ forM_ v' $ \ (pn) -> do
520- el " li" $ elAttr " a " (" href " =: ( " #/package/" <> (pkgNToText pn) )) $ do
518+ el " li" $ routeLink False (" #/package/" <> (pkgNToText pn)) $ do
521519 text ((pkgNToText pn) <> " : " )
522520 case Map. lookup pn dpt of
523521 Just tags -> forM tags $ \ (tag0) -> elAttr " a" ((" class" =: " tag-item" ) <> (" data-tag-name" =: (tagNToText tag0))) $ text (tagNToText tag0)
@@ -532,7 +530,7 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
532530 V. filter (tagContained st dpt) pkg
533531
534532
535- reportTableWidget :: forall t m . (MonadHold t m , PostBuild t m , DomBuilder t m , Reflex t )
533+ reportTableWidget :: forall t m . (SetRoute t FragRoute m , MonadHold t m , PostBuild t m , DomBuilder t m , Reflex t )
536534 => Dynamic t PkgIdxTsReport
537535 -> Dynamic t (Vector QEntryRow )
538536 -> Dynamic t (Vector WorkerRow )
@@ -604,7 +602,7 @@ reportTableWidget dynRepSum dynQRows dynWorkers dynHist dynInfo = joinE =<< go
604602
605603 elAttr " th" (" style" =: " text-align:left;" ) (text (verToText pv))
606604 el " td" $ text (pkgIdxTsToText t)
607- el " td" $ elAttr " a " (" href " =: ( " #/user/" <> u) ) (text u)
605+ el " td" $ routeLink False (" #/user/" <> u) (text u)
608606
609607 pure (leftmost evsRow1)
610608 pure (leftmost evsRows) -- main "return" value
@@ -702,11 +700,14 @@ applyLR (L:xs) (l:ls) rs = l : applyLR xs ls rs
702700applyLR (R : xs) ls (r: rs) = r : applyLR xs ls rs
703701applyLR _ _ _ = error " applyLR"
704702
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
703+ findInitialDropDown :: PkgIdxTs -> Set PkgIdxTs -> PkgIdxTs
704+ findInitialDropDown p s
705+ | True <- Set. null s
706+ = PkgIdxTs 0
707+ | otherwise = if Set. member p s then p else Set. findMax s
708+ {- if Set.null s
709+ then PkgIdxTs 0
710+ else Set.findMax s-}
710711
711712toggleTagSet :: TagN -> Set. Set TagN -> Set. Set TagN
712713toggleTagSet tn st = if Set. member tn st then Set. delete tn st else Set. insert tn st
@@ -779,7 +780,7 @@ calcMatches pkgs sJss
779780 textS = JSS. textFromJSString sJss
780781 (exactMap,othersMap) = F. foldMap (calcMatch sJss) pkgs
781782
782- searchBoxWidget :: 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 )
783+ searchBoxWidget :: 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 )
783784 => Dynamic t (Vector PkgN )
784785 -> m ()
785786searchBoxWidget dynPkgs0 = mdo
@@ -795,16 +796,17 @@ searchBoxWidget dynPkgs0 = mdo
795796 clickPkgE <- searchResultWidget matchesDyn
796797 pure ()
797798
798- searchResultWidget :: forall t m . (MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
799+ searchResultWidget :: forall t m . (SetRoute t FragRoute m , MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
799800 => Dynamic t Matches
800801 -> m (Event t Text )
801802searchResultWidget mDyn =
802803 el " ul" $ do
803804 exactE <- listViewWithKey (matchesExact <$> mDyn) $ \ eId _ -> do
804- (e, _) <- element " li" def $ elAttr " a" (" href" =: (" #/package/" <> eId)) $ el " strong" $ text eId
805+ (e, _) <- element " li" def $
806+ routeLink False (" #/package/" <> eId) $ el " strong" $ text eId
805807 pure $ domEvent Click e
806808 otherE <- listViewWithKey (matchesInfix <$> mDyn) $ \ pId txt -> do
807- (e, _) <- element " li" def $ elAttr " a " (" href " =: ( " #/package/" <> pId) ) $ do
809+ (e, _) <- element " li" def $ routeLink False (" #/package/" <> pId) $ do
808810 dynText . fmap (^. _1) $ txt
809811 el " strong" $ dynText . fmap (^. _2) $ txt
810812 dynText . fmap (^. _3) $ txt
0 commit comments