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