module View.Income.Header ( view , In(..) , Out(..) ) where import Control.Monad.IO.Class (liftIO) import qualified Data.Map as M import qualified Data.Maybe as Maybe import qualified Data.Text as T import qualified Data.Time.Clock as Clock import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import Common.Model (Currency, Income (..), IncomeHeader (..), User (..)) import qualified Common.Model as CM import qualified Common.Msg as Msg import qualified Common.View.Format as Format import qualified Component.Button as Button import qualified Component.Modal as Modal import qualified View.Income.Form as Form import View.Income.Init (Init (..)) data In t = In { _in_users :: [User] , _in_header :: IncomeHeader , _in_currency :: Currency } data Out t = Out { _out_add :: Event t Income } view :: forall t m. MonadWidget t m => In t -> m (Out t) view input = R.divClass "withMargin" $ do currentTime <- liftIO Clock.getCurrentTime case _incomeHeader_since $ _in_header input of Nothing -> R.blank Just since -> R.el "div" $ do R.el "h1" $ do R.text $ Msg.get (Msg.Income_CumulativeSince (Format.longDay since)) R.el "ul" $ flip mapM_ (M.toList . _incomeHeader_byUser $ _in_header input) $ \(userId, amount) -> R.el "li" $ R.text $ T.intercalate " " [ Maybe.fromMaybe "" . fmap _user_name $ CM.findUser userId (_in_users input) , "−" , Format.price (_in_currency input) amount ] R.divClass "titleButton" $ do R.el "h1" $ R.text $ Msg.get Msg.Income_MonthlyNet addIncome <- Button._out_clic <$> (Button.view . Button.defaultIn . R.text $ Msg.get Msg.Income_AddLong) addIncome <- Modal.view $ Modal.In { Modal._in_show = addIncome , Modal._in_content = Form.view $ Form.In { Form._in_operation = Form.New } } return $ Out { _out_add = addIncome }