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))
]
|