module LoggedIn.Home.View.Paging ( paymentsPaging ) where import Signal exposing (Address) import Html 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 Action exposing (Action) import LoggedData exposing (LoggedData) import Model.Payment exposing (Payments, perPage) import View.Icon exposing (renderIcon) showedPages : Int showedPages = 5 paymentsPaging : Address Action -> Payments -> HomeModel.Model -> Html paymentsPaging address payments homeModel = let maxPage = ceiling (toFloat (List.length payments) / toFloat perPage) pages = truncatePages homeModel.currentPage [1..maxPage] in if maxPage == 1 then text "" else div [ class "pages" ] ( ( if homeModel.currentPage > 1 then [ firstPage address, previousPage address homeModel ] else [] ) ++ ( List.map (paymentsPage address homeModel) pages) ++ ( if homeModel.currentPage < maxPage then [ nextPage address homeModel, lastPage address maxPage ] else [] ) ) truncatePages : Int -> List Int -> List Int truncatePages currentPage pages = let totalPages = List.length pages showedLeftPages = ceiling ((toFloat showedPages - 1) / 2) showedRightPages = floor ((toFloat showedPages - 1) / 2) truncatedPages = if currentPage < showedLeftPages then [1..showedPages] else if currentPage > totalPages - showedRightPages then [(totalPages - showedPages)..totalPages] else [(currentPage - showedLeftPages)..(currentPage + showedRightPages)] in List.filter (flip List.member pages) truncatedPages firstPage : Address Action -> Html firstPage address = button [ class "page" , onClick address (Action.UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdatePage <| 1) ] [ renderIcon "fast-backward" ] previousPage : Address Action -> HomeModel.Model -> Html previousPage address homeModel = button [ class "page" , onClick address (Action.UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdatePage <| homeModel.currentPage - 1) ] [ renderIcon "backward" ] nextPage : Address Action -> HomeModel.Model -> Html nextPage address homeModel = button [ class "page" , onClick address (Action.UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdatePage <| homeModel.currentPage + 1) ] [ renderIcon "forward" ] lastPage : Address Action -> Int -> Html lastPage address maxPage = button [ class "page" , onClick address (Action.UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdatePage <| maxPage) ] [ renderIcon "fast-forward" ] paymentsPage : Address Action -> HomeModel.Model -> Int -> Html paymentsPage address homeModel page = let onCurrentPage = page == homeModel.currentPage in button [ classList [ ("page", True) , ("current", onCurrentPage) ] , onClick address <| if onCurrentPage then Action.NoOp else Action.UpdateLoggedIn << LoggedInAction.HomeAction << HomeAction.UpdatePage <| page ] [ text (toString page) ]