module View.Income.Header ( view , HeaderIn(..) ) where import Control.Monad.IO.Class (liftIO) import qualified Data.Maybe as Maybe import qualified Data.Text as T import qualified Data.Time.Clock as Clock import Reflex.Dom (MonadWidget) import qualified Reflex.Dom as R import Common.Model (Income (..), Init (..), User (..)) import qualified Common.Model as CM import qualified Common.Msg as Msg import qualified Common.View.Format as Format import qualified Util.Date as DateUtil data HeaderIn = HeaderIn { _headerIn_init :: Init } view :: forall t m. MonadWidget t m => HeaderIn -> m () view headerIn = R.divClass "withMargin" $ do currentTime <- liftIO Clock.getCurrentTime Maybe.fromMaybe R.blank $ flip fmap useIncomesFrom $ \since -> R.el "div" $ do R.el "h1" $ do day <- liftIO $ DateUtil.utcToLocalDay since R.text $ Msg.get (Msg.Income_CumulativeSince (Format.longDay day)) R.el "ul" $ flip mapM_ (_init_users init) $ \user -> R.el "li" $ R.text $ do let incomes = filter ((==) (_user_id user) . _income_userId) (_init_incomes init) T.intercalate " " [ _user_name user , "−" , Format.price (_init_currency init) $ CM.cumulativeIncomesSince currentTime since incomes ] R.divClass "titleButton" $ R.el "h1" $ R.text $ Msg.get Msg.Income_MonthlyNet where init = _headerIn_init headerIn useIncomesFrom = CM.useIncomesFrom (map _user_id $_init_users init) (_init_incomes init) (_init_payments init)