aboutsummaryrefslogtreecommitdiff
path: root/client/src/View/Category/Category.hs
blob: 77a331a6f39dab32bf33f358c2113ac451b8e97b (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
83
84
85
86
87
88
89
90
91
92
{-# LANGUAGE ExplicitForAll #-}

module View.Category.Category
  ( 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          (Category, CategoryPage (..), Currency,
                                        User, UserId)
import qualified Common.Msg            as Msg

import qualified Component.Button      as Button
import qualified Component.Modal       as Modal
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 Util.Reflex           as ReflexUtil
import qualified View.Category.Form    as Form
import qualified View.Category.Reducer as Reducer
import qualified View.Category.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
    categoryPage <- Reducer.reducer $ Reducer.In
      { Reducer._in_page         = page
      , Reducer._in_addCategory    = R.leftmost [ headerAddCategory, tableAddCategory ]
      , Reducer._in_editCategory   = editCategory
      , Reducer._in_deleteCategory = deleteCategory
      }

    let eventFromResult :: forall a. ((Event t (), Table.Out t, Pages.Out t) -> Event t a) -> m (Event t a)
        eventFromResult op = ReflexUtil.flatten $ (Maybe.fromMaybe R.never . fmap op) <$> result

    page <- eventFromResult $ Pages._out_newPage . (\(_, _, c) -> c)
    headerAddCategory <- eventFromResult $ (\(a, _, _) -> a)
    tableAddCategory <- eventFromResult $ Table._out_add . (\(_, b, _) -> b)
    editCategory <- eventFromResult $ Table._out_edit . (\(_, b, _) -> b)
    deleteCategory <- eventFromResult $ Table._out_delete . (\(_, b, _) -> b)

    result <- Loadable.viewShowValueWhileLoading categoryPage $
      \(CategoryPage page categories count) -> do
        header <- headerView

        table <- Table.view $ Table.In
          { Table._in_currentUser = _in_currentUser input
          , Table._in_currency = _in_currency input
          , Table._in_categories = categories
          , 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 = page
          }

        return (header, table, pages)

  return ()

headerView :: forall t m. MonadWidget t m => m (Event t ())
headerView =
  R.divClass "titleButton" $ do
    R.el "h1" $
      R.text $
        Msg.get Msg.Category_Title

    addCategory <- Button._out_clic <$>
      (Button.view . Button.defaultIn . R.text $
        Msg.get Msg.Category_Add)

    addCategory <- Modal.view $ Modal.In
      { Modal._in_show    = addCategory
      , Modal._in_content = Form.view $ Form.In { Form._in_operation = Form.New }
      }

    return addCategory