diff options
Diffstat (limited to 'Omni/Jr/Web.hs')
| -rw-r--r-- | Omni/Jr/Web.hs | 71 |
1 files changed, 51 insertions, 20 deletions
diff --git a/Omni/Jr/Web.hs b/Omni/Jr/Web.hs index ce77bca..c7e2e44 100644 --- a/Omni/Jr/Web.hs +++ b/Omni/Jr/Web.hs @@ -276,31 +276,62 @@ multiColorProgressBar stats = statusBadgeWithForm :: (Monad m) => TaskCore.Status -> Text -> Lucid.HtmlT m () statusBadgeWithForm status tid = - let badgeClass = case status of - TaskCore.Open -> "status-badge-select badge-open" - TaskCore.InProgress -> "status-badge-select badge-inprogress" - TaskCore.Review -> "status-badge-select badge-review" - TaskCore.Approved -> "status-badge-select badge-approved" - TaskCore.Done -> "status-badge-select badge-done" - in Lucid.select_ - [ Lucid.id_ "status-badge-container", - Lucid.name_ "status", - Lucid.class_ badgeClass, + Lucid.div_ + [ Lucid.id_ "status-badge-container", + Lucid.class_ "status-badge-dropdown" + ] + <| do + clickableBadge status tid + statusDropdownOptions status tid + +clickableBadge :: (Monad m) => TaskCore.Status -> Text -> Lucid.HtmlT m () +clickableBadge status _tid = + let (cls, label) = case status of + TaskCore.Open -> ("badge badge-open status-badge-clickable", "Open" :: Text) + TaskCore.InProgress -> ("badge badge-inprogress status-badge-clickable", "In Progress") + TaskCore.Review -> ("badge badge-review status-badge-clickable", "Review") + TaskCore.Approved -> ("badge badge-approved status-badge-clickable", "Approved") + TaskCore.Done -> ("badge badge-done status-badge-clickable", "Done") + in Lucid.span_ + [ Lucid.class_ cls, + Lucid.makeAttribute "onclick" "this.parentElement.classList.toggle('open')" + ] + <| do + Lucid.toHtml label + Lucid.span_ [Lucid.class_ "dropdown-arrow"] " ▾" + +statusDropdownOptions :: (Monad m) => TaskCore.Status -> Text -> Lucid.HtmlT m () +statusDropdownOptions currentStatus tid = + Lucid.div_ [Lucid.class_ "status-dropdown-menu"] <| do + statusOption TaskCore.Open currentStatus tid + statusOption TaskCore.InProgress currentStatus tid + statusOption TaskCore.Review currentStatus tid + statusOption TaskCore.Approved currentStatus tid + statusOption TaskCore.Done currentStatus tid + +statusOption :: (Monad m) => TaskCore.Status -> TaskCore.Status -> Text -> Lucid.HtmlT m () +statusOption opt currentStatus tid = + let (cls, label) = case opt of + TaskCore.Open -> ("badge badge-open", "Open" :: Text) + TaskCore.InProgress -> ("badge badge-inprogress", "In Progress") + TaskCore.Review -> ("badge badge-review", "Review") + TaskCore.Approved -> ("badge badge-approved", "Approved") + TaskCore.Done -> ("badge badge-done", "Done") + isSelected = opt == currentStatus + optClass = cls <> " status-dropdown-option" <> if isSelected then " selected" else "" + in Lucid.form_ + [ Lucid.class_ "status-option-form", Lucid.makeAttribute "hx-post" ("/tasks/" <> tid <> "/status"), Lucid.makeAttribute "hx-target" "#status-badge-container", Lucid.makeAttribute "hx-swap" "outerHTML" ] <| do - statusOptionHtmx TaskCore.Open status - statusOptionHtmx TaskCore.InProgress status - statusOptionHtmx TaskCore.Review status - statusOptionHtmx TaskCore.Approved status - statusOptionHtmx TaskCore.Done status - where - statusOptionHtmx :: (Monad m2) => TaskCore.Status -> TaskCore.Status -> Lucid.HtmlT m2 () - statusOptionHtmx opt current = - let attrs = [Lucid.value_ (tshow opt)] <> [Lucid.selected_ "selected" | opt == current] - in Lucid.option_ attrs (Lucid.toHtml (tshow opt)) + Lucid.input_ [Lucid.type_ "hidden", Lucid.name_ "status", Lucid.value_ (tshow opt)] + Lucid.button_ + [ Lucid.type_ "submit", + Lucid.class_ optClass + ] + (Lucid.toHtml label) renderTaskCard :: (Monad m) => TaskCore.Task -> Lucid.HtmlT m () renderTaskCard t = |
