module LoggedIn.Home.AddPayment.View exposing ( view ) import Result exposing (..) import Json.Decode as Json import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Msg exposing (Msg) import LoggedIn.Msg as LoggedInMsg import LoggedIn.Home.Msg as HomeMsg import LoggedIn.Home.Model as HomeModel import LoggedIn.Home.AddPayment.Msg as AddPaymentMsg import LoggedIn.Home.AddPayment.Model as AddPaymentModel import Model.Payment exposing (Frequency(..)) import Model.Translations exposing (getMessage) import LoggedData exposing (LoggedData) import View.Events exposing (onSubmitPrevDefault) import View.Icon exposing (..) import Utils.Maybe exposing (isJust) import Utils.Either exposing (toMaybeError) view : LoggedData -> HomeModel.Model -> Html Msg view loggedData homeModel = Html.form [ let update = if homeModel.add.waitingServer then Msg.NoOp else Msg.UpdateLoggedIn <| LoggedInMsg.AddPayment homeModel.add.name homeModel.add.cost homeModel.add.frequency in onSubmitPrevDefault update , class "addPayment" ] [ addPaymentName loggedData homeModel.add , addPaymentCost loggedData homeModel.add , paymentFrequency loggedData homeModel.add , button [ type' "submit" , classList [ ("add", True) , ("waitingServer", homeModel.add.waitingServer) ] ] [ text (getMessage "Add" loggedData.translations) , if homeModel.add.waitingServer then renderSpinIcon else text "" ] ] addPaymentName : LoggedData -> AddPaymentModel.Model -> Html Msg addPaymentName loggedData addPayment = div [ classList [ ("name", True) , ("error", isJust addPayment.nameError) ] ] [ input [ id "nameInput" , value addPayment.name , on "input" (targetValue |> (Json.map <| Msg.UpdateLoggedIn << LoggedInMsg.HomeMsg << HomeMsg.UpdateAdd << AddPaymentMsg.UpdateName)) , maxlength 20 ] [] , label [ for "nameInput" ] [ renderIcon "shopping-cart" ] , case addPayment.nameError of Just error -> div [ class "errorMessage" ] [ text error ] Nothing -> text "" ] addPaymentCost : LoggedData -> AddPaymentModel.Model -> Html Msg addPaymentCost loggedData addPayment = div [ classList [ ("cost", True) , ("error", isJust addPayment.costError) ] ] [ input [ id "costInput" , value addPayment.cost , on "input" (targetValue |> (Json.map <| Msg.UpdateLoggedIn << LoggedInMsg.HomeMsg << HomeMsg.UpdateAdd << AddPaymentMsg.UpdateCost)) , maxlength 7 ] [] , label [ for "costInput" ] [ text loggedData.conf.currency ] , case addPayment.costError of Just error -> div [ class "errorMessage" ] [ text error ] Nothing -> text "" ] paymentFrequency : LoggedData -> AddPaymentModel.Model -> Html Msg paymentFrequency loggedData addPayment = button [ type' "button" , class "frequency" , onClick (Msg.UpdateLoggedIn << LoggedInMsg.HomeMsg << HomeMsg.UpdateAdd <| AddPaymentMsg.ToggleFrequency) ] [ div [ classList [ ("punctual", True) , ("selected", addPayment.frequency == Punctual) ] ] [ text (getMessage "Punctual" loggedData.translations) ] , div [ classList [ ("monthly", True) , ("selected", addPayment.frequency == Monthly) ] ] [ text (getMessage "Monthly" loggedData.translations) ] ]