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
|
module LoggedIn.Income.View exposing
( view
)
import Dict
import Date
import Time exposing (Time)
import Color
import FontAwesome
import Html exposing (..)
import Html.Events exposing (..)
import Html.Attributes exposing (..)
import Html.App as Html
import Form exposing (Form)
import Msg exposing (Msg)
import LoggedData exposing (LoggedData)
import Model.Income exposing (IncomeId, Income, userCumulativeIncomeSince)
import Model.Translations exposing (getMessage, getParamMessage)
import Model.Payer exposing (useIncomesFrom)
import Model.User exposing (UserId, User)
import LoggedIn.Income.Model as IncomeModel
import LoggedIn.Msg as LoggedInMsg
import LoggedIn.Income.Msg as IncomeMsg
import LoggedIn.View.Date exposing (renderShortDate)
import LoggedIn.View.Format as Format
import LoggedIn.View.Date exposing (renderLongDate)
import View.Events exposing (onSubmitPrevDefault)
import View.Form as Form
import View.Color as Color
view : LoggedData -> IncomeModel.Model -> Html Msg
view loggedData incomeModel =
div
[ class "income" ]
[ case useIncomesFrom loggedData.users loggedData.incomes loggedData.payments of
Just since -> cumulativeIncomesView loggedData since
Nothing -> text ""
, h1 [] [ text <| getMessage "MonthlyNetIncomes" loggedData.translations ]
, addIncomeView loggedData incomeModel.addIncome
, incomesView loggedData
]
cumulativeIncomesView : LoggedData -> Time -> Html Msg
cumulativeIncomesView loggedData since =
let longDate = renderLongDate (Date.fromTime since) loggedData.translations
in div
[]
[ h1 [] [ text <| getParamMessage [longDate] "CumulativeIncomesSince" loggedData.translations ]
, ul
[]
( Dict.toList loggedData.users
|> List.map (\(userId, user) ->
(user.name, userCumulativeIncomeSince loggedData.currentTime since loggedData.incomes userId)
)
|> List.sortBy snd
|> List.map (\(userName, cumulativeIncome) ->
li
[]
[ text userName
, text " − "
, text <| Format.price loggedData.conf cumulativeIncome
]
)
)
]
addIncomeView : LoggedData -> Form String IncomeModel.AddIncome -> Html Msg
addIncomeView loggedData addIncome =
let htmlMap = Html.map (Msg.UpdateLoggedIn << LoggedInMsg.IncomeMsg << IncomeMsg.AddIncomeMsg)
in Html.form
[ onSubmitPrevDefault Msg.NoOp ]
[ Form.textInput loggedData.translations addIncome htmlMap "creation"
, Form.textInput loggedData.translations addIncome htmlMap "amount"
, button
[ case Form.getOutput addIncome of
Just data ->
onClick (Msg.UpdateLoggedIn <| LoggedInMsg.AddIncome data.time data.amount)
Nothing ->
onClick (Msg.UpdateLoggedIn <| LoggedInMsg.IncomeMsg <| IncomeMsg.AddIncomeMsg <| Form.Submit)
]
[ text (getMessage "Add" loggedData.translations) ]
]
incomesView : LoggedData -> Html Msg
incomesView loggedData =
ul
[ class "incomes" ]
( loggedData.incomes
|> Dict.toList
|> List.filter ((==) loggedData.me << .userId << snd)
|> List.sortBy (.time << snd)
|> List.reverse
|> List.map (incomeView loggedData)
)
incomeView : LoggedData -> (IncomeId, Income) -> Html Msg
incomeView loggedData (incomeId, income) =
li
[]
[ text <| renderShortDate (Date.fromTime income.time) loggedData.translations
, text " − "
, text <| Format.price loggedData.conf income.amount
, button
[ onClick (Msg.UpdateLoggedIn <| LoggedInMsg.DeleteIncome incomeId) ]
[ FontAwesome.remove Color.chestnutRose 14 ]
]
|