| 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
 | {-# LANGUAGE ExplicitForAll #-}
module View.Income.Income
  ( view
  , In(..)
  ) where
import           Data.Aeson          (FromJSON)
import qualified Data.Maybe          as Maybe
import qualified Data.Text           as T
import           Reflex.Dom          (Dynamic, Event, MonadWidget)
import qualified Reflex.Dom          as R
import           Common.Model        (Currency, Income (..), IncomePage (..),
                                      User, UserId)
import qualified Component.Pages     as Pages
import           Loadable            (Loadable (..))
import qualified Loadable
import qualified Util.Ajax           as AjaxUtil
import qualified Util.Reflex         as ReflexUtil
import qualified View.Income.Header  as Header
import           View.Income.Init    (Init (..))
import qualified View.Income.Reducer as Reducer
import qualified View.Income.Table   as Table
data In t = In
  { _in_users       :: [User]
  , _in_currentUser :: UserId
  , _in_currency    :: Currency
  }
view :: forall t m. MonadWidget t m => In t -> m ()
view input = do
  rec
    incomes <- Reducer.reducer $ Reducer.In
      { Reducer._in_newPage      = newPage
      , Reducer._in_currentPage  = currentPage
      , Reducer._in_addIncome    = R.leftmost [headerAddIncome, tableAddIncome]
      , Reducer._in_editIncome   = editIncome
      , Reducer._in_deleteIncome = deleteIncome
      }
    let eventFromResult :: forall a. ((Header.Out t, Table.Out t, Pages.Out t) -> Event t a) -> m (Event t a)
        eventFromResult op = ReflexUtil.flatten . fmap (Maybe.fromMaybe R.never . fmap op) $ result
    newPage <- eventFromResult $ Pages._out_newPage . (\(_, _, c) -> c)
    currentPage <- R.holdDyn 1 newPage
    headerAddIncome <- eventFromResult $ Header._out_add . (\(a, _, _) -> a)
    tableAddIncome <- eventFromResult $ Table._out_add . (\(_, b, _) -> b)
    editIncome <- eventFromResult $ Table._out_edit . (\(_, b, _) -> b)
    deleteIncome <- eventFromResult $ Table._out_delete . (\(_, b, _) -> b)
    result <- R.dyn . R.ffor ((,) <$> incomes <*> currentPage) $ \(is, p) ->
      flip Loadable.view is $ \(IncomePage header incomes count) -> do
        header <- Header.view $ Header.In
          { Header._in_users = _in_users input
          , Header._in_header = header
          , Header._in_currency = _in_currency input
          }
        table <- Table.view $ Table.In
          { Table._in_currentUser = _in_currentUser input
          , Table._in_currency = _in_currency input
          , Table._in_incomes = incomes
          , Table._in_users = _in_users input
          }
        pages <- Pages.view $ Pages.In
          { Pages._in_total = R.constDyn count
          , Pages._in_perPage = Reducer.perPage
          , Pages._in_page = p
          }
        return (header, table, pages)
  return ()
 |