From 88e9ad353d91748405096e42744009af12fa3b41 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Wed, 25 Jun 2025 20:33:02 +0300 Subject: [PATCH] Fill small version gaps --- app/helpers/numbered_pagination_helper.rb | 16 +++++++++---- .../numbered_pagination_helper_test.rb | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/helpers/numbered_pagination_helper.rb b/app/helpers/numbered_pagination_helper.rb index 043385c6b..597f5704c 100644 --- a/app/helpers/numbered_pagination_helper.rb +++ b/app/helpers/numbered_pagination_helper.rb @@ -17,10 +17,18 @@ module NumberedPaginationHelper middle_list_version_window = Range.new([active_version - window_half_size, start_list_versions.last].max, [active_version + window_half_size, end_list_versions.first].min).to_a middle_list_versions_with_sentinels = (middle_list_version_sentinels | middle_list_version_steps | middle_list_version_window).sort - middle_list_versions_with_gaps = middle_list_versions_with_sentinels.each_cons(2).flat_map do |previous_version, v| - v == previous_version + 1 ? [v] : [:gap, v] - end[...-1] - middle_list_versions = middle_list_versions_with_gaps + middle_list_versions_with_sentinels_and_gaps = [middle_list_versions_with_sentinels.first] + + middle_list_versions_with_sentinels.each_cons(2).flat_map do |previous_version, v| + v == previous_version + 1 ? [v] : [:gap, v] + end + middle_list_versions_with_small_gaps_filled = middle_list_versions_with_sentinels_and_gaps.each_cons(3).map do |previous_version, v, next_version| + if v == :gap && previous_version != :gap && next_version != :gap && next_version - previous_version == 2 + previous_version + 1 + else + v + end + end + middle_list_versions = middle_list_versions_with_small_gaps_filled lists << tag.ul(:id => "versions-navigation-list-start", :class => "pagination pagination-sm mt-1") do diff --git a/test/helpers/numbered_pagination_helper_test.rb b/test/helpers/numbered_pagination_helper_test.rb index 680ab0ae5..d115a8392 100644 --- a/test/helpers/numbered_pagination_helper_test.rb +++ b/test/helpers/numbered_pagination_helper_test.rb @@ -209,6 +209,30 @@ class NumberedPaginationHelperTest < ActionView::TestCase end end + def test_element_versions_pagination_window_start_touch_almost + pagination = element_versions_pagination(50, :window_half_size => 3, :active_version => 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 |items| + check_version_link items.shift, sample_item_data(1) + end + assert_dom lists[1], "> li", 9 do |items| + check_version_link items.shift, sample_item_data(2) + check_version_link items.shift, sample_item_data(3) + check_version_link items.shift, sample_item_data(4) + check_version_link items.shift, sample_item_data(5) + check_version_link items.shift, sample_item_data(6), :active => true + check_version_link items.shift, sample_item_data(7) + check_version_link items.shift, sample_item_data(8) + check_version_link items.shift, sample_item_data(9) + check_version_ellipsis items.shift + end + assert_dom lists[2], "> li", 1 do |items| + check_version_link items.shift, sample_item_data(50) + end + end + end + def test_element_versions_pagination_window_middle pagination = element_versions_pagination(50, :window_half_size => 3, :active_version => 43) { |v| sample_item_data v } pagination_dom = Rails::Dom::Testing.html_document_fragment.parse(pagination) -- 2.39.5