diff --git app/controllers/issues_controller.rb app/controllers/issues_controller.rb index fa911a1..eb05962 100644 --- app/controllers/issues_controller.rb +++ app/controllers/issues_controller.rb @@ -94,6 +94,11 @@ class IssuesController < ApplicationController end def show + @prev = params[:prev] + @next = params[:next] + @pos = params[:pos] + @count = params[:count] + @journals = @issue.journals.includes(:user, :details). references(:user, :details). reorder(:created_on, :id).to_a @@ -174,6 +179,7 @@ class IssuesController < ApplicationController def update return unless update_issue_from_params + retrieve_previous_and_next_issue_ids @issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads])) saved = false begin @@ -191,7 +197,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, {'next' => @next_issue_id, 'prev' => @prev_issue_id, 'pos' => @issue_position, 'count' => @issue_count}.reject{|k,v|k.blank?}) } format.api { render_api_ok } end else @@ -367,6 +373,12 @@ class IssuesController < ApplicationController end @prev_issue_id = issue_ids[idx - 1] if idx > 0 @next_issue_id = issue_ids[idx + 1] if idx < (issue_ids.size - 1) + else + return if issue_ids.empty? + @prev_issue_id = @prev + @next_issue_id = @next + @issue_position = @pos + @issue_count = @count end end end diff --git test/functional/issues_controller_test.rb test/functional/issues_controller_test.rb index 0ad2697..96fa3b6 100644 --- test/functional/issues_controller_test.rb +++ test/functional/issues_controller_test.rb @@ -1354,6 +1354,51 @@ class IssuesControllerTest < ActionController::TestCase assert_select 'a', :text => /Next/, :count => 0 end + def test_show_should_display_prev_next_links_when_issue_does_not_match_query_condition_but_request_param_has_link_attributes + @request.session[:query] = {:filters => {'status_id' => {:values => ['5'], :operator => 'c'}}, :project_id => 1} + issue_5 = Issue.find(5) + issue_5.status_id = 5 # be matched the query conditions + issue_5.save! + issue_1 = Issue.find(1) + issue_1.status_id = 1 # not be matched the query conditions + issue_1.save! + + get :show, :id => 1, :prev => 1, :next => 3, :pos => 2, :count => 4 + assert_response :success + + assert_equal '1', assigns(:prev) + assert_equal '3', assigns(:next) + assert_equal '2', assigns(:pos) + assert_equal '4', assigns(:count) + + assert_equal '1', assigns(:prev_issue_id) + assert_equal '3', assigns(:next_issue_id) + assert_equal '2', assigns(:issue_position) + assert_equal '4', assigns(:issue_count) + + 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_not_display_prev_next_links_when_request_param_has_link_attributes_but_query_results_empty + @request.session[:query] = {:filters => {'status_id' => {:values => ['5'], :operator => 'c'}}, :project_id => 1} + Issue.update_all("status_id=1") # all issues is not matched the qeury condition + + get :show, :id => 1, :prev => 1, :next => 3, :pos => 2, :count => 4 + assert_response :success + + assert_nil assigns(:prev_issue_id) + assert_nil assigns(:next_issue_id) + assert_nil assigns(:issue_position) + assert_nil assigns(:issue_count) + + assert_select 'a', :text => /Previous/, :count => 0 + assert_select 'a', :text => /Next/, :count => 0 + end + def test_show_show_should_display_prev_next_links_with_query_sort_by_user_custom_field cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user') CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2') @@ -3537,6 +3582,29 @@ class IssuesControllerTest < ActionController::TestCase assert ActionMailer::Base.deliveries.empty? end + def test_put_update_should_retrieve_previous_and_next_issue_ids_and_added_parameters_on_redirect_url + issue = Issue.find(11) + issue.status_id = 5 + issue.save! + ActionMailer::Base.deliveries.clear + + @request.session[:query] = {:filters => {'status_id' => {:values => ['5'], :operator => 'c'}}, :project_id => 1} + @request.session['issues_index_sort'] = 'id' + @request.session[:user_id] = 2 + + put :update, :id => 11, :issue => {:status_id => 6, :notes => 'change status.'} + + assert_equal 6, assigns(:issue).status_id + issue.reload + assert_equal 6, issue.status_id + + assert_equal 3, assigns[:issue_count] + assert_equal 8, assigns[:prev_issue_id] + assert_equal 12, assigns[:next_issue_id] + assert_equal 2, assigns[:issue_position] + assert_redirected_to '/issues/11?count=3&next=12&pos=2&prev=8' + end + def test_put_update_should_send_a_notification @request.session[:user_id] = 2 ActionMailer::Base.deliveries.clear