Commit 097aa929503bf39829edf02f86b269fd51860a61
1 parent
f323c51d
Exists in
master
and in
29 other branches
container_block: fix the use of container blocks with templates
fixes #7
Showing
4 changed files
with
82 additions
and
8 deletions
Show diff stats
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 < Block | @@ -38,9 +38,11 @@ class ContainerBlockPlugin::ContainerBlock < 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 < Block | @@ -71,4 +73,23 @@ class ContainerBlockPlugin::ContainerBlock < 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 |
@@ -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 |