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

import String

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

import Update exposing (..)
import Update.LoggedIn exposing (..)
import Update.LoggedIn.Monthly exposing (..)

import Model exposing (Model)
import Model.View.LoggedIn.Monthly exposing (Monthly)
import Model.Payment exposing (Payments, Payment)
import Model.View.LoggedInView exposing (LoggedInView)
import Model.Translations exposing (getMessage, getParamMessage)

import ServerCommunication as SC exposing (serverCommunications)

import View.Icon exposing (renderIcon)
import View.Expand exposing (..)
import View.Price exposing (price)

monthlyPayments : Model -> LoggedInView -> Html
monthlyPayments model loggedInView =
  let monthly = loggedInView.monthly
  in  if List.length monthly.payments == 0
        then
          text ""
        else
          div
            [ classList
                [ ("monthlyPayments", True)
                , ("detail", monthly.visibleDetail)
                ]
            ]
            [ monthlyCount model monthly
            , if monthly.visibleDetail then paymentsTable model loggedInView monthly else text ""
            ]

monthlyCount : Model -> Monthly -> Html
monthlyCount 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 actions.address (UpdateLoggedIn << UpdateMonthly <| ToggleDetail)
        ]
        [ text (getParamMessage [toString count, price model total] key model.translations)
        , expand ExpandDown monthly.visibleDetail
        ]

paymentsTable : Model -> LoggedInView -> Monthly -> Html
paymentsTable model loggedInView monthly =
  div
    [ class "table" ]
    ( monthly.payments
        |> List.sortBy (String.toLower << .name)
        |> List.map (paymentLine model loggedInView)
    )

paymentLine : Model -> LoggedInView -> Payment -> Html
paymentLine model loggedInView payment =
  a
    [ classList
        [ ("row", True)
        , ("edition", loggedInView.paymentEdition == Just payment.id)
        ]
    , onClick actions.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 serverCommunications.address (SC.DeleteMonthlyPayment payment.id)
        ]
        [ button [] [ renderIcon "times" ]
        ]
    ]