mirror of https://github.com/voidlizard/hbs2
uri handling refactoring
This commit is contained in:
parent
e7838bcb3e
commit
2cf7b7f350
|
@ -22,10 +22,11 @@ import HBS2.Git.Web.Html.Root
|
||||||
|
|
||||||
import HBS2.Peer.CLI.Detect
|
import HBS2.Peer.CLI.Detect
|
||||||
|
|
||||||
import Lucid (renderTextT)
|
import Lucid (renderTextT,HtmlT(..),toHtml)
|
||||||
import Options.Applicative as O
|
import Options.Applicative as O
|
||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Text qualified as Text
|
import Data.Text qualified as Text
|
||||||
|
import Data.Text.Lazy qualified as LT
|
||||||
import Data.ByteString.Lazy qualified as LBS
|
import Data.ByteString.Lazy qualified as LBS
|
||||||
import Network.HTTP.Types.Status
|
import Network.HTTP.Types.Status
|
||||||
import Network.Wai.Middleware.Static hiding ((<|>))
|
import Network.Wai.Middleware.Static hiding ((<|>))
|
||||||
|
@ -170,6 +171,9 @@ data WebOptions =
|
||||||
orFall :: m r -> Maybe a -> ContT r m a
|
orFall :: m r -> Maybe a -> ContT r m a
|
||||||
orFall a mb = ContT $ maybe1 mb a
|
orFall a mb = ContT $ maybe1 mb a
|
||||||
|
|
||||||
|
renderHtml :: MonadIO m => HtmlT (ActionT m) a -> ActionT m ()
|
||||||
|
renderHtml m = renderTextT m >>= html
|
||||||
|
|
||||||
runDashboardWeb :: WebOptions -> ScottyT (DashBoardM IO) ()
|
runDashboardWeb :: WebOptions -> ScottyT (DashBoardM IO) ()
|
||||||
runDashboardWeb wo = do
|
runDashboardWeb wo = do
|
||||||
middleware logStdout
|
middleware logStdout
|
||||||
|
@ -182,13 +186,15 @@ runDashboardWeb wo = do
|
||||||
Just f -> do
|
Just f -> do
|
||||||
middleware $ staticPolicy (noDots >-> addBase f)
|
middleware $ staticPolicy (noDots >-> addBase f)
|
||||||
|
|
||||||
get "/" do
|
get (routePattern RepoListPage) do
|
||||||
html =<< lift (renderTextT dashboardRootPage)
|
renderHtml dashboardRootPage
|
||||||
|
|
||||||
|
get (routePattern (RepoPage "lww")) do
|
||||||
|
lww' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
|
|
||||||
get "/repo/:lww" do
|
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
|
||||||
flip runContT pure do
|
flip runContT pure do
|
||||||
lww <- lwws' & orFall (status status404)
|
|
||||||
|
lww <- lww' & orFall (status status404)
|
||||||
|
|
||||||
item <- lift (selectRepoList ( mempty
|
item <- lift (selectRepoList ( mempty
|
||||||
& set repoListByLww (Just lww)
|
& set repoListByLww (Just lww)
|
||||||
|
@ -197,9 +203,9 @@ runDashboardWeb wo = do
|
||||||
<&> listToMaybe
|
<&> listToMaybe
|
||||||
>>= orFall (status status404)
|
>>= orFall (status status404)
|
||||||
|
|
||||||
lift $ html =<< renderTextT (repoPage item)
|
lift $ renderHtml (repoPage item)
|
||||||
|
|
||||||
get "/repo/:lww/manifest" do
|
get (routePattern (RepoManifest "lww")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
flip runContT pure do
|
flip runContT pure do
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
|
@ -214,22 +220,21 @@ runDashboardWeb wo = do
|
||||||
lift $ html =<< renderTextT (thisRepoManifest item)
|
lift $ html =<< renderTextT (thisRepoManifest item)
|
||||||
|
|
||||||
|
|
||||||
get "/repo/:lww/refs" do
|
get (routePattern (RepoRefs "lww")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
|
|
||||||
setHeader "HX-Push-Url" [qc|/repo/{show $ pretty lwws'}|]
|
setHeader "HX-Push-Url" [qc|/{show $ pretty lwws'}|]
|
||||||
|
|
||||||
flip runContT pure do
|
flip runContT pure do
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
refs <- lift $ gitShowRefs lww
|
refs <- lift $ gitShowRefs lww
|
||||||
lift $ html =<< renderTextT (repoRefs lww refs)
|
lift $ renderHtml (repoRefs lww refs)
|
||||||
|
|
||||||
get "/repo/:lww/tree/:co/:hash" do
|
get (routePattern (RepoTree "lww" "co" "hash")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
hash' <- captureParam @String "hash" <&> fromStringMay @GitHash
|
hash' <- captureParam @String "hash" <&> fromStringMay @GitHash
|
||||||
co' <- captureParam @String "co" <&> fromStringMay @GitHash
|
co' <- captureParam @String "co" <&> fromStringMay @GitHash
|
||||||
|
|
||||||
|
|
||||||
flip runContT pure do
|
flip runContT pure do
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
hash <- hash' & orFall (status status404)
|
hash <- hash' & orFall (status status404)
|
||||||
|
@ -242,7 +247,7 @@ runDashboardWeb wo = do
|
||||||
debug $ "selectParentTree" <+> pretty co <+> pretty hash <+> pretty back
|
debug $ "selectParentTree" <+> pretty co <+> pretty hash <+> pretty back
|
||||||
lift $ html =<< renderTextT (repoTree ctx lww co hash tree (coerce <$> back))
|
lift $ html =<< renderTextT (repoTree ctx lww co hash tree (coerce <$> back))
|
||||||
|
|
||||||
get "/repo/:lww/blob/:co/:hash/:blob" do
|
get (routePattern (RepoBlob "lww" "co" "hash" "blob")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
hash' <- captureParam @String "hash" <&> fromStringMay @GitHash
|
hash' <- captureParam @String "hash" <&> fromStringMay @GitHash
|
||||||
co' <- captureParam @String "co" <&> fromStringMay @GitHash
|
co' <- captureParam @String "co" <&> fromStringMay @GitHash
|
||||||
|
@ -257,13 +262,13 @@ runDashboardWeb wo = do
|
||||||
blobInfo <- lift (selectBlobInfo (BlobHash blobHash))
|
blobInfo <- lift (selectBlobInfo (BlobHash blobHash))
|
||||||
>>= orFall (status status404)
|
>>= orFall (status status404)
|
||||||
|
|
||||||
lift $ html =<< renderTextT (repoBlob lww (TreeCommit co) (TreeTree hash) blobInfo)
|
lift $ renderHtml (repoBlob lww (TreeCommit co) (TreeTree hash) blobInfo)
|
||||||
|
|
||||||
get "/repo/:lww/commit/:hash" (commitRoute RepoCommitSummary)
|
get (routePattern (RepoCommitDefault "lww" "hash")) (commitRoute RepoCommitSummary)
|
||||||
get "/repo/:lww/commit/summary/:hash" (commitRoute RepoCommitSummary)
|
get (routePattern (RepoCommitSummaryQ "lww" "hash")) (commitRoute RepoCommitSummary)
|
||||||
get "/repo/:lww/commit/patch/:hash" (commitRoute RepoCommitPatch)
|
get (routePattern (RepoCommitPatchQ "lww" "hash")) (commitRoute RepoCommitPatch)
|
||||||
|
|
||||||
get "/repo/:lww/commits" do
|
get (routePattern (RepoCommits "lww")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
|
|
||||||
let pred = mempty & set commitPredOffset 0
|
let pred = mempty & set commitPredOffset 0
|
||||||
|
@ -273,7 +278,7 @@ runDashboardWeb wo = do
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
lift $ html =<< renderTextT (repoCommits lww (Right pred))
|
lift $ html =<< renderTextT (repoCommits lww (Right pred))
|
||||||
|
|
||||||
get "/repo/:lww/commits/:off/:lim" do
|
get (routePattern (RepoCommitsQ "lww" "off" "lim")) do
|
||||||
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
lwws' <- captureParam @String "lww" <&> fromStringMay @(LWWRefKey HBS2Basic)
|
||||||
off <- captureParam @Int "off"
|
off <- captureParam @Int "off"
|
||||||
lim <- captureParam @Int "lim"
|
lim <- captureParam @Int "lim"
|
||||||
|
@ -285,10 +290,13 @@ runDashboardWeb wo = do
|
||||||
|
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
|
|
||||||
|
-- FIXME: this
|
||||||
referrer <- lift (Scotty.header "Referer")
|
referrer <- lift (Scotty.header "Referer")
|
||||||
>>= orFall (redirect $ fromString $ Text.unpack $ path ["repo", show $ pretty lww])
|
>>= orFall (redirect $ LT.fromStrict $ toURL (RepoPage lww))
|
||||||
|
|
||||||
lift $ html =<< renderTextT (repoCommits lww (Left pred))
|
lift $ renderHtml (repoCommits lww (Left pred))
|
||||||
|
|
||||||
|
-- "pages"
|
||||||
|
|
||||||
where
|
where
|
||||||
commitRoute style = do
|
commitRoute style = do
|
||||||
|
@ -301,9 +309,7 @@ runDashboardWeb wo = do
|
||||||
flip runContT pure do
|
flip runContT pure do
|
||||||
lww <- lwws' & orFall (status status404)
|
lww <- lwws' & orFall (status status404)
|
||||||
hash <- co & orFall (status status404)
|
hash <- co & orFall (status status404)
|
||||||
lift $ html =<< renderTextT (repoCommit style lww hash)
|
lift $ renderHtml (repoCommit style lww hash)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
runScotty :: DashBoardPerks m => DashBoardM m ()
|
runScotty :: DashBoardPerks m => DashBoardM m ()
|
||||||
|
|
|
@ -31,6 +31,9 @@ import Data.Either
|
||||||
import Data.List qualified as List
|
import Data.List qualified as List
|
||||||
import Data.List (sortOn)
|
import Data.List (sortOn)
|
||||||
|
|
||||||
|
import Web.Scotty.Trans as Scotty
|
||||||
|
|
||||||
|
import Data.Kind
|
||||||
|
|
||||||
import Streaming.Prelude qualified as S
|
import Streaming.Prelude qualified as S
|
||||||
|
|
||||||
|
@ -46,9 +49,139 @@ instance Serialise ViewContext
|
||||||
rootPath :: [String] -> [String]
|
rootPath :: [String] -> [String]
|
||||||
rootPath = ("/":)
|
rootPath = ("/":)
|
||||||
|
|
||||||
path :: [String] -> Text
|
class Path a where
|
||||||
|
path :: [a] -> Text
|
||||||
|
|
||||||
|
instance Path String where
|
||||||
path = Text.pack . joinPath . rootPath
|
path = Text.pack . joinPath . rootPath
|
||||||
|
|
||||||
|
class ToRoutePattern a where
|
||||||
|
routePattern :: a -> RoutePattern
|
||||||
|
|
||||||
|
class ToURL a where
|
||||||
|
toURL :: a -> Text
|
||||||
|
|
||||||
|
data family Tabs a :: Type
|
||||||
|
|
||||||
|
data RepoListPage = RepoListPage
|
||||||
|
|
||||||
|
newtype RepoPage a = RepoPage a
|
||||||
|
|
||||||
|
data RepoRefs repo = RepoRefs repo
|
||||||
|
|
||||||
|
data RepoTree repo commit tree = RepoTree repo commit tree
|
||||||
|
|
||||||
|
data RepoBlob repo commit tree blob = RepoBlob repo commit tree blob
|
||||||
|
|
||||||
|
newtype RepoManifest repo = RepoManifest repo
|
||||||
|
|
||||||
|
newtype RepoCommits repo = RepoCommits repo
|
||||||
|
|
||||||
|
data RepoCommitsQ repo off lim = RepoCommitsQ repo off lim
|
||||||
|
|
||||||
|
data RepoCommitDefault repo commit = RepoCommitDefault repo commit
|
||||||
|
|
||||||
|
data RepoCommitSummaryQ repo commit = RepoCommitSummaryQ repo commit
|
||||||
|
|
||||||
|
data RepoCommitPatchQ repo commit = RepoCommitPatchQ repo commit
|
||||||
|
|
||||||
|
toArg :: (Semigroup a, IsString a) => a -> a
|
||||||
|
toArg s = ":" <> s
|
||||||
|
|
||||||
|
instance ToRoutePattern RepoListPage where
|
||||||
|
routePattern = \case
|
||||||
|
RepoListPage -> "/"
|
||||||
|
|
||||||
|
instance ToURL (RepoPage (LWWRefKey 'HBS2Basic)) where
|
||||||
|
toURL (RepoPage w) = path @String [ "/", show (pretty w) ]
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoPage String) where
|
||||||
|
routePattern (RepoPage w) = fromString ("/" <> toArg w)
|
||||||
|
|
||||||
|
instance ToURL RepoListPage where
|
||||||
|
toURL _ = "/"
|
||||||
|
|
||||||
|
instance ToURL (RepoRefs (LWWRefKey 'HBS2Basic)) where
|
||||||
|
toURL (RepoRefs repo') = path ["/", "htmx", "refs", repo]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoRefs String) where
|
||||||
|
routePattern (RepoRefs s) = path ["/", "htmx", "refs", toArg s] & Text.unpack & fromString
|
||||||
|
|
||||||
|
|
||||||
|
instance ToURL (RepoTree (LWWRefKey 'HBS2Basic) GitHash GitHash) where
|
||||||
|
toURL (RepoTree k co tree') = path ["/", "htmx", "tree", repo, commit, tree]
|
||||||
|
where
|
||||||
|
repo = show $ pretty k
|
||||||
|
commit = show $ pretty co
|
||||||
|
tree = show $ pretty tree'
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoTree String String String) where
|
||||||
|
routePattern (RepoTree r co tree) =
|
||||||
|
path ["/", "htmx", "tree", toArg r, toArg co, toArg tree] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoBlob (LWWRefKey 'HBS2Basic) GitHash GitHash GitHash) where
|
||||||
|
toURL (RepoBlob k co t bo) = path ["/", "htmx", "blob", repo, commit, tree, blob]
|
||||||
|
where
|
||||||
|
repo = show $ pretty k
|
||||||
|
commit = show $ pretty co
|
||||||
|
tree = show $ pretty t
|
||||||
|
blob = show $ pretty bo
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoBlob String String String String) where
|
||||||
|
routePattern (RepoBlob r c t b) =
|
||||||
|
path ["/", "htmx", "blob", toArg r, toArg c, toArg t, toArg b] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoManifest (LWWRefKey 'HBS2Basic)) where
|
||||||
|
toURL (RepoManifest repo') = path ["/", "htmx", "manifest", repo]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoManifest String) where
|
||||||
|
routePattern (RepoManifest s) = path ["/", "htmx", "manifest", toArg s] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoCommits (LWWRefKey 'HBS2Basic)) where
|
||||||
|
toURL (RepoCommits repo') = path ["/", "htmx", "commits", repo]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoCommits String) where
|
||||||
|
routePattern (RepoCommits s) = path ["/", "htmx", "commits", toArg s] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoCommitsQ (LWWRefKey 'HBS2Basic) Int Int) where
|
||||||
|
toURL (RepoCommitsQ repo' off lim) = path ["/", "htmx", "commits", repo, show off, show lim]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoCommitsQ String String String) where
|
||||||
|
routePattern (RepoCommitsQ r o l) = path ["/", "htmx", "commits", toArg r, toArg o, toArg l] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoCommitDefault (LWWRefKey 'HBS2Basic) GitHash) where
|
||||||
|
toURL (RepoCommitDefault repo' h) = toURL (RepoCommitSummaryQ repo' h)
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoCommitDefault String String) where
|
||||||
|
routePattern (RepoCommitDefault r h) = routePattern (RepoCommitSummaryQ r h)
|
||||||
|
|
||||||
|
instance ToURL (RepoCommitSummaryQ (LWWRefKey 'HBS2Basic) GitHash) where
|
||||||
|
toURL (RepoCommitSummaryQ repo' h) = path ["/", "htmx", "commit", "summary", repo, ha]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
ha = show $ pretty h
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoCommitSummaryQ String String) where
|
||||||
|
routePattern (RepoCommitSummaryQ r h) = path ["/", "htmx", "commit", "summary", toArg r, toArg h] & Text.unpack & fromString
|
||||||
|
|
||||||
|
instance ToURL (RepoCommitPatchQ (LWWRefKey 'HBS2Basic) GitHash) where
|
||||||
|
toURL (RepoCommitPatchQ repo' h) = path ["/", "htmx", "commit", "patch", repo, ha]
|
||||||
|
where
|
||||||
|
repo = show $ pretty repo'
|
||||||
|
ha = show $ pretty h
|
||||||
|
|
||||||
|
instance ToRoutePattern (RepoCommitPatchQ String String) where
|
||||||
|
routePattern (RepoCommitPatchQ r h) = path ["/", "htmx", "commit", "patch", toArg r, toArg h] & Text.unpack & fromString
|
||||||
|
|
||||||
|
|
||||||
myCss :: Monad m => HtmlT m ()
|
myCss :: Monad m => HtmlT m ()
|
||||||
myCss = do
|
myCss = do
|
||||||
link_ [rel_ "stylesheet", href_ (path ["css/custom.css"])]
|
link_ [rel_ "stylesheet", href_ (path ["css/custom.css"])]
|
||||||
|
@ -56,8 +189,6 @@ myCss = do
|
||||||
hyper_ :: Text -> Attribute
|
hyper_ :: Text -> Attribute
|
||||||
hyper_ = makeAttribute "_"
|
hyper_ = makeAttribute "_"
|
||||||
|
|
||||||
-- makeGetQuery :: String -> Attribute
|
|
||||||
-- makeGetQuery _ = termRaw "jop"
|
|
||||||
|
|
||||||
onClickCopy :: Text -> Attribute
|
onClickCopy :: Text -> Attribute
|
||||||
onClickCopy s =
|
onClickCopy s =
|
||||||
|
@ -102,7 +233,8 @@ instance ToHtml (WithTime RepoListItem) where
|
||||||
|
|
||||||
let locked = isJust $ coerce @_ @(Maybe HashRef) rlRepoGK0
|
let locked = isJust $ coerce @_ @(Maybe HashRef) rlRepoGK0
|
||||||
|
|
||||||
let url = path ["repo", Text.unpack $ view rlRepoLwwAsText it]
|
let url = toURL (RepoPage (coerce @_ @(LWWRefKey 'HBS2Basic) rlRepoLww))
|
||||||
|
-- path ["repo", Text.unpack $ view rlRepoLwwAsText it]
|
||||||
let t = fromIntegral $ coerce @_ @Word64 rlRepoSeq
|
let t = fromIntegral $ coerce @_ @Word64 rlRepoSeq
|
||||||
|
|
||||||
let updated = agePure t now
|
let updated = agePure t now
|
||||||
|
@ -138,7 +270,7 @@ rootPage content = do
|
||||||
|
|
||||||
body_ do
|
body_ do
|
||||||
header_ do
|
header_ do
|
||||||
div_ [class_ "header-title"] $ h1_ [] $ a_ [href_ "/"] "hbs2-peer dashboard"
|
div_ [class_ "header-title"] $ h1_ [] $ a_ [href_ (toURL RepoListPage)] "hbs2-peer dashboard"
|
||||||
content
|
content
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,7 +360,7 @@ repoRefs lww refs = do
|
||||||
for_ refs $ \(r,h) -> do
|
for_ refs $ \(r,h) -> do
|
||||||
let r_ = Text.pack $ show $ pretty r
|
let r_ = Text.pack $ show $ pretty r
|
||||||
let co = show $ pretty h
|
let co = show $ pretty h
|
||||||
let uri = path [ "repo", show $ pretty lww, "tree", co, co ]
|
let uri = toURL (RepoTree lww h h)
|
||||||
|
|
||||||
let showRef = Text.isPrefixOf "refs" r_
|
let showRef = Text.isPrefixOf "refs" r_
|
||||||
|
|
||||||
|
@ -250,13 +382,6 @@ repoRefs lww refs = do
|
||||||
] (toHtml $ show $ pretty h)
|
] (toHtml $ show $ pretty h)
|
||||||
|
|
||||||
|
|
||||||
showRefsHtmxAttribs :: String -> [Attribute]
|
|
||||||
showRefsHtmxAttribs repo =
|
|
||||||
[ hxGet_ (path ["repo", repo, "refs"])
|
|
||||||
, hxTarget_ "#repo-tab-data"
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
treeLocator :: DashBoardPerks m
|
treeLocator :: DashBoardPerks m
|
||||||
=> LWWRefKey 'HBS2Basic
|
=> LWWRefKey 'HBS2Basic
|
||||||
-> GitHash
|
-> GitHash
|
||||||
|
@ -272,19 +397,22 @@ treeLocator lww co locator next = do
|
||||||
|
|
||||||
let prefixSlash x = if fromIntegral x > 1 then span_ "/" else ""
|
let prefixSlash x = if fromIntegral x > 1 then span_ "/" else ""
|
||||||
let showRoot =
|
let showRoot =
|
||||||
[ hxGet_ (path ["repo", repo, "tree", co_, co_])
|
[ hxGet_ (toURL (RepoTree lww co co))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
, href_ "#"
|
, href_ "#"
|
||||||
]
|
]
|
||||||
|
|
||||||
span_ [] $ a_ (showRefsHtmxAttribs repo <> [href_ "#" ]) $ toHtml (take 10 repo <> "..")
|
span_ [] $ a_ [ hxGet_ (toURL (RepoRefs lww))
|
||||||
|
, hxTarget_ "#repo-tab-data"
|
||||||
|
, href_ "#"
|
||||||
|
] $ toHtml (take 10 repo <> "..")
|
||||||
span_ [] "/"
|
span_ [] "/"
|
||||||
span_ [] $ a_ showRoot $ toHtml (take 10 co_ <> "..")
|
span_ [] $ a_ showRoot $ toHtml (take 10 co_ <> "..")
|
||||||
unless (List.null locator) do
|
unless (List.null locator) do
|
||||||
span_ [] "/"
|
span_ [] "/"
|
||||||
for_ locator $ \(_,this,level,name) -> do
|
for_ locator $ \(_,this,level,name) -> do
|
||||||
prefixSlash level
|
prefixSlash level
|
||||||
let uri = path [ "repo", show $ pretty lww, "tree", co_, show (pretty this) ]
|
let uri = toURL (RepoTree lww co (coerce @_ @GitHash this))
|
||||||
span_ [] do
|
span_ [] do
|
||||||
a_ [ href_ "#"
|
a_ [ href_ "#"
|
||||||
, hxGet_ uri
|
, hxGet_ uri
|
||||||
|
@ -303,13 +431,8 @@ repoTree :: (DashBoardPerks m, MonadReader DashBoardEnv m)
|
||||||
|
|
||||||
repoTree ctx lww co root tree back' = do
|
repoTree ctx lww co root tree back' = do
|
||||||
|
|
||||||
let repo = show $ pretty $ lww
|
|
||||||
|
|
||||||
let syntaxMap = Sky.defaultSyntaxMap
|
let syntaxMap = Sky.defaultSyntaxMap
|
||||||
|
|
||||||
let co_ = show $ pretty co
|
|
||||||
let this_ = show $ pretty $ root
|
|
||||||
|
|
||||||
let sorted = sortOn (\(tp, _, name) -> (tpOrder tp, name)) tree
|
let sorted = sortOn (\(tp, _, name) -> (tpOrder tp, name)) tree
|
||||||
where
|
where
|
||||||
tpOrder Tree = (0 :: Int)
|
tpOrder Tree = (0 :: Int)
|
||||||
|
@ -329,7 +452,7 @@ repoTree ctx lww co root tree back' = do
|
||||||
tr_ mempty do
|
tr_ mempty do
|
||||||
|
|
||||||
for_ back' $ \root -> do
|
for_ back' $ \root -> do
|
||||||
let rootLink = path [ "repo", show $ pretty lww, "tree", co_, show (pretty root) ]
|
let rootLink = toURL (RepoTree lww co root)
|
||||||
td_ $ img_ [src_ "/icon/tree-up.svg"]
|
td_ $ img_ [src_ "/icon/tree-up.svg"]
|
||||||
td_ ".."
|
td_ ".."
|
||||||
td_ do a_ [ href_ "#"
|
td_ do a_ [ href_ "#"
|
||||||
|
@ -340,7 +463,7 @@ repoTree ctx lww co root tree back' = do
|
||||||
for_ sorted $ \(tp,h,name) -> do
|
for_ sorted $ \(tp,h,name) -> do
|
||||||
let itemClass = pretty tp & show & Text.pack
|
let itemClass = pretty tp & show & Text.pack
|
||||||
let hash_ = show $ pretty h
|
let hash_ = show $ pretty h
|
||||||
let uri = path [ "repo", show $ pretty lww, "tree", co_, hash_ ]
|
let uri = toURL $ RepoTree lww co h
|
||||||
tr_ mempty do
|
tr_ mempty do
|
||||||
td_ $ case tp of
|
td_ $ case tp of
|
||||||
Commit -> mempty
|
Commit -> mempty
|
||||||
|
@ -370,7 +493,7 @@ repoTree ctx lww co root tree back' = do
|
||||||
td_ [class_ "mono"] do
|
td_ [class_ "mono"] do
|
||||||
case tp of
|
case tp of
|
||||||
Blob -> do
|
Blob -> do
|
||||||
let blobUri = path ["repo", repo, "blob", co_, this_, hash_ ]
|
let blobUri = toURL $ RepoBlob lww co root h
|
||||||
a_ [ href_ "#"
|
a_ [ href_ "#"
|
||||||
, hxGet_ blobUri
|
, hxGet_ blobUri
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
|
@ -399,10 +522,6 @@ repoCommit :: (DashBoardPerks m, MonadReader DashBoardEnv m)
|
||||||
repoCommit style lww hash = do
|
repoCommit style lww hash = do
|
||||||
let syntaxMap = Sky.defaultSyntaxMap
|
let syntaxMap = Sky.defaultSyntaxMap
|
||||||
|
|
||||||
let repo = show $ pretty lww
|
|
||||||
let co_ = show $ pretty hash
|
|
||||||
let root = co_
|
|
||||||
|
|
||||||
txt <- lift $ getCommitRawBrief lww hash
|
txt <- lift $ getCommitRawBrief lww hash
|
||||||
|
|
||||||
let header = Text.lines txt & takeWhile (not . Text.null)
|
let header = Text.lines txt & takeWhile (not . Text.null)
|
||||||
|
@ -417,7 +536,7 @@ repoCommit style lww hash = do
|
||||||
tr_ do
|
tr_ do
|
||||||
th_ [width_ "16rem"] $ strong_ "commit"
|
th_ [width_ "16rem"] $ strong_ "commit"
|
||||||
td_ $ a_ [ href_ "#"
|
td_ $ a_ [ href_ "#"
|
||||||
, hxGet_ (path [ "repo", show $ pretty lww, "tree", co_, co_ ])
|
, hxGet_ (toURL (RepoTree lww hash hash))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] $ toHtml $ show $ pretty hash
|
] $ toHtml $ show $ pretty hash
|
||||||
|
|
||||||
|
@ -432,12 +551,12 @@ repoCommit style lww hash = do
|
||||||
ul_ [class_ "misc-menu"]do
|
ul_ [class_ "misc-menu"]do
|
||||||
unless (style == RepoCommitSummary ) do
|
unless (style == RepoCommitSummary ) do
|
||||||
li_ $ a_ [ href_ "#"
|
li_ $ a_ [ href_ "#"
|
||||||
, hxGet_ (path ["repo", repo, "commit", "summary", co_])
|
, hxGet_ (toURL (RepoCommitSummaryQ lww hash))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] "summary"
|
] "summary"
|
||||||
unless (style == RepoCommitPatch ) do
|
unless (style == RepoCommitPatch ) do
|
||||||
li_ $ a_ [ href_ "#"
|
li_ $ a_ [ href_ "#"
|
||||||
, hxGet_ (path ["repo", repo, "commit", "patch", co_])
|
, hxGet_ (toURL (RepoCommitPatchQ lww hash))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] "patch"
|
] "patch"
|
||||||
|
|
||||||
|
@ -481,7 +600,6 @@ repoCommits :: (DashBoardPerks m, MonadReader DashBoardEnv m)
|
||||||
|
|
||||||
repoCommits lww predicate' = do
|
repoCommits lww predicate' = do
|
||||||
now <- getEpoch
|
now <- getEpoch
|
||||||
let repo = show $ pretty lww
|
|
||||||
|
|
||||||
let predicate = either id id predicate'
|
let predicate = either id id predicate'
|
||||||
|
|
||||||
|
@ -491,7 +609,7 @@ repoCommits lww predicate' = do
|
||||||
let lim = view commitPredLimit predicate
|
let lim = view commitPredLimit predicate
|
||||||
let noff = off + lim
|
let noff = off + lim
|
||||||
|
|
||||||
let query = path ["repo", repo, "commits", show noff, show lim]
|
let query = RepoCommitsQ lww noff lim --) path ["repo", repo, "commits", show noff, show lim]
|
||||||
|
|
||||||
let rows = do
|
let rows = do
|
||||||
for_ co $ \case
|
for_ co $ \case
|
||||||
|
@ -500,12 +618,12 @@ repoCommits lww predicate' = do
|
||||||
td_ $ img_ [src_ "/icon/git-commit.svg"]
|
td_ $ img_ [src_ "/icon/git-commit.svg"]
|
||||||
td_ $ small_ $ toHtml (agePure (coerce @_ @Integer commitListTime) now)
|
td_ $ small_ $ toHtml (agePure (coerce @_ @Integer commitListTime) now)
|
||||||
td_ [class_ "mono", width_ "20rem"] do
|
td_ [class_ "mono", width_ "20rem"] do
|
||||||
let hash = show $ pretty $ coerce @_ @GitHash commitListHash
|
let hash = coerce @_ @GitHash commitListHash
|
||||||
a_ [ href_ "#"
|
a_ [ href_ "#"
|
||||||
, hxGet_ (path ["repo",repo,"commit",hash])
|
, hxGet_ (toURL (RepoCommitDefault lww hash))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
, hxPushUrl_ query
|
, hxPushUrl_ (toURL query)
|
||||||
] (toHtml hash)
|
] (toHtml $ show $ pretty hash)
|
||||||
td_ do
|
td_ do
|
||||||
small_ $ toHtml $ coerce @_ @Text commitListAuthor
|
small_ $ toHtml $ coerce @_ @Text commitListAuthor
|
||||||
tr_ [class_ "commit-brief-details"] do
|
tr_ [class_ "commit-brief-details"] do
|
||||||
|
@ -515,7 +633,7 @@ repoCommits lww predicate' = do
|
||||||
|
|
||||||
unless (List.null co) do
|
unless (List.null co) do
|
||||||
tr_ [ class_ "commit-brief-last"
|
tr_ [ class_ "commit-brief-last"
|
||||||
, hxGet_ query
|
, hxGet_ (toURL query)
|
||||||
, hxTrigger_ "revealed"
|
, hxTrigger_ "revealed"
|
||||||
, hxSwap_ "afterend"
|
, hxSwap_ "afterend"
|
||||||
] do
|
] do
|
||||||
|
@ -606,7 +724,6 @@ repoBlob lww co tree BlobInfo{..} = do
|
||||||
let code = renderText (Lucid.formatHtmlBlock fo tokens)
|
let code = renderText (Lucid.formatHtmlBlock fo tokens)
|
||||||
toHtmlRaw code
|
toHtmlRaw code
|
||||||
|
|
||||||
|
|
||||||
repoPage :: (DashBoardPerks m, MonadReader DashBoardEnv m) => RepoListItem -> HtmlT m ()
|
repoPage :: (DashBoardPerks m, MonadReader DashBoardEnv m) => RepoListItem -> HtmlT m ()
|
||||||
repoPage it@RepoListItem{..} = rootPage do
|
repoPage it@RepoListItem{..} = rootPage do
|
||||||
|
|
||||||
|
@ -618,9 +735,6 @@ repoPage it@RepoListItem{..} = rootPage do
|
||||||
|
|
||||||
(meta, manifest) <- lift $ parsedManifest it
|
(meta, manifest) <- lift $ parsedManifest it
|
||||||
|
|
||||||
debug $ yellow "HEAD" <+> pretty rlRepoTx
|
|
||||||
debug $ yellow "META" <+> pretty meta
|
|
||||||
|
|
||||||
let author = headMay [ s | ListVal [ SymbolVal "author:", LitStrVal s ] <- meta ]
|
let author = headMay [ s | ListVal [ SymbolVal "author:", LitStrVal s ] <- meta ]
|
||||||
let public = headMay [ s | ListVal [ SymbolVal "public:", SymbolVal (Id s) ] <- meta ]
|
let public = headMay [ s | ListVal [ SymbolVal "public:", SymbolVal (Id s) ] <- meta ]
|
||||||
|
|
||||||
|
@ -657,15 +771,17 @@ repoPage it@RepoListItem{..} = rootPage do
|
||||||
repoMenu do
|
repoMenu do
|
||||||
repoMenuItem mempty $ a_ [href_ "/"] "root"
|
repoMenuItem mempty $ a_ [href_ "/"] "root"
|
||||||
|
|
||||||
repoMenuItem0 [ hxGet_ (path ["repo", repo, "commits"])
|
repoMenuItem0 [ hxGet_ (toURL (RepoCommits lww))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] "commits"
|
] "commits"
|
||||||
|
|
||||||
repoMenuItem [ hxGet_ (path ["repo", repo, "manifest"])
|
repoMenuItem [ hxGet_ (toURL (RepoManifest lww))
|
||||||
, hxTarget_ "#repo-tab-data"
|
, hxTarget_ "#repo-tab-data"
|
||||||
] "manifest"
|
] "manifest"
|
||||||
|
|
||||||
repoMenuItem (showRefsHtmxAttribs repo) "tree"
|
repoMenuItem [ hxGet_ (toURL (RepoRefs lww))
|
||||||
|
, hxTarget_ "#repo-tab-data"
|
||||||
|
] "tree"
|
||||||
|
|
||||||
section_ [id_ "repo-data"] do
|
section_ [id_ "repo-data"] do
|
||||||
h1_ (toHtml $ rlRepoName)
|
h1_ (toHtml $ rlRepoName)
|
||||||
|
|
Loading…
Reference in New Issue