aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/View/LoggedIn/Paging.elm
blob: e40c5aa72fb432ae09534ae5ada42658606167e1 (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
98
module View.LoggedIn.Paging
  ( paymentsPaging
  ) where

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)

import Model.View.LoggedInView exposing (..)
import Model.Payment exposing (perPage)

import Update exposing (..)
import Update.LoggedIn exposing (..)

import View.Icon exposing (renderIcon)

showedPages : Int
showedPages = 5

paymentsPaging : LoggedInView -> Html
paymentsPaging loggedInView =
  let maxPage = ceiling (toFloat loggedInView.paymentsCount / toFloat perPage)
      pages = truncatePages loggedInView.currentPage [1..maxPage]
  in  if maxPage == 1
        then
          text ""
        else
          div
            [ class "pages" ]
            (  ( if loggedInView.currentPage > 1
                   then [ firstPage, previousPage loggedInView ]
                   else []
               )
            ++ ( List.map (paymentsPage loggedInView) pages)
            ++ ( if loggedInView.currentPage < maxPage
                   then [ nextPage loggedInView, 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 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 : Html
firstPage =
  button
    [ class "page"
    , onClick actions.address (UpdateLoggedIn (UpdatePage 1))
    ]
    [ renderIcon "fast-backward" ]

previousPage : LoggedInView -> Html
previousPage loggedInView =
  button
    [ class "page"
    , onClick actions.address (UpdateLoggedIn (UpdatePage (loggedInView.currentPage - 1)))
    ]
    [ renderIcon "backward" ]

nextPage : LoggedInView -> Html
nextPage loggedInView =
  button
    [ class "page"
    , onClick actions.address (UpdateLoggedIn (UpdatePage (loggedInView.currentPage + 1)))
    ]
    [ renderIcon "forward" ]

lastPage : Int -> Html
lastPage maxPage =
  button
    [ class "page"
    , onClick actions.address (UpdateLoggedIn (UpdatePage maxPage))
    ]
    [ renderIcon "fast-forward" ]

paymentsPage : LoggedInView -> Int -> Html
paymentsPage loggedInView page =
  let onCurrentPage = page == loggedInView.currentPage
  in  button
        [ classList
            [ ("page", True)
            , ("current", onCurrentPage)
            ]
        , onClick actions.address <|
            if onCurrentPage then NoOp else UpdateLoggedIn (UpdatePage page)
        ]
        [ text (toString page) ]