From 9c972c2f16d60f67142bf73ac1eb742f5aafd99d Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Mon, 23 Jun 2025 18:33:37 +0300 Subject: [PATCH] Show all element version links below breadcrumbs --- app/helpers/numbered_pagination_helper.rb | 21 ++++++++++ app/views/elements/show.html.erb | 19 +++------- app/views/old_elements/_actions.html.erb | 23 +++-------- app/views/old_elements/index.html.erb | 5 +++ .../numbered_pagination_helper_test.rb | 38 +++++++++++++++++++ test/system/element_old_version_test.rb | 22 +++++++++++ 6 files changed, 96 insertions(+), 32 deletions(-) create mode 100644 app/helpers/numbered_pagination_helper.rb create mode 100644 test/helpers/numbered_pagination_helper_test.rb diff --git a/app/helpers/numbered_pagination_helper.rb b/app/helpers/numbered_pagination_helper.rb new file mode 100644 index 000000000..19301abf4 --- /dev/null +++ b/app/helpers/numbered_pagination_helper.rb @@ -0,0 +1,21 @@ +module NumberedPaginationHelper + def element_versions_pagination(top_version, active_version: 0, &) + 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) + end + end + end + + private + + def element_versions_pagination_item(body, href: nil, title: nil, active: false) + link_class = "page-link" + link = link_to body, href, :class => link_class, :title => title + tag.li link, :class => ["page-item", { "active" => active }] + end +end diff --git a/app/views/elements/show.html.erb b/app/views/elements/show.html.erb index b76cb6ab0..5a023fb69 100644 --- a/app/views/elements/show.html.erb +++ b/app/views/elements/show.html.erb @@ -23,18 +23,9 @@ <% end %> - -
- <% if @feature.version > 1 %> - <%= link_to({ :controller => "old_#{@type.pluralize}", :action => :show, :version => 1 }, :class => "icon-link") do %> - <%= previous_page_svg_tag :height => 11, :count => 2 %> - <%= "#{t('browse.version')} #1" %> - <% end %> - · - <%= link_to({ :controller => "old_#{@type.pluralize}", :action => :show, :version => @feature.version }, :class => "icon-link") do %> - <%= "#{t('browse.version')} ##{@feature.version}" %> - <%= next_page_svg_tag :height => 11, :count => 2 %> - <% end %> - <% end %> -
+ <%= element_versions_pagination(@feature.version, :active_version => @feature.version) do |v| + { :href => { :controller => "old_#{@type.pluralize}", :action => :show, :version => v }, + :title => t("browse.versions_navigation.version", :version => v) } + end %> + diff --git a/app/views/old_elements/_actions.html.erb b/app/views/old_elements/_actions.html.erb index f16a11936..c881f09c4 100644 --- a/app/views/old_elements/_actions.html.erb +++ b/app/views/old_elements/_actions.html.erb @@ -24,22 +24,9 @@ - -
- <% if @feature.version > 1 %> - <%= link_to({ :version => @feature.version - 1 }, { :class => "icon-link" }) do %> - <%= previous_page_svg_tag :height => 11 %> - <%= "#{t('browse.version')} ##{@feature.version - 1}" %> - <% end %> - <% end %> - <% if @feature.version > 1 && !@feature.latest_version? %> - · - <% end %> - <% unless @feature.latest_version? %> - <%= link_to({ :version => @feature.version + 1 }, { :class => "icon-link" }) do %> - <%= "#{t('browse.version')} ##{@feature.version + 1}" %> - <%= next_page_svg_tag :height => 11 %> - <% end %> - <% end %> -
+ <%= element_versions_pagination(@current_feature.version, :active_version => @feature.version) do |v| + { :href => { :version => v }, + :title => t("browse.versions_navigation.version", :version => v) } + end %> + diff --git a/app/views/old_elements/index.html.erb b/app/views/old_elements/index.html.erb index fce5954b4..a2e87147c 100644 --- a/app/views/old_elements/index.html.erb +++ b/app/views/old_elements/index.html.erb @@ -53,4 +53,9 @@ <% end %> + + <%= element_versions_pagination(@current_feature.version) do |v| + { :href => { :action => :show, :version => v }, + :title => t("browse.versions_navigation.version", :version => v) } + end %> diff --git a/test/helpers/numbered_pagination_helper_test.rb b/test/helpers/numbered_pagination_helper_test.rb new file mode 100644 index 000000000..87e2df520 --- /dev/null +++ b/test/helpers/numbered_pagination_helper_test.rb @@ -0,0 +1,38 @@ +require "test_helper" + +class NumberedPaginationHelperTest < ActionView::TestCase + def test_element_versions_pagination1 + pagination = element_versions_pagination(1) { |v| sample_item_data v } + pagination_dom = Rails::Dom::Testing.html_document_fragment.parse(pagination) + assert_dom pagination_dom, "ul", :count => 1 do + assert_dom "> li", 1 do + check_version_link sample_item_data(1) + end + end + end + + def test_element_versions_pagination5 + pagination = element_versions_pagination(5) { |v| sample_item_data v } + pagination_dom = Rails::Dom::Testing.html_document_fragment.parse(pagination) + assert_dom pagination_dom, "ul", :count => 1 do + assert_dom "> li", 5 do |items| + items.each_with_index do |item, i| + check_version_link item, sample_item_data(i + 1) + end + end + end + end + + private + + def sample_item_data(version) + { :href => "test/version/#{version}", :title => "Version ##{version}" } + end + + def check_version_link(*elements, data) + assert_dom(*elements, "> a", 1) do + assert_dom "> @href", data[:href] + assert_dom "> @title", data[:title] + end + end +end diff --git a/test/system/element_old_version_test.rb b/test/system/element_old_version_test.rb index e02ae62ac..cadee1a79 100644 --- a/test/system/element_old_version_test.rb +++ b/test/system/element_old_version_test.rb @@ -342,6 +342,28 @@ class ElementOldVersionTest < ApplicationSystemTestCase end end + test "navigates between multiple node versions" do + node = create(:node, :with_history, :version => 5) + + visit node_path(node) + + within_sidebar do + assert_css "h4", :text => "Version #5" + + click_on "Version #3" + + assert_css "h4", :text => "Version #3" + + click_on "Version #2" + + assert_css "h4", :text => "Version #2" + + click_on "Version #4" + + assert_css "h4", :text => "Version #4" + end + end + private def create_redacted_node -- 2.39.5