diff --git a/app/models/alchemy/page/page_elements.rb b/app/models/alchemy/page/page_elements.rb index 2184d85846..849391b530 100644 --- a/app/models/alchemy/page/page_elements.rb +++ b/app/models/alchemy/page/page_elements.rb @@ -37,11 +37,20 @@ module ClassMethods # def copy_elements(source, target) repository = source.draft_version.element_repository + elements = repository.not_nested + page_version = target.draft_version + duplicate_elements(elements.unfixed, repository, page_version) + + duplicate_elements(elements.fixed, repository, page_version) + end + + private + + def duplicate_elements(elements, repository, page_version) transaction do Element.acts_as_list_no_update do - repository.not_nested.each.with_index(1) do |element, position| + elements.each.with_index(1) do |element, position| Alchemy::DuplicateElement.new(element, repository: repository).call( - page_version_id: target.draft_version.id, + page_version_id: page_version.id, position: position ) end diff --git a/spec/models/alchemy/page_spec.rb b/spec/models/alchemy/page_spec.rb index 9720679a79..32dce44585 100644 --- a/spec/models/alchemy/page_spec.rb +++ b/spec/models/alchemy/page_spec.rb @@ -392,6 +392,29 @@ module Alchemy end end + describe ".copy_elements" do + let(:page) { create(:alchemy_page) } + let(:page_2) { create(:alchemy_page) } + let!(:element_1) { create(:alchemy_element, page_version: page.draft_version) } + let!(:element_2) { create(:alchemy_element, page_version: page.draft_version) } + let!(:element_3) { create(:alchemy_element, page_version: page.draft_version) } + let!(:fixed_element_1) { create(:alchemy_element, :fixed, page_version: page.draft_version) } + let!(:fixed_element_2) { create(:alchemy_element, :fixed, page_version: page.draft_version) } + + subject(:copy_elements) { Page.copy_elements(page, page_2) } + + it "should keep original order of fixed and non-fixed elements" do + elements = copy_elements + expect(elements.map(&:position)).to match([ + element_1.position, + element_2.position, + element_3.position, + fixed_element_1.position, + fixed_element_2.position + ]) + end + end + describe ".create" do context "before/after filter" do it "should automatically set the title from its name" do