diff --git a/app/controllers/auto_completes_controller.rb b/app/controllers/auto_completes_controller.rb new file mode 100644 index 00000000..1438106f --- /dev/null +++ b/app/controllers/auto_completes_controller.rb @@ -0,0 +1,25 @@ +class AutoCompletesController < ApplicationController + before_filter :find_project + + def issues + @issues = [] + q = params[:q].to_s + if q.match(/^\d+$/) + @issues << @project.issues.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) + end + render :layout => false + end + + private + + def find_project + project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id] + @project = Project.find(project_id) + rescue ActiveRecord::RecordNotFound + render_404 + end + +end diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index eaa6dbc3..4981f43e 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -21,7 +21,7 @@ class IssuesController < ApplicationController before_filter :find_issue, :only => [:show, :edit, :update] before_filter :find_issues, :only => [:bulk_edit, :move, :perform_move, :destroy] - before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete] + before_filter :find_project, :only => [:new, :create, :update_form, :preview] before_filter :authorize, :except => [:index, :changes, :preview, :context_menu] before_filter :find_optional_project, :only => [:index, :changes] before_filter :check_for_default_issue_status, :only => [:new, :create] @@ -316,18 +316,6 @@ class IssuesController < ApplicationController render :layout => false end - def auto_complete - @issues = [] - q = params[:q].to_s - if q.match(/^\d+$/) - @issues << @project.issues.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) - end - render :layout => false - end - private def find_issue @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category]) diff --git a/app/views/issues/auto_complete.html.erb b/app/views/auto_completes/issues.html.erb similarity index 100% rename from app/views/issues/auto_complete.html.erb rename to app/views/auto_completes/issues.html.erb diff --git a/app/views/issues/_form.rhtml b/app/views/issues/_form.rhtml index 1e3beaf8..ccb7a55a 100644 --- a/app/views/issues/_form.rhtml +++ b/app/views/issues/_form.rhtml @@ -9,10 +9,7 @@ <% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>

<%= f.text_field :parent_issue_id, :size => 10 %>

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

<%= f.text_area :description, diff --git a/config/routes.rb b/config/routes.rb index 08cd1005..910087ab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -104,7 +104,8 @@ ActionController::Routing::Routes.draw do |map| end map.resources :issue_moves, :only => [:new, :create], :path_prefix => '/issues', :as => 'move' - + map.auto_complete_issues '/issues/auto_complete', :controller => 'auto_completes', :action => 'issues' + map.with_options :controller => 'issues' do |issues_routes| issues_routes.with_options :conditions => {:method => :get} do |issues_views| issues_views.connect 'issues', :action => 'index' diff --git a/lib/redmine.rb b/lib/redmine.rb index 073e52d2..aa9fe75d 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -58,7 +58,8 @@ Redmine::AccessControl.map do |map| map.permission :manage_categories, {:projects => :settings, :issue_categories => [:new, :edit, :destroy]}, :require => :member # Issues map.permission :view_issues, {:projects => :roadmap, - :issues => [:index, :changes, :show, :context_menu, :auto_complete], + :issues => [:index, :changes, :show, :context_menu], + :auto_complete => [:issues], :versions => [:show, :status_by], :queries => :index, :reports => [:issue_report, :issue_report_details]} diff --git a/test/functional/auto_completes_controller_test.rb b/test/functional/auto_completes_controller_test.rb new file mode 100644 index 00000000..25e75fc4 --- /dev/null +++ b/test/functional/auto_completes_controller_test.rb @@ -0,0 +1,20 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class AutoCompletesControllerTest < ActionController::TestCase + fixtures :all + + def test_issues_should_not_be_case_sensitive + get :issues, :project_id => 'ecookbook', :q => 'ReCiPe' + assert_response :success + assert_not_nil assigns(:issues) + assert assigns(:issues).detect {|issue| issue.subject.match /recipe/} + end + + def test_issues_should_return_issue_with_given_id + get :issues, :project_id => 'subproject1', :q => '13' + assert_response :success + assert_not_nil assigns(:issues) + assert assigns(:issues).include?(Issue.find(13)) + end + +end diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 0c1172f6..948cf859 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -1123,20 +1123,6 @@ class IssuesControllerTest < ActionController::TestCase assert_not_nil assigns(:notes) end - def test_auto_complete_should_not_be_case_sensitive - get :auto_complete, :project_id => 'ecookbook', :q => 'ReCiPe' - assert_response :success - assert_not_nil assigns(:issues) - assert assigns(:issues).detect {|issue| issue.subject.match /recipe/} - end - - def test_auto_complete_should_return_issue_with_given_id - get :auto_complete, :project_id => 'subproject1', :q => '13' - assert_response :success - assert_not_nil assigns(:issues) - assert assigns(:issues).include?(Issue.find(13)) - end - def test_destroy_issue_with_no_time_entries assert_nil TimeEntry.find_by_issue_id(2) @request.session[:user_id] = 2 diff --git a/test/integration/routing_test.rb b/test/integration/routing_test.rb index b9eac552..607df5b0 100644 --- a/test/integration/routing_test.rb +++ b/test/integration/routing_test.rb @@ -100,7 +100,7 @@ class RoutingTest < ActionController::IntegrationTest should_route :get, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name' should_route :post, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name' - should_route :get, "/issues/auto_complete", :controller => 'issues', :action => 'auto_complete' + should_route :get, "/issues/auto_complete", :controller => 'auto_completes', :action => 'issues' end context "issue categories" do