diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index addeaab843..6c0d234a39 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -69,13 +69,31 @@ define( ); } - var item_actions = ( + var custom_actions = this.props.item_actions; + var item_actions = false; + + if(custom_actions.length > 0) { + item_actions = custom_actions.map(function(action, index) { + return ( + + { action.link(this.props.item.id) } + {(index < (custom_actions.length - 1)) ? ' | ' : ''} + + ); + }.bind(this)); + } else { + item_actions = ( + + Edit + + ); + } + + var actions = (
- - Edit - -  |  + { item_actions } + { ' | ' } { checkbox } - { this.props.onRenderItem(this.props.item, item_actions) } + { this.props.onRenderItem(this.props.item, actions) } ); } @@ -166,6 +184,7 @@ define( onDeleteItem={ this.props.onDeleteItem } selection={ this.props.selection } is_selectable={ this.props.is_selectable } + item_actions={ this.props.item_actions } key={ 'item-' + item.id } item={ item } /> ); @@ -367,6 +386,9 @@ define( // bulk actions var bulk_actions = this.props.bulk_actions || []; + // item actions + var item_actions = this.props.item_actions || []; + var tableClasses = classNames( 'wp-list-table', 'widefat', @@ -420,6 +442,7 @@ define( loading={ this.state.loading } count={ this.state.count } limit={ this.state.limit } + item_actions={ item_actions } items={ items } /> diff --git a/assets/js/src/newsletter_editor/App.js b/assets/js/src/newsletter_editor/App.js index 8b36ebd3f5..92b272d3fd 100644 --- a/assets/js/src/newsletter_editor/App.js +++ b/assets/js/src/newsletter_editor/App.js @@ -5,8 +5,9 @@ define([ 'jquery', 'underscore', 'handlebars', - 'handlebars_helpers', - ], function(Backbone, Marionette, SuperModel, jQuery, _, Handlebars) { + 'handlebars_helpers' + ], function(Backbone, Marionette, SuperModel, jQuery, _, Handlebars) { + var app = new Marionette.Application(), AppView; // Decoupled communication between application components diff --git a/assets/js/src/newsletter_editor/behaviors/BehaviorsLookup.js b/assets/js/src/newsletter_editor/behaviors/BehaviorsLookup.js index 36cd078cd8..ba9bd05c9c 100644 --- a/assets/js/src/newsletter_editor/behaviors/BehaviorsLookup.js +++ b/assets/js/src/newsletter_editor/behaviors/BehaviorsLookup.js @@ -5,7 +5,7 @@ * For more check: http://marionettejs.com/docs/marionette.behaviors.html#behaviorslookup */ define([ - 'backbone.marionette', + 'backbone.marionette' ], function(Marionette) { var BehaviorsLookup = {}; diff --git a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js index f5c417386c..0666908e7e 100644 --- a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js @@ -6,7 +6,7 @@ define([ 'backbone.marionette', 'newsletter_editor/behaviors/BehaviorsLookup', - 'spectrum', + 'spectrum' ], function(Marionette, BehaviorsLookup, Spectrum) { BehaviorsLookup.ColorPickerBehavior = Marionette.Behavior.extend({ diff --git a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js index 8ddfe81ae4..fd5bb27711 100644 --- a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js @@ -10,7 +10,7 @@ define([ 'underscore', 'jquery', 'newsletter_editor/behaviors/BehaviorsLookup', - 'interact', + 'interact' ], function(Marionette, _, jQuery, BehaviorsLookup, interact) { BehaviorsLookup.ContainerDropZoneBehavior = Marionette.Behavior.extend({ diff --git a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js index 6c362c7868..40e1aebb19 100644 --- a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js @@ -9,7 +9,7 @@ define([ 'underscore', 'jquery', 'newsletter_editor/behaviors/BehaviorsLookup', - 'interact', + 'interact' ], function(Marionette, _, jQuery, BehaviorsLookup, interact) { BehaviorsLookup.DraggableBehavior = Marionette.Behavior.extend({ diff --git a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js index 5bb7ea064e..abd140002e 100644 --- a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js @@ -6,7 +6,7 @@ define([ 'backbone.marionette', 'newsletter_editor/behaviors/BehaviorsLookup', - 'interact', + 'interact' ], function(Marionette, BehaviorsLookup, interact) { BehaviorsLookup.ResizableBehavior = Marionette.Behavior.extend({ diff --git a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js index df4533bf41..e9d0a24e79 100644 --- a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js @@ -6,7 +6,7 @@ define([ 'backbone.marionette', 'underscore', - 'newsletter_editor/behaviors/BehaviorsLookup', + 'newsletter_editor/behaviors/BehaviorsLookup' ], function(Marionette, _, BehaviorsLookup) { BehaviorsLookup.SortableBehavior = Marionette.Behavior.extend({ diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js index 3ed52fa77b..12c6fdd9bc 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js @@ -13,7 +13,7 @@ define([ 'newsletter_editor/blocks/divider', 'newsletter_editor/components/wordpress', 'underscore', - 'jquery', + 'jquery' ], function(App, BaseBlock, ButtonBlock, DividerBlock, WordpressComponent, _, jQuery) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/base.js b/assets/js/src/newsletter_editor/blocks/base.js index 378215147e..b313bae42f 100644 --- a/assets/js/src/newsletter_editor/blocks/base.js +++ b/assets/js/src/newsletter_editor/blocks/base.js @@ -11,7 +11,7 @@ define([ 'underscore', 'jquery', 'mailpoet', - 'modal', + 'modal' ], function(App, Marionette, SuperModel, _, jQuery, MailPoet, Modal) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/button.js b/assets/js/src/newsletter_editor/blocks/button.js index 12aaa0e45a..f0e1dfd21e 100644 --- a/assets/js/src/newsletter_editor/blocks/button.js +++ b/assets/js/src/newsletter_editor/blocks/button.js @@ -6,7 +6,7 @@ define([ 'newsletter_editor/blocks/base', 'mailpoet', 'underscore', - 'jquery', + 'jquery' ], function(App, BaseBlock, MailPoet, _, jQuery) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/container.js b/assets/js/src/newsletter_editor/blocks/container.js index 3743081311..675d38ec81 100644 --- a/assets/js/src/newsletter_editor/blocks/container.js +++ b/assets/js/src/newsletter_editor/blocks/container.js @@ -9,7 +9,7 @@ define([ 'underscore', 'jquery', 'newsletter_editor/App', - 'newsletter_editor/blocks/base', + 'newsletter_editor/blocks/base' ], function(Backbone, Marionette, _, jQuery, App, BaseBlock) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/divider.js b/assets/js/src/newsletter_editor/blocks/divider.js index 2e2021c549..0f5e4fb348 100644 --- a/assets/js/src/newsletter_editor/blocks/divider.js +++ b/assets/js/src/newsletter_editor/blocks/divider.js @@ -6,7 +6,7 @@ define([ 'newsletter_editor/blocks/base', 'underscore', 'jquery', - 'mailpoet', + 'mailpoet' ], function(App, BaseBlock, _, jQuery, MailPoet) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/footer.js b/assets/js/src/newsletter_editor/blocks/footer.js index ec9001b89f..ea1bda137d 100644 --- a/assets/js/src/newsletter_editor/blocks/footer.js +++ b/assets/js/src/newsletter_editor/blocks/footer.js @@ -4,7 +4,7 @@ define([ 'newsletter_editor/App', 'newsletter_editor/blocks/base', - 'underscore', + 'underscore' ], function(App, BaseBlock, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/header.js b/assets/js/src/newsletter_editor/blocks/header.js index 0680cde82f..3f262a9703 100644 --- a/assets/js/src/newsletter_editor/blocks/header.js +++ b/assets/js/src/newsletter_editor/blocks/header.js @@ -4,7 +4,7 @@ define([ 'newsletter_editor/App', 'newsletter_editor/blocks/base', - 'underscore', + 'underscore' ], function(App, BaseBlock, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/image.js b/assets/js/src/newsletter_editor/blocks/image.js index c0babd2575..dbb127bf12 100644 --- a/assets/js/src/newsletter_editor/blocks/image.js +++ b/assets/js/src/newsletter_editor/blocks/image.js @@ -4,7 +4,7 @@ define([ 'newsletter_editor/App', 'newsletter_editor/blocks/base', - 'underscore', + 'underscore' ], function(App, BaseBlock, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js index 39e4525a76..404a268c11 100644 --- a/assets/js/src/newsletter_editor/blocks/posts.js +++ b/assets/js/src/newsletter_editor/blocks/posts.js @@ -21,7 +21,7 @@ define([ 'newsletter_editor/components/wordpress', 'newsletter_editor/blocks/base', 'newsletter_editor/blocks/button', - 'newsletter_editor/blocks/divider', + 'newsletter_editor/blocks/divider' ], function(Backbone, Marionette, Radio, _, jQuery, MailPoet, App, WordpressComponent, BaseBlock, ButtonBlock, DividerBlock) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/social.js b/assets/js/src/newsletter_editor/blocks/social.js index 50ea5b2f68..4c38399422 100644 --- a/assets/js/src/newsletter_editor/blocks/social.js +++ b/assets/js/src/newsletter_editor/blocks/social.js @@ -8,7 +8,7 @@ define([ 'backbone.marionette', 'backbone.supermodel', 'underscore', - 'jquery', + 'jquery' ], function(App, BaseBlock, Backbone, Marionette, SuperModel, _, jQuery) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/spacer.js b/assets/js/src/newsletter_editor/blocks/spacer.js index 276ca28be9..1e332f7ad8 100644 --- a/assets/js/src/newsletter_editor/blocks/spacer.js +++ b/assets/js/src/newsletter_editor/blocks/spacer.js @@ -4,7 +4,7 @@ define([ 'newsletter_editor/App', 'newsletter_editor/blocks/base', - 'underscore', + 'underscore' ], function(App, BaseBlock, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/blocks/text.js b/assets/js/src/newsletter_editor/blocks/text.js index 55d7089e4e..ebafe199b8 100644 --- a/assets/js/src/newsletter_editor/blocks/text.js +++ b/assets/js/src/newsletter_editor/blocks/text.js @@ -4,7 +4,7 @@ define([ 'newsletter_editor/App', 'newsletter_editor/blocks/base', - 'underscore', + 'underscore' ], function(App, BaseBlock, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/components/config.js b/assets/js/src/newsletter_editor/components/config.js index 36e25d4de9..d765b8c3c8 100644 --- a/assets/js/src/newsletter_editor/components/config.js +++ b/assets/js/src/newsletter_editor/components/config.js @@ -1,6 +1,6 @@ define([ 'newsletter_editor/App', - 'backbone.supermodel', + 'backbone.supermodel' ], function(App, SuperModel) { var Module = {}; diff --git a/assets/js/src/newsletter_editor/components/content.js b/assets/js/src/newsletter_editor/components/content.js index 4de5d7f061..90432a5f0b 100644 --- a/assets/js/src/newsletter_editor/components/content.js +++ b/assets/js/src/newsletter_editor/components/content.js @@ -1,7 +1,7 @@ define([ 'newsletter_editor/App', 'backbone.supermodel', - 'underscore', + 'underscore' ], function(App, SuperModel, _) { "use strict"; diff --git a/assets/js/src/newsletter_editor/components/heading.js b/assets/js/src/newsletter_editor/components/heading.js index 4db3705f6f..34560d6245 100644 --- a/assets/js/src/newsletter_editor/components/heading.js +++ b/assets/js/src/newsletter_editor/components/heading.js @@ -3,7 +3,7 @@ define([ 'backbone', 'backbone.marionette', 'underscore', - 'jquery', + 'jquery' ], function(App, Backbone, Marionette, _, jQuery) { "use strict"; diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js index eac6c93981..3fb846b13c 100644 --- a/assets/js/src/newsletter_editor/components/save.js +++ b/assets/js/src/newsletter_editor/components/save.js @@ -1,8 +1,9 @@ define([ 'newsletter_editor/App', + 'newsletter_editor/components/wordpress', 'backbone', - 'backbone.marionette', - ], function(App, Backbone, Marionette) { + 'backbone.marionette' + ], function(App, Wordpress, Backbone, Marionette) { "use strict"; @@ -15,27 +16,26 @@ define([ var json = App.toJSON(); - // save newsletter - // TODO: Migrate logic to new AJAX format - //mailpoet_post_wpi('newsletter_save.php', json, function(response) { - //if(response.success !== undefined && response.success === true) { - ////MailPoet.Notice.success(""); - //} else if(response.error !== undefined) { - //if(response.error.length === 0) { - //// TODO: Handle translations - //MailPoet.Notice.error(""); - //} else { - //$(response.error).each(function(i, error) { - //MailPoet.Notice.error(error); - //}); - //} - //} - //App.getChannel().trigger('afterEditorSave', json, response); - //}, function(error) { - //// TODO: Handle saving errors - //App.getChannel().trigger('afterEditorSave', {}, error); - //}); + Wordpress.saveNewsletter(json).done(function(response) { + if(response.success !== undefined && response.success === true) { + // TODO: Handle translations + //MailPoet.Notice.success(""); + } else if(response.error !== undefined) { + if(response.error.length === 0) { + // TODO: Handle translations + MailPoet.Notice.error(""); + } else { + $(response.error).each(function(i, error) { + MailPoet.Notice.error(error); + }); + } + } + App.getChannel().trigger('afterEditorSave', json, response); + }).fail(function() { + // TODO: Handle saving errors + App.getChannel().trigger('afterEditorSave', {}, error); + }); }; Module.SaveView = Marionette.LayoutView.extend({ diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js index a7a338b550..a56de30988 100644 --- a/assets/js/src/newsletter_editor/components/sidebar.js +++ b/assets/js/src/newsletter_editor/components/sidebar.js @@ -5,7 +5,7 @@ define([ 'backbone.supermodel', 'underscore', 'jquery', - 'sticky-kit', + 'sticky-kit' ], function(App, Backbone, Marionette, SuperModel, _, jQuery, StickyKit) { "use strict"; @@ -225,23 +225,23 @@ define([ MailPoet.Modal.loading(true); // TODO: Migrate logic to new AJAX format - //mailpoet_post_wpi('newsletter_preview.php', data, function(response) { - //if(response.success !== undefined && response.success === true) { - //MailPoet.Notice.success(App.getConfig().get('translations.testEmailSent')); - //} else if(response.error !== undefined) { - //if(response.error.length === 0) { - //MailPoet.Notice.error(App.getConfig().get('translations.unknownErrorOccurred')); - //} else { - //$(response.error).each(function(i, error) { - //MailPoet.Notice.error(error); - //}); - //} - //} - //MailPoet.Modal.loading(false); - //}, function(error) { - //// an error occurred - //MailPoet.Modal.loading(false); - //}); + Wordpress.previewNewsletter(data).done(function(response) { + if(response.success !== undefined && response.success === true) { + MailPoet.Notice.success(App.getConfig().get('translations.testEmailSent')); + } else if(response.error !== undefined) { + if(response.error.length === 0) { + MailPoet.Notice.error(App.getConfig().get('translations.unknownErrorOccurred')); + } else { + $(response.error).each(function(i, error) { + MailPoet.Notice.error(error); + }); + } + } + MailPoet.Modal.loading(false); + }).fail(function(response) { + // an error occurred + MailPoet.Modal.loading(false); + }); }, }); diff --git a/assets/js/src/newsletter_editor/components/styles.js b/assets/js/src/newsletter_editor/components/styles.js index 356a56bf1e..1647594d29 100644 --- a/assets/js/src/newsletter_editor/components/styles.js +++ b/assets/js/src/newsletter_editor/components/styles.js @@ -1,7 +1,7 @@ define([ 'newsletter_editor/App', 'backbone.marionette', - 'backbone.supermodel', + 'backbone.supermodel' ], function(App, Marionette, SuperModel) { "use strict"; diff --git a/assets/js/src/newsletter_editor/components/wordpress.js b/assets/js/src/newsletter_editor/components/wordpress.js index 958bceabd6..6b3c43da0c 100644 --- a/assets/js/src/newsletter_editor/components/wordpress.js +++ b/assets/js/src/newsletter_editor/components/wordpress.js @@ -7,13 +7,21 @@ define([ var Module = {}; - Module._cachedQuery = _.memoize(function(args) { + Module._query = function(args) { return MailPoet.Ajax.post({ endpoint: 'wordpress', action: args.action, data: args.options || {}, }); - }, JSON.stringify); + }; + Module._cachedQuery = _.memoize(Module._query, JSON.stringify); + + Module.getNewsletter = function(options) { + return Module._query({ + action: 'get', + options: options, + }); + }; Module.getPostTypes = function() { return Module._cachedQuery({ @@ -54,6 +62,20 @@ define([ }); }; + Module.saveNewsletter = function(options) { + return Module._query({ + action: 'save', + options: options, + }); + }; + + Module.previewNewsletter = function(options) { + return Module._query({ + action: 'preview', + options: options, + }); + }; + App.on('start', function(options) { // Prefetch post types Module.getPostTypes(); diff --git a/assets/js/src/newsletters/list.jsx b/assets/js/src/newsletters/list.jsx index f15dd7c48e..7fbd05dba9 100644 --- a/assets/js/src/newsletters/list.jsx +++ b/assets/js/src/newsletters/list.jsx @@ -1,14 +1,18 @@ define( [ 'react', + 'react-router', 'listing/listing.jsx', 'classnames' ], function( React, + Router, Listing, classNames ) { + var Link = Router.Link; + var columns = [ { name: 'subject', @@ -34,8 +38,22 @@ define( } ]; + var item_actions = [ + { + name: 'edit', + link: function(id) { + return ( + + Edit + + ); + } + } + ]; + var NewsletterList = React.createClass({ renderItem: function(newsletter, actions) { + var rowClasses = classNames( 'manage-column', 'column-primary', @@ -65,7 +83,8 @@ define( endpoint="newsletters" onRenderItem={this.renderItem} columns={columns} - bulk_actions={ bulk_actions } /> + bulk_actions={ bulk_actions } + item_actions={ item_actions } /> ); } }); diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index cd680ffc7e..a5830b4a71 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -59,14 +59,30 @@ class Menu { 'mailpoet-settings', array($this, 'settings') ); - add_submenu_page( - 'mailpoet', - __('Newsletter editor'), - __('Newsletter editor'), - 'manage_options', - 'mailpoet-newsletter-editor', - array($this, 'newsletterEditor') + // add_submenu_page( + // 'mailpoet', + // __('Newsletter editor'), + // __('Newsletter editor'), + // 'manage_options', + // 'mailpoet-newsletter-editor', + // array($this, 'newletterEditor') + // ); + $this->registered_pages(); + } + + function registered_pages() { + global $_registered_pages; + $pages = array( + //'mailpoet-form-editor' => 'formEditor', + 'mailpoet-newsletter-editor' => array($this, 'newletterForm') ); + foreach($pages as $menu_slug => $callback) { + $hookname = get_plugin_page_hookname($menu_slug, null); + if(!empty($hookname)) { + add_action($hookname, $callback); + } + $_registered_pages[$hookname] = true; + } } function home() { @@ -97,11 +113,11 @@ class Menu { echo $this->renderer->render('newsletters.html', $data); } - function newsletterEditor() { + function newletterForm() { $data = array(); wp_enqueue_media(); wp_enqueue_script('tinymce-wplink', includes_url('js/tinymce/plugins/wplink/plugin.js')); wp_enqueue_style('editor', includes_url('css/editor.css')); - echo $this->renderer->render('newsletter/editor.html', $data); + echo $this->renderer->render('newsletter/form.html', $data); } } diff --git a/lib/Twig/Functions.php b/lib/Twig/Functions.php index aaa55c8231..0ee443d045 100644 --- a/lib/Twig/Functions.php +++ b/lib/Twig/Functions.php @@ -3,14 +3,14 @@ namespace MailPoet\Twig; class Functions extends \Twig_Extension { - public function __construct() { + function __construct() { } - public function getName() { + function getName() { return 'functions'; } - public function getFunctions() { + function getFunctions() { return array( new \Twig_SimpleFunction( 'json_encode', @@ -21,7 +21,25 @@ class Functions extends \Twig_Extension { 'json_decode', 'json_decode', array('is_safe' => array('all')) + ), + new \Twig_SimpleFunction( + 'wp_nonce_field', + 'wp_nonce_field', + array('is_safe' => array('all')) + ), + new \Twig_SimpleFunction( + 'params', + array($this, 'params'), + array('is_safe' => array('all')) ) ); } + + function params($key = null) { + $args = stripslashes_deep($_GET); + if(array_key_exists($key, $args)) { + return $args[$key]; + } + return null; + } } diff --git a/package.json b/package.json index ad10e1ff60..3fa00ed9b5 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "interact.js": "taye/interact.js.git" }, "dependencies": { - "backbone": "1.2.0", - "backbone.marionette": "2.4.2", + "backbone": "1.2.3", + "backbone.marionette": "2.4.3", "backbone.radio": "0.9.0", "backbone.supermodel": "1.2.0", "c3": "~0.4.10", diff --git a/tests/javascript/newsletter_editor/components/save.spec.js b/tests/javascript/newsletter_editor/components/save.spec.js index beb6b07ca4..7aaf3bc530 100644 --- a/tests/javascript/newsletter_editor/components/save.spec.js +++ b/tests/javascript/newsletter_editor/components/save.spec.js @@ -1,40 +1,56 @@ define([ 'newsletter_editor/App', - 'newsletter_editor/components/save' - ], function(EditorApplication, SaveComponent) { + 'newsletter_editor/components/save', + 'amd-inject-loader!newsletter_editor/components/save' + ], function(EditorApplication, SaveComponent, SaveInjector) { describe('Save', function() { describe('save method', function() { + var module; + before(function() { + module = SaveInjector({ + 'newsletter_editor/components/wordpress': { + saveNewsletter: function() { + var deferred = jQuery.Deferred(); + deferred.resolve({}); + return deferred; + } + } + }); + }); + it('triggers beforeEditorSave event', function() { var spy = sinon.spy(); global.stubChannel(EditorApplication, { trigger: spy, }); - global.mailpoet_post_wpi = sinon.stub(); EditorApplication.toJSON = sinon.stub(); - SaveComponent.save(); + module.save(); expect(spy.withArgs('beforeEditorSave').calledOnce).to.be.true; }); - it.skip('triggers afterEditorSave event', function() { + it('triggers afterEditorSave event', function() { var stub = sinon.stub().callsArgWith(2, { success: true }), spy = sinon.spy(); - global.mailpoet_post_wpi = stub; global.stubChannel(EditorApplication, { trigger: spy, }); EditorApplication.toJSON = sinon.stub(); - SaveComponent.save(); + module.save(); expect(spy.withArgs('afterEditorSave').calledOnce).to.be.true; }); - it.skip('sends newsletter json to server for saving', function() { - var mock = sinon.mock({ mailpoet_post_wpi: function() {} }).expects('mailpoet_post_wpi').once(); + it('sends newsletter json to server for saving', function() { + var mock = sinon.mock({ saveNewsletter: function() {} }).expects('saveNewsletter').once().returns(jQuery.Deferred()); + var module = SaveInjector({ + 'newsletter_editor/components/wordpress': { + saveNewsletter: mock, + } + }); global.stubChannel(EditorApplication); - global.mailpoet_post_wpi = mock; EditorApplication.toJSON = sinon.stub().returns({}); - SaveComponent.save(); + module.save(); mock.verify(); }); diff --git a/tests/javascript/newsletter_editor/components/wordpress.spec.js b/tests/javascript/newsletter_editor/components/wordpress.spec.js index dc3745a2bc..416e9ab7ed 100644 --- a/tests/javascript/newsletter_editor/components/wordpress.spec.js +++ b/tests/javascript/newsletter_editor/components/wordpress.spec.js @@ -1,16 +1,12 @@ define([ 'newsletter_editor/App', - 'newsletter_editor/components/wordpress' - ], function(EditorApplication, Wordpress) { + 'newsletter_editor/components/wordpress', + 'amd-inject-loader!newsletter_editor/components/wordpress' + ], function(EditorApplication, Wordpress, WordpressInjector) { describe('getPostTypes', function() { - var injector; - beforeEach(function() { - injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); - }); - it('fetches post types from the server', function() { - var module = injector({ + var module = WordpressInjector({ "mailpoet": { Ajax: { post: function() { @@ -32,7 +28,7 @@ define([ it('caches results', function() { var deferred = jQuery.Deferred(), mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: mock, @@ -51,11 +47,6 @@ define([ }); describe('getTaxonomies', function() { - var injector; - beforeEach(function() { - injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); - }); - it('sends post type to endpoint', function() { var spy, post = function(params) { @@ -68,7 +59,7 @@ define([ }, module; spy = sinon.spy(post); - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: spy, @@ -81,7 +72,7 @@ define([ }); it('fetches post types from the server', function() { - var module = injector({ + var module = WordpressInjector({ "mailpoet": { Ajax: { post: function() { @@ -100,7 +91,7 @@ define([ it('caches results', function() { var deferred = jQuery.Deferred(), mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: mock, @@ -116,11 +107,6 @@ define([ }); describe('getTerms', function() { - var injector; - beforeEach(function() { - injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); - }); - it('sends terms to endpoint', function() { var spy, post = function(params) { @@ -130,7 +116,7 @@ define([ }, module; spy = sinon.spy(post); - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: spy, @@ -145,7 +131,7 @@ define([ }); it('fetches terms from the server', function() { - var module = injector({ + var module = WordpressInjector({ "mailpoet": { Ajax: { post: function() { @@ -164,7 +150,7 @@ define([ it('caches results', function() { var deferred = jQuery.Deferred(), mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: mock, @@ -180,11 +166,6 @@ define([ }); describe('getPosts', function() { - var injector; - beforeEach(function() { - injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); - }); - it('sends options to endpoint', function() { var spy, post = function(params) { @@ -194,7 +175,7 @@ define([ }, module; spy = sinon.spy(post); - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: spy, @@ -213,7 +194,7 @@ define([ }); it('fetches posts from the server', function() { - var module = injector({ + var module = WordpressInjector({ "mailpoet": { Ajax: { post: function() { @@ -232,7 +213,7 @@ define([ it('caches results', function() { var deferred = jQuery.Deferred(), mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: mock, @@ -251,11 +232,6 @@ define([ }); describe('getTransformedPosts', function() { - var injector; - beforeEach(function() { - injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); - }); - it('sends options to endpoint', function() { var spy, post = function(params) { @@ -265,7 +241,7 @@ define([ }, module; spy = sinon.spy(post); - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: spy, @@ -284,7 +260,7 @@ define([ }); it('fetches transformed posts from the server', function() { - var module = injector({ + var module = WordpressInjector({ "mailpoet": { Ajax: { post: function() { @@ -303,7 +279,7 @@ define([ it('caches results', function() { var deferred = jQuery.Deferred(), mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), - module = injector({ + module = WordpressInjector({ "mailpoet": { Ajax: { post: mock, diff --git a/views/newsletter/form.html b/views/newsletter/form.html new file mode 100644 index 0000000000..f4d5153838 --- /dev/null +++ b/views/newsletter/form.html @@ -0,0 +1,1274 @@ +<% extends 'layout.html' %> + +<% block content %> +
+
+
+ <%= __('Select type') %> > <%= __('Template') %> > <%= __('Designer') %> > <%= __('Send') %> +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + +<% endblock %> + +<% block templates %> + <%= partial( + 'newsletter_editor_template_tools_generic', + 'newsletter/templates/blocks/base/toolsGeneric.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_automated_latest_content_block', + 'newsletter/templates/blocks/automatedLatestContent/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_automated_latest_content_widget', + 'newsletter/templates/blocks/automatedLatestContent/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_automated_latest_content_settings', + 'newsletter/templates/blocks/automatedLatestContent/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_button_block', + 'newsletter/templates/blocks/button/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_button_widget', + 'newsletter/templates/blocks/button/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_button_settings', + 'newsletter/templates/blocks/button/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_block', + 'newsletter/templates/blocks/container/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_block_empty', + 'newsletter/templates/blocks/container/emptyBlock.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_one_column_widget', + 'newsletter/templates/blocks/container/oneColumnLayoutWidget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_two_column_widget', + 'newsletter/templates/blocks/container/twoColumnLayoutWidget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_three_column_widget', + 'newsletter/templates/blocks/container/threeColumnLayoutWidget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_container_settings', + 'newsletter/templates/blocks/container/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_divider_block', + 'newsletter/templates/blocks/divider/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_divider_widget', + 'newsletter/templates/blocks/divider/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_divider_settings', + 'newsletter/templates/blocks/divider/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_footer_block', + 'newsletter/templates/blocks/footer/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_footer_widget', + 'newsletter/templates/blocks/footer/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_footer_settings', + 'newsletter/templates/blocks/footer/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_header_block', + 'newsletter/templates/blocks/header/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_header_widget', + 'newsletter/templates/blocks/header/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_header_settings', + 'newsletter/templates/blocks/header/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_image_block', + 'newsletter/templates/blocks/image/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_image_widget', + 'newsletter/templates/blocks/image/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_image_settings', + 'newsletter/templates/blocks/image/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_block', + 'newsletter/templates/blocks/posts/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_widget', + 'newsletter/templates/blocks/posts/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_settings', + 'newsletter/templates/blocks/posts/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_settings_display_options', + 'newsletter/templates/blocks/posts/settingsDisplayOptions.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_settings_selection', + 'newsletter/templates/blocks/posts/settingsSelection.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_settings_selection_empty', + 'newsletter/templates/blocks/posts/settingsSelectionEmpty.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_posts_settings_single_post', + 'newsletter/templates/blocks/posts/settingsSinglePost.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_block', + 'newsletter/templates/blocks/social/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_block_icon', + 'newsletter/templates/blocks/social/blockIcon.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_widget', + 'newsletter/templates/blocks/social/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_settings', + 'newsletter/templates/blocks/social/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_settings_icon', + 'newsletter/templates/blocks/social/settingsIcon.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_settings_icon_selector', + 'newsletter/templates/blocks/social/settingsIconSelector.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_social_settings_styles', + 'newsletter/templates/blocks/social/settingsStyles.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_spacer_block', + 'newsletter/templates/blocks/spacer/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_spacer_widget', + 'newsletter/templates/blocks/spacer/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_spacer_settings', + 'newsletter/templates/blocks/spacer/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_text_block', + 'newsletter/templates/blocks/text/block.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_text_widget', + 'newsletter/templates/blocks/text/widget.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_text_settings', + 'newsletter/templates/blocks/text/settings.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_heading', + 'newsletter/templates/components/heading.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_save', + 'newsletter/templates/components/save.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_styles', + 'newsletter/templates/components/styles.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_sidebar', + 'newsletter/templates/components/sidebar/sidebar.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_sidebar_content', + 'newsletter/templates/components/sidebar/content.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_sidebar_layout', + 'newsletter/templates/components/sidebar/layout.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_sidebar_preview', + 'newsletter/templates/components/sidebar/preview.hbs' + ) %> + <%= partial( + 'newsletter_editor_template_sidebar_styles', + 'newsletter/templates/components/sidebar/styles.hbs' + ) %> + + <%= javascript( + 'vendor.js', + 'lib/tinymce/tinymce.jquery.min.js', + 'lib/tinymce/jquery.tinymce.min.js', + 'lib/mailpoet_custom_fields/plugin.js', + 'lib/wplink/plugin.js', + 'newsletter_editor.js' + ) %> + + <%= stylesheet( + 'newsletter_editor.css' + ) %> + + + + +<% endblock %> diff --git a/views/newsletter/templates/components/heading.hbs b/views/newsletter/templates/components/heading.hbs index 30fee47c29..a1eaf668b5 100644 --- a/views/newsletter/templates/components/heading.hbs +++ b/views/newsletter/templates/components/heading.hbs @@ -1,6 +1,15 @@
- +
- +
diff --git a/views/templates/test.hbs b/views/templates/test.hbs deleted file mode 100644 index d0662f1919..0000000000 --- a/views/templates/test.hbs +++ /dev/null @@ -1,2 +0,0 @@ -

<%= __('Settings') %>

-{{ user.name }} ({{ user.age }}) - extra value: {{ extra_value }}