Commit 65ee2d89570a43baca856f0a6fb71e5f043449fb
Committed by
Joenio Costa
1 parent
0f7ed650
Exists in
master
and in
22 other branches
Making manage categories load only what is necessary
* Still on the way TODO * Selenium tests
Showing
6 changed files
with
94 additions
and
13 deletions
Show diff stats
app/controllers/admin/categories_controller.rb
| ... | ... | @@ -10,6 +10,11 @@ class CategoriesController < AdminController |
| 10 | 10 | @product_categories = environment.product_categories.find(:all, :conditions => {:parent_id => nil}) |
| 11 | 11 | end |
| 12 | 12 | |
| 13 | + def get_children | |
| 14 | + children = Category.find(params[:id]).children | |
| 15 | + render :partial => 'category_children', :locals => {:children => children} | |
| 16 | + end | |
| 17 | + | |
| 13 | 18 | ALLOWED_TYPES = CategoriesHelper::TYPES.map {|item| item[1] } |
| 14 | 19 | |
| 15 | 20 | # posts back | ... | ... |
app/views/categories/_category.rhtml
| ... | ... | @@ -2,12 +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 | + <% if category.children.count > 0 %> | |
| 6 | + <div class='button' id="category-loading-<%= category.id %>" style="position: relative;"> | |
| 7 | + <a href="#" id="show-button-<%= category.id %>" class="show-button" onclick="return false;" data-category="<%= category.id %>"><%= _('Show') %></a> | |
| 8 | + </div> | |
| 9 | + <a href="#" id="hide-button-<%= category.id %>" class="hide-button" onclick="return false;" data-category="<%= category.id %>" style="display: none;"><%= _('Hide') %></a> | |
| 10 | + <% end %> | |
| 11 | 11 | |
| 12 | 12 | <div> |
| 13 | 13 | <%= link_to _('Add subcategory'), :action => 'new', :parent_id => category %> |
| ... | ... | @@ -16,12 +16,6 @@ |
| 16 | 16 | </div> |
| 17 | 17 | </div> |
| 18 | 18 | |
| 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> | |
| 19 | +<ul id="category-sub-items-<%= category.id %>" class="tree" style='display:none;'></ul> | |
| 26 | 20 | |
| 27 | 21 | </li> | ... | ... |
app/views/categories/index.rhtml
| ... | ... | @@ -0,0 +1,32 @@ |
| 1 | +Feature: manage categories | |
| 2 | + As an environment administrator | |
| 3 | + I want to manage categories | |
| 4 | + | |
| 5 | + Background: | |
| 6 | + Given the following categories | |
| 7 | + | name | | |
| 8 | + | Products | | |
| 9 | + | Services | | |
| 10 | + And the following categories | |
| 11 | + | name | parent | | |
| 12 | + | Beans | products | | |
| 13 | + | Potatoes | products | | |
| 14 | + | Development | services | | |
| 15 | + And I am logged in as admin | |
| 16 | + And I am on the environment control panel | |
| 17 | + And I follow "Manage categories" | |
| 18 | + | |
| 19 | + Scenario: load only top level categories | |
| 20 | + Then I should see "Products" | |
| 21 | + And I should see "Services" | |
| 22 | + And I should not see "Beans" | |
| 23 | + And I should not see "Development" | |
| 24 | + | |
| 25 | + @selenium | |
| 26 | + Scenario: load subcategories only after following parent | |
| 27 | + Then I should not see "Beans" | |
| 28 | + And I should not see "Potatoes" | |
| 29 | + When I follow "Show" and wait for jquery | |
| 30 | + Then show me the page | |
| 31 | + | |
| 32 | + | ... | ... |
| ... | ... | @@ -0,0 +1,46 @@ |
| 1 | +(function($){ | |
| 2 | + fetch_sub_items = function(sub_items, category){ | |
| 3 | + loading_for_button($("#category-loading-"+category)[0]); | |
| 4 | + $.ajax({ | |
| 5 | + url: "/admin/categories/get_children", | |
| 6 | + dataType: "html", | |
| 7 | + data: {id: category}, | |
| 8 | + success: function(data, st, ajax){ | |
| 9 | + $(sub_items).append(data); | |
| 10 | + $(".small-loading").remove(); | |
| 11 | + $("#show-button-"+category).fadeOut(400, function(){ | |
| 12 | + $("#hide-button-"+category).fadeIn(); | |
| 13 | + }); | |
| 14 | + $(sub_items).slideDown(); | |
| 15 | + }, | |
| 16 | + error: function(ajax, st, errorThrown) { | |
| 17 | + alert('HTTP '+st+': '+errorThrown); | |
| 18 | + } | |
| 19 | + }); | |
| 20 | + }; | |
| 21 | + | |
| 22 | + $(".hide-button").live('click', function(){ | |
| 23 | + var category = $(this).attr('data-category'); | |
| 24 | + var sub_items = $('#category-sub-items-'+category); | |
| 25 | + $(this).fadeOut(400, function(){ | |
| 26 | + $("#show-button-"+category).fadeIn(); | |
| 27 | + }); | |
| 28 | + $(sub_items).slideUp(); | |
| 29 | + }); | |
| 30 | + | |
| 31 | + $(".show-button").live('click', function(){ | |
| 32 | + var category = $(this).attr('data-category'); | |
| 33 | + var sub_items = $('#category-sub-items-'+category); | |
| 34 | + if(!$(this).attr('data-fetched')){ | |
| 35 | + fetch_sub_items(sub_items, category); | |
| 36 | + $(this).attr('data-fetched', true); | |
| 37 | + } | |
| 38 | + else{ | |
| 39 | + $(this).fadeOut(400, function(){ | |
| 40 | + $("#hide-button-"+category).fadeIn(); | |
| 41 | + }); | |
| 42 | + $(sub_items).slideDown(); | |
| 43 | + } | |
| 44 | + }); | |
| 45 | +})(jQuery); | |
| 46 | + | ... | ... |