From 7ca71e3d5faf10e195dc07810ce959f20e878ce2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Thu, 13 Jul 2023 12:38:29 +0200
Subject: [PATCH] fix duplication on contents

---
 app/models/communication/block/heading.rb |  6 ++++
 app/models/concerns/with_duplication.rb   | 38 ++++++++++++++++++-----
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/app/models/communication/block/heading.rb b/app/models/communication/block/heading.rb
index 186320adc..cbf44bb4f 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 3285ff9a6..d83d03803 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
 
-- 
GitLab