Commit dd55c842eff469a983e774214c484142b45ce2f5

Authored by Rodrigo Souto + Ana Losnak + Daniel Bucher + Caio Almeida + Leandro Nunes + Daniela Feitosa + Mariel Zasso
Committed by Daniela Feitosa
1 parent 5a911ba4

Clone blocks

app/controllers/my_profile/profile_design_controller.rb
@@ -54,4 +54,10 @@ class ProfileDesignController < BoxOrganizerController @@ -54,4 +54,10 @@ class ProfileDesignController < BoxOrganizerController
54 blocks 54 blocks
55 end 55 end
56 56
  57 + def clone
  58 + block = Block.find(params[:id])
  59 + block.duplicate
  60 + redirect_to :action => 'index'
  61 + end
  62 +
57 end 63 end
app/helpers/boxes_helper.rb
@@ -210,6 +210,7 @@ module BoxesHelper @@ -210,6 +210,7 @@ module BoxesHelper
210 210
211 if !block.main? 211 if !block.main?
212 buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')}) 212 buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')})
  213 + buttons << icon_button(:clone, _('Clone'), { :action => 'clone', :id => block.id }, { :method => 'post' })
213 end 214 end
214 215
215 if block.respond_to?(:help) 216 if block.respond_to?(:help)
app/models/block.rb
@@ -138,4 +138,14 @@ class Block &lt; ActiveRecord::Base @@ -138,4 +138,14 @@ class Block &lt; ActiveRecord::Base
138 4.hours 138 4.hours
139 end 139 end
140 140
  141 + def duplicate
  142 + duplicated_block = self.clone
  143 + duplicated_block.enabled = false
  144 + duplicated_block.created_at = nil
  145 + duplicated_block.updated_at = nil
  146 + duplicated_block.save!
  147 + duplicated_block.insert_at(self.position + 1)
  148 + duplicated_block
  149 + end
  150 +
141 end 151 end
public/designs/icons/tango/style.css
@@ -100,6 +100,7 @@ @@ -100,6 +100,7 @@
100 .icon-user-removed { background-image: url(Tango/16x16/actions/gtk-cancel.png) } 100 .icon-user-removed { background-image: url(Tango/16x16/actions/gtk-cancel.png) }
101 .icon-user-unknown { background-image: url(Tango/16x16/status/dialog-error.png) } 101 .icon-user-unknown { background-image: url(Tango/16x16/status/dialog-error.png) }
102 .icon-alert { background-image: url(Tango/16x16/status/dialog-warning.png) } 102 .icon-alert { background-image: url(Tango/16x16/status/dialog-warning.png) }
  103 +.icon-clone { background-image: url(Tango/16x16/actions/edit-copy.png) }
103 104
104 /******************LARGE ICONS********************/ 105 /******************LARGE ICONS********************/
105 .image-gallery-item .folder { background-image: url(mod/96x96/places/folder.png) } 106 .image-gallery-item .folder { background-image: url(mod/96x96/places/folder.png) }
test/functional/profile_design_controller_test.rb
@@ -714,4 +714,12 @@ class ProfileDesignControllerTest &lt; ActionController::TestCase @@ -714,4 +714,12 @@ class ProfileDesignControllerTest &lt; ActionController::TestCase
714 assert !@controller.available_blocks.include?(CustomBlock1) 714 assert !@controller.available_blocks.include?(CustomBlock1)
715 end 715 end
716 716
  717 + should 'clone a block' do
  718 + block = ProfileImageBlock.create!(:box => profile.boxes.first)
  719 + assert_difference ProfileImageBlock, :count, 1 do
  720 + post :clone, :id => block.id, :profile => profile.identifier
  721 + assert_response :redirect
  722 + end
  723 + end
  724 +
717 end 725 end
test/unit/block_test.rb
@@ -2,6 +2,8 @@ require File.dirname(__FILE__) + &#39;/../test_helper&#39; @@ -2,6 +2,8 @@ require File.dirname(__FILE__) + &#39;/../test_helper&#39;
2 2
3 class BlockTest < ActiveSupport::TestCase 3 class BlockTest < ActiveSupport::TestCase
4 4
  5 + DUPLICATABLE_FIELDS = [:settings, :title, :box_id, :type]
  6 +
5 should 'describe itself' do 7 should 'describe itself' do
6 assert_kind_of String, Block.description 8 assert_kind_of String, Block.description
7 end 9 end
@@ -150,10 +152,49 @@ class BlockTest &lt; ActiveSupport::TestCase @@ -150,10 +152,49 @@ class BlockTest &lt; ActiveSupport::TestCase
150 152
151 should 'delegate environment to box' do 153 should 'delegate environment to box' do
152 box = fast_create(Box, :owner_id => fast_create(Profile).id) 154 box = fast_create(Box, :owner_id => fast_create(Profile).id)
153 - block = Block.new(:box => box) 155 + block = Block.new(:bo => box)
154 box.stubs(:environment).returns(Environment.default) 156 box.stubs(:environment).returns(Environment.default)
155 157
156 assert_equal box.environment, block.environment 158 assert_equal box.environment, block.environment
157 end 159 end
158 160
  161 + should 'create a clone block' do
  162 + block = fast_create(Block, :title => 'test 1', :position => 1)
  163 + assert_difference Block, :count, 1 do
  164 + block.duplicate
  165 + end
  166 + end
  167 +
  168 + should 'clone and keep some fields' do
  169 + box = fast_create(Box, :owner_id => fast_create(Profile).id)
  170 + block = TagsBlock.create!(:title => 'test 1', :box_id => box.id, :settings => {:test => 'test'})
  171 + duplicated = block.duplicate
  172 + DUPLICATABLE_FIELDS.each do |f|
  173 + assert_equal duplicated.send(f), block.send(f)
  174 + end
  175 + end
  176 +
  177 + should 'clone block and set fields' do
  178 + box = fast_create(Box, :owner_id => fast_create(Profile).id)
  179 + block = TagsBlock.create!(:title => 'test 1', :box_id => box.id, :settings => {:test => 'test'}, :position => 1)
  180 + block2 = TagsBlock.create!(:title => 'test 2', :box_id => box.id, :settings => {:test => 'test'}, :position => 2)
  181 + duplicated = block.duplicate
  182 + block2.reload
  183 + block.reload
  184 + assert_equal false, duplicated.enabled
  185 + assert_equal 1, block.position
  186 + assert_equal 2, duplicated.position
  187 + assert_equal 3, block2.position
  188 + end
  189 +
  190 + should 'not clone date creation and update attributes' do
  191 + box = fast_create(Box, :owner_id => fast_create(Profile).id)
  192 + block = TagsBlock.create!(:title => 'test 1', :box_id => box.id, :settings => {:test => 'test'}, :position => 1)
  193 + duplicated = block.duplicate
  194 +
  195 + assert_not_equal block.created_at, duplicated.created_at
  196 + assert_not_equal block.updated_at, duplicated.updated_at
  197 + end
  198 +
  199 +
159 end 200 end