Commit 94f572282e84a6f0263901432c2e2a59391ee21b

Authored by MoisesMachado
1 parent 43a90b83

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
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
... ... @@ -37,7 +37,7 @@ COUNT = {
37 37 :categories => 0,
38 38 }
39 39  
40   -$default_env = Environment.default_
  40 +$default_env = Environment.default
41 41 def step(what)
42 42 COUNT[what] += 1
43 43 puts "#{what}: #{COUNT[what]}"
... ...
test/functional/search_controller_test.rb
... ... @@ -785,35 +785,8 @@ class SearchControllerTest &lt; 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 &lt; 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 &lt; 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
... ...