From 55d5a0062c1d3cdb8c8f0a2ee8c9033a1b5fe9ca Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Thu, 24 Oct 2013 17:17:06 -0300 Subject: [PATCH] Added a block that works like a container of blocks --- plugins/container_block/lib/container_block.rb | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ plugins/container_block/lib/container_block_array.rb | 14 ++++++++++++++ plugins/container_block/lib/container_block_plugin.rb | 19 +++++++++++++++++++ plugins/container_block/lib/ext/block.rb | 15 +++++++++++++++ plugins/container_block/lib/ext/environment.rb | 7 +++++++ plugins/container_block/lib/ext/profile.rb | 7 +++++++ plugins/container_block/public/style.css | 11 +++++++++++ plugins/container_block/test/functional/container_block_environment_design_controller_test.rb | 34 ++++++++++++++++++++++++++++++++++ plugins/container_block/test/functional/container_block_home_controller_test.rb | 34 ++++++++++++++++++++++++++++++++++ plugins/container_block/test/test_helper.rb | 1 + plugins/container_block/test/unit/block_test.rb | 24 ++++++++++++++++++++++++ plugins/container_block/test/unit/container_block_array_test.rb | 29 +++++++++++++++++++++++++++++ plugins/container_block/test/unit/container_block_plugin_test.rb | 25 +++++++++++++++++++++++++ plugins/container_block/test/unit/container_block_test.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/container_block/test/unit/environment_test.rb | 29 +++++++++++++++++++++++++++++ plugins/container_block/test/unit/profile_test.rb | 29 +++++++++++++++++++++++++++++ plugins/container_block/views/blocks/container.rhtml | 4 ++++ plugins/container_block/views/box_organizer/_container_block.rhtml | 14 ++++++++++++++ plugins/container_block/views/environment_design | 1 + plugins/container_block/views/profile_design | 1 + 20 files changed, 402 insertions(+), 0 deletions(-) create mode 100644 plugins/container_block/lib/container_block.rb create mode 100644 plugins/container_block/lib/container_block_array.rb create mode 100644 plugins/container_block/lib/container_block_plugin.rb create mode 100644 plugins/container_block/lib/ext/block.rb create mode 100644 plugins/container_block/lib/ext/environment.rb create mode 100644 plugins/container_block/lib/ext/profile.rb create mode 100644 plugins/container_block/public/style.css create mode 100644 plugins/container_block/test/functional/container_block_environment_design_controller_test.rb create mode 100644 plugins/container_block/test/functional/container_block_home_controller_test.rb create mode 100644 plugins/container_block/test/test_helper.rb create mode 100644 plugins/container_block/test/unit/block_test.rb create mode 100644 plugins/container_block/test/unit/container_block_array_test.rb create mode 100644 plugins/container_block/test/unit/container_block_plugin_test.rb create mode 100644 plugins/container_block/test/unit/container_block_test.rb create mode 100644 plugins/container_block/test/unit/environment_test.rb create mode 100644 plugins/container_block/test/unit/profile_test.rb create mode 100644 plugins/container_block/views/blocks/container.rhtml create mode 100644 plugins/container_block/views/box_organizer/_container_block.rhtml create mode 120000 plugins/container_block/views/environment_design create mode 120000 plugins/container_block/views/profile_design diff --git a/plugins/container_block/lib/container_block.rb b/plugins/container_block/lib/container_block.rb new file mode 100644 index 0000000..ce015eb --- /dev/null +++ b/plugins/container_block/lib/container_block.rb @@ -0,0 +1,48 @@ +class ContainerBlock < Block + + include Noosfero::Plugin::HotSpot + + after_create :create_box + + settings_items :container_box_id, :type => Integer, :default => nil + + def self.description + _('Container') + end + + def help + _('This block acts as a container for another blocks') + end + + def create_box + box = Box.create!(:owner => self) + settings[:container_box_id] = box.id + save! + end + + def container_box + Box.find(container_box_id) + end + + def block_classes=(classes) + classes.each { |c| block = c.constantize.create!(:box => container_box) } if classes + end + + def blocks + container_box.blocks + end + + #FIXME needed? + def layout_template + 'default2' + end + + #FIXME controller test + def content(args={}) + block = self + lambda do + render :file => 'blocks/container.rhtml', :locals => {:block => block} + end + end + +end diff --git a/plugins/container_block/lib/container_block_array.rb b/plugins/container_block/lib/container_block_array.rb new file mode 100644 index 0000000..637a2d5 --- /dev/null +++ b/plugins/container_block/lib/container_block_array.rb @@ -0,0 +1,14 @@ +module ContainerBlockArray + + def blocks_with_container_block_plugin + blocks = blocks_without_container_block_plugin + blocks.each { |block| blocks.concat(block.blocks) if block.kind_of?(ContainerBlock) } + end + + def self.included(base) + base.class_eval do + alias_method_chain :blocks, :container_block_plugin + end + end + +end diff --git a/plugins/container_block/lib/container_block_plugin.rb b/plugins/container_block/lib/container_block_plugin.rb new file mode 100644 index 0000000..7b80d82 --- /dev/null +++ b/plugins/container_block/lib/container_block_plugin.rb @@ -0,0 +1,19 @@ +class ContainerBlockPlugin < Noosfero::Plugin + + def self.plugin_name + "Container Block Plugin" + end + + def self.plugin_description + _("A plugin that add a container block.") + end + + def self.extra_blocks + { ContainerBlock => {} } + end + + def stylesheet? + true + end + +end diff --git a/plugins/container_block/lib/ext/block.rb b/plugins/container_block/lib/ext/block.rb new file mode 100644 index 0000000..c4bd470 --- /dev/null +++ b/plugins/container_block/lib/ext/block.rb @@ -0,0 +1,15 @@ +require_dependency 'block' + +class Block + + def box_with_container_block_plugin + box = box_without_container_block_plugin + if box && box.owner.kind_of?(ContainerBlock) + box = box.owner.box + end + box + end + + alias_method_chain :box, :container_block_plugin + +end diff --git a/plugins/container_block/lib/ext/environment.rb b/plugins/container_block/lib/ext/environment.rb new file mode 100644 index 0000000..f4930d2 --- /dev/null +++ b/plugins/container_block/lib/ext/environment.rb @@ -0,0 +1,7 @@ +require_dependency 'environment' + +class Environment + + include ContainerBlockArray + +end diff --git a/plugins/container_block/lib/ext/profile.rb b/plugins/container_block/lib/ext/profile.rb new file mode 100644 index 0000000..7ca7779 --- /dev/null +++ b/plugins/container_block/lib/ext/profile.rb @@ -0,0 +1,7 @@ +require_dependency 'profile' + +class Profile + + include ContainerBlockArray + +end diff --git a/plugins/container_block/public/style.css b/plugins/container_block/public/style.css new file mode 100644 index 0000000..f636571 --- /dev/null +++ b/plugins/container_block/public/style.css @@ -0,0 +1,11 @@ +#content .boxes .container-block .block, #content .boxes .container-block .block-target { + float: left; +} + +#content .boxes .container-block .block-target { + width: 20px; +} + +#content .boxes .container-block .block .icon-down, #content .boxes .container-block .block .icon-down-disabled, #content .boxes .container-block .block .icon-up, #content .boxes .container-block .block .icon-up-disabled { + display: none; +} diff --git a/plugins/container_block/test/functional/container_block_environment_design_controller_test.rb b/plugins/container_block/test/functional/container_block_environment_design_controller_test.rb new file mode 100644 index 0000000..5e3133c --- /dev/null +++ b/plugins/container_block/test/functional/container_block_environment_design_controller_test.rb @@ -0,0 +1,34 @@ +require File.dirname(__FILE__) + '/../test_helper' + +# Re-raise errors caught by the controller. +class EnvironmentDesignController; def rescue_action(e) raise e end; end + +class EnvironmentDesignControllerTest < ActionController::TestCase + + def setup + Environment.delete_all + @environment = Environment.new(:name => 'testenv', :is_default => true) + @environment.enabled_plugins = ['ContainerBlock'] + @environment.save! + + user = create_user('testinguser') + @environment.add_admin(user.person) + login_as(user.login) + + box = Box.create!(:owner => @environment) + @block = ContainerBlock.create!(:box => box) + end + + should 'be able to edit ContainerBlock' do + get :edit, :id => @block.id + assert_tag :tag => 'input', :attributes => { :id => 'block_title' } + end + + should 'be able to save ContainerBlock' do + get :edit, :id => @block.id + post :save, :id => @block.id, :block => {:title => 'Container' } + @block.reload + assert_equal 'Container', @block.title + end + +end diff --git a/plugins/container_block/test/functional/container_block_home_controller_test.rb b/plugins/container_block/test/functional/container_block_home_controller_test.rb new file mode 100644 index 0000000..dc5a86c --- /dev/null +++ b/plugins/container_block/test/functional/container_block_home_controller_test.rb @@ -0,0 +1,34 @@ +require File.dirname(__FILE__) + '/../test_helper' + +# Re-raise errors caught by the controller. +class HomeController + append_view_path File.join(File.dirname(__FILE__) + '/../../views') + def rescue_action(e) + raise e + end +end + +class HomeControllerTest < ActionController::TestCase + + def setup + Environment.delete_all + @environment = Environment.new(:name => 'testenv', :is_default => true) + @environment.enabled_plugins = ['ContainerBlock'] + @environment.save! + + user = create_user('testinguser') + @environment.add_admin(user.person) + login_as(user.login) + + box = Box.create!(:owner => @environment) + @block = ContainerBlock.create!(:box => box) + + @environment.boxes = [box] + end + + should 'display ContainerBlock' do + get :index + assert_tag :div, :attributes => { :class => 'block container-block' } + end + +end diff --git a/plugins/container_block/test/test_helper.rb b/plugins/container_block/test/test_helper.rb new file mode 100644 index 0000000..cca1fd3 --- /dev/null +++ b/plugins/container_block/test/test_helper.rb @@ -0,0 +1 @@ +require File.dirname(__FILE__) + '/../../../test/test_helper' diff --git a/plugins/container_block/test/unit/block_test.rb b/plugins/container_block/test/unit/block_test.rb new file mode 100644 index 0000000..0850e1d --- /dev/null +++ b/plugins/container_block/test/unit/block_test.rb @@ -0,0 +1,24 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class BlockTest < ActiveSupport::TestCase + + def setup + @environment = Environment.new + + @box = Box.new(:owner => @environment) + @block = Block.new(:box => @box) + + @container_box = Box.new(:owner => @environment) + @container = ContainerBlock.new(:box => @container_box) + end + + should 'return block box if block owner is not a ContainerBlock' do + assert_equal @box, @block.box + end + + should 'return container box if block onwer is a ContainerBlock' do + @box.owner = @container + assert_equal @container_box, @block.box + end + +end diff --git a/plugins/container_block/test/unit/container_block_array_test.rb b/plugins/container_block/test/unit/container_block_array_test.rb new file mode 100644 index 0000000..d116848 --- /dev/null +++ b/plugins/container_block/test/unit/container_block_array_test.rb @@ -0,0 +1,29 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ContainerBlockArrayTest < ActiveSupport::TestCase + + attr_reader :blocks + + include ContainerBlockArray + + def setup + @blocks = [] + + @environment = fast_create(Environment) + @container_box = Box.new(:owner => @environment) + @container = ContainerBlock.new(:box => @container_box) + end + + should 'return blocks as usual' do + @blocks << Block.new + assert_equal @blocks, blocks_without_container_block_plugin + end + + should 'return blocks and container block children' do + @container.save! + @container_box.blocks << Block.new + @blocks.concat([Block.new, @container]) + assert_equal @blocks + @container.blocks, blocks_without_container_block_plugin + end + +end diff --git a/plugins/container_block/test/unit/container_block_plugin_test.rb b/plugins/container_block/test/unit/container_block_plugin_test.rb new file mode 100644 index 0000000..319dc9c --- /dev/null +++ b/plugins/container_block/test/unit/container_block_plugin_test.rb @@ -0,0 +1,25 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ContainerBlockPluginTest < ActiveSupport::TestCase + + def setup + @plugin = ContainerBlockPlugin.new + end + + should 'has a name' do + assert !ContainerBlockPlugin.plugin_name.blank? + end + + should 'has a description' do + assert !ContainerBlockPlugin.plugin_description.blank? + end + + should 'add a block' do + assert_equal [ContainerBlock], ContainerBlockPlugin.extra_blocks.keys + end + + should 'has stylesheet' do + assert @plugin.stylesheet? + end + +end diff --git a/plugins/container_block/test/unit/container_block_test.rb b/plugins/container_block/test/unit/container_block_test.rb new file mode 100644 index 0000000..2c8c294 --- /dev/null +++ b/plugins/container_block/test/unit/container_block_test.rb @@ -0,0 +1,56 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ContainerBlockTest < ActiveSupport::TestCase + + def setup + @block = ContainerBlock.new + end + + should 'describe yourself' do + assert !ContainerBlock.description.blank? + end + + should 'has a help' do + assert !@block.help.blank? + end + + should 'create a box on save' do + @block.save! + assert @block.container_box_id + end + + should 'return created box' do + @block.save! + assert @block.container_box + end + + should 'create new blocks when receive block classes' do + Block.destroy_all + @block.save! + @block.block_classes = ['Block'] + assert_equal 2, Block.count + assert_equal Block, Block.last.class + end + + should 'do not create blocks when nothing is passed as block classes' do + Block.destroy_all + @block.save! + @block.block_classes = [] + assert_equal 1, Block.count + end + + should 'do not create blocks when nil is passed as block classes' do + Block.destroy_all + @block.save! + @block.block_classes = nil + assert_equal 1, Block.count + end + + should 'return a list of blocks associated with the container block' do + Block.destroy_all + @block.save! + @block.block_classes = ['Block', 'Block'] + assert_equal [Block, Block], @block.blocks.map(&:class) + end + +end diff --git a/plugins/container_block/test/unit/environment_test.rb b/plugins/container_block/test/unit/environment_test.rb new file mode 100644 index 0000000..add815c --- /dev/null +++ b/plugins/container_block/test/unit/environment_test.rb @@ -0,0 +1,29 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class EnvironmentTest < ActiveSupport::TestCase + + def setup + @environment = fast_create(Environment) + + @box = Box.create!(:owner => @environment) + @block = Block.create!(:box => @box) + + @container_box = Box.create!(:owner => @environment) + @container = ContainerBlock.create!(:box => @container_box) + end + + should 'return blocks as usual' do + assert_equal [@block, @container], @environment.blocks + end + + should 'return block with id at find method' do + assert_equal @block, @environment.blocks.find(@block.id) + end + + should 'return child block with id at find method' do + block = Block.create!(:box => @container_box) + @container.save! + assert_equal @block, @environment.blocks.find(@block.id) + end + +end diff --git a/plugins/container_block/test/unit/profile_test.rb b/plugins/container_block/test/unit/profile_test.rb new file mode 100644 index 0000000..d3746f7 --- /dev/null +++ b/plugins/container_block/test/unit/profile_test.rb @@ -0,0 +1,29 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ProfileTest < ActiveSupport::TestCase + + def setup + @profile = fast_create(Profile) + + @box = Box.create!(:owner => @profile) + @block = Block.create!(:box => @box) + + @container_box = Box.create!(:owner => @profile) + @container = ContainerBlock.create!(:box => @container_box) + end + + should 'return blocks as usual' do + assert_equal [@block, @container], @profile.blocks + end + + should 'return block with id at find method' do + assert_equal @block, @profile.blocks.find(@block.id) + end + + should 'return child block with id at find method' do + block = Block.create!(:box => @container_box) + @container.save! + assert_equal @block, @profile.blocks.find(@block.id) + end + +end diff --git a/plugins/container_block/views/blocks/container.rhtml b/plugins/container_block/views/blocks/container.rhtml new file mode 100644 index 0000000..fa4967e --- /dev/null +++ b/plugins/container_block/views/blocks/container.rhtml @@ -0,0 +1,4 @@ +<% block.blocks.each do |block| %> + <%= display_block(block, '') %> +<% end %> +
diff --git a/plugins/container_block/views/box_organizer/_container_block.rhtml b/plugins/container_block/views/box_organizer/_container_block.rhtml new file mode 100644 index 0000000..62936f1 --- /dev/null +++ b/plugins/container_block/views/box_organizer/_container_block.rhtml @@ -0,0 +1,14 @@ +
+ + +<%= link_to_function(_('New block'), nil, :class => 'button icon-add with-text') { |page| + page.insert_html :bottom, 'links', content_tag('li',select_tag('block[block_classes][]', + options_for_select( @controller.available_blocks.each_with_index.map {|b,i| [b.name, b.name] } ))) } %> + +

diff --git a/plugins/container_block/views/environment_design b/plugins/container_block/views/environment_design new file mode 120000 index 0000000..a75d184 --- /dev/null +++ b/plugins/container_block/views/environment_design @@ -0,0 +1 @@ +box_organizer \ No newline at end of file diff --git a/plugins/container_block/views/profile_design b/plugins/container_block/views/profile_design new file mode 120000 index 0000000..a75d184 --- /dev/null +++ b/plugins/container_block/views/profile_design @@ -0,0 +1 @@ +box_organizer \ No newline at end of file -- libgit2 0.21.2