module View.Income.Header ( view , In(..) , Out(..) ) 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 (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import Common.Model (Currency, Income (..), 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 Util.Date as DateUtil import qualified View.Income.Form as Form import View.Income.Init (Init (..)) data In t = In { _in_init :: Init , _in_currency :: Currency , _in_incomes :: Dynamic t [Income] } 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 R.dyn . R.ffor useIncomesFrom $ \case (Nothing, _) -> R.blank (Just since, incomes) -> 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 userIncomes = filter ((==) (_user_id user) . _income_userId) incomes T.intercalate " " [ _user_name user , "−" , Format.price (_in_currency input) $ CM.cumulativeIncomesSince currentTime since userIncomes ] 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 } where init = _in_init input useIncomesFrom = R.ffor (_in_incomes input) $ \incomes -> ( CM.useIncomesFrom (map _user_id $_init_users init) incomes (_init_payments init) , incomes )