aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Income/Income.hs
blob: 2784cac71078a3f903879d578c10e5eb4727b206 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
module View.Income.Income
  ( init
  , view
  , In(..)
  ) where

import           Data.Aeson         (FromJSON)
import           Prelude            hiding (init)
import           Reflex.Dom         (Dynamic, Event, MonadWidget)
import qualified Reflex.Dom         as R

import           Common.Model       (Currency, Income (..), UserId)

import           Loadable           (Loadable (..))
import qualified Loadable
import qualified Util.Ajax          as AjaxUtil
import qualified View.Income.Header as Header
import           View.Income.Init   (Init (..))
import qualified View.Income.Table  as Table

data In t = In
  { _in_currentUser :: UserId
  , _in_currency    :: Currency
  , _in_init        :: Dynamic t (Loadable Init)
  }

init :: forall t m. MonadWidget t m => m (Dynamic t (Loadable Init))
init = do
  users <- AjaxUtil.getNow "api/users"
  incomes <- AjaxUtil.getNow "api/incomes"
  payments <- AjaxUtil.getNow "api/payments"
  return $ do
    us <- users
    is <- incomes
    ps <- payments
    return $ Init <$> us <*> is <*> ps

view :: forall t m. MonadWidget t m => In t -> m ()
view input = do
  R.dyn . R.ffor (_in_init input) . Loadable.view $ \init ->

    R.elClass "main" "income" $ do

      rec
        let addIncome = R.leftmost
              [ Header._out_add header
              , Table._out_add table
              ]

        incomes <- reduceIncomes
          (_init_incomes init)
          addIncome
          (Table._out_delete table)

        header <- Header.view $ Header.In
          { Header._in_init = init
          , Header._in_currency = _in_currency input
          , Header._in_incomes = incomes
          }

        table <- Table.view $ Table.In
          { Table._in_currentUser = _in_currentUser input
          , Table._in_init = init
          , Table._in_currency = _in_currency input
          , Table._in_incomes = incomes
          }

      return ()

  return ()

reduceIncomes
  :: forall t m. MonadWidget t m
  => [Income]
  -> Event t Income -- add income
  -> Event t Income -- delete income
  -> m (Dynamic t [Income])
reduceIncomes initIncomes add delete =
  R.foldDyn id initIncomes $ R.leftmost
    [ (:) <$> add
    , R.ffor delete (\p -> filter ((/= (_income_id p)) . _income_id))
    ]