module View.Payments.Paging ( paymentsPaging ) where import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Model.View.LoggedView exposing (..) import Model.Payment exposing (perPage) import ServerCommunication as SC exposing (serverCommunications) import Update exposing (..) import Update.LoggedView exposing (..) import View.Icon exposing (renderIcon) showedPages : Int showedPages = 5 paymentsPaging : LoggedView -> Html paymentsPaging loggedView = let maxPage = ceiling (toFloat loggedView.paymentsCount / toFloat perPage) pages = truncatePages loggedView.currentPage [1..maxPage] in if maxPage == 1 then text "" else ul [ class "pages" ] ( ( if loggedView.currentPage > 1 then [ firstPage, previousPage loggedView ] else [] ) ++ ( List.map (paymentsPage loggedView) pages) ++ ( if loggedView.currentPage < maxPage then [ nextPage loggedView, lastPage 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 -> [1..showedPages] | currentPage > totalPages - showedRightPages -> [(totalPages - showedPages)..totalPages] | otherwise -> [(currentPage - showedLeftPages)..(currentPage + showedRightPages)] in List.filter (flip List.member pages) truncatedPages firstPage : Html firstPage = li [ class "page" , onClick serverCommunications.address (SC.UpdatePage 1) ] [ renderIcon "fast-backward" ] previousPage : LoggedView -> Html previousPage loggedView = li [ class "page" , onClick serverCommunications.address (SC.UpdatePage (loggedView.currentPage - 1)) ] [ renderIcon "backward" ] nextPage : LoggedView -> Html nextPage loggedView = li [ class "page" , onClick serverCommunications.address (SC.UpdatePage (loggedView.currentPage + 1)) ] [ renderIcon "forward" ] lastPage : Int -> Html lastPage maxPage = li [ class "page" , onClick serverCommunications.address (SC.UpdatePage maxPage) ] [ renderIcon "fast-forward" ] paymentsPage : LoggedView -> Int -> Html paymentsPage loggedView page = let onCurrentPage = page == loggedView.currentPage in li [ class ("page" ++ (if onCurrentPage then " current" else "")) , onClick serverCommunications.address <| if onCurrentPage then SC.NoCommunication else SC.UpdatePage page ] [ text (toString page) ]