diff options
Diffstat (limited to 'src/client/elm/LoggedIn/Income')
-rw-r--r-- | src/client/elm/LoggedIn/Income/Action.elm | 9 | ||||
-rw-r--r-- | src/client/elm/LoggedIn/Income/Model.elm | 46 | ||||
-rw-r--r-- | src/client/elm/LoggedIn/Income/Update.elm | 25 | ||||
-rw-r--r-- | src/client/elm/LoggedIn/Income/View.elm | 95 |
4 files changed, 175 insertions, 0 deletions
diff --git a/src/client/elm/LoggedIn/Income/Action.elm b/src/client/elm/LoggedIn/Income/Action.elm new file mode 100644 index 0000000..68b343a --- /dev/null +++ b/src/client/elm/LoggedIn/Income/Action.elm @@ -0,0 +1,9 @@ +module LoggedIn.Income.Action + ( Action(..) + ) where + +import Form exposing (Form) + +type Action = + NoOp + | AddIncomeAction Form.Action diff --git a/src/client/elm/LoggedIn/Income/Model.elm b/src/client/elm/LoggedIn/Income/Model.elm new file mode 100644 index 0000000..fdfb964 --- /dev/null +++ b/src/client/elm/LoggedIn/Income/Model.elm @@ -0,0 +1,46 @@ +module LoggedIn.Income.Model + ( Model + , AddIncome + , init + ) where + +import String exposing (toInt, split) +import Date exposing (Date) +import Date.Utils exposing (dateFromFields) +import Utils.Date exposing (numToMonth) + +import Form exposing (Form) +import Form.Validate as Validate exposing (..) +import Form.Error exposing (Error(InvalidString)) + +type alias Model = + { addIncome : Form () AddIncome + } + +type alias AddIncome = + { creation : Date + , amount : Int + } + +init : Model +init = + { addIncome = Form.initial [] validate + } + +validate : Validation () AddIncome +validate = + form2 AddIncome + (get "creation" dateValidation) + (get "amount" (int `andThen` (minInt 1))) + +dateValidation : Validation () Date +dateValidation = + customValidation string (\str -> + case split "/" str of + [day, month, year] -> + case (toInt day, toInt month, toInt year) of + (Ok dayNum, Ok monthNum, Ok yearNum) -> + Ok (dateFromFields yearNum (numToMonth monthNum) dayNum 0 0 0 0) + _ -> Err InvalidString + _ -> Err InvalidString + ) diff --git a/src/client/elm/LoggedIn/Income/Update.elm b/src/client/elm/LoggedIn/Income/Update.elm new file mode 100644 index 0000000..4e673fa --- /dev/null +++ b/src/client/elm/LoggedIn/Income/Update.elm @@ -0,0 +1,25 @@ +module LoggedIn.Income.Update + ( update + ) where + +import Effects exposing (Effects) +import Form exposing (Form) + +import LoggedData exposing (LoggedData) + +import LoggedIn.Income.Model as IncomeModel +import LoggedIn.Income.Action as IncomeAction + +update : LoggedData -> IncomeAction.Action -> IncomeModel.Model -> (IncomeModel.Model, Effects IncomeAction.Action) +update loggedData action model = + case action of + + IncomeAction.NoOp -> + ( model + , Effects.none + ) + + IncomeAction.AddIncomeAction formAction -> + ( { model | addIncome = Form.update formAction model.addIncome } + , Effects.none + ) diff --git a/src/client/elm/LoggedIn/Income/View.elm b/src/client/elm/LoggedIn/Income/View.elm new file mode 100644 index 0000000..010b503 --- /dev/null +++ b/src/client/elm/LoggedIn/Income/View.elm @@ -0,0 +1,95 @@ +module LoggedIn.Income.View + ( view + ) where + +import Dict +import Date + +import Html exposing (..) +import Html.Events exposing (..) +import Html.Attributes exposing (..) +import Form exposing (Form) +import Form.Input as Input + +import LoggedData exposing (LoggedData) + +import Model.Income exposing (IncomeId, Income) +import Model.Translations exposing (getMessage) +import LoggedIn.Income.Model as IncomeModel + +import Mailbox + +import Action +import LoggedIn.Action as LoggedInAction +import LoggedIn.Income.Action as IncomeAction + +import LoggedIn.View.Date exposing (renderShortDate) +import LoggedIn.View.Price exposing (price) + +import Utils.Maybe exposing (isJust) + +view : LoggedData -> IncomeModel.Model -> Html +view loggedData incomeModel = + div + [] + [ h1 [] [ text <| getMessage "AddIncome" loggedData.translations ] + , addIncomeView loggedData incomeModel.addIncome + , h1 [] [ text <| getMessage "MonthlyNetIncomes" loggedData.translations ] + , incomesView loggedData + ] + +addIncomeView : LoggedData -> Form () IncomeModel.AddIncome -> Html +addIncomeView loggedData addIncome = + let + formAddress = Signal.forwardTo Mailbox.address (Action.UpdateLoggedIn << LoggedInAction.IncomeAction << IncomeAction.AddIncomeAction) + errorFor error field = + if isJust field.liveError + then div [ class "error" ] [ text (getMessage error loggedData.translations) ] + else text "" + creation = Form.getFieldAsString "creation" addIncome + amount = Form.getFieldAsString "amount" addIncome + in + div + [] + [ label [] [ text "Creation" ] + , Input.textInput creation formAddress [] + , errorFor "DateValidationError" creation + + , label [] [ text "amount" ] + , Input.textInput amount formAddress [] + , errorFor "IncomeValidationError" amount + + , button + [ case Form.getOutput addIncome of + Just data -> + onClick Mailbox.address (Action.UpdateLoggedIn <| LoggedInAction.AddIncome data.creation data.amount) + Nothing -> + onClick formAddress Form.Submit + ] + [ text (getMessage "Add" loggedData.translations) ] + ] + +incomesView : LoggedData -> Html +incomesView loggedData = + ol + [] + ( loggedData.incomes + |> Dict.toList + |> List.filter ((==) loggedData.me << .userId << snd) + |> List.sortBy (.creation << snd) + |> List.reverse + |> List.map (incomeView loggedData) + ) + +incomeView : LoggedData -> (IncomeId, Income) -> Html +incomeView loggedData (incomeId, income) = + li + [] + [ text <| renderShortDate (Date.fromTime income.creation) loggedData.translations + , text " − " + , text <| price loggedData.conf income.amount + , text " − " + , button + [ onClick Mailbox.address (Action.UpdateLoggedIn <| LoggedInAction.DeleteIncome incomeId) ] + [ text "x" ] + ] |