diff --git a/app/models/communication/block/heading.rb b/app/models/communication/block/heading.rb index 186320adca87be8c2484a44c3a19b37882498614..cbf44bb4f99c80d350c1f8b8ca74bbb853a9559e 100644 --- a/app/models/communication/block/heading.rb +++ b/app/models/communication/block/heading.rb @@ -54,6 +54,12 @@ class Communication::Block::Heading < ApplicationRecord [about] end + def duplicate + heading = self.dup + heading.save + heading + end + def translate!(about_translation, parent_id = nil) translation = self.dup translation.about = about_translation diff --git a/app/models/concerns/with_duplication.rb b/app/models/concerns/with_duplication.rb index 3285ff9a664e02dcabd2f992dd2b0561b16f85cf..d83d03803db1423e6e1a489741c9a1fab5b1a3d7 100644 --- a/app/models/concerns/with_duplication.rb +++ b/app/models/concerns/with_duplication.rb @@ -3,7 +3,7 @@ module WithDuplication def duplicate instance = duplicate_instance - duplicate_blocks_to(instance) + duplicate_contents_to(instance) duplicate_featured_image_to(instance) instance end @@ -18,13 +18,35 @@ module WithDuplication instance end - def duplicate_blocks_to(instance) - return unless respond_to?(:blocks) - blocks.ordered.each do |block| - b = block.duplicate - b.about = instance - b.position = block.position - b.save + def duplicate_contents_to(instance) + return unless respond_to?(:contents) + blocks.without_heading.ordered.each do |block| + duplicate_block(instance, block) + end + headings.root.ordered.each do |heading| + duplicate_heading(instance, heading) + end + end + + def duplicate_block(instance, block, heading_id = nil) + b = block.duplicate + b.about = instance + b.position = block.position + b.heading_id = heading_id + b.save + end + + def duplicate_heading(instance, heading, parent_id = nil) + h = heading.duplicate + h.about = instance + h.position = heading.position + h.save + + heading.blocks.ordered.each do |block| + duplicate_block(instance, block, h.id) + end + heading.children.ordered.each do |child| + duplicate_heading(instance, child, h.id) end end