diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2015-01-10 10:09:34 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2015-01-10 10:09:34 +0000 |
commit | 0ed895388b89c1092f88da7c501587b70c4e899e (patch) | |
tree | 7e9537ecc7af04355e6e7dc256a892edef75352d | |
parent | 6e94d2f2af616dd3180c1b4eebe35b467198bb2d (diff) | |
download | redmine-0ed895388b89c1092f88da7c501587b70c4e899e.tar.gz redmine-0ed895388b89c1092f88da7c501587b70c4e899e.zip |
Option to search open issues only (#10734).
git-svn-id: http://svn.redmine.org/redmine/trunk@13858 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r-- | app/controllers/search_controller.rb | 3 | ||||
-rw-r--r-- | app/models/issue.rb | 3 | ||||
-rw-r--r-- | app/views/search/index.html.erb | 1 | ||||
-rw-r--r-- | config/locales/en.yml | 1 | ||||
-rw-r--r-- | config/locales/fr.yml | 1 | ||||
-rw-r--r-- | lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb | 12 | ||||
-rw-r--r-- | test/functional/search_controller_test.rb | 9 |
7 files changed, 22 insertions, 8 deletions
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index e140878a9..9bdfb0f5d 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -24,6 +24,7 @@ class SearchController < ApplicationController @all_words = params[:all_words] ? params[:all_words].present? : true @titles_only = params[:titles_only] ? params[:titles_only].present? : false @search_attachments = params[:attachments].presence || '0' + @open_issues = params[:open_issues] ? params[:open_issues].present? : false # quick jump to an issue if (m = @question.match(/^#?(\d+)$/)) && (issue = Issue.visible.find_by_id(m[1].to_i)) @@ -56,7 +57,7 @@ class SearchController < ApplicationController fetcher = Redmine::Search::Fetcher.new( @question, User.current, @scope, projects_to_search, - :all_words => @all_words, :titles_only => @titles_only, :attachments => @search_attachments, + :all_words => @all_words, :titles_only => @titles_only, :attachments => @search_attachments, :open_issues => @open_issues, :cache => params[:page].present? ) diff --git a/app/models/issue.rb b/app/models/issue.rb index e7a444d7d..0f6312f2c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -47,7 +47,8 @@ class Issue < ActiveRecord::Base acts_as_customizable acts_as_watchable acts_as_searchable :columns => ['subject', "#{table_name}.description"], - :preload => [:project, :status, :tracker] + :preload => [:project, :status, :tracker], + :scope => lambda {|options| options[:open_issues] ? self.open : self.all} acts_as_event :title => Proc.new {|o| "#{o.tracker.name} ##{o.id} (#{o.status}): #{o.subject}"}, :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.id}}, diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb index aaf08d369..935abf5a2 100644 --- a/app/views/search/index.html.erb +++ b/app/views/search/index.html.erb @@ -20,6 +20,7 @@ <fieldset class="collapsible collapsed"> <legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> <div id="options-content" style="display:none;"> + <p><label><%= check_box_tag 'open_issues', 1, @open_issues %> <%= l(:label_search_open_issues_only) %></label></p> <p> <label><%= radio_button_tag 'attachments', '0', @search_attachments == '0' %> <%= l(:label_search_attachments_no) %></label> <label><%= radio_button_tag 'attachments', '1', @search_attachments == '1' %> <%= l(:label_search_attachments_yes) %></label> diff --git a/config/locales/en.yml b/config/locales/en.yml index c7d13cc0f..86d9b50b0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -930,6 +930,7 @@ en: label_search_attachments_yes: Search attachment filenames and descriptions label_search_attachments_no: Do not search attachments label_search_attachments_only: Search attachments only + label_search_open_issues_only: Open issues only button_login: Login button_submit: Submit diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 26857d9c8..1c5fbf889 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -950,6 +950,7 @@ fr: label_search_attachments_yes: Rechercher les noms et descriptions de fichiers label_search_attachments_no: Ne pas rechercher les fichiers label_search_attachments_only: Rechercher les fichiers uniquement + label_search_open_issues_only: Demandes ouvertes uniquement button_login: Connexion button_submit: Soumettre diff --git a/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb b/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb index 2ffe79e0a..86d954d59 100644 --- a/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb +++ b/lib/plugins/acts_as_searchable/lib/acts_as_searchable.rb @@ -89,7 +89,7 @@ module Redmine unless options[:attachments] == 'only' r = fetch_ranks_and_ids( - search_scope(user, projects). + search_scope(user, projects, options). where(search_tokens_condition(columns, tokens, options[:all_words])), options[:limit] ) @@ -109,7 +109,7 @@ module Redmine visibility = clauses.join(' OR ') r |= fetch_ranks_and_ids( - search_scope(user, projects). + search_scope(user, projects, options). joins(:custom_values). where(visibility). where(search_tokens_condition(["#{CustomValue.table_name}.value"], tokens, options[:all_words])), @@ -121,7 +121,7 @@ module Redmine if !options[:titles_only] && searchable_options[:search_journals] r |= fetch_ranks_and_ids( - search_scope(user, projects). + search_scope(user, projects, options). joins(:journals). where("#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(user, :view_private_notes)})", false). where(search_tokens_condition(["#{Journal.table_name}.notes"], tokens, options[:all_words])), @@ -133,7 +133,7 @@ module Redmine if searchable_options[:search_attachments] && (options[:titles_only] ? options[:attachments] == 'only' : options[:attachments] != '0') r |= fetch_ranks_and_ids( - search_scope(user, projects). + search_scope(user, projects, options). joins(:attachments). where(search_tokens_condition(["#{Attachment.table_name}.filename", "#{Attachment.table_name}.description"], tokens, options[:all_words])), options[:limit] @@ -180,7 +180,7 @@ module Redmine private :fetch_ranks_and_ids # Returns the search scope for user and projects - def search_scope(user, projects) + def search_scope(user, projects, options={}) if projects.is_a?(Array) && projects.empty? # no results return none @@ -188,7 +188,7 @@ module Redmine scope = (searchable_options[:scope] || self) if scope.is_a? Proc - scope = scope.call + scope = scope.call(options) end if respond_to?(:visible) && !searchable_options.has_key?(:permission) diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb index d57cc0757..924c049b9 100644 --- a/test/functional/search_controller_test.rb +++ b/test/functional/search_controller_test.rb @@ -209,6 +209,15 @@ class SearchControllerTest < ActionController::TestCase assert_equal 2, results.size end + def test_search_open_issues + Issue.generate! :subject => 'search_open' + Issue.generate! :subject => 'search_open', :status_id => 5 + + get :index, :id => 1, :q => 'search_open', :open_issues => '1' + results = assigns(:results) + assert_equal 1, results.size + end + def test_search_all_words # 'all words' is on by default get :index, :id => 1, :q => 'recipe updating saving', :all_words => '1' |