module View.Income.Table ( view , In(..) , Out(..) ) where import qualified Data.List as L import qualified Data.Maybe as Maybe import Data.Text (Text) 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.Table as Table import qualified View.Income.Add as Add 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_addIncome :: Event t Income } view :: forall t m. MonadWidget t m => In t -> m (Out t) view input = do table <- Table.view $ Table.In { Table._in_headerLabel = headerLabel , Table._in_rows = R.ffor (_in_incomes input) $ reverse . L.sortOn _income_date , Table._in_cell = cell (_in_init input) (_in_currency input) , Table._in_perPage = 7 , Table._in_resetPage = R.never , Table._in_cloneModal = \income -> Add.view $ Add.In { Add._in_income = Just <$> income } } return $ Out { _out_addIncome = Table._out_add table } data Header = UserHeader | AmountHeader | DateHeader deriving (Eq, Show, Bounded, Enum) headerLabel :: Header -> Text headerLabel UserHeader = Msg.get Msg.Income_Name headerLabel DateHeader = Msg.get Msg.Income_Date headerLabel AmountHeader = Msg.get Msg.Income_Amount cell :: Init -> Currency -> Header -> Income -> Text cell init currency header income = case header of UserHeader -> Maybe.fromMaybe "" . fmap _user_name $ CM.findUser (_income_userId income) (_init_users init) DateHeader -> Format.longDay . _income_date $ income AmountHeader -> Format.price currency . _income_amount $ income