diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index 97afffe012..f781673b35 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -133,12 +133,15 @@ class WatchersController < ApplicationController end def users_for_new_watcher - scope = nil - if params[:q].blank? && @project.present? - scope = @project.principals.assignable_watchers - else - scope = Principal.assignable_watchers.limit(100) - end + scope = if params[:q].blank? + if @project.present? + @project.principals.assignable_watchers + elsif @projects.present? && @projects.size > 1 + Principal.joins(:members).where(:members => { :project_id => @projects }).assignable_watchers.distinct + end + else + Principal.assignable_watchers.limit(100) + end users = scope.sorted.like(params[:q]).to_a if @watchables && @watchables.size == 1 watchable_object = @watchables.first diff --git a/app/views/watchers/_new.html.erb b/app/views/watchers/_new.html.erb index bc08a3322b..dfff5516c0 100644 --- a/app/views/watchers/_new.html.erb +++ b/app/views/watchers/_new.html.erb @@ -31,7 +31,7 @@ title = :controller => 'watchers', :action => 'autocomplete_for_user', :object_type => (watchables.present? ? watchables.first.class.name.underscore : nil), - :object_id => (watchables.present? && watchables.size == 1 ? watchables.first.id : nil), + :object_id => (watchables.present? ? watchables.map(&:id) : nil), :project_id => @project ) )}' diff --git a/test/functional/watchers_controller_test.rb b/test/functional/watchers_controller_test.rb index 5e399b7294..3d2224af7a 100644 --- a/test/functional/watchers_controller_test.rb +++ b/test/functional/watchers_controller_test.rb @@ -543,4 +543,37 @@ class WatchersControllerTest < Redmine::ControllerTest assert_response 404 end end + + def test_ajax_url_should_pass_object_id_when_there_are_multiple_objects + @request.session[:user_id] = 2 + get :new, :params => { + :object_id => [7, 9], + :object_type => 'issue' + }, :xhr => true + assert_response :success + + assert_match( + %r{/watchers/autocomplete_for_user\?object_id%5B%5D=7&object_id%5B%5D=9&object_type=issue}, + response.body + ) + end + + def test_autocomplete_for_user_with_multiple_projects + # 7 => eCookbook + # 9 => Private child of eCookbook + @request.session[:user_id] = 2 + get :autocomplete_for_user, :params => { + :object_id => [7, 9], + :object_type => 'issue' + }, :xhr => true + assert_response :success + + # All users from two projects eCookbook (7) and Private child of eCookbook (9) + assert_select 'input', :count => 5 + assert_select 'input[name=?][value="1"]', 'watcher[user_ids][]' + assert_select 'input[name=?][value="2"]', 'watcher[user_ids][]' + assert_select 'input[name=?][value="3"]', 'watcher[user_ids][]' + assert_select 'input[name=?][value="8"]', 'watcher[user_ids][]' + assert_select 'input[name=?][value="10"]', 'watcher[user_ids][]' + end end