Skip to content
This repository has been archived by the owner on Mar 27, 2023. It is now read-only.

Commit

Permalink
allow overriding the form on page cloning
Browse files Browse the repository at this point in the history
  • Loading branch information
NealJMD committed Feb 15, 2017
1 parent 7927010 commit de8f20c
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 20 deletions.
3 changes: 2 additions & 1 deletion app/controllers/clone_pages_controller.rb
Expand Up @@ -7,7 +7,8 @@ def new
end

def create
new_page = PageCloner.clone(@page, params[:page][:title])
override_forms = (params[:override_forms].to_i == 1)
new_page = PageCloner.clone(@page, params[:page][:title], params[:page][:language_id], override_forms)
QueueManager.push(new_page, job_type: :create)
redirect_to edit_page_path(new_page)
end
Expand Down
25 changes: 21 additions & 4 deletions app/services/page_cloner.rb
Expand Up @@ -6,19 +6,22 @@ class PageCloner

attr_reader :page, :cloned_page, :title

def self.clone(page, title = nil)
new(page, title).clone
def self.clone(page, title = nil, language_id = nil, override_forms = false)
new(page, title, language_id, override_forms).clone
end

def initialize(page, title = nil)
def initialize(page, title = nil, language_id = nil, override_forms = false)
@page = page
@title = title
@language_id = language_id&.to_i
@override_forms = override_forms
end

def clone
clone_page do
language
links
plugins
plugins # needs to go after language
tags
images
shares # needs to go after images
Expand Down Expand Up @@ -55,6 +58,7 @@ def plugins
page.plugins.each do |plugin|
plugin.dup.tap do |clone|
clone.page = cloned_page
update_form(clone) if @override_forms
clone.save!
end
end
Expand All @@ -66,6 +70,19 @@ def tags
end
end

def language
return unless @language_id.present?
language_record = Language.find_by(id: @language_id)
cloned_page.update_attributes(language_id: language_record.id) if language_record.present?
end

def update_form(plugin)
# plugins_with_forms = page.plugins.select { |p| p.try(:form).present? }
return unless plugin.respond_to?(:form=)
default_form = DefaultFormBuilder.find_or_create(locale: cloned_page.language.code)
plugin.form = FormDuplicator.duplicate(default_form)
end

def images
@image_id_mapping ||= {}
primary_image = page.primary_image
Expand Down
29 changes: 20 additions & 9 deletions app/views/clone_pages/new.html.slim
Expand Up @@ -3,14 +3,25 @@
.edit-block
h1.page-edit-step__title
= t('.title')
= form_for Page.new, url: clone_pages_path, class: '' do |f|

.form-group
= f.label :title, t('.labels.title')
= f.text_field :title, class: 'form-control', value: @page.title
.form-group
p
= f.submit t('.labels.submit'), class: 'btn btn-sm btn-primary submit-new-page'
= link_to t('common.cancel'), :back, class: 'btn btn-sm'
= hidden_field_tag :id, @page.id
.col-md-6
= form_for Page.new, url: clone_pages_path, class: '' do |f|
.form-group
= f.label :title, t('.labels.title')
= f.text_field :title, class: 'form-control', value: @page.title

.form-group
= f.label :language_id, t('pages.edit.language_label')
= f.select :language_id, Language.all.map { |lang| [lang.name, lang.id] }, { selected: @page.language_id}, class: "form-control"

.form-group
label.edit-page-checkbox
= check_box_tag :override_forms
= t('.labels.override_forms')

.form-group
p
= f.submit t('.labels.submit'), class: 'btn btn-sm btn-primary submit-new-page'
= link_to t('common.cancel'), :back, class: 'btn btn-sm'
= hidden_field_tag :id, @page.id

1 change: 1 addition & 0 deletions config/locales/champaign.en.yml
Expand Up @@ -111,6 +111,7 @@ en:
title: "Clone Page"
labels:
title: "Edit Page Title"
override_forms: Replace page's forms with the default in the selected language
submit: "Clone!"
pages:
index:
Expand Down
4 changes: 2 additions & 2 deletions spec/controllers/clone_pages_controller_spec.rb
Expand Up @@ -39,7 +39,7 @@
allow(PageCloner).to receive(:clone) { cloned_page }
allow(QueueManager).to receive(:push)

post :create, id: '1', page: { title: 'foo' }
post :create, id: '1', page: { title: 'foo', language_id: 3 }, override_forms: '1'
end

it 'authenticates session' do
Expand All @@ -51,7 +51,7 @@
end

it 'clones page' do
expect(PageCloner).to have_received(:clone).with(page, 'foo')
expect(PageCloner).to have_received(:clone).with(page, 'foo', '3', true)
end

it 'posts page to queue' do
Expand Down
32 changes: 28 additions & 4 deletions spec/services/page_cloner_spec.rb
Expand Up @@ -41,8 +41,11 @@
let!(:link) { create(:link, page: page) }

subject(:cloned_page) do
@title ||= nil
@language_id ||= nil
@override_forms ||= nil
VCR.use_cassette('page_cloner_share_success') do
PageCloner.clone(page).reload
PageCloner.clone(page, @title, @language_id, @override_forms).reload
end
end

Expand Down Expand Up @@ -109,6 +112,12 @@
expect(cloned_page.content).to eq('Foo Bar')
end

it 'updates the language when language_id is passed' do
@language_id = create(:language, :french).id
expect(cloned_page.language_id).to eq(@language_id)
expect(cloned_page.language.code).to eq 'fr'
end

it 'sets the new pages action_count to 0' do
expect(page.action_count).not_to eq(0)
expect(cloned_page.action_count).to eq(0)
Expand Down Expand Up @@ -209,10 +218,25 @@ def get_plugin(type)

it 'clones form elements' do
expect(cloned_form.form_elements).not_to match_array(form.form_elements)
expect(cloned_form.form_elements.map(&:name)).to match_array(form.form_elements.map(&:name))
end

context 'when override_forms is passed' do
before :each do
@override_forms = true
end

it 'with a language_id it creates a new form with the same language' do
@language_id = create(:language, :german).id
expect { cloned_page }.to change { Form.count }.by 2 # it also creates the german master form
expect(cloned_form.form_elements.map(&:name)).not_to match_array(form.form_elements.map(&:name))
expect(cloned_form.form_elements.map(&:label)).to include('VOLLSTÄNDIGER NAME')
end

expect(
cloned_form.form_elements.map(&:name)
).to include('action_textentry_foo_bar')
it 'without a language_id' do
expect { cloned_page }.to change { Form.count }.by 1
expect(cloned_form.form_elements.map(&:name)).not_to match_array(form.form_elements.map(&:name))
end
end
end
end
Expand Down

0 comments on commit de8f20c

Please sign in to comment.