diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 92aba61..164ca6a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -169,6 +169,11 @@ class ApplicationController < ActionController::Base fallback_find_by_contents(asset, scope, query, paginate_options, options) end + def find_suggestions(asset, query, options={}) + plugins.dispatch_first(:find_suggestions, asset, query, options) || + fallback_find_suggestions(asset, query, options) + end + private def fallback_find_by_contents(asset, scope, query, paginate_options, options) @@ -177,4 +182,7 @@ class ApplicationController < ActionController::Base {:results => scope.paginate(paginate_options)} end + def fallback_find_suggestions(asset, query, options) + #TODO Implement fallback suggestions solution + end end diff --git a/app/controllers/public/search_controller.rb b/app/controllers/public/search_controller.rb index eae18f7..c4ab956 100644 --- a/app/controllers/public/search_controller.rb +++ b/app/controllers/public/search_controller.rb @@ -4,11 +4,11 @@ class SearchController < PublicController include SearchHelper include ActionView::Helpers::NumberHelper - before_filter :redirect_asset_param, :except => :assets - before_filter :load_category - before_filter :load_search_assets - before_filter :load_query - before_filter :load_filter + before_filter :redirect_asset_param, :except => [:assets, :suggestions] + before_filter :load_category, :except => :suggestions + before_filter :load_search_assets, :except => :suggestions + before_filter :load_query, :except => :suggestions + before_filter :load_filter, :except => :suggestions # Backwards compatibility with old URLs def redirect_asset_param @@ -143,6 +143,10 @@ class SearchController < PublicController render :partial => 'events/events' end + def suggestions + render :text => find_suggestions(params[:term], environment, params[:asset]).to_json + end + ####################################################### protected diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 9524548..604277c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1402,4 +1402,8 @@ module ApplicationHelper content_tag('ul', article.versions.map {|v| link_to("r#{v.version}", @page.url.merge(:version => v.version))}) end + def search_input_with_suggestions(name, asset, default, options = {}) + text_field_tag name, default, options.merge({:id => 'search-input', 'data-asset' => asset}) + end + end diff --git a/app/views/search/_search_form.html.erb b/app/views/search/_search_form.html.erb index 07cc38b..d044381 100644 --- a/app/views/search/_search_form.html.erb +++ b/app/views/search/_search_form.html.erb @@ -8,7 +8,7 @@
- <%= text_field_tag 'query', @query, :id => 'search-input', :size => 50 %> + <%= search_input_with_suggestions('query', @asset, @query, {:size => 50}) %> <%= javascript_tag "jQuery('#search-input').attr('title', \"#{hint}\").hint()" if defined?(hint) %> diff --git a/lib/noosfero/plugin.rb b/lib/noosfero/plugin.rb index a3608de..9e56689 100644 --- a/lib/noosfero/plugin.rb +++ b/lib/noosfero/plugin.rb @@ -507,6 +507,17 @@ class Noosfero::Plugin def find_by_contents(asset, scope, query, paginate_options={}, options={}) end + # -> Suggests terms based on asset and query + # returns = [a, b, c, ...] + def find_suggestions(query, context, asset, options={:limit => 5}) + context.search_terms. + where(:asset => asset). + where("search_terms.term like ?", "#{query}%"). + where('search_terms.score > 0'). + order('search_terms.score DESC'). + limit(options[:limit]).map(&:term) + end + # -> Adds aditional fields for change_password # returns = [{:field => 'field1', :name => 'field 1 name', :model => 'person'}, {...}] def change_password_fields diff --git a/public/javascripts/application.js b/public/javascripts/application.js index fe80a0a..34283dc 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1101,4 +1101,24 @@ jQuery(document).ready(function(){ jQuery("#article_has_terms_of_use").click(function(){ showHideTermsOfUse(); }); + + // Suggestions on search inputs + (function($) { + var suggestions_cache = {}; + $("#search-input").autocomplete({ + minLength: 2, + source: function(request, response) { + var term = request.term; + if (term in suggestions_cache) { + response(suggestions_cache[term]); + return; + } + request["asset"] = $("#search-input").data("asset"); + $.getJSON("/search/suggestions", request, function(data, status, xhr) { + suggestions_cache[term] = data; + response(data); + }); + } + }); + })(jQuery); }); -- libgit2 0.21.2