@@ -79,28 +79,33 @@ def show
79
79
@changeset = Changeset . find ( params [ :id ] )
80
80
case turbo_frame_request_id
81
81
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 }
84
85
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 }
87
89
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 }
90
93
else
91
94
@comments = if current_user &.moderator?
92
95
@changeset . comments . unscope ( :where => :visible ) . includes ( :author )
93
96
else
94
97
@changeset . comments . includes ( :author )
95
98
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
+
99
103
if @changeset . user . active? && @changeset . user . data_public?
100
104
changesets = conditions_nonempty ( @changeset . user . changesets )
101
105
@next_by_user = changesets . where ( "id > ?" , @changeset . id ) . reorder ( :id => :asc ) . first
102
106
@prev_by_user = changesets . where ( :id => ...@changeset . id ) . reorder ( :id => :desc ) . first
103
107
end
108
+
104
109
render :layout => map_layout
105
110
end
106
111
rescue ActiveRecord ::RecordNotFound
@@ -163,4 +168,50 @@ def conditions_bbox(changesets, bbox)
163
168
def conditions_nonempty ( changesets )
164
169
changesets . where ( "num_changes > 0" )
165
170
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
166
217
end
0 commit comments