taskell-1.3.6.0: src/UI/Modal/Detail.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module UI.Modal.Detail
( detail
) where
import ClassyPrelude
import Control.Lens ((^.))
import Data.Sequence (mapWithIndex)
import Brick
import Data.Taskell.Date (Day, dayToOutput, deadline)
import qualified Data.Taskell.Subtask as ST (Subtask, complete, name)
import Data.Taskell.Task (Task, description, due, name, subtasks)
import Events.State (getCurrentTask)
import Events.State.Modal.Detail (getCurrentItem, getField)
import Events.State.Types (State)
import Events.State.Types.Mode (DetailItem (..))
import UI.Field (Field, textField, widgetFromMaybe)
import UI.Theme (disabledAttr, dlToAttr, taskCurrentAttr,
titleCurrentAttr)
import UI.Types (ResourceName (..))
renderSubtask :: Maybe Field -> DetailItem -> Int -> ST.Subtask -> Widget ResourceName
renderSubtask f current i subtask = padBottom (Pad 1) $ prefix <+> final
where
cur =
case current of
DetailItem c -> i == c
_ -> False
done = subtask ^. ST.complete
attr =
withAttr
(if cur
then taskCurrentAttr
else titleCurrentAttr)
prefix =
attr . txt $
if done
then "[x] "
else "[ ] "
widget = textField (subtask ^. ST.name)
final
| cur = visible . attr $ widgetFromMaybe widget f
| not done = attr widget
| otherwise = widget
renderSummary :: Maybe Field -> DetailItem -> Task -> Widget ResourceName
renderSummary f i task = padTop (Pad 1) $ padBottom (Pad 2) w'
where
w = textField $ fromMaybe "No description" (task ^. description)
w' =
case i of
DetailDescription -> visible $ widgetFromMaybe w f
_ -> w
renderDate :: Day -> Maybe Field -> DetailItem -> Task -> Widget ResourceName
renderDate today field item task =
case item of
DetailDate -> visible $ prefix <+> widgetFromMaybe widget field
_ ->
case day of
Just d -> prefix <+> withAttr (dlToAttr (deadline today d)) widget
Nothing -> emptyWidget
where
day = task ^. due
prefix = txt "Due: "
widget = textField $ maybe "" dayToOutput day
detail :: State -> Day -> (Text, Widget ResourceName)
detail state today =
fromMaybe ("Error", txt "Oops") $ do
task <- getCurrentTask state
i <- getCurrentItem state
let f = getField state
let sts = task ^. subtasks
w
| null sts = withAttr disabledAttr $ txt "No sub-tasks"
| otherwise = vBox . toList $ renderSubtask f i `mapWithIndex` sts
pure (task ^. name, renderDate today f i task <=> renderSummary f i task <=> w)