From e6358290ce872d8f9e057bfd4e1c000b72bfe2f1 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Fri, 8 Aug 2025 20:51:13 +0300 Subject: [PATCH] Use scrollable pagination for changeset elements --- app/assets/javascripts/index/changeset.js | 10 +++++++++ app/controllers/changesets_controller.rb | 27 ++++++++++++++++++----- app/views/changesets/_elements.html.erb | 2 +- app/views/changesets/_paging_nav.html.erb | 15 ++++++------- app/views/changesets/show.html.erb | 6 ++--- test/system/changeset_elements_test.rb | 24 ++++++++++---------- 6 files changed, 54 insertions(+), 30 deletions(-) diff --git a/app/assets/javascripts/index/changeset.js b/app/assets/javascripts/index/changeset.js index 952aff35b..4f14c8deb 100644 --- a/app/assets/javascripts/index/changeset.js +++ b/app/assets/javascripts/index/changeset.js @@ -2,6 +2,14 @@ OSM.Changeset = function (map) { const page = {}, content = $("#sidebar_content"); + content.on("turbo:before-frame-render", "turbo-frame", function () { + $(this).find(".numbered_pagination").trigger("numbered_pagination:disable"); + }); + + content.on("turbo:frame-render", "turbo-frame", function () { + $(this).find(".numbered_pagination").trigger("numbered_pagination:enable"); + }); + page.pushstate = page.popstate = function (path) { OSM.loadSidebarContent(path, function () { page.load(); @@ -21,6 +29,7 @@ OSM.Changeset = function (map) { }); } }); + $(".numbered_pagination").trigger("numbered_pagination:enable"); }; function updateChangeset(method, url, include_data) { @@ -75,6 +84,7 @@ OSM.Changeset = function (map) { page.unload = function () { map.removeObject(); + $(".numbered_pagination").trigger("numbered_pagination:disable"); }; return page; diff --git a/app/controllers/changesets_controller.rb b/app/controllers/changesets_controller.rb index 7842b2e2c..ff6397a96 100644 --- a/app/controllers/changesets_controller.rb +++ b/app/controllers/changesets_controller.rb @@ -84,13 +84,13 @@ class ChangesetsController < ApplicationController case turbo_frame_request_id when "changeset_nodes" load_nodes - render :partial => "elements", :locals => { :type => "node", :elements => @nodes, :pages => @node_pages } + render :partial => "elements", :locals => { :type => "node", :elements => @nodes, :elements_count => @nodes_count, :current_page => @current_node_page } when "changeset_ways" load_ways - render :partial => "elements", :locals => { :type => "way", :elements => @ways, :pages => @way_pages } + render :partial => "elements", :locals => { :type => "way", :elements => @ways, :elements_count => @ways_count, :current_page => @current_way_page } when "changeset_relations" load_relations - render :partial => "elements", :locals => { :type => "relation", :elements => @relations, :pages => @relation_pages } + render :partial => "elements", :locals => { :type => "relation", :elements => @relations, :elements_count => @relations_count, :current_page => @current_relation_page } else @comments = if current_user&.moderator? @changeset.comments.unscope(:where => :visible).includes(:author) @@ -157,15 +157,30 @@ class ChangesetsController < ApplicationController end def load_nodes - @node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :order => [:node_id, :version], :per_page => ELEMENTS_PER_PAGE, :parameter => "node_page") + @nodes_count = @changeset.old_nodes.count + @current_node_page = params[:node_page].to_i.clamp(1, element_pages_count(@nodes_count)) + @nodes = @changeset.old_nodes + .order(:node_id, :version) + .offset(ELEMENTS_PER_PAGE * (@current_node_page - 1)) + .limit(ELEMENTS_PER_PAGE) end def load_ways - @way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :order => [:way_id, :version], :per_page => ELEMENTS_PER_PAGE, :parameter => "way_page") + @ways_count = @changeset.old_ways.count + @current_way_page = params[:way_page].to_i.clamp(1, element_pages_count(@ways_count)) + @ways = @changeset.old_ways + .order(:way_id, :version) + .offset(ELEMENTS_PER_PAGE * (@current_way_page - 1)) + .limit(ELEMENTS_PER_PAGE) end def load_relations - @relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :order => [:relation_id, :version], :per_page => ELEMENTS_PER_PAGE, :parameter => "relation_page") + @relations_count = @changeset.old_relations.count + @current_relation_page = params[:relation_page].to_i.clamp(1, element_pages_count(@relations_count)) + @relations = @changeset.old_relations + .order(:relation_id, :version) + .offset(ELEMENTS_PER_PAGE * (@current_relation_page - 1)) + .limit(ELEMENTS_PER_PAGE) end helper_method def element_pages_count(elements_count) diff --git a/app/views/changesets/_elements.html.erb b/app/views/changesets/_elements.html.erb index a95bed6fa..938c97b10 100644 --- a/app/views/changesets/_elements.html.erb +++ b/app/views/changesets/_elements.html.erb @@ -1,5 +1,5 @@ <%= turbo_frame_tag "changeset_#{type.pluralize}" do %> - <%= render :partial => "paging_nav", :locals => { :type => type, :pages => pages } %> + <%= render :partial => "paging_nav", :locals => { :type => type, :elements_count => elements_count, :current_page => current_page } %>