Skip to content

Commit 1c414a4

Browse files
committed
Remove classic pagination
1 parent f90c7c4 commit 1c414a4

File tree

8 files changed

+105
-655
lines changed

8 files changed

+105
-655
lines changed

app/controllers/changesets_controller.rb

+60-9
Original file line numberDiff line numberDiff line change
@@ -79,28 +79,33 @@ def show
7979
@changeset = Changeset.find(params[:id])
8080
case turbo_frame_request_id
8181
when "changeset_nodes"
82-
@node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :order => [:node_id, :version], :per_page => 20, :parameter => "node_page")
83-
render :partial => "elements", :locals => { :type => "node", :elements => @nodes, :pages => @node_pages }
82+
load_nodes
83+
84+
render :partial => "elements", :locals => { :type => "node", :paginator => @nodes_paginator }
8485
when "changeset_ways"
85-
@way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :order => [:way_id, :version], :per_page => 20, :parameter => "way_page")
86-
render :partial => "elements", :locals => { :type => "way", :elements => @ways, :pages => @way_pages }
86+
load_ways
87+
88+
render :partial => "elements", :locals => { :type => "way", :paginator => @ways_paginator }
8789
when "changeset_relations"
88-
@relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :order => [:relation_id, :version], :per_page => 20, :parameter => "relation_page")
89-
render :partial => "elements", :locals => { :type => "relation", :elements => @relations, :pages => @relation_pages }
90+
load_relations
91+
92+
render :partial => "elements", :locals => { :type => "relation", :paginator => @relations_paginator }
9093
else
9194
@comments = if current_user&.moderator?
9295
@changeset.comments.unscope(:where => :visible).includes(:author)
9396
else
9497
@changeset.comments.includes(:author)
9598
end
96-
@node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :order => [:node_id, :version], :per_page => 20, :parameter => "node_page")
97-
@way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :order => [:way_id, :version], :per_page => 20, :parameter => "way_page")
98-
@relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :order => [:relation_id, :version], :per_page => 20, :parameter => "relation_page")
99+
load_nodes
100+
load_ways
101+
load_relations
102+
99103
if @changeset.user.active? && @changeset.user.data_public?
100104
changesets = conditions_nonempty(@changeset.user.changesets)
101105
@next_by_user = changesets.where("id > ?", @changeset.id).reorder(:id => :asc).first
102106
@prev_by_user = changesets.where(:id => ...@changeset.id).reorder(:id => :desc).first
103107
end
108+
104109
render :layout => map_layout
105110
end
106111
rescue ActiveRecord::RecordNotFound
@@ -163,4 +168,50 @@ def conditions_bbox(changesets, bbox)
163168
def conditions_nonempty(changesets)
164169
changesets.where("num_changes > 0")
165170
end
171+
172+
def load_nodes
173+
nodes = OldNode.where(:changeset => @changeset).order(:node_id, :version)
174+
@nodes_paginator = ElementsPaginator.new(nodes, 20, params[:node_page])
175+
end
176+
177+
def load_ways
178+
ways = OldWay.where(:changeset => @changeset).order(:way_id, :version)
179+
@ways_paginator = ElementsPaginator.new(ways, 20, params[:way_page])
180+
end
181+
182+
def load_relations
183+
relations = OldRelation.where(:changeset => @changeset).order(:relation_id, :version)
184+
@relations_paginator = ElementsPaginator.new(relations, 20, params[:relation_page])
185+
end
186+
187+
class ElementsPaginator
188+
attr_reader :elements_count, :elements_per_page, :current_page, :current_page_elements
189+
190+
def initialize(elements, elements_per_page, current_page = 1)
191+
@elements_count = elements.count
192+
@elements_per_page = elements_per_page.to_i
193+
@current_page = current_page.to_i.clamp(1, pages_count)
194+
@current_page_elements = elements.offset(@elements_per_page * (@current_page - 1)).limit(@elements_per_page)
195+
end
196+
197+
def pages_count
198+
[1, 1 + ((elements_count - 1) / elements_per_page)].max
199+
end
200+
201+
def pages
202+
1..pages_count
203+
end
204+
205+
def pages_window(window_size, page = current_page)
206+
[page - window_size, pages.first].max..[page + window_size, pages.last].min
207+
end
208+
209+
def lower_element_number(page = current_page)
210+
(elements_per_page * (page - 1)) + 1
211+
end
212+
213+
def upper_element_number(page = current_page)
214+
[elements_per_page * page, elements_count].min
215+
end
216+
end
166217
end

app/helpers/browse_helper.rb

+33-10
Original file line numberDiff line numberDiff line change
@@ -70,33 +70,56 @@ def link_follow(object)
7070
"nofollow" if object.tags.empty?
7171
end
7272

73-
def type_and_paginated_count(type, pages, selected_page = pages.current_page)
74-
if pages.page_count == 1
73+
def type_and_paginated_count(type, paginator, page = paginator.current_page)
74+
if paginator.pages_count <= 1
7575
t ".#{type.pluralize}",
76-
:count => pages.item_count
76+
:count => paginator.elements_count
7777
else
7878
t ".#{type.pluralize}_paginated",
79-
:x => selected_page.first_item,
80-
:y => selected_page.last_item,
81-
:count => pages.item_count
79+
:x => paginator.lower_element_number(page),
80+
:y => paginator.upper_element_number(page),
81+
:count => paginator.elements_count
8282
end
8383
end
8484

85-
def sidebar_classic_pagination(pages, page_param)
85+
def sidebar_classic_pagination(paginator, page_param)
86+
window_size = 2
8687
max_width_for_default_padding = 35
8788

89+
pages = paginator.pages
90+
window = paginator.pages_window(window_size)
91+
page_items = []
92+
93+
if window.first != pages.first
94+
page_items.push [pages.first.to_s, pages.first]
95+
page_items.push ["...", "disabled"] if window.first - pages.first > 1
96+
end
97+
98+
window.each do |page|
99+
if paginator.current_page == page
100+
page_items.push [page.to_s, "active"]
101+
else
102+
page_items.push [page.to_s, page]
103+
end
104+
end
105+
106+
if window.last != pages.last
107+
page_items.push ["...", "disabled"] if pages.last - window.last > 1
108+
page_items.push [pages.last.to_s, pages.last]
109+
end
110+
88111
width = 0
89-
pagination_items(pages, {}).each do |(body)|
112+
page_items.each do |(body)|
90113
width += 2 # padding width
91114
width += body.length
92115
end
93116
link_classes = ["page-link", { "px-1" => width > max_width_for_default_padding }]
94117

95118
tag.ul :class => "pagination pagination-sm mb-2" do
96-
pagination_items(pages, {}).each do |body, page_or_class|
119+
page_items.each do |body, page_or_class|
97120
linked = !(page_or_class.is_a? String)
98121
link = if linked
99-
link_to body, url_for(page_param => page_or_class.number), :class => link_classes, **yield(page_or_class)
122+
link_to body, url_for(page_param => page_or_class), :class => link_classes, **yield(page_or_class)
100123
else
101124
tag.span body, :class => link_classes
102125
end

app/views/changesets/_elements.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<%= turbo_frame_tag "changeset_#{type.pluralize}" do %>
2-
<%= render :partial => "paging_nav", :locals => { :type => type, :pages => pages } %>
2+
<%= render :partial => "paging_nav", :locals => { :type => type, :paginator => paginator } %>
33
<ul class="list-unstyled" data-turbo="false">
4-
<% elements.each do |element| %>
4+
<% paginator.current_page_elements.each do |element| %>
55
<%= element_list_item type, element do
66
t "printable_name.current_and_old_links_html",
77
:current_link => link_to(printable_element_name(element), :controller => type.pluralize, :action => :show, :id => element.id[0]),

app/views/changesets/_paging_nav.html.erb

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
<h4 class="fs-5"><%= type_and_paginated_count(type, pages) %></h4>
2-
<% if pages.page_count > 1 %>
3-
<%= sidebar_classic_pagination(pages, "#{type}_page") do |page|
1+
<h4 class="fs-5"><%= type_and_paginated_count(type, paginator) %></h4>
2+
<% if paginator.pages_count > 1 %>
3+
<%= sidebar_classic_pagination(paginator, "#{type}_page") do |page|
44
{
5-
:title => type_and_paginated_count(type, pages, page),
5+
:title => type_and_paginated_count(type, paginator, page),
66
:data => { :turbo => "true" }
77
}
88
end %>

app/views/changesets/show.html.erb

+6-6
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,16 @@
8989
<% end %>
9090
<% end %>
9191

92-
<% unless @ways.empty? %>
93-
<%= render :partial => "elements", :locals => { :type => "way", :elements => @ways, :pages => @way_pages } %>
92+
<% unless @ways_paginator.current_page_elements.empty? %>
93+
<%= render :partial => "elements", :locals => { :type => "way", :paginator => @ways_paginator } %>
9494
<% end %>
9595

96-
<% unless @relations.empty? %>
97-
<%= render :partial => "elements", :locals => { :type => "relation", :elements => @relations, :pages => @relation_pages } %>
96+
<% unless @relations_paginator.current_page_elements.empty? %>
97+
<%= render :partial => "elements", :locals => { :type => "relation", :paginator => @relations_paginator } %>
9898
<% end %>
9999

100-
<% unless @nodes.empty? %>
101-
<%= render :partial => "elements", :locals => { :type => "node", :elements => @nodes, :pages => @node_pages } %>
100+
<% unless @nodes_paginator.current_page_elements.empty? %>
101+
<%= render :partial => "elements", :locals => { :type => "node", :paginator => @nodes_paginator } %>
102102
<% end %>
103103
</div>
104104

config/initializers/classic_pagination.rb

-33
This file was deleted.

0 commit comments

Comments
 (0)