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