diff --git a/assets/js/src/newsletter_editor/blocks/base.js b/assets/js/src/newsletter_editor/blocks/base.js index 7e5a172305..c86ed6488a 100644 --- a/assets/js/src/newsletter_editor/blocks/base.js +++ b/assets/js/src/newsletter_editor/blocks/base.js @@ -52,6 +52,7 @@ define([ modelEvents: { 'change': 'render', 'delete': 'deleteBlock', + 'duplicate': 'duplicateBlock', }, events: { "mouseenter": "showTools", @@ -142,6 +143,9 @@ define([ this.model.destroy(); }.bind(this)); }, + duplicateBlock: function() { + this.model.collection.add(this.model.toJSON(), {at: this.model.collection.findIndex(this.model)}); + }, transitionIn: function() { return this._transition('slideDown', 'fadeIn', 'easeOut'); }, @@ -180,11 +184,13 @@ define([ "click .mailpoet_delete_block_activate": "showDeletionConfirmation", "click .mailpoet_delete_block_cancel": "hideDeletionConfirmation", "click .mailpoet_delete_block_confirm": "deleteBlock", + "click .mailpoet_duplicate_block": "duplicateBlock", }, // Markers of whether these particular tools will be used for this instance tools: { settings: true, delete: true, + duplicate: true, move: true, }, getSettingsView: function() { return Module.BlockSettingsView; }, @@ -221,6 +227,11 @@ define([ this.model.trigger('delete'); return false; }, + duplicateBlock: function(event) { + event.preventDefault(); + this.model.trigger('duplicate'); + return false; + }, }); Module.BlockSettingsView = Marionette.View.extend({ diff --git a/assets/js/src/newsletter_editor/blocks/container.js b/assets/js/src/newsletter_editor/blocks/container.js index 025b9e0b20..e557dde547 100644 --- a/assets/js/src/newsletter_editor/blocks/container.js +++ b/assets/js/src/newsletter_editor/blocks/container.js @@ -161,6 +161,7 @@ define([ tools: { settings: this.renderOptions.depth === 1, delete: this.renderOptions.depth === 1, + duplicate: true, move: this.renderOptions.depth === 1, layerSelector: false, }, diff --git a/tests/javascript/newsletter_editor/blocks/container.spec.js b/tests/javascript/newsletter_editor/blocks/container.spec.js index f0e20b3a12..4dd46b4982 100644 --- a/tests/javascript/newsletter_editor/blocks/container.spec.js +++ b/tests/javascript/newsletter_editor/blocks/container.spec.js @@ -135,6 +135,10 @@ define([ it('does not have a settings tool', function () { expect(view.$('.mailpoet_edit_block')).to.have.length(0); }); + + it('has a duplication tool', function () { + expect(view.$('.mailpoet_duplicate_block')).to.have.length(1); + }); }); describe.skip('on non-root levels', function () { @@ -164,6 +168,10 @@ define([ it('has a settings tool', function () { expect(view.$('.mailpoet_edit_block')).to.have.length(1); }); + + it('has a duplication tool', function () { + expect(view.$('.mailpoet_duplicate_block')).to.have.length(1); + }); }); }); diff --git a/views/newsletter/templates/blocks/base/toolsGeneric.hbs b/views/newsletter/templates/blocks/base/toolsGeneric.hbs index 1198239f8a..9cff8cda8e 100644 --- a/views/newsletter/templates/blocks/base/toolsGeneric.hbs +++ b/views/newsletter/templates/blocks/base/toolsGeneric.hbs @@ -3,7 +3,8 @@ <%= source('newsletter/templates/svg/block-tools/settings-column.svg') %> {{/if}}{{#if tools.settings}} <%= source('newsletter/templates/svg/block-tools/settings.svg') %> -{{/if}}{{#if tools.delete}}
<%= source('newsletter/templates/svg/block-tools/trash.svg') %><%= __('Delete') %><%= __('Cancel') %>
{{/if}}{{#if tools.move}} -<%= source('newsletter/templates/svg/block-tools/move.svg') %> +{{/if}}{{#if tools.delete}}
<%= source('newsletter/templates/svg/block-tools/trash.svg') %><%= __('Delete') %><%= __('Cancel') %>
{{/if}}{{#if tools.duplicate}} +<%= source('newsletter/templates/svg/block-tools/duplicate.svg') %>{{/if}}{{#if tools.move}} + <%= source('newsletter/templates/svg/block-tools/move.svg') %> {{/if}} diff --git a/views/newsletter/templates/svg/block-tools/duplicate.svg b/views/newsletter/templates/svg/block-tools/duplicate.svg new file mode 100644 index 0000000000..9bfb461d0e --- /dev/null +++ b/views/newsletter/templates/svg/block-tools/duplicate.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + +