From 17ea1539ef03607a1dfac792e43fe7c2c9c8bf7d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 19 Mar 2016 09:00:36 +0000 Subject: [PATCH] Previous/next links may be lost after editing the issue (#14462). git-svn-id: http://svn.redmine.org/redmine/trunk@15253 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/issues_controller.rb | 42 ++++++++++++++++------- app/views/issues/_edit.html.erb | 5 +++ test/functional/issues_controller_test.rb | 24 +++++++++++++ 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 71d06f1ae..51999544f 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -191,7 +191,7 @@ class IssuesController < ApplicationController flash[:notice] = l(:notice_successful_update) unless @issue.current_journal.new_record? respond_to do |format| - format.html { redirect_back_or_default issue_path(@issue) } + format.html { redirect_back_or_default issue_path(@issue, previous_and_next_issue_ids_params) } format.api { render_api_ok } end else @@ -354,23 +354,39 @@ class IssuesController < ApplicationController private def retrieve_previous_and_next_issue_ids - retrieve_query_from_session - if @query - sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria) - sort_update(@query.sortable_columns, 'issues_index_sort') - limit = 500 - issue_ids = @query.issue_ids(:order => sort_clause, :limit => (limit + 1), :include => [:assigned_to, :tracker, :priority, :category, :fixed_version]) - if (idx = issue_ids.index(@issue.id)) && idx < limit - if issue_ids.size < 500 - @issue_position = idx + 1 - @issue_count = issue_ids.size + if params[:prev_issue_id].present? || params[:next_issue_id].present? + @prev_issue_id = params[:prev_issue_id].presence.try(:to_i) + @next_issue_id = params[:next_issue_id].presence.try(:to_i) + @issue_position = params[:issue_position].presence.try(:to_i) + @issue_count = params[:issue_count].presence.try(:to_i) + else + retrieve_query_from_session + if @query + sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria) + sort_update(@query.sortable_columns, 'issues_index_sort') + limit = 500 + issue_ids = @query.issue_ids(:order => sort_clause, :limit => (limit + 1), :include => [:assigned_to, :tracker, :priority, :category, :fixed_version]) + if (idx = issue_ids.index(@issue.id)) && idx < limit + if issue_ids.size < 500 + @issue_position = idx + 1 + @issue_count = issue_ids.size + end + @prev_issue_id = issue_ids[idx - 1] if idx > 0 + @next_issue_id = issue_ids[idx + 1] if idx < (issue_ids.size - 1) end - @prev_issue_id = issue_ids[idx - 1] if idx > 0 - @next_issue_id = issue_ids[idx + 1] if idx < (issue_ids.size - 1) end end end + def previous_and_next_issue_ids_params + { + :prev_issue_id => params[:prev_issue_id], + :next_issue_id => params[:next_issue_id], + :issue_position => params[:issue_position], + :issue_count => params[:issue_count] + }.reject {|k,v| k.blank?} + end + # Used by #edit and #update to set some common instance variables # from the params def update_issue_from_params diff --git a/app/views/issues/_edit.html.erb b/app/views/issues/_edit.html.erb index 7415c79eb..24a01cad0 100644 --- a/app/views/issues/_edit.html.erb +++ b/app/views/issues/_edit.html.erb @@ -49,6 +49,11 @@ <%= submit_tag l(:button_submit) %> <%= preview_link preview_edit_issue_path(:project_id => @project, :id => @issue), 'issue-form' %> | <%= link_to l(:button_cancel), {}, :onclick => "$('#update').hide(); return false;" %> + + <%= hidden_field_tag 'prev_issue_id', @prev_issue_id if @prev_issue_id %> + <%= hidden_field_tag 'next_issue_id', @next_issue_id if @next_issue_id %> + <%= hidden_field_tag 'issue_position', @issue_position if @issue_position %> + <%= hidden_field_tag 'issue_count', @issue_count if @issue_count %> <% end %>
diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index ae6eb4feb..7679195bb 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -1423,6 +1423,17 @@ class IssuesControllerTest < ActionController::TestCase end end + def test_show_should_display_prev_next_links_when_request_has_previous_and_next_issue_ids_params + get :show, :id => 1, :prev_issue_id => 1, :next_issue_id => 3, :issue_position => 2, :issue_count => 4 + assert_response :success + + assert_select 'div.next-prev-links' do + assert_select 'a[href="/issues/1"]', :text => /Previous/ + assert_select 'a[href="/issues/3"]', :text => /Next/ + assert_select 'span.position', :text => "2 of 4" + end + end + def test_show_should_display_category_field_if_categories_are_defined Issue.update_all :category_id => nil @@ -3681,6 +3692,19 @@ class IssuesControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id end + + def test_put_update_should_redirect_with_previous_and_next_issue_ids_params + @request.session[:user_id] = 2 + + put :update, :id => 11, + :issue => {:status_id => 6, :notes => 'Notes'}, + :prev_issue_id => 8, + :next_issue_id => 12, + :issue_position => 2, + :issue_count => 3 + + assert_redirected_to '/issues/11?issue_count=3&issue_position=2&next_issue_id=12&prev_issue_id=8' + end def test_get_bulk_edit @request.session[:user_id] = 2 -- 2.39.5