module Web.View.HubCapabilityManifests.Show where
import Web.Types
import Generated.Types
import IHP.Prelude
import IHP.ViewPrelude
import Data.Aeson (Value(..), encode)
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy.Char8 as BL
data ShowView = ShowView
{ manifest :: !HubCapabilityManifest
, hub :: !Hub
}
instance View ShowView where
html ShowView { .. } = [hsx|
{hub.name} — Capability Manifest
{statusBadge manifest.status}
{if manifest.status == "draft"
then [hsx|
|]
else if manifest.status == "active"
then [hsx|
|]
else [hsx||]}
Manifest Version
{manifest.manifestVersion}
Activated
{maybe "—" show manifest.activatedAt}
{forEach (maybeText manifest.capabilityDescription) (\d -> [hsx|
{d}
|])}
{forEach (maybeText manifest.contact) (\c -> [hsx|
Contact: {c}
|])}
{jsonArraySection "Declared Widget Types" manifest.declaredWidgetTypes}
{jsonArraySection "Declared Event Types" manifest.declaredEventTypes}
{jsonArraySection "Declared Annotation Categories" manifest.declaredAnnotationCategories}
{jsonArraySection "Declared Policy Scopes" manifest.declaredPolicyScopes}
|]
jsonArraySection :: Text -> Value -> Html
jsonArraySection title val = [hsx|
{title}
({arrayLen val})
{renderArrayItems val}
|]
renderArrayItems :: Value -> Html
renderArrayItems (Array v) | V.null v =
[hsx|None declared
|]
renderArrayItems (Array v) = [hsx|
{forEach (V.toList v) renderItem}
|]
renderArrayItems _ = [hsx|—
|]
renderItem :: Value -> Html
renderItem (String t) = [hsx|{t}|]
renderItem v = [hsx|{cs (BL.unpack (encode v)) :: Text}|]
arrayLen :: Value -> Text
arrayLen (Array v) = tshow (V.length v)
arrayLen _ = "0"
statusBadge :: Text -> Html
statusBadge "active" = [hsx|active|]
statusBadge "draft" = [hsx|draft|]
statusBadge "retired" = [hsx|retired|]
statusBadge s = [hsx|{s}|]
maybeText :: Maybe Text -> [Text]
maybeText Nothing = []
maybeText (Just t) = [t]