aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/LoggedIn/AddPayment
diff options
context:
space:
mode:
authorJoris2016-03-27 21:13:37 +0200
committerJoris2016-03-27 21:13:37 +0200
commit0c9d2b91e73f045067f7bcce6e4235fc9008f309 (patch)
tree6aa101db10b72408a9cfa256312cb34e7ec22dff /src/client/elm/LoggedIn/AddPayment
parent7c050fe2d2c3e8f190e019e1613d37b9d8ef22b9 (diff)
downloadbudget-0c9d2b91e73f045067f7bcce6e4235fc9008f309.tar.gz
budget-0c9d2b91e73f045067f7bcce6e4235fc9008f309.tar.bz2
budget-0c9d2b91e73f045067f7bcce6e4235fc9008f309.zip
Regroup add payment modules
Diffstat (limited to 'src/client/elm/LoggedIn/AddPayment')
-rw-r--r--src/client/elm/LoggedIn/AddPayment/Action.elm11
-rw-r--r--src/client/elm/LoggedIn/AddPayment/Model.elm29
-rw-r--r--src/client/elm/LoggedIn/AddPayment/Update.elm55
-rw-r--r--src/client/elm/LoggedIn/AddPayment/View.elm127
4 files changed, 222 insertions, 0 deletions
diff --git a/src/client/elm/LoggedIn/AddPayment/Action.elm b/src/client/elm/LoggedIn/AddPayment/Action.elm
new file mode 100644
index 0000000..41d4f5b
--- /dev/null
+++ b/src/client/elm/LoggedIn/AddPayment/Action.elm
@@ -0,0 +1,11 @@
+module LoggedIn.AddPayment.Action
+ ( Action(..)
+ ) where
+
+type Action =
+ NoOp
+ | UpdateName String
+ | UpdateCost String
+ | AddError (Maybe String) (Maybe String)
+ | ToggleFrequency
+ | WaitingServer
diff --git a/src/client/elm/LoggedIn/AddPayment/Model.elm b/src/client/elm/LoggedIn/AddPayment/Model.elm
new file mode 100644
index 0000000..2aa32c2
--- /dev/null
+++ b/src/client/elm/LoggedIn/AddPayment/Model.elm
@@ -0,0 +1,29 @@
+module LoggedIn.AddPayment.Model
+ ( Model
+ , init
+ ) where
+
+import Result as Result exposing (Result(..))
+import Json.Decode exposing ((:=))
+
+import Model.Translations exposing (..)
+import Model.Payment exposing (PaymentFrequency(..))
+
+type alias Model =
+ { name : String
+ , nameError : Maybe String
+ , cost : String
+ , costError : Maybe String
+ , frequency : PaymentFrequency
+ , waitingServer : Bool
+ }
+
+init : PaymentFrequency -> Model
+init frequency =
+ { name = ""
+ , nameError = Nothing
+ , cost = ""
+ , costError = Nothing
+ , frequency = frequency
+ , waitingServer = False
+ }
diff --git a/src/client/elm/LoggedIn/AddPayment/Update.elm b/src/client/elm/LoggedIn/AddPayment/Update.elm
new file mode 100644
index 0000000..eb4384b
--- /dev/null
+++ b/src/client/elm/LoggedIn/AddPayment/Update.elm
@@ -0,0 +1,55 @@
+module LoggedIn.AddPayment.Update
+ ( update
+ , addPaymentError
+ ) where
+
+import Maybe
+import Json.Decode as Json exposing ((:=))
+
+import LoggedIn.AddPayment.Action as AddPaymentAction
+import LoggedIn.AddPayment.Model as AddPaymentModel
+
+import Model.Translations exposing (Translations, getMessage)
+import Model.Payment exposing (PaymentFrequency(..))
+
+update : AddPaymentAction.Action -> AddPaymentModel.Model -> AddPaymentModel.Model
+update action addPayment =
+ case action of
+
+ AddPaymentAction.NoOp ->
+ addPayment
+
+ AddPaymentAction.UpdateName name ->
+ { addPayment | name = name }
+
+ AddPaymentAction.UpdateCost cost ->
+ { addPayment | cost = cost }
+
+ AddPaymentAction.AddError nameError costError ->
+ { addPayment
+ | nameError = nameError
+ , costError = costError
+ , waitingServer = False
+ }
+
+ AddPaymentAction.ToggleFrequency ->
+ { addPayment
+ | frequency = if addPayment.frequency == Punctual then Monthly else Punctual
+ }
+
+ AddPaymentAction.WaitingServer ->
+ { addPayment | waitingServer = True }
+
+addPaymentError : Translations -> String -> Maybe AddPaymentAction.Action
+addPaymentError translations jsonErr =
+ let decoder =
+ Json.object2 (,)
+ (Json.maybe <| "name" := Json.string)
+ (Json.maybe <| "cost" := Json.string)
+ in case Json.decodeString decoder jsonErr of
+ Err _ ->
+ Nothing
+ Ok (mbNameKey, mbCostKey) ->
+ Just <| AddPaymentAction.AddError
+ (Maybe.map (flip getMessage translations) mbNameKey)
+ (Maybe.map (flip getMessage translations) mbCostKey)
diff --git a/src/client/elm/LoggedIn/AddPayment/View.elm b/src/client/elm/LoggedIn/AddPayment/View.elm
new file mode 100644
index 0000000..50f7708
--- /dev/null
+++ b/src/client/elm/LoggedIn/AddPayment/View.elm
@@ -0,0 +1,127 @@
+module LoggedIn.AddPayment.View
+ ( view
+ ) where
+
+import Result exposing (..)
+import Signal exposing (Address)
+
+import Html as H exposing (..)
+import Html.Attributes exposing (..)
+import Html.Events exposing (..)
+
+import LoggedIn.Action as LoggedInAction
+import LoggedIn.Model as LoggedInModel
+
+import LoggedIn.AddPayment.Action as AddPaymentAction
+import LoggedIn.AddPayment.Model as AddPaymentModel
+
+import Model exposing (Model)
+import Model.Payment exposing (PaymentFrequency(..))
+import Model.Translations exposing (getMessage)
+import Model.Action as Action exposing (..)
+
+import View.Events exposing (onSubmitPrevDefault)
+import View.Icon exposing (..)
+
+import Utils.Maybe exposing (isJust)
+import Utils.Either exposing (toMaybeError)
+
+view : Address Action -> Model -> LoggedInModel.Model -> Html
+view address model loggedInModel =
+ H.form
+ [ let update =
+ if loggedInModel.add.waitingServer
+ then
+ Action.NoOp
+ else
+ UpdateLoggedIn <| LoggedInAction.AddPayment loggedInModel.add.name loggedInModel.add.cost loggedInModel.add.frequency
+ in onSubmitPrevDefault address update
+ , class "addPayment"
+ ]
+ [ addPaymentName address loggedInModel.add
+ , addPaymentCost address model loggedInModel.add
+ , paymentFrequency address model loggedInModel.add
+ , button
+ [ type' "submit"
+ , classList
+ [ ("add", True)
+ , ("waitingServer", loggedInModel.add.waitingServer)
+ ]
+ ]
+ [ text (getMessage "Add" model.translations)
+ , if loggedInModel.add.waitingServer then renderSpinIcon else text ""
+ ]
+ ]
+
+addPaymentName : Address Action -> AddPaymentModel.Model -> Html
+addPaymentName address addPayment =
+ div
+ [ classList
+ [ ("name", True)
+ , ("error", isJust addPayment.nameError)
+ ]
+ ]
+ [ input
+ [ id "nameInput"
+ , value addPayment.name
+ , on "input" targetValue (Signal.message address << UpdateLoggedIn << LoggedInAction.UpdateAdd << AddPaymentAction.UpdateName)
+ , maxlength 20
+ ]
+ []
+ , label
+ [ for "nameInput" ]
+ [ renderIcon "shopping-cart" ]
+ , case addPayment.nameError of
+ Just error ->
+ div [ class "errorMessage" ] [ text error ]
+ Nothing ->
+ text ""
+ ]
+
+addPaymentCost : Address Action -> Model -> AddPaymentModel.Model -> Html
+addPaymentCost address model addPayment =
+ div
+ [ classList
+ [ ("cost", True)
+ , ("error", isJust addPayment.costError)
+ ]
+ ]
+ [ input
+ [ id "costInput"
+ , value addPayment.cost
+ , on "input" targetValue (Signal.message address << UpdateLoggedIn << LoggedInAction.UpdateAdd << AddPaymentAction.UpdateCost)
+ , maxlength 7
+ ]
+ []
+ , label
+ [ for "costInput" ]
+ [ text model.conf.currency ]
+ , case addPayment.costError of
+ Just error ->
+ div [ class "errorMessage" ] [ text error ]
+ Nothing ->
+ text ""
+ ]
+
+paymentFrequency : Address Action -> Model -> AddPaymentModel.Model -> Html
+paymentFrequency address model addPayment =
+ button
+ [ type' "button"
+ , class "frequency"
+ , onClick address (UpdateLoggedIn << LoggedInAction.UpdateAdd <| AddPaymentAction.ToggleFrequency)
+ ]
+ [ div
+ [ classList
+ [ ("punctual", True)
+ , ("selected", addPayment.frequency == Punctual)
+ ]
+ ]
+ [ text (getMessage "Punctual" model.translations) ]
+ , div
+ [ classList
+ [ ("monthly", True)
+ , ("selected", addPayment.frequency == Monthly)
+ ]
+ ]
+ [ text (getMessage "Monthly" model.translations) ]
+ ]