packages feed

mywork-1.0.1.0: lib/Panes/Summary.hs

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}

module Panes.Summary
  (
    SummaryPane
  )
where

import           Brick
import           Brick.Panes
import           Control.Lens
import           Data.Maybe ( catMaybes )

import           Defs


data SummaryPane

instance Pane WName MyWorkEvent SummaryPane where
  data (PaneState SummaryPane MyWorkEvent) = Unused
  type (DrawConstraints SummaryPane s WName) = ( HasProjects s )
  initPaneState _ = Unused
  drawPane _ s = Just $ drawSummary (snd $ getProjects s)


drawSummary :: Projects -> Widget WName
drawSummary prjcts =
    let prjs = projects prjcts
        prjcnt = (str "# Projects: " <+>)
                    $ foldr ((<+>) . (<+> str ", "))
                      (str ("Total=" <> show (length prjs)))
                    [ withAttr (roleAttr r) (str $ show r)
                      <+> str "="
                      <+> str (show (length fp))
                    | r <- [minBound .. maxBound]
                    , let fp = filter (isRole r) prjs
                    , not (null fp)
                    ]
        isRole r p = r == p ^. roleL
        dateRange = if null projDates
                    then str ""
                    else str (show (minimum projDates)
                              <> ".."
                              <> show (maximum projDates)
                             )
        locDates prj = catMaybes (view locatedOnL <$> prj ^. locationsL)
        projDates = concatMap locDates prjs
    in vLimit 1
       $ if null prjs
         then str "No projects defined"
         else prjcnt <+> fill ' ' <+> dateRange