aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/LoggedIn/Home/Account/View.elm
blob: 252f8cf6ac3afac63a8002d70f5c659660b1a377 (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
module LoggedIn.Home.Account.View
  ( view
  ) where

import List
import Signal exposing (Address)

import Html exposing (..)
import Html as H exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)

import LoggedIn.Action as LoggedInAction

import LoggedIn.Home.Action as HomeAction
import LoggedIn.Home.Model as HomeModel
import LoggedIn.Home.Model.Payer exposing (..)
import LoggedIn.Home.View.Price exposing (price)
import LoggedIn.Home.View.Expand exposing (..)

import LoggedIn.Home.Account.Action as AccountAction
import LoggedIn.Home.Account.Model as AccountModel

import Model exposing (Model)
import Model.User exposing (getUserName)
import Model.Translations exposing (getParamMessage, getMessage)
import Action exposing (..)

import View.Events exposing (onSubmitPrevDefault)

import Utils.Either exposing (toMaybeError)

view : Address Action -> Model -> HomeModel.Model -> Html
view address model homeModel =
  let account = homeModel.account
  in  div
        [ classList
            [ ("account", True)
            , ("detail", account.visibleDetail)
            ]
        ]
        [ exceedingPayers address model homeModel
        , if account.visibleDetail
            then income address model account
            else text ""
        ]

exceedingPayers : Address Action -> Model -> HomeModel.Model -> Html
exceedingPayers address model homeModel =
  button
    [ class "header"
    , onClick address (UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdateAccount <| AccountAction.ToggleDetail)
    ]
    (  (List.map (exceedingPayer model homeModel) (getOrderedExceedingPayers model.currentTime homeModel.users homeModel.account.incomes homeModel.payments))
    ++ [ expand ExpandDown homeModel.account.visibleDetail ]
    )

exceedingPayer : Model -> HomeModel.Model -> ExceedingPayer -> Html
exceedingPayer model homeModel payer =
  div
    [ class "exceedingPayer" ]
    [ span
        [ class "userName" ]
        [ payer.userId
            |> getUserName homeModel.users
            |> Maybe.withDefault "−"
            |> text
        ]
    , span
        [ class "amount" ]
        [ text ("+ " ++ (price model payer.amount)) ]
    ]

income : Address Action -> Model -> AccountModel.Model -> Html
income address model account =
  case account.incomeEdition of
    Nothing ->
      incomeRead address model account
    Just edition ->
      incomeEdition address model account edition

incomeRead : Address Action -> Model -> AccountModel.Model -> Html
incomeRead address model account =
  div
    [ class "income" ]
    [ ( case AccountModel.getCurrentIncome account of
          Nothing ->
            text (getMessage "NoIncome" model.translations)
          Just income ->
            text (getParamMessage [price model income] "Income" model.translations)
      )
    , toggleIncomeEdition address "editIncomeEdition" (getMessage "Edit" model.translations)
    ]

incomeEdition : Address Action -> Model -> AccountModel.Model -> AccountModel.IncomeEdition -> Html
incomeEdition address model account edition =
  H.form
    [ case AccountModel.validateIncome edition.income model.translations of
        Ok validatedAmount ->
          onSubmitPrevDefault address (UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdateAccount <| AccountAction.UpdateIncome model.currentTime validatedAmount)
        Err error ->
          onSubmitPrevDefault address (UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdateAccount << AccountAction.UpdateEditionError <| error)
    , class "income"
    ]
    [ label
        [ for "incomeInput" ]
        [ text (getMessage "NewIncome" model.translations) ]
    , input
        [ id "incomeInput"
        , value edition.income
        , on "input" targetValue (Signal.message address << UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdateAccount << AccountAction.UpdateIncomeEdition)
        , maxlength 10
        ]
        []
    , button
        [ type' "submit"
        , class "validateIncomeEdition"
        ]
        [ text (getMessage "Validate" model.translations) ]
    , toggleIncomeEdition address "undoIncomeEdition" (getMessage "Undo" model.translations)
    , case edition.error of
        Just error -> div [ class "error" ] [ text error ]
        Nothing -> text ""
    ]

toggleIncomeEdition : Address Action -> String -> String -> Html
toggleIncomeEdition address className name =
  button
    [ type' "button"
    , class className
    , onClick address (UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdateAccount <| AccountAction.ToggleIncomeEdition)
    ]
    [ text name ]