From 73127535694b251d5cd53ab5ced94611bcc12bca Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Mon, 23 Jun 2025 19:21:29 +0300 Subject: [PATCH] Split long version lists into 3 parts, with middle list scrollable --- app/helpers/numbered_pagination_helper.rb | 36 +++++++++++++++---- .../numbered_pagination_helper_test.rb | 18 ++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/app/helpers/numbered_pagination_helper.rb b/app/helpers/numbered_pagination_helper.rb index 5e3e20f27..5495be67f 100644 --- a/app/helpers/numbered_pagination_helper.rb +++ b/app/helpers/numbered_pagination_helper.rb @@ -2,13 +2,35 @@ module NumberedPaginationHelper def element_versions_pagination(top_version, active_version: 0, &) lists = [] - lists << tag.ul(:class => [ - "pagination pagination-sm", - "overflow-x-scroll pb-3", # horizontal scrollbar with reserved space below - "pt-1" # space reserved for focus outlines - ]) do - (1..top_version).each do |v| - concat element_versions_pagination_item(v, **yield(v), :active => v == active_version) + if top_version <= 5 + lists << tag.ul(:class => "pagination pagination-sm mt-1") do + (1..top_version).each do |v| + concat element_versions_pagination_item(v, **yield(v), :active => v == active_version) + end + end + else + start_list_versions = 1..1 + end_list_versions = top_version..top_version + middle_list_versions = (start_list_versions.last + 1)..(end_list_versions.first - 1) + + lists << tag.ul(:class => "pagination pagination-sm mt-1") do + start_list_versions.each do |v| + concat element_versions_pagination_item(v, **yield(v), :active => v == active_version) + end + end + lists << tag.ul(:class => [ + "pagination pagination-sm", + "overflow-x-scroll pb-3", # horizontal scrollbar with reserved space below + "pt-1" # space reserved for focus outlines + ]) do + middle_list_versions.each do |v| + concat element_versions_pagination_item(v, **yield(v), :active => v == active_version) + end + end + lists << tag.ul(:class => "pagination pagination-sm mt-1") do + end_list_versions.each do |v| + concat element_versions_pagination_item(v, **yield(v), :active => v == active_version) + end end end diff --git a/test/helpers/numbered_pagination_helper_test.rb b/test/helpers/numbered_pagination_helper_test.rb index 87e2df520..377e5a38f 100644 --- a/test/helpers/numbered_pagination_helper_test.rb +++ b/test/helpers/numbered_pagination_helper_test.rb @@ -23,6 +23,24 @@ class NumberedPaginationHelperTest < ActionView::TestCase end end + def test_element_versions_pagination6 + pagination = element_versions_pagination(6) { |v| sample_item_data v } + pagination_dom = Rails::Dom::Testing.html_document_fragment.parse(pagination) + assert_dom pagination_dom, "ul", :count => 3 do |lists| + assert_dom lists[0], "> li", 1 do + check_version_link sample_item_data(1) + end + assert_dom lists[1], "> li", 4 do |items| + items.each_with_index do |item, i| + check_version_link item, sample_item_data(i + 2) + end + end + assert_dom lists[2], "> li", 1 do + check_version_link sample_item_data(6) + end + end + end + private def sample_item_data(version) -- 2.39.5