inter-hub-haskell/Web/View/GovernanceTemplates/Show.hs

72 lines
2.6 KiB
Haskell
Raw Normal View History

module Web.View.GovernanceTemplates.Show where
import Web.Types
import Generated.Types
import IHP.Prelude
import IHP.ViewPrelude
import Data.Aeson (Value(..), decode, encode)
import qualified Data.ByteString.Lazy.Char8 as BL
data ShowView = ShowView
{ template :: !GovernanceTemplate
, hub :: !Hub
, cloneCount :: !Int
}
instance View ShowView where
html ShowView { .. } = [hsx|
<div class="mb-4">
<a href={GovernanceTemplatesAction} class="text-sm text-gray-500 hover:text-gray-700">
Governance Templates
</a>
</div>
<div class="flex items-center gap-3 mb-2">
<h1 class="text-2xl font-semibold">{template.name}</h1>
{if template.isPublished
then [hsx|<span class="px-2 py-0.5 rounded text-xs bg-green-100 text-green-800">published</span>|]
else [hsx|<span class="px-2 py-0.5 rounded text-xs bg-amber-100 text-amber-800">draft</span>|]}
</div>
<p class="text-sm text-gray-500 mb-1">Hub: {hub.name}</p>
<p class="text-sm text-gray-500 mb-4">{tshow cloneCount} clones</p>
{maybe mempty (\d -> [hsx|<p class="text-sm text-gray-600 mb-4">{d}</p>|]) template.description}
<div class="mb-4">
<h3 class="text-sm font-semibold text-gray-700 mb-2">Categories</h3>
<div class="flex flex-wrap gap-1">
{forEach (jsonArrayTexts template.categories) renderCategoryTag}
{if null (jsonArrayTexts template.categories)
then [hsx|<span class="text-xs text-gray-400">None</span>|]
else mempty}
</div>
</div>
<div class="mb-6">
<h3 class="text-sm font-semibold text-gray-700 mb-2">Template Body</h3>
<pre class="bg-gray-50 rounded border border-gray-200 p-3 text-xs font-mono overflow-x-auto">
{cs (BL.unpack (encode template.templateBody)) :: Text}
</pre>
</div>
{if template.isPublished
then [hsx|
<a href={CloneGovernanceTemplateAction { governanceTemplateId = template.id }}
class="text-sm bg-indigo-600 text-white px-3 py-1.5 rounded hover:bg-indigo-700">
Clone to My Hub
</a>
|]
else mempty}
|]
renderCategoryTag :: Text -> Html
renderCategoryTag cat = [hsx|
<span class="px-2 py-0.5 rounded text-xs bg-blue-100 text-blue-700 font-mono">{cat}</span>
|]
jsonArrayTexts :: Value -> [Text]
jsonArrayTexts val = case decode (encode val) of
Just (arr :: [Text]) -> arr
Nothing -> []