##// END OF EJS Templates
Autocomplete issue relations on subject (#3170)....
Jean-Philippe Lang -
r4388:a8b12bcb5202
parent child
Show More
@@ -4,11 +4,12 class AutoCompletesController < ApplicationController
4 def issues
4 def issues
5 @issues = []
5 @issues = []
6 q = params[:q].to_s
6 q = params[:q].to_s
7 query = (params[:scope] == "all" && Setting.cross_project_issue_relations?) ? Issue : @project.issues
7 if q.match(/^\d+$/)
8 if q.match(/^\d+$/)
8 @issues << @project.issues.visible.find_by_id(q.to_i)
9 @issues << query.visible.find_by_id(q.to_i)
9 end
10 end
10 unless q.blank?
11 unless q.blank?
11 @issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
12 @issues += query.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
12 end
13 end
13 render :layout => false
14 render :layout => false
14 end
15 end
@@ -1,7 +1,9
1 <%= error_messages_for 'relation' %>
1 <%= error_messages_for 'relation' %>
2
2
3 <p><%= f.select :relation_type, collection_for_relation_type_select, {}, :onchange => "setPredecessorFieldsVisibility();" %>
3 <p><%= f.select :relation_type, collection_for_relation_type_select, {}, :onchange => "setPredecessorFieldsVisibility();" %>
4 <%= l(:label_issue) %> #<%= f.text_field :issue_to_id, :size => 6 %>
4 <%= l(:label_issue) %> #<%= f.text_field :issue_to_id, :size => 10 %>
5 <div id="related_issue_candidates" class="autocomplete"></div>
6 <%= javascript_tag "observeRelatedIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
5 <span id="predecessor_fields" style="display:none;">
7 <span id="predecessor_fields" style="display:none;">
6 <%= l(:field_delay) %>: <%= f.text_field :delay, :size => 3 %> <%= l(:label_day_plural) %>
8 <%= l(:field_delay) %>: <%= f.text_field :delay, :size => 3 %> <%= l(:label_day_plural) %>
7 </span>
9 </span>
@@ -218,6 +218,20 function observeParentIssueField(url) {
218 }});
218 }});
219 }
219 }
220
220
221 function observeRelatedIssueField(url) {
222 new Ajax.Autocompleter('relation_issue_to_id',
223 'related_issue_candidates',
224 url,
225 { minChars: 3,
226 frequency: 0.5,
227 paramName: 'q',
228 updateElement: function(value) {
229 document.getElementById('relation_issue_to_id').value = value.id;
230 },
231 parameters: 'scope=all'
232 });
233 }
234
221 /* shows and hides ajax indicator */
235 /* shows and hides ajax indicator */
222 Ajax.Responders.register({
236 Ajax.Responders.register({
223 onCreate: function(){
237 onCreate: function(){
@@ -663,6 +663,7 div.autocomplete ul li span.informal {
663 }
663 }
664
664
665 #parent_issue_candidates ul li {width: 500px;}
665 #parent_issue_candidates ul li {width: 500px;}
666 #related_issue_candidates ul li {width: 500px;}
666
667
667 /***** Diff *****/
668 /***** Diff *****/
668 .diff_out { background: #fcc; }
669 .diff_out { background: #fcc; }
@@ -17,4 +17,18 class AutoCompletesControllerTest < ActionController::TestCase
17 assert assigns(:issues).include?(Issue.find(13))
17 assert assigns(:issues).include?(Issue.find(13))
18 end
18 end
19
19
20 def test_auto_complete_with_scope_all_and_cross_project_relations
21 Setting.cross_project_issue_relations = '1'
22 get :issues, :project_id => 'ecookbook', :q => '13', :scope => 'all'
23 assert_response :success
24 assert_not_nil assigns(:issues)
25 assert assigns(:issues).include?(Issue.find(13))
26 end
27
28 def test_auto_complete_with_scope_all_without_cross_project_relations
29 Setting.cross_project_issue_relations = '0'
30 get :issues, :project_id => 'ecookbook', :q => '13', :scope => 'all'
31 assert_response :success
32 assert_equal [nil], assigns(:issues)
33 end
20 end
34 end
General Comments 0
You need to be logged in to leave comments. Login now