module Web.View.AnnotationThreads.Index where import Web.Types import Generated.Types import IHP.Prelude import IHP.ViewPrelude data IndexView = IndexView { widget :: !Widget , threads :: ![AnnotationThread] , allAnnotations :: ![Annotation] } instance View IndexView where html IndexView { .. } = [hsx|
Widgets / {widget.name} / Threads

Annotation Threads

New Thread
{if null threads then [hsx|

No threads yet.

|] else [hsx|
{forEach threads (renderThreadRow allAnnotations)}
|]} |] renderThreadRow :: [Annotation] -> AnnotationThread -> Html renderThreadRow allAnnotations t = let members = filter (\a -> a.threadId == Just t.id) allAnnotations count = length members severityBreakdown = buildSeverityBreakdown members in [hsx|
{t.title} {maybe mempty (\d -> [hsx|

{d}

|]) t.description}
{show t.createdAt}
{show count} annotation(s) {renderSeverityBreakdown severityBreakdown}
|] buildSeverityBreakdown :: [Annotation] -> [(Text, Int)] buildSeverityBreakdown annotations = [ ("low", length $ filter (\a -> a.severity == "low") annotations) , ("medium", length $ filter (\a -> a.severity == "medium") annotations) , ("high", length $ filter (\a -> a.severity == "high") annotations) , ("critical", length $ filter (\a -> a.severity == "critical") annotations) ] renderSeverityBreakdown :: [(Text, Int)] -> Html renderSeverityBreakdown pairs = [hsx| {forEach (filter (\(_, n) -> n > 0) pairs) renderSeverityPip} |] renderSeverityPip :: (Text, Int) -> Html renderSeverityPip (sev, n) = [hsx| " text-xs px-1.5 py-0.5 rounded"}> {sev}: {show n} |] severityClass :: Text -> Text severityClass "low" = "bg-gray-100 text-gray-500" severityClass "medium" = "bg-blue-100 text-blue-700" severityClass "high" = "bg-yellow-100 text-yellow-800" severityClass "critical" = "bg-red-100 text-red-800 font-semibold" severityClass _ = "bg-gray-100 text-gray-500"