feat(users/Profpatsch/whatcd-resolver): add chrome to artistPage
The settings could actually be improved with an htmx snippet, so that we don’t have to load the whole page every time. Change-Id: I472940533881ff24c0111188e7265c59665bc29d Reviewed-on: https://cl.tvl.fyi/c/depot/+/13213 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
This commit is contained in:
parent
0b881b6d23
commit
1c205394a1
1 changed files with 44 additions and 30 deletions
|
|
@ -136,9 +136,9 @@ htmlUi = do
|
||||||
mainHtml counterHtml uniqueRunId span
|
mainHtml counterHtml uniqueRunId span
|
||||||
),
|
),
|
||||||
( "redacted-search",
|
( "redacted-search",
|
||||||
HtmlWithQueryArgs (singleQueryArgument "searchstr" Cat.id) $
|
HtmlWithQueryArgs (label @"searchstr" <$> singleQueryArgument "searchstr" Cat.id) $
|
||||||
\searchstr _span -> do
|
\dat _span -> do
|
||||||
t <- redactedSearchAndInsert [("searchstr", searchstr)]
|
t <- redactedSearchAndInsert [("searchstr", dat.queryArgs.searchstr)]
|
||||||
runTransaction $ do
|
runTransaction $ do
|
||||||
res <- t
|
res <- t
|
||||||
(table, settings) <-
|
(table, settings) <-
|
||||||
|
|
@ -162,16 +162,16 @@ htmlUi = do
|
||||||
pure $
|
pure $
|
||||||
mainHtml'
|
mainHtml'
|
||||||
( MainHtml
|
( MainHtml
|
||||||
{ pageTitle = [fmt|whatcd-resolver – Search – {searchstr & bytesToTextUtf8Lenient}|],
|
{ pageTitle = [fmt|whatcd-resolver – Search – {dat.queryArgs.searchstr & bytesToTextUtf8Lenient}|],
|
||||||
|
returnUrl = dat.returnUrl,
|
||||||
counterHtml = "",
|
counterHtml = "",
|
||||||
mainContent =
|
mainContent =
|
||||||
[hsx|<h1>Search results for <pre>{searchstr}</pre></h1>{table}|],
|
[hsx|<h1>Search results for <pre>{dat.queryArgs.searchstr}</pre></h1>{table}|],
|
||||||
uniqueRunId,
|
uniqueRunId,
|
||||||
searchFieldContent = searchstr & bytesToTextUtf8Lenient,
|
searchFieldContent = dat.queryArgs.searchstr & bytesToTextUtf8Lenient,
|
||||||
settings
|
settings
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
_span
|
|
||||||
),
|
),
|
||||||
( "snips/redacted/torrentDataJson",
|
( "snips/redacted/torrentDataJson",
|
||||||
Html $ \span -> do
|
Html $ \span -> do
|
||||||
|
|
@ -249,8 +249,8 @@ htmlUi = do
|
||||||
& Parse.andParse uriToHttpClientRequest
|
& Parse.andParse uriToHttpClientRequest
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
( \qry _span -> do
|
( \dat _span -> do
|
||||||
jsonld <- httpGetJsonLd (qry.target)
|
jsonld <- httpGetJsonLd (dat.queryArgs.target)
|
||||||
pure $ renderJsonld jsonld
|
pure $ renderJsonld jsonld
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
|
@ -281,8 +281,8 @@ htmlUi = do
|
||||||
( label @"artistRedactedId"
|
( label @"artistRedactedId"
|
||||||
<$> (singleQueryArgument "redacted_id" (Field.utf8 >>> Field.decimalNatural))
|
<$> (singleQueryArgument "redacted_id" (Field.utf8 >>> Field.decimalNatural))
|
||||||
)
|
)
|
||||||
$ \qry _span -> do
|
$ \dat _span -> do
|
||||||
artistPage qry
|
artistPage (T2 dat.queryArgs (label @"uniqueRunId" uniqueRunId))
|
||||||
),
|
),
|
||||||
( "artist/refresh",
|
( "artist/refresh",
|
||||||
HtmlOrRedirect $
|
HtmlOrRedirect $
|
||||||
|
|
@ -347,6 +347,7 @@ htmlUi = do
|
||||||
mainHtml'
|
mainHtml'
|
||||||
( MainHtml
|
( MainHtml
|
||||||
{ pageTitle = "whatcd-resolver",
|
{ pageTitle = "whatcd-resolver",
|
||||||
|
returnUrl = "/",
|
||||||
counterHtml,
|
counterHtml,
|
||||||
mainContent = bestTorrentsTable,
|
mainContent = bestTorrentsTable,
|
||||||
uniqueRunId,
|
uniqueRunId,
|
||||||
|
|
@ -354,10 +355,10 @@ htmlUi = do
|
||||||
searchFieldContent = ""
|
searchFieldContent = ""
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
_span
|
|
||||||
|
|
||||||
data MainHtml = MainHtml
|
data MainHtml = MainHtml
|
||||||
{ pageTitle :: Text,
|
{ pageTitle :: Text,
|
||||||
|
returnUrl :: ByteString,
|
||||||
counterHtml :: Html,
|
counterHtml :: Html,
|
||||||
mainContent :: Html,
|
mainContent :: Html,
|
||||||
searchFieldContent :: Text,
|
searchFieldContent :: Text,
|
||||||
|
|
@ -365,16 +366,14 @@ data MainHtml = MainHtml
|
||||||
settings :: Settings
|
settings :: Settings
|
||||||
}
|
}
|
||||||
|
|
||||||
mainHtml' :: MainHtml -> Otel.Span -> Html
|
mainHtml' :: MainHtml -> Html
|
||||||
mainHtml' dat _span = do
|
mainHtml' dat = do
|
||||||
-- transmissionTorrentsTable <- lift @Transaction getTransmissionTorrentsTable
|
-- transmissionTorrentsTable <- lift @Transaction getTransmissionTorrentsTable
|
||||||
let returnUrl = (label @"returnUrl" "/")
|
|
||||||
|
|
||||||
htmlPageChrome
|
htmlPageChrome
|
||||||
dat.pageTitle
|
dat.pageTitle
|
||||||
( [hsx|
|
( [hsx|
|
||||||
{dat.counterHtml}
|
{dat.counterHtml}
|
||||||
{settingButtons returnUrl dat.settings}
|
{settingButtons dat dat.settings}
|
||||||
|]
|
|]
|
||||||
<> [hsx|
|
<> [hsx|
|
||||||
<form action="redacted-search">
|
<form action="redacted-search">
|
||||||
|
|
@ -477,6 +476,7 @@ htmlPageChrome title body =
|
||||||
|
|
||||||
artistPage ::
|
artistPage ::
|
||||||
( HasField "artistRedactedId" dat Natural,
|
( HasField "artistRedactedId" dat Natural,
|
||||||
|
HasField "uniqueRunId" dat Text,
|
||||||
MonadPostgres m,
|
MonadPostgres m,
|
||||||
MonadOtel m,
|
MonadOtel m,
|
||||||
MonadLogger m,
|
MonadLogger m,
|
||||||
|
|
@ -496,16 +496,13 @@ artistPage dat = runTransaction $ do
|
||||||
let torrents = mkBestTorrentsTable (label @"groupByReleaseType" True) fresh
|
let torrents = mkBestTorrentsTable (label @"groupByReleaseType" True) fresh
|
||||||
|
|
||||||
let returnUrl =
|
let returnUrl =
|
||||||
label @"returnUrl" $
|
textToBytesUtf8 $
|
||||||
mkArtistLink (label @"artistId" (dat.artistRedactedId & fromIntegral @Natural @Int))
|
mkArtistLink (label @"artistId" (dat.artistRedactedId & fromIntegral @Natural @Int))
|
||||||
pure $
|
let pageTitle = case artistName of
|
||||||
htmlPageChrome
|
|
||||||
( case artistName of
|
|
||||||
Nothing -> "whatcd-resolver"
|
Nothing -> "whatcd-resolver"
|
||||||
Just a -> [fmt|{a} - Artist Page - whatcd-resolver|]
|
Just a -> [fmt|{a} - Artist Page - whatcd-resolver|]
|
||||||
)
|
let mainContent =
|
||||||
[hsx|
|
[hsx|
|
||||||
{settingButtons returnUrl settings}
|
|
||||||
<p>Artist ID: {dat.artistRedactedId}</p>
|
<p>Artist ID: {dat.artistRedactedId}</p>
|
||||||
|
|
||||||
<div id="artist-torrents">
|
<div id="artist-torrents">
|
||||||
|
|
@ -523,16 +520,33 @@ artistPage dat = runTransaction $ do
|
||||||
<div class="htmx-indicator">Refreshing!</div>
|
<div class="htmx-indicator">Refreshing!</div>
|
||||||
</form>
|
</form>
|
||||||
|]
|
|]
|
||||||
|
pure $
|
||||||
|
mainHtml'
|
||||||
|
( MainHtml
|
||||||
|
{ pageTitle,
|
||||||
|
returnUrl,
|
||||||
|
counterHtml = "",
|
||||||
|
mainContent,
|
||||||
|
uniqueRunId = dat.uniqueRunId,
|
||||||
|
searchFieldContent = "",
|
||||||
|
settings
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
type Handlers m = Map Text (HandlerResponse m)
|
type Handlers m = Map Text (HandlerResponse m)
|
||||||
|
|
||||||
|
data QueryArgsDat a = QueryArgsDat
|
||||||
|
{ queryArgs :: a,
|
||||||
|
returnUrl :: ByteString
|
||||||
|
}
|
||||||
|
|
||||||
data HandlerResponse m where
|
data HandlerResponse m where
|
||||||
-- | render html
|
-- | render html
|
||||||
Html :: (Otel.Span -> m Html) -> HandlerResponse m
|
Html :: (Otel.Span -> m Html) -> HandlerResponse m
|
||||||
-- | either render html or redirect to another page
|
-- | either render html or redirect to another page
|
||||||
HtmlOrRedirect :: (Otel.Span -> m (E2 "respond" Html "redirectTo" ByteString)) -> HandlerResponse m
|
HtmlOrRedirect :: (Otel.Span -> m (E2 "respond" Html "redirectTo" ByteString)) -> HandlerResponse m
|
||||||
-- | render html after parsing some query arguments
|
-- | render html after parsing some query arguments
|
||||||
HtmlWithQueryArgs :: Parse Query a -> (a -> Otel.Span -> m Html) -> HandlerResponse m
|
HtmlWithQueryArgs :: Parse Query a -> (QueryArgsDat a -> Otel.Span -> m Html) -> HandlerResponse m
|
||||||
-- | render html or reload the page via the Referer header if no htmx
|
-- | render html or reload the page via the Referer header if no htmx
|
||||||
HtmlOrReferer :: (Otel.Span -> m Html) -> HandlerResponse m
|
HtmlOrReferer :: (Otel.Span -> m Html) -> HandlerResponse m
|
||||||
-- | parse the request as POST submission, then redirect to the given endpoint
|
-- | parse the request as POST submission, then redirect to the given endpoint
|
||||||
|
|
@ -596,7 +610,7 @@ runHandlers defaultHandler handlers req respond = withRunInIO $ \runInIO -> do
|
||||||
liftIO $ respond (Wai.responseLBS Http.methodNotAllowed405 [] "")
|
liftIO $ respond (Wai.responseLBS Http.methodNotAllowed405 [] "")
|
||||||
let htmlWithQueryArgs parser act =
|
let htmlWithQueryArgs parser act =
|
||||||
case req & Parse.runParse "Unable to find the right request query arguments" (lmap Wai.queryString parser) of
|
case req & Parse.runParse "Unable to find the right request query arguments" (lmap Wai.queryString parser) of
|
||||||
Right a -> html (act a)
|
Right queryArgs -> html (act $ QueryArgsDat {queryArgs, returnUrl = (req & Wai.rawPathInfo) <> (req & Wai.rawQueryString)})
|
||||||
Left err ->
|
Left err ->
|
||||||
html
|
html
|
||||||
( \span -> do
|
( \span -> do
|
||||||
|
|
@ -1140,7 +1154,7 @@ instance Semigroup Settings where
|
||||||
instance Monoid Settings where
|
instance Monoid Settings where
|
||||||
mempty = Settings {useFreeleechTokens = False}
|
mempty = Settings {useFreeleechTokens = False}
|
||||||
|
|
||||||
submitSettingForm :: (HasField "returnUrl" r Text, ToHtml a) => r -> a -> Html
|
submitSettingForm :: (HasField "returnUrl" r ByteString, ToHtml a) => r -> a -> Html
|
||||||
submitSettingForm opts inputs =
|
submitSettingForm opts inputs =
|
||||||
[hsx|
|
[hsx|
|
||||||
<form
|
<form
|
||||||
|
|
@ -1152,7 +1166,7 @@ submitSettingForm opts inputs =
|
||||||
</form>
|
</form>
|
||||||
|]
|
|]
|
||||||
|
|
||||||
settingButtons :: (HasField "returnUrl" opts Text) => opts -> Settings -> Html
|
settingButtons :: (HasField "returnUrl" opts ByteString) => opts -> Settings -> Html
|
||||||
settingButtons opts s =
|
settingButtons opts s =
|
||||||
if s.useFreeleechTokens
|
if s.useFreeleechTokens
|
||||||
then
|
then
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue