okfn-brasil/serenata-de-amor

View on GitHub
jarbas/layers/elm/Reimbursement/RelatedTable/Update.elm

Summary

Maintainability
Test Coverage
module Reimbursement.RelatedTable.Update exposing (Msg(..), getReimbursementUrl, loadUrl, update, updateParentId)

import Array exposing (Array)
import Http
import Material
import Reimbursement.RelatedTable.Decoder exposing (decoder)
import Reimbursement.RelatedTable.Model exposing (Model, ReimbursementSummary, Results)
import String


type Msg
    = LoadRelatedTable (Result Http.Error Results)
    | MouseOver Int Bool
    | Mdl (Material.Msg Msg)


updateParentId : Int -> Model -> Model
updateParentId parentId model =
    { model | parentId = Just parentId }


updateReimbursements : Int -> Bool -> Array ReimbursementSummary -> Array ReimbursementSummary
updateReimbursements target mouseOver reimbursements =
    case Array.get target reimbursements of
        Just reimbursement ->
            Array.set target { reimbursement | over = mouseOver } reimbursements

        Nothing ->
            reimbursements


isParent : Model -> ReimbursementSummary -> Bool
isParent model result =
    case model.parentId of
        Just parentId ->
            result.documentId == parentId

        Nothing ->
            False


update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
    case msg of
        LoadRelatedTable (Ok results) ->
            let
                newReimbursements : Array ReimbursementSummary
                newReimbursements =
                    results.reimbursements
                        |> Array.filter (isParent model >> not)
                        |> Array.append model.results.reimbursements

                nextPageUrl : Maybe String
                nextPageUrl =
                    results.nextPageUrl

                newResults : Results
                newResults =
                    { reimbursements = newReimbursements, nextPageUrl = nextPageUrl }

                cmd : Cmd Msg
                cmd =
                    case nextPageUrl of
                        Just url ->
                            loadUrl url

                        Nothing ->
                            Cmd.none
            in
                ( { model | results = newResults }, cmd )

        LoadRelatedTable (Err error) ->
            let
                err =
                    Debug.log "ApiFail" (toString error)
            in
                ( model, Cmd.none )

        MouseOver target mouseOver ->
            let
                newReimbursements : Array ReimbursementSummary
                newReimbursements =
                    updateReimbursements target mouseOver model.results.reimbursements

                results : Results
                results =
                    model.results

                newResults : Results
                newResults =
                    { results | reimbursements = newReimbursements }
            in
                ( { model | results = newResults }, Cmd.none )

        Mdl mdlMsg ->
            Material.update mdlMsg model


getReimbursementUrl : ReimbursementSummary -> String
getReimbursementUrl reimbursement =
    String.join
        "/"
        [ "#"
        , "year"
        , reimbursement.year |> toString
        , "applicantId"
        , reimbursement.applicantId |> toString
        , "documentId"
        , reimbursement.documentId |> toString
        ]


loadUrl : String -> Cmd Msg
loadUrl url =
    Http.send
        LoadRelatedTable
        (Http.get url decoder)