aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/LoggedIn/Income
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/elm/LoggedIn/Income')
-rw-r--r--src/client/elm/LoggedIn/Income/Action.elm9
-rw-r--r--src/client/elm/LoggedIn/Income/Model.elm46
-rw-r--r--src/client/elm/LoggedIn/Income/Update.elm25
-rw-r--r--src/client/elm/LoggedIn/Income/View.elm95
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" ]
+ ]