Commit 59b729e5d546296f4cad7f74e20adaeb39144469

Authored by Leandro Santos
Committed by Joenio Costa
1 parent aedeaf61

The admin user should manage the region and the product category on manage category interface.

(ActionItem1582)
app/controllers/admin/categories_controller.rb
... ... @@ -5,9 +5,9 @@ class CategoriesController < AdminController
5 5 helper :categories
6 6  
7 7 def index
8   - # WORKAROUND: restricting the category trees to display. Region and
9   - # ProductCategory have VERY LARGE trees.
10 8 @categories = environment.categories.find(:all, :conditions => "parent_id is null AND type is null")
  9 + @regions = environment.regions.find(:all, :conditions => {:parent_id => nil})
  10 + @product_categories = environment.product_categories.find(:all, :conditions => {:parent_id => nil})
11 11 end
12 12  
13 13 ALLOWED_TYPES = CategoriesHelper::TYPES.map {|item| item[1] }
... ...
app/models/environment.rb
... ... @@ -147,6 +147,7 @@ class Environment < ActiveRecord::Base
147 147 has_many :categories
148 148 has_many :display_categories, :class_name => 'Category', :conditions => 'display_color is not null and parent_id is null', :order => 'display_color'
149 149  
  150 + has_many :product_categories, :conditions => { :type => 'ProductCategory'}
150 151 has_many :regions
151 152  
152 153 has_many :roles
... ...
app/views/categories/_category.rhtml
... ... @@ -2,6 +2,12 @@
2 2 <div class='treeitem'>
3 3 <%= display_color_for_category(category) %>
4 4 <%= category.name %>
  5 + <div class='button' id="show_button_<%= category.id %>">
  6 + <%= link_to_function(_('Show'), "['category_#{category.id}','hide_button_#{category.id}'].each(Element.show); Element.hide('show_button_#{category.id}');") unless category.children.empty? %>
  7 + </div>
  8 + <div class='button' id="hide_button_<%= category.id %>" style='display:none;'>
  9 + <%= link_to_function(_('Hide'), "['category_#{category.id}','hide_button_#{category.id}'].each(Element.hide); Element.show('show_button_#{category.id}') ") %>
  10 + </div>
5 11  
6 12 <div>
7 13 <%= link_to _('Add subcategory'), :action => 'new', :parent_id => category %>
... ... @@ -10,11 +16,12 @@
10 16 </div>
11 17 </div>
12 18  
13   - <% unless category.children.empty? %>
14   - <ul class='tree'>
15   - <%= render :partial => 'category', :collection => category.children %>
16   - </ul>
17   - <% end %>
  19 + <div id="category_<%= category.id %>" style='display:none;'>
  20 + <% unless category.children.empty? %>
  21 + <ul class='tree'>
  22 + <%= render :partial => 'category', :collection => category.children %>
  23 + </ul>
  24 + <% end %>
  25 + </div>
18 26  
19 27 </li>
20   -
... ...
app/views/categories/index.rhtml
... ... @@ -3,8 +3,25 @@
3 3 <ul class='tree'>
4 4 <%= render :partial => 'category', :collection => @categories %>
5 5 </ul>
6   -
7 6 <div>
8 7 <%= link_to _('New category'), :action => 'new' %>
9 8 </div>
10 9  
  10 +<h1><%= _('Product Categories') %></h1>
  11 +<ul class='tree'>
  12 + <%= render :partial => 'category', :collection => @product_categories %>
  13 +</ul>
  14 +
  15 +<div>
  16 + <%= link_to _('New category'), :action => 'new', :type => 'ProductCategory' %>
  17 +</div>
  18 +
  19 +<h1><%= _('Regions') %></h1>
  20 +<ul class='tree'>
  21 + <%= render :partial => 'category', :collection => @regions %>
  22 +</ul>
  23 +
  24 +<div>
  25 + <%= link_to _('New category'), :action => 'new', :type => 'Region' %>
  26 +</div>
  27 +
... ...
features/admin_categories.feature 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +Feature: manage categories
  2 + As an administrator
  3 + I want to manage the categories
  4 +
  5 + Background:
  6 + Given the following categories
  7 + | name | display_in_menu |
  8 + | Food | true |
  9 + | Book | true |
  10 + And the following categories
  11 + | parent | name | display_in_menu |
  12 + | Food | Vegetarian | true |
  13 + | Food | Steak | true |
  14 + Given I am logged in as admin
  15 +
  16 + @selenium
  17 + Scenario: admin user could create a category
  18 + Given I follow "Administration"
  19 + And I follow "Manage Categories"
  20 + And I follow "New category"
  21 + When I fill in "Name" with "Category 1"
  22 + And I press "Save"
  23 + Then I should see "Categories"
  24 + And I should see "Category 1"
  25 +
  26 + @selenium
  27 + Scenario: admin user could see all the category tree
  28 + Given I follow "Administration"
  29 + And I follow "Manage Categories"
  30 + When I follow "Show"
  31 + Then I should see "Vegetarian"
  32 + And I should see "Steak"
  33 +
  34 + @selenium
  35 + Scenario: admin user could hide the category tree
  36 + Given I follow "Administration"
  37 + And I follow "Manage Categories"
  38 + When I follow "Show"
  39 + Then I should see "Vegetarian"
  40 + And I should see "Steak"
  41 + When I follow "Hide"
  42 + Then I should not see "Vegetarian"
  43 + And I should not see "Steak"
  44 +
  45 + @selenium
  46 + Scenario: the show link is available just for categories with category tree
  47 + Given the following category
  48 + | parent | name | display_in_menu |
  49 + | Steak | Pig | true |
  50 + And I follow "Administration"
  51 + And I follow "Manage Categories"
  52 + Then I should see "Food Show"
  53 + When I follow "Show"
  54 + Then I should see "Vegetarian"
  55 + And I should not see "Vegetarian Show"
  56 + And I should see "Steak Show"
... ...
features/step_definitions/noosfero_steps.rb
... ... @@ -85,12 +85,12 @@ Given /^the following validation info$/ do |table|
85 85 end
86 86 end
87 87  
88   -Given /^the following (product_categories|product_category|category|categories)$/ do |kind,table|
  88 +Given /^the following (product_categories|product_category|category|categories|regions?)$/ do |kind,table|
89 89 klass = kind.singularize.camelize.constantize
90 90 table.hashes.each do |row|
91 91 parent = row.delete("parent")
92 92 if parent
93   - parent = Category.find_by_slug(parent)
  93 + parent = Category.find_by_slug(parent.to_slug)
94 94 row.merge!({:parent_id => parent.id})
95 95 end
96 96 category = klass.create!({:environment_id => Environment.default.id}.merge(row))
... ...
public/stylesheets/application.css
... ... @@ -3905,3 +3905,7 @@ h1#agenda-title {
3905 3905 .fg-button span {
3906 3906 padding: 0.1em 1em !important;
3907 3907 }
  3908 +
  3909 +.treeitem .button{
  3910 + display: inline;
  3911 +}
... ...
test/functional/categories_controller_test.rb
... ... @@ -36,6 +36,8 @@ class CategoriesControllerTest &lt; Test::Unit::TestCase
36 36 assert_response :success
37 37 assert_template 'index'
38 38 assert_kind_of Array, assigns(:categories)
  39 + assert_kind_of Array, assigns(:product_categories)
  40 + assert_kind_of Array, assigns(:regions)
39 41 assert_tag :tag => 'a', :attributes => { :href => '/admin/categories/new'}
40 42 end
41 43  
... ... @@ -178,11 +180,13 @@ class CategoriesControllerTest &lt; Test::Unit::TestCase
178 180 should 'not list regions and product categories' do
179 181 Environment.default.categories.destroy_all
180 182 c = Category.create!(:name => 'Regular category', :environment => Environment.default)
181   - ProductCategory.create!(:name => 'Product category', :environment => Environment.default)
182   - Region.create!(:name => 'Some region', :environment => Environment.default)
  183 + p = ProductCategory.create!(:name => 'Product category', :environment => Environment.default)
  184 + r = Region.create!(:name => 'Some region', :environment => Environment.default)
183 185  
184 186 get :index
185 187 assert_equal [c], assigns(:categories)
  188 + assert_equal [p], assigns(:product_categories)
  189 + assert_equal [r], assigns(:regions)
186 190 end
187 191  
188 192 end
... ...
test/unit/environment_test.rb
... ... @@ -131,6 +131,22 @@ class EnvironmentTest &lt; Test::Unit::TestCase
131 131 assert cats.include?(subcat)
132 132 end
133 133  
  134 + def test_should_list_all_product_categories
  135 + env = fast_create(Environment)
  136 + Category.create!(:name => 'first category', :environment_id => env.id)
  137 + cat = Category.create!(:name => 'second category', :environment_id => env.id)
  138 + Category.create!(:name => 'child category', :environment_id => env.id, :parent_id => cat.id)
  139 + cat1 = ProductCategory.create!(:name => 'first product category', :environment_id => env.id)
  140 + cat2 = ProductCategory.create!(:name => 'second product category', :environment_id => env.id)
  141 + subcat = ProductCategory.create!(:name => 'child product category', :environment_id => env.id, :parent_id => cat2.id)
  142 +
  143 + cats = env.product_categories
  144 + assert_equal 3, cats.size
  145 + assert cats.include?(cat1)
  146 + assert cats.include?(cat2)
  147 + assert cats.include?(subcat)
  148 + end
  149 +
134 150 should 'list displayable categories' do
135 151 env = fast_create(Environment)
136 152 cat1 = env.categories.create(:name => 'category one', :display_color => 1)
... ...