]> source.dussan.org Git - redmine.git/commitdiff
Contextual quick search (#3263).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 21 Oct 2009 17:07:18 +0000 (17:07 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 21 Oct 2009 17:07:18 +0000 (17:07 +0000)
Eg. when viewing issues, the quick search will search issues only.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2943 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/application_controller.rb
app/controllers/boards_controller.rb
app/controllers/documents_controller.rb
app/controllers/issues_controller.rb
app/controllers/messages_controller.rb
app/controllers/news_controller.rb
app/controllers/repositories_controller.rb
app/controllers/wiki_controller.rb
app/views/layouts/base.rhtml
lib/redmine/search.rb [new file with mode: 0644]
test/functional/issues_controller_test.rb

index 59d117e4f996bb82c1f379906ee4eb24060c666d..68377b6f7b82799d286f012d48f753a33eb0d2eb 100644 (file)
@@ -26,6 +26,7 @@ class ApplicationController < ActionController::Base
   before_filter :user_setup, :check_if_login_required, :set_localization
   filter_parameter_logging :password
   
+  include Redmine::Search::Controller
   include Redmine::MenuManager::MenuController
   helper Redmine::MenuManager::MenuHelper
   
index eaac14e5b8b8f80daa5e3503abc2f75f71aeaaec..436398d1c392758bd7f88cf2acd931e2f0f97ef6 100644 (file)
@@ -16,6 +16,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class BoardsController < ApplicationController
+  default_search_scope :messages
   before_filter :find_project, :authorize
 
   helper :messages
index c2e08768fb9ca95419f38f3861d62fc3c8d986b8..c9eecf4f7861d2cde23edf981ea42b45cc89d6b3 100644 (file)
@@ -16,6 +16,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class DocumentsController < ApplicationController
+  default_search_scope :documents
   before_filter :find_project, :only => [:index, :new]
   before_filter :find_document, :except => [:index, :new]
   before_filter :authorize
index 74fe25d78ee5ecfb5e6baaba1de3f7fb09d963af..bebba10a4746e45084ac5a5adf89c7e0b13b4bfc 100644 (file)
@@ -17,6 +17,7 @@
 
 class IssuesController < ApplicationController
   menu_item :new_issue, :only => :new
+  default_search_scope :issues
   
   before_filter :find_issue, :only => [:show, :edit, :reply]
   before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
index f328e9b605d95bad631b4449982bb1b7d7ef1070..88609738a9fd0552883b5ddcadf35c1af2f17adf 100644 (file)
@@ -17,6 +17,7 @@
 
 class MessagesController < ApplicationController
   menu_item :boards
+  default_search_scope :messages
   before_filter :find_board, :only => [:new, :preview]
   before_filter :find_message, :except => [:new, :preview]
   before_filter :authorize, :except => [:preview, :edit, :destroy]
index a8ad716ee7f0129f67330f07d7c7419efa822d65..68d2b2a8b041cc4ce09fe235cdfc1a2b38c8d252 100644 (file)
@@ -16,6 +16,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 class NewsController < ApplicationController
+  default_search_scope :news
   before_filter :find_news, :except => [:new, :index, :preview]
   before_filter :find_project, :only => [:new, :preview]
   before_filter :authorize, :except => [:index, :preview]
index 7527f0d9a20142455d3401e2c84647c19f23e355..8e39d42c7fd892595d7ca1fde2997be938b96890 100644 (file)
@@ -24,6 +24,8 @@ class InvalidRevisionParam < Exception; end
 
 class RepositoriesController < ApplicationController
   menu_item :repository
+  default_search_scope :changesets
+  
   before_filter :find_repository, :except => :edit
   before_filter :find_project, :only => :edit
   before_filter :authorize
index b000b0596f02f1e85e6990864dda27a51fba2b72..63382f81c015214db005ce9d3848904f6e90fd6e 100644 (file)
@@ -18,6 +18,7 @@
 require 'diff'
 
 class WikiController < ApplicationController
+  default_search_scope :wiki_pages
   before_filter :find_wiki, :authorize
   before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
   
index 471953a66e3d9e0070ec85a7fa6688ac68cb67bc..d8fdcf0d59023c70bb931ae3fc5dc193300b2ce6 100644 (file)
@@ -31,6 +31,7 @@
 <div id="header">
     <div id="quick-search">
         <% form_tag({:controller => 'search', :action => 'index', :id => @project}, :method => :get ) do %>
+        <%= hidden_field_tag(controller.default_search_scope, 1, :id => nil) if controller.default_search_scope %>
         <%= link_to l(:label_search), {:controller => 'search', :action => 'index', :id => @project}, :accesskey => accesskey(:search) %>:
         <%= text_field_tag 'q', @question, :size => 20, :class => 'small', :accesskey => accesskey(:quick_search) %>
         <% end %>
diff --git a/lib/redmine/search.rb b/lib/redmine/search.rb
new file mode 100644 (file)
index 0000000..ed1f629
--- /dev/null
@@ -0,0 +1,55 @@
+# Redmine - project management software
+# Copyright (C) 2006-2009  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module Redmine
+  module Search
+    module Controller
+      def self.included(base)
+        base.extend(ClassMethods)
+      end
+
+      module ClassMethods
+        @@default_search_scopes = Hash.new {|hash, key| hash[key] = {:default => nil, :actions => {}}}
+        mattr_accessor :default_search_scopes
+        
+        # Set the default search scope for a controller or specific actions
+        # Examples:
+        #   * search_scope :issues # => sets the search scope to :issues for the whole controller
+        #   * search_scope :issues, :only => :index
+        #   * search_scope :issues, :only => [:index, :show]
+        def default_search_scope(id, options = {})
+          if actions = options[:only]
+            actions = [] << actions unless actions.is_a?(Array)
+            actions.each {|a| default_search_scopes[controller_name.to_sym][:actions][a.to_sym] = id.to_s}
+          else
+            default_search_scopes[controller_name.to_sym][:default] = id.to_s
+          end
+        end
+      end
+
+      def default_search_scopes
+        self.class.default_search_scopes
+      end
+
+      # Returns the default search scope according to the current action
+      def default_search_scope
+        @default_search_scope ||= default_search_scopes[controller_name.to_sym][:actions][action_name.to_sym] ||
+                                  default_search_scopes[controller_name.to_sym][:default]
+      end
+    end
+  end
+end
index 0c50172510584d8bae7dc635202c2d7f09fe6c93..de45e96d9b6de8b909413ced469117cb58926d15 100644 (file)
@@ -1093,4 +1093,11 @@ class IssuesControllerTest < ActionController::TestCase
     assert_equal 2, TimeEntry.find(1).issue_id
     assert_equal 2, TimeEntry.find(2).issue_id
   end
+  
+  def test_default_search_scope
+    get :index
+    assert_tag :div, :attributes => {:id => 'quick-search'},
+                     :child => {:tag => 'form',
+                                :child => {:tag => 'input', :attributes => {:name => 'issues', :type => 'hidden', :value => '1'}}}
+  end
 end