module Web.View.DecisionRecords.Index where import Web.Types import Generated.Types import IHP.Prelude import IHP.ViewPrelude import Web.Routes () data IndexView = IndexView { records :: ![DecisionRecord] , requirements :: ![Requirement] , users :: ![User] , mOutcomeFilter :: !(Maybe Text) } allOutcomes :: [Text] allOutcomes = ["accepted", "rejected", "deferred", "split", "merged", "reframed"] instance View IndexView where html IndexView { .. } = [hsx|

Decision Records

New Decision
All {forEach allOutcomes (renderOutcomeTab mOutcomeFilter)}
{if null records then noDecisionsMsg else renderTable records requirements users} |] noDecisionsMsg :: Html noDecisionsMsg = [hsx|

No decision records found.

|] renderOutcomeTab :: Maybe Text -> Text -> Html renderOutcomeTab mOutcomeFilter o = [hsx| {o} |] decisionFilterUrl :: Text -> Text decisionFilterUrl o = "/DecisionRecords?outcome=" <> o renderTable :: [DecisionRecord] -> [Requirement] -> [User] -> Html renderTable records reqs users = [hsx|
{forEach records (renderRow reqs users)}
Title Outcome Requirement Decided By Decided At
|] renderRow :: [Requirement] -> [User] -> DecisionRecord -> Html renderRow reqs users dr = [hsx| {dr.title} " text-xs px-2 py-0.5 rounded font-medium"}> {dr.outcome} {linkedReqTitle reqs dr.requirementId} {userName users dr.decidedBy} {show dr.decidedAt} |] linkedReqTitle :: [Requirement] -> Maybe (Id Requirement) -> Text linkedReqTitle _ Nothing = "—" linkedReqTitle reqs (Just rid) = maybe "(unknown)" (.title) (find (\r -> r.id == rid) reqs) userName :: [User] -> Maybe UUID -> Text userName _ Nothing = "—" userName users (Just uid) = maybe "(unknown)" (.name) (find (\u -> toUUID u.id == uid) users) outcomeClass :: Text -> Text outcomeClass "accepted" = "bg-green-100 text-green-800" outcomeClass "rejected" = "bg-red-100 text-red-800" outcomeClass "deferred" = "bg-gray-100 text-gray-600" outcomeClass "split" = "bg-purple-100 text-purple-800" outcomeClass "merged" = "bg-indigo-100 text-indigo-800" outcomeClass "reframed" = "bg-orange-100 text-orange-800" outcomeClass _ = "bg-gray-100 text-gray-600" filterTabClass :: Maybe Text -> Maybe Text -> Text filterTabClass a b | a == b = "px-3 py-1.5 rounded bg-indigo-100 text-indigo-700 font-medium" | otherwise = "px-3 py-1.5 rounded text-gray-600 hover:bg-gray-100"