]> git.openstreetmap.org Git - rails.git/commitdiff
Separate pagination item computation and output
authorAnton Khorev <tony29@yandex.ru>
Tue, 3 Oct 2023 15:49:49 +0000 (18:49 +0300)
committerAnton Khorev <tony29@yandex.ru>
Thu, 16 Nov 2023 10:21:14 +0000 (13:21 +0300)
app/views/browse/_paging_nav.html.erb
lib/classic_pagination/pagination_helper.rb

index 738d2f2eed616926c484e61737da2cfa36ab96e7..cbe8cdefbf159a7ee19426bb227f93483ece26e2 100644 (file)
@@ -2,7 +2,18 @@
   <h4 class="fs-5 mb-0"><%= heading %></h4>
   <% if pages.page_count > 1 %>
     <ul class="pagination pagination-sm mb-1 ms-auto">
-      <%= raw pagination_links_bootstrap(pages, {}) { |n| url_for(page_param => n) } %>
+    <% pagination_items(pages, {}).each do |body, n| %>
+      <% linked = !(n.is_a? String)
+         classes = ["page-item"]
+         classes.push(n) unless linked %>
+      <%= content_tag "li", :class => classes do
+        if linked
+          link_to(body, url_for(page_param => n), :class => "page-link")
+        else
+          content_tag("span", body, :class => "page-link")
+        end
+      end %>
+    <% end %>
     </ul>
   <% end %>
 </div>
index c691360e09f103207bac0e54e83ac5d0db638f15..72d16fc983cdbfd80b28201f1ce9b239c1b3b939 100644 (file)
@@ -131,63 +131,38 @@ module ActionView
         html
       end
 
-      # Same as above, but
-      # - with bootstrap classes
-      # - no list wrapper
-      # - invoked block returns the page url
-      def pagination_links_bootstrap(paginator, options)
+      def pagination_items(paginator, options)
         options = DEFAULT_OPTIONS.merge(options)
         link_to_current_page = options[:link_to_current_page]
         always_show_anchors = options[:always_show_anchors]
 
         current_page = paginator.current_page
         window_pages = current_page.window(options[:window_size]).pages
-        return unless link_to_current_page || window_pages.length > 1
 
         first = paginator.first
         last = paginator.last
 
-        html = ""
+        items = []
 
         if always_show_anchors && !(wp_first = window_pages[0]).first?
-          html << bootstrap_page_item_link(first.number.to_s, yield(first.number))
-          html << bootstrap_page_item_disabled("...") if wp_first.number - first.number > 1
+          items.push [first.number.to_s, first.number]
+          items.push ["...", "disabled"] if wp_first.number - first.number > 1
         end
 
         window_pages.each do |page|
-          html << if current_page == page && !link_to_current_page
-                    bootstrap_page_item_active(page.number.to_s)
-                  else
-                    bootstrap_page_item_link(page.number.to_s, yield(page.number))
-                  end
+          if current_page == page && !link_to_current_page
+            items.push [page.number.to_s, "active"]
+          else
+            items.push [page.number.to_s, page.number]
+          end
         end
 
         if always_show_anchors && !(wp_last = window_pages[-1]).last?
-          html << bootstrap_page_item_disabled("...") if last.number - wp_last.number > 1
-          html << bootstrap_page_item_link(last.number.to_s, yield(last.number))
+          items.push ["...", "disabled"] if last.number - wp_last.number > 1
+          items.push [last.number.to_s, last.number]
         end
 
-        html
-      end
-      
-      private
-
-      def bootstrap_page_item_disabled(body)
-        content_tag "li", :class => "page-item disabled" do
-          content_tag "span", body, :class => "page-link"
-        end
-      end
-
-      def bootstrap_page_item_active(body)
-        content_tag "li", :class => "page-item active", :'aria-current' => "page" do
-          content_tag "span", body, :class => "page-link"
-        end
-      end
-
-      def bootstrap_page_item_link(body, url)
-        content_tag "li", :class => "page-item" do
-          link_to body, url, :class => "page-link"
-        end
+        items
       end
     end
   end