Commit e1a0da0107e96192f877de78737ef41575ab94c4
1 parent
af6235af
Exists in
master
and in
23 other branches
Restrict altBeautify fix and disabled searches
Showing
9 changed files
with
105 additions
and
70 deletions
Show diff stats
app/controllers/public/search_controller.rb
| ... | ... | @@ -44,8 +44,9 @@ class SearchController < PublicController |
| 44 | 44 | end |
| 45 | 45 | |
| 46 | 46 | def products |
| 47 | + public_filters = ['public:true', 'enabled:true'] | |
| 47 | 48 | if !@empty_query |
| 48 | - full_text_search ['public:true', 'enabled:true'] | |
| 49 | + full_text_search public_filters | |
| 49 | 50 | else |
| 50 | 51 | @one_page = true |
| 51 | 52 | @geosearch = logged_in? && current_user.person.lat && current_user.person.lng |
| ... | ... | @@ -53,11 +54,11 @@ class SearchController < PublicController |
| 53 | 54 | extra_limit = LIST_SEARCH_LIMIT*5 |
| 54 | 55 | sql_options = {:limit => LIST_SEARCH_LIMIT, :order => 'random()'} |
| 55 | 56 | if @geosearch |
| 56 | - full_text_search ['public:true', "{!geofilt}"], :sql_options => sql_options, :extra_limit => extra_limit, | |
| 57 | + full_text_search public_filters, :sql_options => sql_options, :extra_limit => extra_limit, | |
| 57 | 58 | :alternate_query => "{!boost b=recip(geodist(),#{"%e" % (1.to_f/DistBoost)},1,1)}", |
| 58 | 59 | :radius => DistFilt, :latitude => current_user.person.lat, :longitude => current_user.person.lng |
| 59 | 60 | else |
| 60 | - full_text_search ['public:true'], :sql_options => sql_options, :extra_limit => extra_limit, | |
| 61 | + full_text_search public_filters, :sql_options => sql_options, :extra_limit => extra_limit, | |
| 61 | 62 | :boost_functions => ['recip(ms(NOW/HOUR,updated_at),1.3e-10,1,1)'] |
| 62 | 63 | end |
| 63 | 64 | end |
| ... | ... | @@ -190,7 +191,9 @@ class SearchController < PublicController |
| 190 | 191 | end |
| 191 | 192 | |
| 192 | 193 | def load_category |
| 193 | - unless params[:category_path].blank? | |
| 194 | + if params[:category_path].blank? | |
| 195 | + render_not_found if params[:action] == 'category_index' | |
| 196 | + else | |
| 194 | 197 | path = params[:category_path].join('/') |
| 195 | 198 | @category = environment.categories.find_by_path(path) |
| 196 | 199 | if @category.nil? |
| ... | ... | @@ -229,22 +232,19 @@ class SearchController < PublicController |
| 229 | 232 | end |
| 230 | 233 | |
| 231 | 234 | def load_search_assets |
| 232 | - @enabled_searches = [ | |
| 233 | - [ :articles, _('Contents') ], | |
| 234 | - [ :enterprises, _('Enterprises') ], | |
| 235 | - [ :people, _('People') ], | |
| 236 | - [ :communities, _('Communities') ], | |
| 237 | - [ :products, _('Products and Services') ], | |
| 238 | - [ :events, _('Events') ] | |
| 239 | - ].select {|key, name| !environment.enabled?('disable_asset_' + key.to_s) } | |
| 235 | + if Searches.keys.include?(params[:action].to_sym) and environment.enabled?("disable_asset_#{params[:action]}") | |
| 236 | + render_not_found | |
| 237 | + return | |
| 238 | + end | |
| 240 | 239 | |
| 240 | + @enabled_searches = Searches.select {|key, name| environment.disabled?("disable_asset_#{params[:action]}") } | |
| 241 | 241 | @searching = {} |
| 242 | 242 | @titles = {} |
| 243 | 243 | @enabled_searches.each do |key, name| |
| 244 | 244 | @titles[key] = name |
| 245 | 245 | @searching[key] = params[:action] == 'index' || params[:action] == key.to_s |
| 246 | 246 | end |
| 247 | - @names = @titles if @names.nil? | |
| 247 | + @names = @titles if @names.nil? | |
| 248 | 248 | end |
| 249 | 249 | |
| 250 | 250 | def limit | ... | ... |
app/helpers/search_helper.rb
| ... | ... | @@ -6,6 +6,16 @@ module SearchHelper |
| 6 | 6 | MULTIPLE_SEARCH_LIMIT = 8 |
| 7 | 7 | DistFilt = 200 |
| 8 | 8 | DistBoost = 50 |
| 9 | + | |
| 10 | + Searches = ActiveSupport::OrderedHash[ | |
| 11 | + :articles, _('Contents'), | |
| 12 | + :enterprises, _('Enterprises'), | |
| 13 | + :people, _('People'), | |
| 14 | + :communities, _('Communities'), | |
| 15 | + :products, _('Products and Services'), | |
| 16 | + :events, _('Events'), | |
| 17 | + ] | |
| 18 | + | |
| 9 | 19 | SortOptions = { |
| 10 | 20 | :products => ActiveSupport::OrderedHash[ :none, {:label => _('Relevance')}, |
| 11 | 21 | :more_recent, {:label => _('More Recent'), :solr_opts => {:sort => 'updated_at desc, score desc'}}, |
| ... | ... | @@ -112,7 +122,7 @@ module SearchHelper |
| 112 | 122 | |
| 113 | 123 | if count > 0 |
| 114 | 124 | url = params.merge(:facet => params[:facet].merge( |
| 115 | - id => facet[:label_id].nil? ? value : params[:facet][id].merge( facet[:label_id] => params[:facet][id][facet[:label_id]].to_a.push(value) ) | |
| 125 | + id => facet[:label_id].nil? ? value : params[:facet][id].merge( facet[:label_id] => params[:facet][id][facet[:label_id]].to_a | [value] ) | |
| 116 | 126 | )) |
| 117 | 127 | else |
| 118 | 128 | # preserve others filters and change this filter | ... | ... |
app/models/environment.rb
| ... | ... | @@ -281,6 +281,9 @@ class Environment < ActiveRecord::Base |
| 281 | 281 | def enabled?(feature) |
| 282 | 282 | self.settings["#{feature}_enabled".to_sym] == true |
| 283 | 283 | end |
| 284 | + def disabled?(feature) | |
| 285 | + !self.enabled?(feature) | |
| 286 | + end | |
| 284 | 287 | |
| 285 | 288 | # enables the features identified by <tt>features</tt>, which is expected to |
| 286 | 289 | # be an Enumarable object containing the identifiers of the desired features. | ... | ... |
app/models/input.rb
app/views/search/_product.rhtml
| ... | ... | @@ -27,15 +27,10 @@ |
| 27 | 27 | <% end %> |
| 28 | 28 | |
| 29 | 29 | <% if product.price_described? %> |
| 30 | - <% title = product.inputs.map{ |i| | |
| 30 | + <% title = (product.inputs + product.price_details).map{ |i| | |
| 31 | 31 | '<div class="search-product-input-dots-to-price">' + |
| 32 | 32 | '<div class="search-product-input-name">' + i.product_category.name + '</div>' + |
| 33 | - price_span(i.cost, :class => 'search-product-input-price') + | |
| 34 | - '</div>' }.join('') %> | |
| 35 | - <% title += product.price_details.map{ |p| | |
| 36 | - '<div class="search-product-input-dots-to-price">' + | |
| 37 | - '<div class="search-product-input-name">' + p.production_cost.name + '</div>' + | |
| 38 | - price_span(p.price, :class => 'search-product-input-price') + | |
| 33 | + price_span(i.price, :class => 'search-product-input-price') + | |
| 39 | 34 | '</div>' }.join('') %> |
| 40 | 35 | <%= link_to_function _("Open Price"), '', :title => title, :class => "search-product-price-details" %> |
| 41 | 36 | <% end %> |
| ... | ... | @@ -80,10 +75,11 @@ |
| 80 | 75 | </div> |
| 81 | 76 | </div> |
| 82 | 77 | |
| 78 | + <div style="clear: both"></div> | |
| 79 | + | |
| 83 | 80 | <%= extra_content.join('\n') %> |
| 84 | 81 | <% extra_properties.each do |property| %> |
| 85 | 82 | <div><%= property[:name] + ': ' + instance_eval(&property[:content]) %></div> |
| 86 | 83 | <% end %> |
| 87 | 84 | |
| 88 | - <br /><br /> | |
| 89 | 85 | </li> | ... | ... |
app/views/search/products.rhtml
| 1 | -<% if @environment.settings[:disable_asset_products_enabled] %> | |
| 2 | - Product search disabled | |
| 3 | -<% else %> | |
| 1 | +<%= search_page_title( @titles[:products], @category ) %> | |
| 4 | 2 | |
| 5 | - <%= search_page_title( @titles[:products], @category ) %> | |
| 6 | - | |
| 7 | - <div id="search-column-left"> | |
| 8 | - <% if !@empty_query %> | |
| 9 | - <% button_bar do %> | |
| 10 | - <%= display_map_list_button %> | |
| 11 | - <% end %> | |
| 12 | - <%= facets_menu(:products, @facets) %> | |
| 13 | - <% end %> | |
| 14 | - </div> | |
| 3 | +<div id="search-column-left"> | |
| 4 | + <% if !@empty_query %> | |
| 5 | + <% button_bar do %> | |
| 6 | + <%= display_map_list_button %> | |
| 7 | +<% end %> | |
| 8 | + <%= facets_menu(:products, @facets) %> | |
| 9 | +<% end %> | |
| 10 | +</div> | |
| 15 | 11 | |
| 16 | - <div id="search-column-right"> | |
| 17 | - <%= render :partial => 'search_form', :locals => { :hint => _('Type the product, service, city or qualifier desired') } %> | |
| 18 | - <%= render :partial => 'results_header' %> | |
| 12 | +<div id="search-column-right"> | |
| 13 | + <%= render :partial => 'search_form', :locals => { :hint => _('Type the product, service, city or qualifier desired') } %> | |
| 14 | + <%= render :partial => 'results_header' %> | |
| 19 | 15 | |
| 20 | - <%= display_results(true) %> | |
| 21 | - <% if !@one_page and params[:display] != 'map' %> | |
| 22 | - <%= pagination_links @results[:products] %> | |
| 23 | - <% end %> | |
| 24 | - </div> | |
| 16 | + <%= display_results(true) %> | |
| 17 | + <% if !@one_page and params[:display] != 'map' %> | |
| 18 | + <%= pagination_links @results[:products] %> | |
| 19 | +<% end %> | |
| 20 | +</div> | |
| 25 | 21 | |
| 22 | +<% javascript_tag do %> | |
| 23 | + jQuery('.search-product-price-details').altBeautify(); | |
| 26 | 24 | <% end %> |
| 27 | 25 | |
| 28 | 26 | <div style="clear: both"></div> | ... | ... |
public/javascripts/application.js
| ... | ... | @@ -756,6 +756,11 @@ $.fn.hint = function (blurClass) { |
| 756 | 756 | |
| 757 | 757 | })(jQuery); |
| 758 | 758 | |
| 759 | +/* | |
| 760 | + * altBeautify: put a styled tooltip on elements with | |
| 761 | + * HTML on title and alt attributes. | |
| 762 | + */ | |
| 763 | + | |
| 759 | 764 | var altBeautify = jQuery('<div id="alt-beautify" style="display:none; position: absolute"/>') |
| 760 | 765 | .append('<div class="alt-beautify-content"/>') |
| 761 | 766 | .append('<div class="alt-beautify-arrow-border alt-beautify-arrow"/>') |
| ... | ... | @@ -779,7 +784,7 @@ function altHide() { |
| 779 | 784 | altBeautify.hide(); |
| 780 | 785 | } |
| 781 | 786 | |
| 782 | -jQuery('a[title]').live('mouseover', function (e) { | |
| 787 | +function altShow(e) { | |
| 783 | 788 | alt = jQuery(this).attr('title'); |
| 784 | 789 | if (alt != '') { |
| 785 | 790 | jQuery(this).attr('alt-beautify', alt); |
| ... | ... | @@ -788,9 +793,27 @@ jQuery('a[title]').live('mouseover', function (e) { |
| 788 | 793 | |
| 789 | 794 | altTarget = this; |
| 790 | 795 | setTimeout("altTimeout()", 500); |
| 791 | -}); | |
| 792 | -jQuery('a[title]').live('mouseout', altHide); | |
| 793 | -jQuery('a[title]').live('click', altHide); | |
| 796 | +} | |
| 797 | + | |
| 798 | +(function($) { | |
| 799 | + | |
| 800 | + jQuery.fn.altBeautify = function() { | |
| 801 | + return this.each(function() { | |
| 802 | + jQuery(this).bind('mouseover', altShow); | |
| 803 | + jQuery(this).bind('mouseout', altHide); | |
| 804 | + jQuery(this).bind('click', altHide); | |
| 805 | + }); | |
| 806 | + } | |
| 807 | + | |
| 808 | +})(jQuery); | |
| 809 | + | |
| 810 | +// enable it generally | |
| 811 | +// jQuery('*[title]').live('mouseover', altShow); | |
| 812 | +// jQuery('*[title]').live('mouseout', altHide); | |
| 813 | +// jQuery('*[title]').live('click', altHide); | |
| 814 | +// jQuery('image[alt]').live('mouseover', altShow); | |
| 815 | +// jQuery('image[alt]').live('mouseout', altHide); | |
| 816 | +// jQuery('image[alt]').live('click', altHide); | |
| 794 | 817 | |
| 795 | 818 | |
| 796 | 819 | function facet_options_toggle(id, url) { | ... | ... |
test/functional/search_controller_test.rb
| ... | ... | @@ -787,12 +787,12 @@ class SearchControllerTest < ActionController::TestCase |
| 787 | 787 | prod2 = Product.create!(:name => 'product 2', :enterprise_id => ent.id, :product_category_id => @product_category.id) |
| 788 | 788 | prod3 = Product.create!(:name => 'product 3', :enterprise_id => ent.id, :product_category_id => @product_category.id) |
| 789 | 789 | |
| 790 | - prod3.name = 'product 4' | |
| 791 | - prod3.save! | |
| 792 | - prod1.name = 'product 5' | |
| 793 | - prod1.save! | |
| 794 | - prod2.name = 'product 6' | |
| 795 | - prod2.save! | |
| 790 | + # change others attrs will make updated_at = Time.now for all | |
| 791 | + Product.record_timestamps = false | |
| 792 | + prod3.update_attribute :updated_at, Time.now-2.days | |
| 793 | + prod1.update_attribute :updated_at, Time.now-1.days | |
| 794 | + prod2.update_attribute :updated_at, Time.now | |
| 795 | + Product.record_timestamps = true | |
| 796 | 796 | |
| 797 | 797 | get :products, :query => 'product', :order_by => :more_recent |
| 798 | 798 | |
| ... | ... | @@ -816,13 +816,13 @@ class SearchControllerTest < ActionController::TestCase |
| 816 | 816 | prod2 = Product.create!(:name => 'product 2', :enterprise_id => ent.id, :product_category_id => @product_category.id) |
| 817 | 817 | prod3 = Product.create!(:name => 'product 3', :enterprise_id => ent.id, :product_category_id => @product_category.id) |
| 818 | 818 | |
| 819 | - prod3.update_attribute! :name, 'product A' | |
| 820 | - prod2.update_attribute! :name, 'product B' | |
| 821 | - prod1.update_attribute! :name, 'product C' | |
| 819 | + prod3.update_attribute :name, 'product A' | |
| 820 | + prod2.update_attribute :name, 'product B' | |
| 821 | + prod1.update_attribute :name, 'product C' | |
| 822 | 822 | |
| 823 | 823 | get :products, :query => 'product', :order_by => :name |
| 824 | 824 | |
| 825 | - assert_equal [prod3, prod1, prod2], assigns(:results)[:products].docs | |
| 825 | + assert_equal [prod3, prod2, prod1], assigns(:results)[:products].docs | |
| 826 | 826 | end |
| 827 | 827 | |
| 828 | 828 | should 'order product results by closest when requested' do |
| ... | ... | @@ -871,16 +871,16 @@ class SearchControllerTest < ActionController::TestCase |
| 871 | 871 | art2 = Article.create!(:name => 'review A', :profile_id => fast_create(Person).id) |
| 872 | 872 | art3 = Article.create!(:name => 'review B', :profile_id => fast_create(Person).id) |
| 873 | 873 | |
| 874 | - art1.name = 'review 10' | |
| 875 | - art1.save! | |
| 876 | - art3.name = 'review 87' | |
| 877 | - art3.save! | |
| 878 | - art2.name = 'review 54' | |
| 879 | - art2.save! | |
| 874 | + # change others attrs will make updated_at = Time.now for all | |
| 875 | + Article.record_timestamps = false | |
| 876 | + art3.update_attribute :updated_at, Time.now-2.days | |
| 877 | + art1.update_attribute :updated_at, Time.now-1.days | |
| 878 | + art2.update_attribute :updated_at, Time.now | |
| 879 | + Article.record_timestamps = true | |
| 880 | 880 | |
| 881 | 881 | get :articles, :query => 'review', :order_by => :more_recent |
| 882 | 882 | |
| 883 | - assert_equal [art2, art3, art1], assigns(:results)[:articles].docs | |
| 883 | + assert_equal [art2, art1, art3], assigns(:results)[:articles].docs | |
| 884 | 884 | end |
| 885 | 885 | |
| 886 | 886 | should 'order enterprise results by name when requested' do | ... | ... |
vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb
| ... | ... | @@ -16,9 +16,7 @@ module ActsAsSolr #:nodoc: |
| 16 | 16 | begin |
| 17 | 17 | Deprecation.validate_query(options) |
| 18 | 18 | |
| 19 | - query_options[:filter_queries] ||= [] | |
| 20 | - options[:alternate_query] ||= '' | |
| 21 | - options[:alternate_query].strip! | |
| 19 | + query_options[:filter_queries] = [] | |
| 22 | 20 | query.strip! |
| 23 | 21 | |
| 24 | 22 | # using *:* disable index boosts, so use the type filter |
| ... | ... | @@ -26,14 +24,20 @@ module ActsAsSolr #:nodoc: |
| 26 | 24 | query = solr_type_condition(options) |
| 27 | 25 | else |
| 28 | 26 | query = sanitize_query(query) |
| 29 | - query_options[:filter_queries] = [solr_type_condition(options)] | |
| 27 | + query_options[:filter_queries] << solr_type_condition(options) | |
| 30 | 28 | |
| 31 | 29 | # put types on filtered fields |
| 32 | 30 | query = replace_types([*query], ':').first |
| 33 | 31 | end |
| 34 | 32 | |
| 33 | + query_options[:filter_queries] += replace_types([*options[:filter_queries]], '') if options[:filter_queries] | |
| 34 | + | |
| 35 | + options[:alternate_query] ||= '' | |
| 36 | + options[:alternate_query].strip! | |
| 35 | 37 | query = "#{options[:alternate_query]} #{query}" unless options[:alternate_query].blank? |
| 38 | + | |
| 36 | 39 | query = add_relevance query, options[:relevance] |
| 40 | + | |
| 37 | 41 | query_options[:query] = query |
| 38 | 42 | |
| 39 | 43 | field_list = options[:models].nil? ? solr_configuration[:primary_key_field] : "id" |
| ... | ... | @@ -46,8 +50,6 @@ module ActsAsSolr #:nodoc: |
| 46 | 50 | |
| 47 | 51 | query_options[:operator] = options[:operator] |
| 48 | 52 | |
| 49 | - query_options[:filter_queries] += replace_types([*options[:filter_queries]], '') if options[:filter_queries] | |
| 50 | - | |
| 51 | 53 | query_options[:boost_functions] = replace_types([*options[:boost_functions]], '').join(' ') if options[:boost_functions] |
| 52 | 54 | |
| 53 | 55 | # first steps on the facet parameter processing | ... | ... |