Commit 097aa929503bf39829edf02f86b269fd51860a61

Authored by Victor Costa
1 parent f323c51d

container_block: fix the use of container blocks with templates

fixes #7
app/models/block.rb
@@ -234,4 +234,9 @@ class Block < ActiveRecord::Base @@ -234,4 +234,9 @@ class Block < ActiveRecord::Base
234 duplicated_block 234 duplicated_block
235 end 235 end
236 236
  237 + def copy_from(block)
  238 + self.settings = block.settings
  239 + self.position = block.position
  240 + end
  241 +
237 end 242 end
app/models/profile.rb
@@ -346,16 +346,17 @@ class Profile < ActiveRecord::Base @@ -346,16 +346,17 @@ class Profile < ActiveRecord::Base
346 end 346 end
347 347
348 def copy_blocks_from(profile) 348 def copy_blocks_from(profile)
  349 + template_boxes = profile.boxes.select{|box| box.position}
349 self.boxes.destroy_all 350 self.boxes.destroy_all
350 - profile.boxes.each do |box|  
351 - new_box = Box.new 351 + self.boxes = template_boxes.size.times.map { Box.new }
  352 +
  353 + template_boxes.each_with_index do |box, i|
  354 + new_box = self.boxes[i]
352 new_box.position = box.position 355 new_box.position = box.position
353 - self.boxes << new_box  
354 box.blocks.each do |block| 356 box.blocks.each do |block|
355 new_block = block.class.new(:title => block[:title]) 357 new_block = block.class.new(:title => block[:title])
356 - new_block.settings = block.settings  
357 - new_block.position = block.position  
358 - self.boxes[-1].blocks << new_block 358 + new_block.copy_from(block)
  359 + new_box.blocks << new_block
359 end 360 end
360 end 361 end
361 end 362 end
plugins/container_block/lib/container_block_plugin/container_block.rb
@@ -38,9 +38,11 @@ class ContainerBlockPlugin::ContainerBlock &lt; Block @@ -38,9 +38,11 @@ class ContainerBlockPlugin::ContainerBlock &lt; Block
38 end 38 end
39 39
40 def create_box 40 def create_box
41 - container_box = Box.create!(:owner => owner)  
42 - container_box.update_attribute(:position, nil) 41 + container_box = Box.new(:owner => owner)
  42 + container_box.save!
43 settings[:container_box_id] = container_box.id 43 settings[:container_box_id] = container_box.id
  44 + copy_blocks unless @blocks_to_copy.blank?
  45 + container_box.update_attribute(:position, nil)
44 save! 46 save!
45 end 47 end
46 48
@@ -71,4 +73,23 @@ class ContainerBlockPlugin::ContainerBlock &lt; Block @@ -71,4 +73,23 @@ class ContainerBlockPlugin::ContainerBlock &lt; Block
71 end 73 end
72 end 74 end
73 75
  76 + def copy_from_with_container(block)
  77 + copy_from_without_container(block)
  78 + children_settings = block.children_settings
  79 + @blocks_to_copy = block.blocks
  80 + end
  81 +
  82 + alias_method_chain :copy_from, :container
  83 +
  84 + def copy_blocks
  85 + new_children_settings = {}
  86 + @blocks_to_copy.map do |child|
  87 + new_block = child.class.new(:title => child[:title])
  88 + new_block.copy_from(child)
  89 + container_box.blocks << new_block
  90 + new_children_settings[new_block.id] = children_settings[child.id] if children_settings[child.id]
  91 + end
  92 + settings[:children_settings] = new_children_settings
  93 + end
  94 +
74 end 95 end
plugins/container_block/test/unit/profile_test.rb 0 → 100644
@@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
  1 +require 'test_helper'
  2 +
  3 +class ProfileTest < ActiveSupport::TestCase
  4 +
  5 + should 'not lose position values for boxes when the template has a container block' do
  6 + template = fast_create(Profile)
  7 + template.boxes = [Box.new, Box.new]
  8 + template.boxes[0].blocks << ContainerBlockPlugin::ContainerBlock.new
  9 + template.boxes[1].blocks << Block.new
  10 + template.is_template = true
  11 + template.save!
  12 +
  13 + p = Profile.new
  14 + p.identifier = 'profile-with-template'
  15 + p.name = p.identifier
  16 + p.template = template.reload
  17 + p.save!
  18 +
  19 + assert_equivalent p.reload.boxes.map(&:position), template.reload.boxes.map(&:position)
  20 + end
  21 +
  22 + should 'copy contents of a container block that belongs to the template' do
  23 + template = fast_create(Profile)
  24 + template.boxes = [Box.new]
  25 + template.boxes[0].blocks << ContainerBlockPlugin::ContainerBlock.new
  26 + template.is_template = true
  27 + template.save!
  28 +
  29 + container = template.blocks.first
  30 + container.container_box.blocks << Block.new
  31 + container.container_box.blocks << Block.new
  32 + container.settings[:children_settings] = {}
  33 + container.settings[:children_settings][container.blocks.last.id] = 999
  34 + container.save!
  35 +
  36 + p = Profile.new
  37 + p.identifier = 'another-profile-with-template'
  38 + p.name = p.identifier
  39 + p.template = template.reload
  40 + p.save!
  41 +
  42 + container_copy = p.blocks.first
  43 + assert_equal({container_copy.blocks.last.id => 999}, container_copy.children_settings)
  44 + assert_equal container.blocks.size, p.blocks.first.blocks.size
  45 + end
  46 +
  47 +end