Commit 94f572282e84a6f0263901432c2e2a59391ee21b
1 parent
43a90b83
Exists in
staging
and in
42 other branches
ActionItem507: changed the filtering by product category to act more like a menu
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2118 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
6 changed files
with
54 additions
and
37 deletions
Show diff stats
app/controllers/public/search_controller.rb
| ... | ... | @@ -155,12 +155,9 @@ class SearchController < ApplicationController |
| 155 | 155 | |
| 156 | 156 | def products |
| 157 | 157 | @results[:products].uniq! |
| 158 | - @categories = ProductCategory.menu_categories(@product_category) | |
| 159 | - @categories.map do |cat| | |
| 158 | + @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| | |
| 160 | 159 | [cat, @finder.count(:products, @filtered_query, calculate_find_options(:products, nil, cat, @region, params[:radius]))] |
| 161 | - end | |
| 162 | - | |
| 163 | - @found_product_categories = @counts.values.sort_by{|v|v[0].full_name} | |
| 160 | + end.select{|cat, hits| hits > 0 } | |
| 164 | 161 | end |
| 165 | 162 | |
| 166 | 163 | alias :assets :index | ... | ... |
app/models/product_category.rb
| ... | ... | @@ -10,4 +10,8 @@ class ProductCategory < Category |
| 10 | 10 | def all_products |
| 11 | 11 | Product.find(:all, :conditions => { :product_category_id => tree.map(&:id) }) |
| 12 | 12 | end |
| 13 | + | |
| 14 | + def self.menu_categories(top_category, env) | |
| 15 | + top_category ? top_category.children : top_level_for(env) | |
| 16 | + end | |
| 13 | 17 | end | ... | ... |
app/views/search/products.rhtml
| ... | ... | @@ -12,10 +12,10 @@ |
| 12 | 12 | |
| 13 | 13 | <%= render :partial => 'search_form', :locals => { :form_title => _("Refine your search"), :simple_search => true } %> |
| 14 | 14 | |
| 15 | -<% if @found_product_categories %> | |
| 15 | +<% if @categories_menu %> | |
| 16 | 16 | <div id="product-categories-menu" class="product-search-filter"> |
| 17 | 17 | <ul> |
| 18 | - <% @found_product_categories.each do |cat, hits| %> | |
| 18 | + <% @categories_menu.each do |cat, hits| %> | |
| 19 | 19 | <li><%= link_to (cat.name + "(#{hits})"), params.merge({:product_category => cat.id}) %> </li> |
| 20 | 20 | <% end %> |
| 21 | 21 | </ul> | ... | ... |
script/fbes_populate_helper.rb
test/functional/search_controller_test.rb
| ... | ... | @@ -785,35 +785,8 @@ class SearchControllerTest < Test::Unit::TestCase |
| 785 | 785 | |
| 786 | 786 | get :index, :find_in => 'products', :query => 'test' |
| 787 | 787 | |
| 788 | - assert_equal 1, assigns(:counts)[cat1.id][1] | |
| 789 | - assert_equal nil, assigns(:counts)[cat2.id] | |
| 790 | - end | |
| 791 | - | |
| 792 | - should 'not list ancestor if no product in it' do | |
| 793 | - cat1 = ProductCategory.create!(:name => 'pc test 1', :environment => Environment.default) | |
| 794 | - cat2 = ProductCategory.create!(:name => 'pc test 2', :environment => Environment.default, :parent => cat1) | |
| 795 | - ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 796 | - | |
| 797 | - cat1.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 798 | - | |
| 799 | - get :index, :find_in => 'products', :query => 'test' | |
| 800 | - | |
| 801 | - assert_equal 1, assigns(:counts)[cat1.id][1] | |
| 802 | - assert_equal nil, assigns(:counts)[cat2.id] | |
| 803 | - end | |
| 804 | - | |
| 805 | - should 'add hits of children in ancestor when it has products on results' do | |
| 806 | - cat1 = ProductCategory.create!(:name => 'pc test 1', :environment => Environment.default) | |
| 807 | - cat2 = ProductCategory.create!(:name => 'pc test 2', :environment => Environment.default, :parent => cat1) | |
| 808 | - ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 809 | - | |
| 810 | - cat1.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 811 | - cat2.products.create!(:name => 'prod test 2', :enterprise => ent) | |
| 812 | - | |
| 813 | - get :index, :find_in => 'products', :query => 'test' | |
| 814 | - | |
| 815 | - assert_equal 2, assigns(:counts)[cat1.id][1] | |
| 816 | - assert_equal 1, assigns(:counts)[cat2.id][1] | |
| 788 | + assert_includes assigns(:categories_menu).map(&:first), cat1 | |
| 789 | + assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
| 817 | 790 | end |
| 818 | 791 | |
| 819 | 792 | should 'display only within a product category when specified' do |
| ... | ... | @@ -840,6 +813,31 @@ class SearchControllerTest < Test::Unit::TestCase |
| 840 | 813 | assert_includes assigns(:results)[:products], p |
| 841 | 814 | end |
| 842 | 815 | |
| 816 | + should 'display only top level product categories that has products when no product category filter is specified' do | |
| 817 | + cat1 = ProductCategory.create(:name => 'prod cat 1', :environment => Environment.default) | |
| 818 | + cat2 = ProductCategory.create(:name => 'prod cat 2', :environment => Environment.default) | |
| 819 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 820 | + p = cat1.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 821 | + | |
| 822 | + get :index, :find_in => 'products' | |
| 823 | + | |
| 824 | + assert_includes assigns(:categories_menu).map(&:first), cat1 | |
| 825 | + assert_not_includes assigns(:categories_menu).map(&:first), cat2 | |
| 826 | + end | |
| 827 | + | |
| 828 | + should 'display children categories that has products when product category filter is selected' do | |
| 829 | + cat1 = ProductCategory.create(:name => 'prod cat 1', :environment => Environment.default) | |
| 830 | + cat11 = ProductCategory.create(:name => 'prod cat 11', :environment => Environment.default, :parent => cat1) | |
| 831 | + cat12 = ProductCategory.create(:name => 'prod cat 12', :environment => Environment.default, :parent => cat1) | |
| 832 | + ent = Enterprise.create!(:name => 'test ent', :identifier => 'test_ent') | |
| 833 | + p = cat11.products.create!(:name => 'prod test 1', :enterprise => ent) | |
| 834 | + | |
| 835 | + get :index, :find_in => 'products', :product_category => cat1.id | |
| 836 | + | |
| 837 | + assert_includes assigns(:categories_menu).map(&:first), cat11 | |
| 838 | + assert_not_includes assigns(:categories_menu).map(&:first), cat12 | |
| 839 | + end | |
| 840 | + | |
| 843 | 841 | should 'provide calendar for events' do |
| 844 | 842 | get :index, :find_in => [ 'events' ] |
| 845 | 843 | assert_equal 0, assigns(:calendar).size % 7 | ... | ... |
test/unit/product_category_test.rb
| ... | ... | @@ -61,4 +61,22 @@ class ProductCategoryTest < Test::Unit::TestCase |
| 61 | 61 | assert_includes c.consumers, person |
| 62 | 62 | end |
| 63 | 63 | |
| 64 | + should 'return top level product categories for environment when no parent product category specified' do | |
| 65 | + env1 = Environment.create!(:name => 'test env 1') | |
| 66 | + env2 = Environment.create!(:name => 'test env 2') | |
| 67 | + | |
| 68 | + c1 = ProductCategory.create!(:name => 'test cat 1', :environment => env1) | |
| 69 | + c2 = ProductCategory.create!(:name => 'test cat 2', :environment => env2) | |
| 70 | + | |
| 71 | + assert_equal [c1], ProductCategory.menu_categories(nil, env1) | |
| 72 | + end | |
| 73 | + | |
| 74 | + should 'return chlidren of parent category' do | |
| 75 | + c1 = ProductCategory.create!(:name => 'test cat 1', :environment => Environment.default) | |
| 76 | + c11 = ProductCategory.create!(:name => 'test cat 11', :environment => Environment.default, :parent => c1) | |
| 77 | + c2 = ProductCategory.create!(:name => 'test cat 2', :environment => Environment.default) | |
| 78 | + | |
| 79 | + assert_equal [c11], ProductCategory.menu_categories(c1, nil) | |
| 80 | + end | |
| 81 | + | |
| 64 | 82 | end | ... | ... |