aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Income/Income.hs
blob: b97613db91240818fab049465e3250e6af9292fd (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
module View.Income.Income
  ( init
  , view
  , In(..)
  ) where

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

import           Common.Model       (Currency)

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_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_addIncome header
              , Table._out_addIncome table
              ]
        incomes <- R.foldDyn
          (:)
          (_init_incomes init)
          addIncome

        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_init = init
          , Table._in_currency = _in_currency input
          , Table._in_incomes = incomes
          }

      return ()

  return ()