blob: 0385941b0dd2c6cc9b9c29b41891c9033f90c19b (
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
99
100
101
102
103
104
105
|
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 as 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 (Payment.punctual 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) ]
|