Index: test/functional/issues_controller_test.rb =================================================================== --- test/functional/issues_controller_test.rb (revision 3709) +++ test/functional/issues_controller_test.rb (working copy) @@ -1249,7 +1249,21 @@ assert_not_nil assigns(:issues) assert assigns(:issues).include?(Issue.find(13)) end + + def test_auto_complete_with_scope_all_and_cross_project_relations + Setting.cross_project_issue_relations = '1' + get :aut_complete, :project_id => 'ecookbook', :q => '13', :scope => 'all' + assert_response :success + assert_not_nil assigns(:issues) + assert assigns(:issues).include?(Issue.find(13)) + end + def test_auto_complete_with_scope_all_without_cross_project_relations + get :aut_complete, :project_id => 'ecookbook', :q => '13', :scope => 'all' + assert_response :success + assert_nil assigns(:issues) + end + def test_destroy_issue_with_no_time_entries assert_nil TimeEntry.find_by_issue_id(2) @request.session[:user_id] = 2 Index: app/controllers/issues_controller.rb =================================================================== --- app/controllers/issues_controller.rb (revision 3709) +++ app/controllers/issues_controller.rb (working copy) @@ -405,11 +405,12 @@ def auto_complete @issues = [] q = params[:q].to_s + query = (params[:scope] == "all" && Setting.cross_project_issue_relations?) ? Issue : @project.issues if q.match(/^\d+$/) - @issues << @project.issues.visible.find_by_id(q.to_i) + @issues << query.visible.find_by_id(q.to_i) end unless q.blank? - @issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10) + @issues += query.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10) end render :layout => false end Index: public/javascripts/application.js =================================================================== --- public/javascripts/application.js (revision 3709) +++ public/javascripts/application.js (working copy) @@ -206,6 +206,20 @@ }}); } +function observeRelatedIssueField(url) { + new Ajax.Autocompleter('relation_issue_to_id', + 'related_issue_candidates', + url, + { minChars: 3, + frequency: 0.5, + paramName: 'q', + updateElement: function(value) { + document.getElementById('relation_issue_to_id').value = value.id; + }, + parameters: 'scope=all' + }); +} + /* shows and hides ajax indicator */ Ajax.Responders.register({ onCreate: function(){ Index: public/stylesheets/application.css =================================================================== --- public/stylesheets/application.css (revision 3709) +++ public/stylesheets/application.css (working copy) @@ -655,6 +655,7 @@ } #parent_issue_candidates ul li {width: 500px;} +#related_issue_candidates ul li {width: 500px;} /***** Diff *****/ .diff_out { background: #fcc; } Index: app/views/issue_relations/_form.rhtml =================================================================== --- app/views/issue_relations/_form.rhtml (revision 3709) +++ app/views/issue_relations/_form.rhtml (working copy) @@ -2,6 +2,11 @@

<%= f.select :relation_type, collection_for_relation_type_select, {}, :onchange => "setPredecessorFieldsVisibility();" %> <%= l(:label_issue) %> #<%= f.text_field :issue_to_id, :size => 6 %> +

+<%= javascript_tag "observeRelatedIssueField('#{url_for(:controller => :issues, + :action => :auto_complete, + :id => @issue, + :project_id => @project) }')" %>