{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module WikiMusic.SSR.View.GenreHtml
  ( genreListPage',
    genreDetailPage',
    genreCreatePage',
    genreEditPage',
  )
where

import Principium
import Text.Blaze.Html5 as H hiding (map)
import Text.Blaze.Html5.Attributes as A
import WikiMusic.Interaction.Model.Genre
import WikiMusic.SSR.View.Components.Forms
import WikiMusic.SSR.View.Components.Other
import WikiMusic.SSR.View.HtmlUtil

genreListPage' :: (MonadIO m) => Limit -> Offset -> Env -> ViewVars -> GetGenresQueryResponse -> m Html
genreListPage' :: forall (m :: * -> *).
MonadIO m =>
Limit
-> Offset -> Env -> ViewVars -> GetGenresQueryResponse -> m Html
genreListPage' Limit
limit Offset
offset Env
env ViewVars
vv GetGenresQueryResponse
xs =
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle (Text -> SimplePageTitle) -> Text -> SimplePageTitle
forall a b. (a -> b) -> a -> b
$ (ApplicationDictionary
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm -> DictTerm
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
#titles Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
-> Optic A_Lens NoIx Titles Titles DictTerm DictTerm
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens NoIx Titles Titles DictTerm DictTerm
#genresPage) (ApplicationDictionary -> DictTerm) -> Language -> Text
|##| (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars Language -> Language
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars Language
#language)) (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"flex", Text
"flex-row", Text
"flex-wrap", Text
"gap-4", Text
"justify-center", Text
"align-center", Text
"items-center"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
searchForm Text
"/genres/search" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Html
searchInput Text
"searchInput"
        Html
submitButtonNoText
      Html -> Html
section (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Html -> Html
H.a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
href AttributeValue
"/genres/create" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
button (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
H.small Html
"+ new genre"
        ViewVars -> SortOrder -> Text -> Text -> Html
mkSortingForm ViewVars
vv (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars SortOrder -> SortOrder
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars SortOrder
#genreSorting) Text
"/user-preferences/genre-sorting" Text
"genre-sorting"
    --
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! Set Text -> Attribute
css Set Text
cssCenteredCardGrid (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ (Genre -> Html) -> [Genre] -> Html
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (ViewVars -> Text -> Genre -> Html
forall {k1} {k2} {k3} {k4} {k5} {k6} {k7} {k8} {a1} {k9} {l1} {l2}
       {s1} {u} {v} {k10} {s2} {k11} {a2}.
(Is k1 A_Getter, Is k2 A_Getter, Is k3 A_Getter, Is k4 A_Getter,
 Is k5 A_Getter, Is k6 A_Getter, Is k7 A_Getter, Is k8 A_Getter,
 Show a1, JoinKinds k9 l1 k3, JoinKinds k9 l2 k2,
 LabelOptic "identifier" k4 s1 s1 UUID UUID,
 LabelOptic "displayName" k7 s1 s1 Text Text,
 LabelOptic "isLike" l1 u v Bool Bool,
 LabelOptic "artworks" k6 s1 s1 (Map k10 s2) (Map k10 s2),
 LabelOptic "opinions" k8 s1 s1 (Map k11 a2) (Map k11 a2),
 LabelOptic "viewCount" k1 s1 s1 a1 a1,
 LabelOptic "artwork" k5 s2 s2 Artwork Artwork,
 LabelOptic "opinion" k9 a2 a2 u v,
 LabelOptic "isDislike" l2 u v Bool Bool) =>
ViewVars -> Text -> s1 -> Html
simpleEntityCard ViewVars
vv Text
"genres") [Genre]
sortedXs
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"flex", Text
"flex-row", Text
"flex-wrap", Text
"gap-4", Text
"justify-center", Text
"align-center", Text
"items-center", Text
"my-6"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      ViewVars -> Limit -> Offset -> Int -> Html
maybePrevPaginationButton ViewVars
vv Limit
limit Offset
offset (Map UUID Genre -> Int
forall a. Map UUID a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (GetGenresQueryResponse
xs GetGenresQueryResponse
-> Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
-> Map UUID Genre
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
#genres))
      ViewVars -> Limit -> Offset -> Int -> Html
maybeNextPaginationButton ViewVars
vv Limit
limit Offset
offset (Map UUID Genre -> Int
forall a. Map UUID a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (GetGenresQueryResponse
xs GetGenresQueryResponse
-> Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
-> Map UUID Genre
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
#genres))
  where
    sortedXs :: [Genre]
sortedXs =
      (UUID -> Maybe Genre) -> [UUID] -> [Genre]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe
        (\UUID
identifier -> (GetGenresQueryResponse
xs GetGenresQueryResponse
-> Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
-> Map UUID Genre
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetGenresQueryResponse (Map UUID Genre)
#genres) Map UUID Genre -> UUID -> Maybe Genre
forall k a. Ord k => Map k a -> k -> Maybe a
Principium.!? UUID
identifier)
        (GetGenresQueryResponse
xs GetGenresQueryResponse
-> Optic' A_Lens NoIx GetGenresQueryResponse [UUID] -> [UUID]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetGenresQueryResponse [UUID]
#sortOrder)

genreDetailPage' :: (MonadIO m) => Env -> ViewVars -> Genre -> m Html
genreDetailPage' :: forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> Genre -> m Html
genreDetailPage' Env
env ViewVars
vv Genre
x = do
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle (Text -> SimplePageTitle) -> Text -> SimplePageTitle
forall a b. (a -> b) -> a -> b
$ (ApplicationDictionary
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm -> DictTerm
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
#titles Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
-> Optic A_Lens NoIx Titles Titles DictTerm DictTerm
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens NoIx Titles Titles DictTerm DictTerm
#genresPage) (ApplicationDictionary -> DictTerm) -> Language -> Text
|##| (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars Language -> Language
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars Language
#language)) (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    ViewVars -> Text -> Genre -> Html
forall {a1} {a2} {a3} {a4} {a5} {t1 :: * -> *} {k1} {l1} {k2} {l2}
       {k3} {k4} {k5} {k6} {k7} {k8} {k9} {k10} {k11} {k12} {k13} {k14}
       {k15} {k16} {k17} {t2 :: * -> *} {t3 :: * -> *} {t4 :: * -> *}
       {t5 :: * -> *} {t6 :: * -> *} {s} {u} {v} {k18} {a6} {k19} {a7}.
(Show a1, Show a2, Show a3, Show a4, Show a5, Functor t1,
 JoinKinds k1 l1 k2, JoinKinds k1 l2 k3, Is k4 A_Getter,
 Is k5 A_Getter, Is k6 A_Getter, Is k7 A_Getter, Is k8 A_Getter,
 Is k9 A_Getter, Is k10 A_Getter, Is k11 A_Getter, Is k3 A_Getter,
 Is k2 A_Getter, Is k12 A_Getter, Is k13 A_Getter, Is k14 A_Getter,
 Is k15 A_Getter, Is k16 A_Getter, Is k17 A_Getter, Foldable t2,
 Foldable t1, Foldable t3, Foldable t4, Foldable t5, Foldable t6,
 LabelOptic "description" k4 s s (t2 Text) (t2 Text),
 LabelOptic "identifier" k8 s s a1 a1,
 LabelOptic "createdBy" k9 s s a2 a2,
 LabelOptic "createdAt" k10 s s a3 a3,
 LabelOptic "lastEditedAt" k13 s s (t1 a5) (t1 a5),
 LabelOptic "displayName" k7 s s Text Text,
 LabelOptic "soundcloudUrl" k14 s s (t3 Text) (t3 Text),
 LabelOptic "spotifyUrl" k16 s s (t5 Text) (t5 Text),
 LabelOptic "wikipediaUrl" k15 s s (t4 Text) (t4 Text),
 LabelOptic "youtubeUrl" k17 s s (t6 Text) (t6 Text),
 LabelOptic "isLike" l2 u v Bool Bool,
 LabelOptic "artworks" k5 s s (Map k18 a6) (Map k18 a6),
 LabelOptic "opinions" k11 s s (Map k19 a7) (Map k19 a7),
 LabelOptic "viewCount" k12 s s a4 a4,
 LabelOptic "artwork" k6 a6 a6 Artwork Artwork,
 LabelOptic "opinion" k1 a7 a7 u v,
 LabelOptic "isDislike" l1 u v Bool Bool) =>
ViewVars -> Text -> s -> Html
entityDetails ViewVars
vv Text
"genres" Genre
x

genreCreatePage' :: (MonadIO m) => Env -> ViewVars -> m Html
genreCreatePage' :: forall (m :: * -> *). MonadIO m => Env -> ViewVars -> m Html
genreCreatePage' Env
env ViewVars
vv =
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle Text
"Create genre") (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"container", Text
"mx-auto"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
postForm Text
"/genres/create" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Text -> Html
requiredTextInput Text
"displayName" Text
"genre name"
        Text -> Text -> Html
optionalTextArea Text
"description" Text
"description"
        Text -> Text -> Html
optionalTextInput Text
"spotifyUrl" Text
"spotify URL"
        Text -> Text -> Html
optionalTextInput Text
"youtubeUrl" Text
"youtube URL"
        Text -> Text -> Html
optionalTextInput Text
"wikipediaUrl" Text
"wikipedia URL"
        Text -> Text -> Html
optionalTextInput Text
"soundcloudUrl" Text
"soundcloud URL"
        ViewVars -> Html
submitButton ViewVars
vv

genreEditPage' :: (MonadIO m) => Env -> ViewVars -> Genre -> m Html
genreEditPage' :: forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> Genre -> m Html
genreEditPage' Env
env ViewVars
vv Genre
genre =
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle Text
"Edit genre") (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"container", Text
"mx-auto"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
postForm (Text
"/genres/edit/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
packText (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
show (UUID -> Text) -> UUID -> Text
forall a b. (a -> b) -> a -> b
$ Genre
genre Genre -> Optic' A_Lens NoIx Genre UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre UUID
#identifier)) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Text -> Maybe Text -> Html
requiredTextInput' Text
"displayName" Text
"genre name" (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Genre
genre Genre -> Optic' A_Lens NoIx Genre Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre Text
#displayName)
        Text -> Text -> Maybe Text -> Html
optionalTextArea' Text
"description" Text
"description" (Genre
genre Genre -> Optic' A_Lens NoIx Genre (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Maybe Text)
#description)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"spotifyUrl" Text
"spotify URL" (Genre
genre Genre -> Optic' A_Lens NoIx Genre (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Maybe Text)
#spotifyUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"youtubeUrl" Text
"youtube URL" (Genre
genre Genre -> Optic' A_Lens NoIx Genre (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Maybe Text)
#youtubeUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"wikipediaUrl" Text
"wikipedia URL" (Genre
genre Genre -> Optic' A_Lens NoIx Genre (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Maybe Text)
#wikipediaUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"soundcloudUrl" Text
"soundcloud URL" (Genre
genre Genre -> Optic' A_Lens NoIx Genre (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Maybe Text)
#soundcloudUrl)

        ViewVars -> Html
submitButton ViewVars
vv
      ViewVars -> Text -> [Artwork] -> Html
entityArtworkForm ViewVars
vv Text
"genres" ((GenreArtwork -> Artwork) -> [GenreArtwork] -> [Artwork]
forall a b. (a -> b) -> [a] -> [b]
map (GenreArtwork -> Optic' A_Lens NoIx GenreArtwork Artwork -> Artwork
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GenreArtwork Artwork
#artwork) ([GenreArtwork] -> [Artwork])
-> (Map UUID GenreArtwork -> [GenreArtwork])
-> Map UUID GenreArtwork
-> [Artwork]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map UUID GenreArtwork -> [GenreArtwork]
forall k a. Map k a -> [a]
mapElems (Map UUID GenreArtwork -> [Artwork])
-> Map UUID GenreArtwork -> [Artwork]
forall a b. (a -> b) -> a -> b
$ Genre
genre Genre
-> Optic' A_Lens NoIx Genre (Map UUID GenreArtwork)
-> Map UUID GenreArtwork
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre (Map UUID GenreArtwork)
#artworks)
      Html
hr
      ViewVars -> Text -> UUID -> Html
entityNewArtworkForm ViewVars
vv Text
"genres" (Genre
genre Genre -> Optic' A_Lens NoIx Genre UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Genre UUID
#identifier)