module View.LoggedIn.Account ( account ) where import Html exposing (..) import Html as H exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import List import ServerCommunication as SC exposing (serverCommunications) import Update exposing (..) import Update.LoggedIn exposing (..) import Update.LoggedIn.Account exposing (..) import Model exposing (Model) import Model.User exposing (getUserName) import Model.Payer exposing (..) import Model.View.LoggedInView exposing (LoggedInView) import Model.Translations exposing (getParamMessage, getMessage) import Model.View.LoggedIn.Account exposing (..) import View.Expand exposing (..) import View.Price exposing (price) import View.Events exposing (onSubmitPrevDefault) import Utils.Either exposing (toMaybeError) account : Model -> LoggedInView -> Html account model loggedInView = let account = loggedInView.account in div [ classList [ ("account", True) , ("detail", account.visibleDetail) ] ] [ exceedingPayers model loggedInView , if account.visibleDetail then income model account else text "" ] exceedingPayers : Model -> LoggedInView -> Html exceedingPayers model loggedInView = button [ class "header" , onClick actions.address (UpdateLoggedIn << UpdateAccount <| ToggleDetail) ] ( (List.map (exceedingPayer model loggedInView) (getOrderedExceedingPayers model.currentTime loggedInView.account.payers)) ++ [ expand ExpandDown loggedInView.account.visibleDetail ] ) exceedingPayer : Model -> LoggedInView -> ExceedingPayer -> Html exceedingPayer model loggedInView payer = div [ class "exceedingPayer" ] [ span [ class "userName" ] [ payer.userId |> getUserName loggedInView.users |> Maybe.withDefault "−" |> text ] , span [ class "amount" ] [ text ("+ " ++ (price model payer.amount)) ] ] income : Model -> Account -> Html income model account = case account.incomeEdition of Just edition -> incomeEdition model account edition Nothing -> incomeRead model account incomeRead : Model -> Account -> Html incomeRead model account = div [ class "income" ] [ ( case getCurrentIncome account of Nothing -> text (getMessage "NoIncome" model.translations) Just income -> text (getParamMessage [price model income] "Income" model.translations) ) , toggleIncomeEdition "editIncomeEdition" (getMessage "Edit" model.translations) ] incomeEdition : Model -> Account -> IncomeEdition -> Html incomeEdition model account edition = H.form [ case validateIncome edition.income model.translations of Ok validatedAmount -> onSubmitPrevDefault serverCommunications.address (SC.SetIncome model.currentTime validatedAmount) Err error -> onSubmitPrevDefault actions.address (UpdateLoggedIn << UpdateAccount << UpdateEditionError <| error) , class "income" ] [ label [ for "incomeInput" ] [ text (getMessage "NewIncome" model.translations) ] , input [ id "incomeInput" , value edition.income , on "input" targetValue (Signal.message actions.address << UpdateLoggedIn << UpdateAccount << UpdateIncomeEdition) , maxlength 10 ] [] , button [ type' "submit" , class "validateIncomeEdition" ] [ text (getMessage "Validate" model.translations) ] , toggleIncomeEdition "undoIncomeEdition" (getMessage "Undo" model.translations) , case edition.error of Just error -> div [ class "error" ] [ text error ] Nothing -> text "" ] toggleIncomeEdition : String -> String -> Html toggleIncomeEdition className name = button [ type' "button" , class className , onClick actions.address (UpdateLoggedIn << UpdateAccount <| ToggleIncomeEdition) ] [ text name ]