aboutsummaryrefslogtreecommitdiff
path: root/src/client/View/LoggedIn/Account.elm
blob: 7e383f3fba13ab0cf1bbe95deb327b821ae7c127 (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
module View.LoggedIn.Account
  ( account
  ) where

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

import ServerCommunication as SC exposing (serverCommunications)

import Update exposing (..)
import Update.LoggedIn exposing (..)
import Update.LoggedIn.Account exposing (..)

import Model exposing (Model)
import Model.User exposing (getUserName)
import Model.Payers exposing (..)
import Model.View.LoggedInView exposing (LoggedInView)
import Model.Translations exposing (getParamMessage, getMessage)
import Model.View.LoggedIn.Account exposing (..)

import View.Expand exposing (..)
import View.Price exposing (price)
import View.Events exposing (onSubmitPrevDefault)

import Utils.Either exposing (toMaybeError)

account : Model -> LoggedInView -> Html
account model loggedInView =
  let account = loggedInView.account
  in  div
        [ classList
            [ ("account", True)
            , ("detail", account.visibleDetail)
            ]
        ]
        [ exceedingPayers model loggedInView
        , if account.visibleDetail
            then income model account
            else text ""
        ]

exceedingPayers : Model -> LoggedInView -> Html
exceedingPayers model loggedInView =
  button
    [ class "header"
    , onClick actions.address (UpdateLoggedIn << UpdateAccount <| ToggleDetail)
    ]
    (  (List.map (exceedingPayer model loggedInView) (getOrderedExceedingPayers loggedInView.account.payers))
    ++ [ expand ExpandDown loggedInView.account.visibleDetail ]
    )

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

income : Model -> Account -> Html
income model account =
  case account.incomeEdition of
    Just edition ->
      incomeEdition model account edition
    Nothing ->
      incomeRead model account

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

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

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