aboutsummaryrefslogtreecommitdiff
path: root/src/client/View/Payments/Paging.elm
blob: 53df3b30054faa92e2ab79b94544da3495235579 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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) ]