]> git.openstreetmap.org Git - rails.git/blob - app/helpers/numbered_pagination_helper.rb
Remove border rounding/duplication between adjacent version lists
[rails.git] / app / helpers / numbered_pagination_helper.rb
1 module NumberedPaginationHelper
2   def element_versions_pagination(top_version, active_version: 0, &)
3     lists = []
4
5     if top_version <= 5
6       lists << tag.ul(:class => "pagination pagination-sm mt-1") do
7         (1..top_version).each do |v|
8           concat element_versions_pagination_item(v, **yield(v), :active => v == active_version)
9         end
10       end
11     else
12       start_list_versions = 1..1
13       end_list_versions = top_version..top_version
14       middle_list_versions = (start_list_versions.last + 1)..(end_list_versions.first - 1)
15
16       lists << tag.ul(:class => "pagination pagination-sm mt-1") do
17         start_list_versions.each do |v|
18           concat element_versions_pagination_item(v, **yield(v), :active => v == active_version,
19                                                                  :edge => [false, v == start_list_versions.last],
20                                                                  :edge_border => true)
21         end
22       end
23       lists << tag.ul(:class => [
24                         "pagination pagination-sm",
25                         "overflow-x-scroll pb-3", # horizontal scrollbar with reserved space below
26                         "pt-1" # space reserved for focus outlines
27                       ]) do
28         middle_list_versions.each do |v|
29           concat element_versions_pagination_item(v, **yield(v), :active => v == active_version,
30                                                                  :edge => [v == start_list_versions.last + 1,
31                                                                            v == end_list_versions.first - 1])
32         end
33       end
34       lists << tag.ul(:class => "pagination pagination-sm mt-1") do
35         end_list_versions.each do |v|
36           concat element_versions_pagination_item(v, **yield(v), :active => v == active_version,
37                                                                  :edge => [v == end_list_versions.first, false],
38                                                                  :edge_border => true)
39         end
40       end
41     end
42
43     tag.div safe_join(lists), :class => "d-flex align-items-start"
44   end
45
46   private
47
48   def element_versions_pagination_item(body, href: nil, title: nil, active: false, edge: [false, false], edge_border: false)
49     link_class = ["page-link", { "rounded-start-0" => edge.first,
50                                  "border-start-0" => edge.first && !edge_border,
51                                  "rounded-end-0" => edge.last,
52                                  "border-end-0" => edge.last && !edge_border }]
53     link = link_to body, href, :class => link_class, :title => title
54     tag.li link, :class => ["page-item", { "active" => active }]
55   end
56 end