From 75324e48592fbe141a66ba7e5dbda8553bbd2db1 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Tue, 27 Feb 2007 21:03:15 +0000 Subject: [PATCH] added a simple search engine. left to do: - full content search (only subject/titles for now) - pagination - results presentation improvement git-svn-id: http://redmine.rubyforge.org/svn/trunk@279 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/projects_controller.rb | 12 ++++++++++ app/views/layouts/base.rhtml | 2 ++ app/views/projects/search.rhtml | 32 +++++++++++++++++++++++++ db/migrate/025_add_search_permission.rb | 9 +++++++ lang/de.yml | 3 +++ lang/en.yml | 3 +++ lang/es.yml | 3 +++ lang/fr.yml | 3 +++ lang/ja.yml | 3 +++ public/stylesheets/application.css | 2 ++ 10 files changed, 72 insertions(+) create mode 100644 app/views/projects/search.rhtml create mode 100644 db/migrate/025_add_search_permission.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ce2e39fa..ab1cb3e1 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -539,6 +539,18 @@ class ProjectsController < ApplicationController end end + def search + @token = params[:token] + @scope = params[:scope] || (params[:submit] ? [] : %w(issues news documents) ) + + if @token and @token.length > 2 + @results = [] + @results += @project.issues.find(:all, :include => :author, :conditions => ["issues.subject like ?", "%#{@token}%"] ) if @scope.include? 'issues' + @results += @project.news.find(:all, :conditions => ["news.title like ?", "%#{@token}%"], :include => :author ) if @scope.include? 'news' + @results += @project.documents.find(:all, :conditions => ["title like ?", "%#{@token}%"] ) if @scope.include? 'documents' + end + end + private # Find project of id params[:id] # if not found, redirect to project list diff --git a/app/views/layouts/base.rhtml b/app/views/layouts/base.rhtml index b359898f..53c346dc 100644 --- a/app/views/layouts/base.rhtml +++ b/app/views/layouts/base.rhtml @@ -93,6 +93,7 @@ <%= link_to l(:label_document_plural), {:controller => 'projects', :action => 'list_documents', :id => @project }, :class => "menuItem" %> <%= link_to l(:label_member_plural), {:controller => 'projects', :action => 'list_members', :id => @project }, :class => "menuItem" %> <%= link_to l(:label_attachment_plural), {:controller => 'projects', :action => 'list_files', :id => @project }, :class => "menuItem" %> + <%= link_to l(:label_search), {:controller => 'projects', :action => 'search', :id => @project }, :class => "menuItem" %> <%= link_to l(:label_repository), {:controller => 'repositories', :action => 'show', :id => @project}, :class => "menuItem" if @project.repository and !@project.repository.new_record? %> <%= link_to_if_authorized l(:label_settings), {:controller => 'projects', :action => 'settings', :id => @project }, :class => "menuItem" %> @@ -116,6 +117,7 @@
  • <%= link_to l(:label_document_plural), :controller => 'projects', :action => 'list_documents', :id => @project %>
  • <%= link_to l(:label_member_plural), :controller => 'projects', :action => 'list_members', :id => @project %>
  • <%= link_to l(:label_attachment_plural), :controller => 'projects', :action => 'list_files', :id => @project %>
  • +
  • <%= link_to l(:label_search), :controller => 'projects', :action => 'search', :id => @project %>
  • <%= link_to l(:label_repository), :controller => 'repositories', :action => 'show', :id => @project if @project.repository and !@project.repository.new_record? %>
  • <%= link_to_if_authorized l(:label_settings), :controller => 'projects', :action => 'settings', :id => @project %>
  • diff --git a/app/views/projects/search.rhtml b/app/views/projects/search.rhtml new file mode 100644 index 00000000..32e486fe --- /dev/null +++ b/app/views/projects/search.rhtml @@ -0,0 +1,32 @@ +

    <%= l(:label_search) %>

    + +
    +<% form_tag({:action => 'search', :id => @project}, :method => :get) do %> +

    <%= text_field_tag 'token', @token, :size => 30 %> +<%= check_box_tag 'scope[]', 'issues', (@scope.include? 'issues') %> +<%= check_box_tag 'scope[]', 'news', (@scope.include? 'news') %> +<%= check_box_tag 'scope[]', 'documents', (@scope.include? 'documents') %>

    +<%= submit_tag l(:button_submit), :name => 'submit' %> +<% end %> +
    + +<% if @results %> +

    <%= lwr(:label_result, @results.length) %>

    + +<% end %> \ No newline at end of file diff --git a/db/migrate/025_add_search_permission.rb b/db/migrate/025_add_search_permission.rb new file mode 100644 index 00000000..212a4dc5 --- /dev/null +++ b/db/migrate/025_add_search_permission.rb @@ -0,0 +1,9 @@ +class AddSearchPermission < ActiveRecord::Migration + def self.up + Permission.create :controller => "projects", :action => "search", :description => "label_search", :sort => 130, :is_public => true, :mail_option => 0, :mail_enabled => 0 + end + + def self.down + Permission.find_by_controller_and_action('projects', 'roadmap').destroy + end +end diff --git a/lang/de.yml b/lang/de.yml index 2bee78a3..4339cad9 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -315,6 +315,9 @@ label_sort_higher: Aufzurichten label_sort_lower: Herabzusteigen label_sort_lowest: Letzter label_roadmap: Roadmap +label_search: Suche +label_result: %d Resultat +label_result_plural: %d Resultate button_login: Einloggen button_submit: Einreichen diff --git a/lang/en.yml b/lang/en.yml index 0696bda5..27e3cb77 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -315,6 +315,9 @@ label_sort_higher: Move up label_sort_lower: Move down label_sort_lowest: Move to bottom label_roadmap: Roadmap +label_search: Search +label_result: %d result +label_result_plural: %d results button_login: Login button_submit: Submit diff --git a/lang/es.yml b/lang/es.yml index 9e7cbe9d..d09f58bb 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -315,6 +315,9 @@ label_sort_higher: Subir label_sort_lower: Bajar label_sort_lowest: Último label_roadmap: Roadmap +label_search: Búsqueda +label_result: %d resultado +label_result_plural: %d resultados button_login: Conexión button_submit: Someter diff --git a/lang/fr.yml b/lang/fr.yml index 77cd839d..30a4fb2d 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -315,6 +315,9 @@ label_sort_higher: Remonter label_sort_lower: Descendre label_sort_lowest: Descendre en dernier label_roadmap: Roadmap +label_search: Recherche +label_result: %d résultat +label_result_plural: %d résultats button_login: Connexion button_submit: Soumettre diff --git a/lang/ja.yml b/lang/ja.yml index 93d9e766..7336c578 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -316,6 +316,9 @@ label_sort_higher: 上へ label_sort_lower: 下へ label_sort_lowest: 一番下へ label_roadmap: ロードマップ +label_search: Search +label_result: %d result +label_result_plural: %d results button_login: ログイン button_submit: 変更 diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 2f20c8e9..aaf332a1 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -243,6 +243,8 @@ legend {color: #505050;} hr { border:none; border-bottom: dotted 1px #c0c0c0; } table p {margin:0; padding:0;} +strong.highlight { background-color: #FCFD8D;} + div.square { border: 1px solid #999; float: left;