@@ -31,8 +31,11 @@ import qualified Data.List as List
31
31
import qualified Data.Map.Strict as Map
32
32
import qualified Data.Maybe as M
33
33
import Data.Monoid (Endo (Endo ), appEndo )
34
+ import qualified Data.List.NonEmpty as NE
35
+ import Data.List.NonEmpty (NonEmpty )
34
36
import Data.Proxy
35
37
import qualified Data.Set as Set
38
+ import Data.Set (Set )
36
39
import qualified Data.Text as T
37
40
import Data.Text (Text )
38
41
import Data.Time (UTCTime )
@@ -45,6 +48,8 @@ import Data.Vector (Vector)
45
48
import qualified Data.Vector as V
46
49
import qualified Data.Version as Ver
47
50
import GHC.Generics (Rep )
51
+ import qualified GHCJS.DOM.Types as DOM
52
+ import Language.Javascript.JSaddle (jsNull )
48
53
import Network.URI
49
54
-- import Reflex.Dom
50
55
import Reflex.Dom.Core
@@ -61,6 +66,7 @@ import Servant.Reflex
61
66
62
67
import API
63
68
import PkgId
69
+ import Router
64
70
65
71
66
72
main :: IO ()
@@ -100,13 +106,18 @@ utc2unix :: UTCTime -> Int
100
106
utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double )
101
107
102
108
bodyElement4 :: 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 ()
107
114
-- ticker1 <- tickLossy 1 =<< liftIO getCurrentTime
108
115
-- ticker1cnt <- count ticker1
109
116
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
110
121
-- top-level PB event
111
122
evPB0 <- getPostBuild
112
123
@@ -129,11 +140,11 @@ bodyElement4 = mdo
129
140
-- pseudo navbar
130
141
el " nav" $ do
131
142
text " [ "
132
- elAttr " a " ( " href " =: " #/" ) $ text " HOME"
143
+ routeLink False " #/" ( text " HOME" )
133
144
text " | "
134
- elAttr " a " ( " href " =: " #/queue" ) $ text " Build Queue"
145
+ routeLink False " #/queue" ( text " Build Queue" )
135
146
text " | "
136
- elAttr " a " ( " href " =: " #/packages" ) $ text " Packages"
147
+ routeLink False " #/packages" ( text " Packages" )
137
148
text " ]"
138
149
text " (current index-state: "
139
150
dynText (pkgIdxTsToText <$> dynIdxStLast)
@@ -319,21 +330,23 @@ bodyElement4 = mdo
319
330
let dynPkgTags = pkgTagList <$> dynTagPkgs
320
331
packagesPageWidget dynPackages0 dynTags dynPkgTags
321
332
322
- RoutePackage pn -> pure $ do
333
+ RoutePackage (pn, idxSt) -> pure $ do
334
+
323
335
el " h2" $ text (pkgNToText pn)
324
336
el " p" $ el " em" $ elAttr " a" (" href" =: (" https://hackage.haskell.org/package/" <> pkgNToText pn)) $
325
337
do text " (view on Hackage)"
326
338
327
339
evPB <- getPostBuild
328
-
340
+ let
341
+ dynIdxStLast' = fmap (\ x -> M. fromMaybe x idxSt) dynIdxStLast
329
342
-- single-shot requests
330
343
evReports <- getPackageReports (constDyn $ Right pn) evPB
331
344
dynReports <- holdDyn mempty evReports
332
345
333
346
evInfo <- getInfo evPB
334
347
dynInfo <- holdDyn (ControllerInfo mempty ) evInfo
335
348
336
- evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast $> () , evPB])
349
+ evHist <- getPackageHistory (constDyn $ Right pn) (leftmost [updated dynIdxStLast' $> () , evPB])
337
350
dynHist <- holdDyn mempty evHist
338
351
339
352
evPkgTags <- getPackageTags (constDyn $ Right pn) evPB
@@ -351,11 +364,13 @@ bodyElement4 = mdo
351
364
text " for latest index-state "
352
365
dynText (pkgIdxTsToText <$> dynIdxStLast)
353
366
354
- putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
367
+ putQueue (constDyn $ Right pn) (Right <$> dynIdxStLast' ) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
355
368
356
369
357
370
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
+
359
374
360
375
let ddCfg = DropdownConfig (updated x0) (constDyn mempty )
361
376
@@ -365,7 +380,8 @@ bodyElement4 = mdo
365
380
ddReports <- el " p" $ do
366
381
evQButton <- button " Queue a build"
367
382
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
369
385
text " shown below"
370
386
371
387
_ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value tmp) (constDyn $ Right (QEntryUpd (- 1 ))) evQButton
@@ -396,12 +412,14 @@ bodyElement4 = mdo
396
412
pure $ tagPromptlyDyn tVal addResult
397
413
pure ()
398
414
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
402
420
evRepSum <- getPackageReportSummary (constDyn $ Right pn) (Right <$> dynIdxSt) (leftmost [evReports' $> () , ticker4 $> () ])
403
421
dynRepSum <- holdUniqDyn =<< holdDyn (PkgIdxTsReport pn (PkgIdxTs 0 ) [] mempty ) evRepSum
404
-
422
+
405
423
el " hr" blank
406
424
407
425
evCellClick <- reportTableWidget dynRepSum dynQRows dynWorkers dynHist dynInfo
@@ -454,35 +472,6 @@ bodyElement4 = mdo
454
472
delResult <- deleteTags (constDyn $ Right (TagN tId)) (constDyn $ Right pn) rmTag
455
473
pure $ (TagN tId) <$ delResult
456
474
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
-
486
475
-- | Renders alpha-tabbed package index
487
476
packagesPageWidget :: forall t m . (MonadFix m , MonadHold t m , PostBuild t m , DomBuilder t m )
488
477
=> Dynamic t (Vector PkgN )
@@ -533,7 +522,6 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
533
522
case Map. lookup pn dpt of
534
523
Just tags -> forM tags $ \ (tag0) -> elAttr " a" ((" class" =: " tag-item" ) <> (" data-tag-name" =: (tagNToText tag0))) $ text (tagNToText tag0)
535
524
Nothing -> pure ([] )
536
-
537
525
pure ()
538
526
where
539
527
evalPkgFilter ' *' = V. takeWhile (\ (PkgN t) -> T. head t < ' A' )
@@ -714,6 +702,12 @@ applyLR (L:xs) (l:ls) rs = l : applyLR xs ls rs
714
702
applyLR (R : xs) ls (r: rs) = r : applyLR xs ls rs
715
703
applyLR _ _ _ = error " applyLR"
716
704
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
+
717
711
toggleTagSet :: TagN -> Set. Set TagN -> Set. Set TagN
718
712
toggleTagSet tn st = if Set. member tn st then Set. delete tn st else Set. insert tn st
719
713
0 commit comments