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
|
module View.LoggedIn.Monthly
( monthlyPayments
) where
import String
import Signal exposing (Address)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Model exposing (Model)
import Model.Payment as Payment exposing (Payments, Payment)
import Model.Translations exposing (getMessage, getParamMessage)
import Model.Action exposing (..)
import Model.Action.LoggedInAction as LoggedInAction exposing (..)
import Model.Action.MonthlyAction exposing (..)
import Model.View.LoggedIn.Monthly exposing (Monthly)
import Model.View.LoggedInView exposing (LoggedInView)
import View.Icon exposing (renderIcon)
import View.Expand exposing (..)
import View.Price exposing (price)
monthlyPayments : Address Action -> Model -> LoggedInView -> Html
monthlyPayments address model loggedInView =
let monthly = loggedInView.monthly
in if List.length monthly.payments == 0
then
text ""
else
div
[ classList
[ ("monthlyPayments", True)
, ("detail", monthly.visibleDetail)
]
]
[ monthlyCount address model monthly
, if monthly.visibleDetail then paymentsTable address model loggedInView monthly else text ""
]
monthlyCount : Address Action -> Model -> Monthly -> Html
monthlyCount address model monthly =
let count = List.length monthly.payments
total = List.sum << List.map .cost <| monthly.payments
key = if count > 1 then "PluralMonthlyCount" else "SingularMonthlyCount"
in button
[ class "header"
, onClick address (UpdateLoggedIn << UpdateMonthly <| ToggleDetail)
]
[ text (getParamMessage [toString count, price model total] key model.translations)
, expand ExpandDown monthly.visibleDetail
]
paymentsTable : Address Action -> Model -> LoggedInView -> Monthly -> Html
paymentsTable address model loggedInView monthly =
div
[ class "table" ]
( monthly.payments
|> List.sortBy (String.toLower << .name)
|> List.map (paymentLine address model loggedInView)
)
paymentLine : Address Action -> Model -> LoggedInView -> Payment -> Html
paymentLine address model loggedInView payment =
a
[ classList
[ ("row", True)
, ("edition", loggedInView.paymentEdition == Just payment.id)
]
, onClick address (UpdateLoggedIn (ToggleEdit payment.id))
]
[ div [ class "cell category" ] [ text (payment.name) ]
, div
[ classList
[ ("cell cost", True)
, ("refund", payment.cost < 0)
]
]
[ text (price model payment.cost) ]
, div
[ class "cell delete"
, onClick address (UpdateLoggedIn <| LoggedInAction.DeletePayment payment Payment.Monthly)
]
[ button [] [ renderIcon "times" ]
]
]
|