Skip to content

Commit 648a954

Browse files
author
Andika Demas Riyandi
committed
Possible fix on changing between dropdown value but still lack on back button
1 parent 678b801 commit 648a954

File tree

3 files changed

+137
-89
lines changed

3 files changed

+137
-89
lines changed

src-ui.v3/src/Main.hs

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import Reflex.Time
6565
import Reflex.Class
6666
import Servant.API
6767
import Servant.Reflex
68+
import qualified Text.Read as R
6869

6970
import API
7071
import PkgId
@@ -109,7 +110,7 @@ utc2unix x = ceiling (realToFrac (utcTimeToPOSIXSeconds x) :: Double)
109110

110111
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 ()
111112
bodyElement4 = do
112-
_ <- runRouteViewT app
113+
_ <- runRouteViewT' app
113114

114115
--(result, changeStateE) <- runSetRouteT $ app RouteHome
115116
pure ()
@@ -330,23 +331,24 @@ app dynFrag = do
330331
let dynPkgTags = pkgTagList <$> dynTagPkgs
331332
packagesPageWidget dynPackages0 dynTags dynPkgTags
332333

333-
RoutePackage (pn, idxSt) -> 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,28 +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-
tmp <- routePkgIdxTs pn (PkgIdxTs 0) dynReports xs ddCfg
382+
dd <- dropdown initId xs ddCfg
383+
routePkgIdxTs pn dynReports (dd ^. dropdown_value)
384384
text " shown below"
385+
_ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value dd) (constDyn $ Right (QEntryUpd (-1))) evQButton
385386

386-
_ <- putQueue (constDyn $ Right pn) (Right <$> _dropdown_value tmp) (constDyn $ Right (QEntryUpd (-1))) evQButton
387-
388-
pure tmp
387+
pure dd
389388

390389
elClass "p" "tagging" $ mdo
391390
let evMapTags = Map.fromList . (fmap (\t -> (t,t))) . (fmap tagNToText) . V.toList <$> evPkgTags
@@ -472,7 +471,7 @@ app dynFrag = do
472471
pure $ (TagN tId) <$ delResult
473472

474473
-- | Renders alpha-tabbed package index
475-
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)
476475
=> Dynamic t (Vector PkgN)
477476
-> Dynamic t (Vector TagN)
478477
-> Dynamic t (Map.Map PkgN [TagN])
@@ -516,7 +515,7 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
516515
pure $ do
517516

518517
el "ol" $ forM_ v' $ \(pn) -> do
519-
el "li" $ elAttr "a" ("href" =: ("#/package/" <> (pkgNToText pn))) $ do
518+
el "li" $ routeLink False ("#/package/" <> (pkgNToText pn)) $ do
520519
text ((pkgNToText pn) <> " : ")
521520
case Map.lookup pn dpt of
522521
Just tags -> forM tags $ \(tag0) -> elAttr "a" (("class" =: "tag-item") <> ("data-tag-name" =: (tagNToText tag0))) $ text (tagNToText tag0)
@@ -531,7 +530,7 @@ packagesPageWidget dynPackages dynTags dynPkgTags = do
531530
V.filter (tagContained st dpt) pkg
532531

533532

534-
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)
535534
=> Dynamic t PkgIdxTsReport
536535
-> Dynamic t (Vector QEntryRow)
537536
-> Dynamic t (Vector WorkerRow)
@@ -603,7 +602,7 @@ reportTableWidget dynRepSum dynQRows dynWorkers dynHist dynInfo = joinE =<< go
603602

604603
elAttr "th" ("style" =: "text-align:left;") (text (verToText pv))
605604
el "td" $ text (pkgIdxTsToText t)
606-
el "td" $ elAttr "a" ("href" =: ("#/user/" <> u)) (text u)
605+
el "td" $ routeLink False ("#/user/" <> u) (text u)
607606

608607
pure (leftmost evsRow1)
609608
pure (leftmost evsRows) -- main "return" value
@@ -701,11 +700,14 @@ applyLR (L:xs) (l:ls) rs = l : applyLR xs ls rs
701700
applyLR (R:xs) ls (r:rs) = r : applyLR xs ls rs
702701
applyLR _ _ _ = error "applyLR"
703702

704-
findInitialDropDown :: Maybe PkgIdxTs -> Set PkgIdxTs -> PkgIdxTs
705-
findInitialDropDown (Just idx) pkgSet = if Set.member idx pkgSet
706-
then Set.foldr (\a b -> if a == b then a else b) idx pkgSet
707-
else Set.findMax pkgSet
708-
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-}
709711

710712
toggleTagSet :: TagN -> Set.Set TagN -> Set.Set TagN
711713
toggleTagSet tn st = if Set.member tn st then Set.delete tn st else Set.insert tn st
@@ -778,7 +780,7 @@ calcMatches pkgs sJss
778780
textS = JSS.textFromJSString sJss
779781
(exactMap,othersMap) = F.foldMap (calcMatch sJss) pkgs
780782

781-
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)
782784
=> Dynamic t (Vector PkgN)
783785
-> m ()
784786
searchBoxWidget dynPkgs0 = mdo
@@ -794,16 +796,17 @@ searchBoxWidget dynPkgs0 = mdo
794796
clickPkgE <- searchResultWidget matchesDyn
795797
pure ()
796798

797-
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)
798800
=> Dynamic t Matches
799801
-> m (Event t Text)
800802
searchResultWidget mDyn =
801803
el "ul" $ do
802804
exactE <- listViewWithKey (matchesExact <$> mDyn) $ \eId _ -> do
803-
(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
804807
pure $ domEvent Click e
805808
otherE <- listViewWithKey (matchesInfix <$> mDyn) $ \pId txt -> do
806-
(e, _) <- element "li" def $ elAttr "a" ("href" =: ("#/package/" <> pId)) $ do
809+
(e, _) <- element "li" def $ routeLink False ("#/package/" <> pId) $ do
807810
dynText . fmap (^. _1) $ txt
808811
el "strong" $ dynText . fmap (^. _2) $ txt
809812
dynText . fmap (^. _3) $ txt

src-ui.v3/src/PkgId.hs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import qualified Data.Version as Ver
5050
import Servant.API (FromHttpApiData (..),
5151
ToHttpApiData (..))
5252
import Text.ParserCombinators.ReadP (readP_to_S)
53-
import qualified Text.Read as R
5453

5554
type UserName = Text
5655
type PkgRev = Word
@@ -66,22 +65,21 @@ instance Show PkgN where
6665
| otherwise = (("PkgN "<>show x) <>)
6766

6867
-- NB: this assumes the Hackage ascii-only policy
69-
pkgNFromText :: Text -> (Maybe PkgN, Maybe PkgIdxTs)
68+
pkgNFromText :: Text -> Maybe PkgN--(Maybe PkgN, Maybe PkgIdxTs)
7069
pkgNFromText t0
71-
| Just (p0,ts0) <- parsingUrlText t0
72-
, Just intTs <- R.readMaybe (T.unpack ts0) :: Maybe Int
73-
, isValid p0 = (Just (PkgN p0), Just (PkgIdxTs intTs))--R.readMaybe (T.unpack ts0) :: Maybe PkgIdxTs)
74-
| otherwise = (Just (PkgN t0), Nothing)
70+
| isValid t0 = Just (PkgN t0) --True <- T.any (=='@') t0 --Just (p0,ts0) <- parsingUrlText t0
71+
--, isValid t0 = Just (PkgN t0) --, Just (PkgIdxTs intTs))--R.readMaybe (T.unpack ts0) :: Maybe PkgIdxTs)
72+
| otherwise = Nothing
7573
where
7674
isValid t
7775
| T.null t = False
78-
| not (T.all (\c -> C.isAsciiLower c || C.isAsciiUpper c || C.isDigit c || c == '-') t) = False
76+
| not (T.any (=='@') t0 || (T.all (\c -> C.isAsciiLower c || C.isAsciiUpper c || C.isDigit c || c == '-') t)) = False
7977
| otherwise = and [ T.any C.isAlpha x | x <- T.split (=='-') t ]
8078

81-
parsingUrlText :: Text -> Maybe (Text, Text)
79+
{-parsingUrlText :: Text -> Maybe (Text, Text)
8280
parsingUrlText t0 = case T.any (=='@') t0 of
8381
True -> Just (T.takeWhile (/='@') t0, T.takeWhileEnd (/='@') t0)
84-
False -> Just (t0, T.empty)
82+
False -> Just (t0, T.empty)-}
8583
-- | Just prefix <- T.stripSuffix "@" t0
8684
-- , Just suffix <- T.stripPrefix "@" t0 = Just (prefix,suffix)
8785
-- | otherwise = Just (t0,T.empty)
@@ -122,7 +120,7 @@ instance FromHttpApiData CompilerID where
122120
----------------------------------------------------------------------------
123121

124122
newtype PkgIdxTs = PkgIdxTs Int
125-
deriving (Show,Ord,Eq,FromJSON,ToJSON,FromHttpApiData,ToHttpApiData,Read)
123+
deriving (Show,Ord,Eq,FromJSON,ToJSON,FromHttpApiData,ToHttpApiData)
126124

127125
pkgIdxTsToText :: PkgIdxTs -> Text
128126
pkgIdxTsToText (PkgIdxTs t) = T.pack $ formatTime defaultTimeLocale "%Y-%m-%dT%TZ" (posixSecondsToUTCTime (fromIntegral t :: POSIXTime))

0 commit comments

Comments
 (0)