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

import String
import Signal exposing (Address)

import Html 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.View.Price exposing (price)
import LoggedIn.Home.View.Expand exposing (..)

import LoggedIn.Home.Monthly.Action as MonthlyAction
import LoggedIn.Home.Monthly.Model as MonthlyModel

import Model exposing (Model)
import Model.Payment as Payment exposing (Payments, Payment)
import Model.Translations exposing (getMessage, getParamMessage)
import Action exposing (..)

import View.Icon exposing (renderIcon)

view : Address Action -> Model -> HomeModel.Model -> Html
view address model homeModel =
  let monthly = homeModel.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 homeModel monthly else text ""
            ]

monthlyCount : Address Action -> Model -> MonthlyModel.Model -> 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 << LoggedInAction.HomeAction << HomeAction.UpdateMonthly <| MonthlyAction.ToggleDetail)
        ]
        [ text (getParamMessage [toString count, price model total] key model.translations)
        , expand ExpandDown monthly.visibleDetail
        ]

paymentsTable : Address Action -> Model -> HomeModel.Model -> MonthlyModel.Model -> Html
paymentsTable address model homeModel monthly =
  div
    [ class "table" ]
    ( monthly.payments
        |> List.sortBy (String.toLower << .name)
        |> List.map (paymentLine address model homeModel)
    )

paymentLine : Address Action -> Model -> HomeModel.Model -> Payment -> Html
paymentLine address model homeModel payment =
  a
    [ classList
        [ ("row", True)
        , ("edition", homeModel.paymentEdition == Just payment.id)
        ]
    , onClick address (UpdateLoggedIn << LoggedInAction.HomeAction <| HomeAction.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.HomeAction <| HomeAction.DeletePayment payment Payment.Monthly)
        ]
        [ button [] [ renderIcon "times" ]
        ]
    ]