diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-01-07 16:18:53 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-01-07 16:18:53 +0000 |
commit | d29638845a9c5d69f9ad6e9ab8c81ed29c808c3f (patch) | |
tree | 4fd7f84ee7eb5c3e1bc124ad7193812f24094013 | |
parent | dc8fcbaf036981fa08899f8de46afb8a18e4612a (diff) | |
download | redmine-d29638845a9c5d69f9ad6e9ab8c81ed29c808c3f.tar.gz redmine-d29638845a9c5d69f9ad6e9ab8c81ed29c808c3f.zip |
Allows project to be changed from the bulk edit form.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8536 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/controllers/issues_controller.rb | 39 | ||||
-rw-r--r-- | app/views/issues/bulk_edit.html.erb | 21 | ||||
-rw-r--r-- | config/routes.rb | 2 | ||||
-rw-r--r-- | test/functional/issues_controller_test.rb | 51 | ||||
-rw-r--r-- | test/integration/routing/issues_test.rb | 5 |
5 files changed, 109 insertions, 9 deletions
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 076a3a663..ff8d2d0e1 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -209,10 +209,25 @@ class IssuesController < ApplicationController # Bulk edit a set of issues def bulk_edit @issues.sort! - @available_statuses = @projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w} - @custom_fields = @projects.map{|p|p.all_issue_custom_fields}.inject{|memo,c|memo & c} - @assignables = @projects.map(&:assignable_users).inject{|memo,a| memo & a} - @trackers = @projects.map(&:trackers).inject{|memo,t| memo & t} + + if User.current.allowed_to?(:move_issues, @projects) + @allowed_projects = Issue.allowed_target_projects_on_move + if params[:issue] + @target_project = @allowed_projects.detect {|p| p.id.to_s == params[:issue][:project_id]} + if @target_project + target_projects = [@target_project] + end + end + end + target_projects ||= @projects + + @available_statuses = target_projects.map{|p|Workflow.available_statuses(p)}.inject{|memo,w|memo & w} + @custom_fields = target_projects.map{|p|p.all_issue_custom_fields}.inject{|memo,c|memo & c} + @assignables = target_projects.map(&:assignable_users).inject{|memo,a| memo & a} + @trackers = target_projects.map(&:trackers).inject{|memo,t| memo & t} + + @notes = params[:notes] + render :layout => false if request.xhr? end def bulk_update @@ -220,18 +235,30 @@ class IssuesController < ApplicationController attributes = parse_params_for_bulk_issue_attributes(params) unsaved_issue_ids = [] + moved_issues = [] @issues.each do |issue| issue.reload journal = issue.init_journal(User.current, params[:notes]) issue.safe_attributes = attributes call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue }) - unless issue.save + if issue.save + moved_issues << issue + else # Keep unsaved issue ids to display them in flash error unsaved_issue_ids << issue.id end end set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids) - redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project}) + + if params[:follow] + if @issues.size == 1 && moved_issues.size == 1 + redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first + elsif moved_issues.map(&:project).uniq.size == 1 + redirect_to :controller => 'issues', :action => 'index', :project_id => moved_issues.map(&:project).first + end + else + redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project}) + end end verify :method => :delete, :only => :destroy, :render => { :nothing => true, :status => :method_not_allowed } diff --git a/app/views/issues/bulk_edit.html.erb b/app/views/issues/bulk_edit.html.erb index 2a62a09ee..9161654ac 100644 --- a/app/views/issues/bulk_edit.html.erb +++ b/app/views/issues/bulk_edit.html.erb @@ -7,13 +7,22 @@ ) + h(": #{i.subject}")) }.join("\n").html_safe %></ul> -<% form_tag(:action => 'bulk_update') do %> +<% form_tag({:action => 'bulk_update'}, :id => 'bulk_edit_form') do %> <%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join("\n").html_safe %> <div class="box tabular"> <fieldset class="attributes"> <legend><%= l(:label_change_properties) %></legend> <div class="splitcontentleft"> +<% if @allowed_projects.present? %> +<p> + <label for="issue_project_id"><%= l(:field_project) %></label> + <%= select_tag('issue[project_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + project_tree_options_for_select(@allowed_projects, :selected => @target_project)) %> +</p> +<%= observe_field :issue_project_id, :url => {:action => 'bulk_edit'}, + :update => 'content', + :with => "Form.serialize('bulk_edit_form')" %> +<% end %> <p> <label for="issue_tracker_id"><%= l(:field_tracker) %></label> <%= select_tag('issue[tracker_id]', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@trackers, :id, :name)) %> @@ -92,5 +101,13 @@ </fieldset> </div> -<p><%= submit_tag l(:button_submit) %></p> +<p> + <% if @target_project %> + <%= submit_tag l(:button_move) %> + <%= submit_tag l(:button_move_and_follow), :name => 'follow' %> + <% else %> + <%= submit_tag l(:button_submit) %> + <% end %> +</p> + <% end %> diff --git a/config/routes.rb b/config/routes.rb index d7b76bb11..7814fe807 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -198,7 +198,7 @@ ActionController::Routing::Routes.draw do |map| map.resources :queries, :except => [:show] map.resources :issues, - :collection => {:bulk_edit => :get, :bulk_update => :post} do |issues| + :collection => {:bulk_edit => [:get, :post], :bulk_update => :post} do |issues| issues.resources :time_entries, :controller => 'timelog', :collection => {:report => :get} issues.resources :relations, :shallow => true, diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 435ff82f0..234cb41f8 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -2033,6 +2033,7 @@ class IssuesControllerTest < ActionController::TestCase assert_response :success assert_template 'bulk_edit' + assert_tag :select, :attributes => {:name => 'issue[project_id]'} assert_tag :input, :attributes => {:name => 'issue[parent_issue_id]'} # Project specific custom field, date type @@ -2185,6 +2186,38 @@ class IssuesControllerTest < ActionController::TestCase assert_equal 2, ActionMailer::Base.deliveries.size end + def test_bulk_update_project + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'} + assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' + # Issues moved to project 2 + assert_equal 2, Issue.find(1).project_id + assert_equal 2, Issue.find(2).project_id + # No tracker change + assert_equal 1, Issue.find(1).tracker_id + assert_equal 2, Issue.find(2).tracker_id + end + + def test_bulk_update_project_on_single_issue_should_follow_when_needed + @request.session[:user_id] = 2 + post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1' + assert_redirected_to '/issues/1' + end + + def test_bulk_update_project_on_multiple_issues_should_follow_when_needed + @request.session[:user_id] = 2 + post :bulk_update, :id => [1, 2], :issue => {:project_id => '2'}, :follow => '1' + assert_redirected_to '/projects/onlinestore/issues' + end + + def test_bulk_update_tracker + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'} + assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' + assert_equal 2, Issue.find(1).tracker_id + assert_equal 2, Issue.find(2).tracker_id + end + def test_bulk_update_status @request.session[:user_id] = 2 # update issues priority @@ -2198,6 +2231,24 @@ class IssuesControllerTest < ActionController::TestCase assert issue.closed? end + def test_bulk_update_priority + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6} + + assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' + assert_equal 6, Issue.find(1).priority_id + assert_equal 6, Issue.find(2).priority_id + end + + def test_bulk_update_with_notes + @request.session[:user_id] = 2 + post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues' + + assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' + assert_equal 'Moving two issues', Issue.find(1).journals.sort_by(&:id).last.notes + assert_equal 'Moving two issues', Issue.find(2).journals.sort_by(&:id).last.notes + end + def test_bulk_update_parent_id @request.session[:user_id] = 2 post :bulk_update, :ids => [1, 3], diff --git a/test/integration/routing/issues_test.rb b/test/integration/routing/issues_test.rb index b15c83d3f..cb727b7ac 100644 --- a/test/integration/routing/issues_test.rb +++ b/test/integration/routing/issues_test.rb @@ -123,6 +123,11 @@ class RoutingIssuesTest < ActionController::IntegrationTest { :method => 'get', :path => "/issues/bulk_edit" }, { :controller => 'issues', :action => 'bulk_edit' } ) + # For updating the bulk edit form + assert_routing( + { :method => 'post', :path => "/issues/bulk_edit" }, + { :controller => 'issues', :action => 'bulk_edit' } + ) assert_routing( { :method => 'post', :path => "/issues/bulk_update" }, { :controller => 'issues', :action => 'bulk_update' } |