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.Format as Format import Utils.Maybe exposing (isJust) view : LoggedData -> IncomeModel.Model -> Html view loggedData incomeModel = div [ class "income" ] [ 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 = ul [] ( 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 <| Format.price loggedData.conf income.amount , text " − " , button [ onClick Mailbox.address (Action.UpdateLoggedIn <| LoggedInAction.DeleteIncome incomeId) ] [ text "x" ] ]