diff --git a/.eslintrc.es5.json b/.eslintrc.es5.json index 37edb595d9..c31cea73e8 100644 --- a/.eslintrc.es5.json +++ b/.eslintrc.es5.json @@ -43,7 +43,6 @@ "brace-style": 0, "no-else-return": 0, "no-use-before-define": 0, - "one-var": 0, "camelcase": 0, "padded-blocks": 0, "strict": 0, diff --git a/assets/js/src/form_editor/form_editor.js b/assets/js/src/form_editor/form_editor.js index fcf47b7064..c0233f6976 100644 --- a/assets/js/src/form_editor/form_editor.js +++ b/assets/js/src/form_editor/form_editor.js @@ -38,8 +38,8 @@ Object.extend(document, (function () { } function createWrapper(selector, eventName, handler, context) { - var wrapper, - c = getWrappersForSelector(selector, eventName); + var wrapper; + var c = getWrappersForSelector(selector, eventName); if(c.pluck('handler').include(handler)) return false; wrapper = function(event) { var element = event.findElement(selector); @@ -90,10 +90,10 @@ var Observable = (function () { } function getHandlers(klass) { - var proto = klass.prototype, - namespace = proto.namespace; - return Object.keys(proto).grep(/^on/).inject(window.$H(), function (handlers, name) { - if (name === 'onDomLoaded') return handlers; + var proto = klass.prototype; + var namespace = proto.namespace; + return Object.keys(proto).grep(/^on/).inject(window.$H(), function(handlers, name) { + if(name === 'onDomLoaded') return handlers; handlers.set(getEventName(name, namespace), getWrapper(proto[name], klass)); return handlers; }); @@ -148,8 +148,8 @@ Object.extend(window.Droppables, { }), show: function(point, element) { if(!this.drops.length) return; - var drop, - affected = []; + var drop; + var affected = []; this.drops.each(function(drop) { if(window.Droppables.isAffected(point, element, drop)) affected.push(drop); }); @@ -325,14 +325,14 @@ var WysijaForm = { }); } }, - save: function () { - var position = 1, - data = { - name: window.$F('mailpoet_form_name'), - settings: window.$('mailpoet_form_settings').serialize(true), - body: [], - styles: (window.MailPoet.CodeEditor !== undefined) ? window.MailPoet.CodeEditor.getValue() : null - }; + save: function() { + var position = 1; + var data = { + name: window.$F('mailpoet_form_name'), + settings: window.$('mailpoet_form_settings').serialize(true), + body: [], + styles: (window.MailPoet.CodeEditor !== undefined) ? window.MailPoet.CodeEditor.getValue() : null + }; // body WysijaForm.getBlocks().each(function (b) { var block_data = (typeof (b.block['save']) === 'function') ? b.block.save() : null; @@ -455,8 +455,8 @@ var WysijaForm = { if (target !== undefined) { // get placeholders (previous placeholder matches the placeholder linked to the next block) - var block_placeholder = window.$(target.element.readAttribute('wysija_placeholder')), - previous_placeholder = target.element.previous('.block_placeholder'); + var block_placeholder = window.$(target.element.readAttribute('wysija_placeholder')); + var previous_placeholder = target.element.previous('.block_placeholder'); if (block_placeholder !== null) { // put block placeholder before the current block @@ -481,22 +481,22 @@ var WysijaForm = { }, setSettingsPosition: function () { // get viewport offsets and dimensions - var viewportHeight = document.viewport.getHeight(), - blockPadding = 5; + var viewportHeight = document.viewport.getHeight(); + var blockPadding = 5; window.$(WysijaForm.options.container).select('.wysija_settings').each(function (element) { // get parent dimensions and position - var parentDim = element.up('.mailpoet_form_block').getDimensions(), - parentPos = element.up('.mailpoet_form_block').cumulativeOffset(), - is_visible = (parentPos.top <= (WysijaForm.scroll.top + viewportHeight)), - buttonMargin = 5, - relativeTop = buttonMargin; + var parentDim = element.up('.mailpoet_form_block').getDimensions(); + var parentPos = element.up('.mailpoet_form_block').cumulativeOffset(); + var is_visible = (parentPos.top <= (WysijaForm.scroll.top + viewportHeight)); + var buttonMargin = 5; + var relativeTop = buttonMargin; if (is_visible) { // desired position is set to center of viewport - var absoluteTop = parseInt(WysijaForm.scroll.top + ((viewportHeight / 2) - (element.getHeight() / 2)), 10), - parentTop = parseInt(parentPos.top - blockPadding, 10), - parentBottom = parseInt(parentPos.top + parentDim.height - blockPadding, 10); + var absoluteTop = parseInt(WysijaForm.scroll.top + ((viewportHeight / 2) - (element.getHeight() / 2)), 10); + var parentTop = parseInt(parentPos.top - blockPadding, 10); + var parentBottom = parseInt(parentPos.top + parentDim.height - blockPadding, 10); // always center relativeTop = parseInt((parentDim.height / 2) - (element.getHeight() / 2), 10); @@ -638,8 +638,8 @@ var WysijaForm = { }, encodeURIComponent: function (str) { // check if it's a url and if so, prevent encoding of protocol - var regexp = new RegExp(/^http[s]?:\/\//), - protocol = regexp.exec(str); + var regexp = new RegExp(/^http[s]?:\/\//); + var protocol = regexp.exec(str); if (protocol === null) { // this is not a url so encode the whole thing @@ -681,14 +681,14 @@ WysijaForm.DraggableItem = window.Class.create({ this.insert(); }, STYLES: new window.Template('position: absolute; top: #{top}px; left: #{left}px;'), - cloneElement: function () { - var clone = this.element.clone(), - offset = this.element.cumulativeOffset(), - list = this.getList(), - styles = this.STYLES.evaluate({ - top: offset.top - list.scrollTop, - left: offset.left - list.scrollLeft - }); + cloneElement: function() { + var clone = this.element.clone(); + var offset = this.element.cumulativeOffset(); + var list = this.getList(); + var styles = this.STYLES.evaluate({ + top: offset.top - list.scrollTop, + left: offset.left - list.scrollLeft + }); clone.setStyle(styles); clone.addClassName('mailpoet_form_widget'); @@ -911,10 +911,10 @@ WysijaForm.Block.create = function (createBlock, target) { return false; } - var body = window.$(WysijaForm.options.body), - block_template = window.Handlebars.compile(window.$('form_template_block').innerHTML), - template = window.Handlebars.compile(window.$('form_template_' + block.type).innerHTML), - output = ''; + var body = window.$(WysijaForm.options.body); + var block_template = window.Handlebars.compile(window.$('form_template_block').innerHTML); + var template = window.Handlebars.compile(window.$('form_template_' + block.type).innerHTML); + var output = ''; if (block.type === 'segment') { if (block.params.values === undefined) { @@ -995,9 +995,9 @@ WysijaForm.Widget = window.Class.create(WysijaForm.Block, { return data; }, - setData: function (data) { - var current_data = this.getData(), - params = window.$H(current_data.params).merge(data.params).toObject(); + setData: function(data) { + var current_data = this.getData(); + var params = window.$H(current_data.params).merge(data.params).toObject(); // update type if it changed if (data.type !== undefined && data.type !== current_data.type) { @@ -1026,11 +1026,11 @@ WysijaForm.Widget = window.Class.create(WysijaForm.Block, { this.setData(data); var options = this.getData(); // redraw block - var block_template = window.Handlebars.compile(window.$('form_template_block').innerHTML), - template = window.Handlebars.compile(window.$('form_template_' + options.type).innerHTML), - data = window.$H(options).merge({ - template: template(options) - }).toObject(); + var block_template = window.Handlebars.compile(window.$('form_template_block').innerHTML); + var template = window.Handlebars.compile(window.$('form_template_' + options.type).innerHTML); + var data = window.$H(options).merge({ + template: template(options) + }).toObject(); this.element.replace(block_template(data)); WysijaForm.init(); diff --git a/assets/js/src/handlebars_helpers.js b/assets/js/src/handlebars_helpers.js index 4fe8de2401..aa61f9e1b3 100644 --- a/assets/js/src/handlebars_helpers.js +++ b/assets/js/src/handlebars_helpers.js @@ -1,9 +1,9 @@ define('handlebars_helpers', ['handlebars'], function (Handlebars) { // Handlebars helpers - Handlebars.registerHelper('concat', function () { - var size = (arguments.length - 1), - output = ''; - for (var i = 0; i < size; i++) { + Handlebars.registerHelper('concat', function() { + var size = (arguments.length - 1); + var output = ''; + for(var i = 0; i < size; i++) { output += arguments[i]; } return output; diff --git a/assets/js/src/jquery.serialize_object.js b/assets/js/src/jquery.serialize_object.js index 552632a577..e16cf1e9d5 100644 --- a/assets/js/src/jquery.serialize_object.js +++ b/assets/js/src/jquery.serialize_object.js @@ -23,21 +23,21 @@ define( * Dual licensed under the MIT and GPL licenses. * http://benalman.com/about/license/ */ - $.fn.serializeObject = function (coerce) { - var obj = {}, - coerce_types = { true: !0, false: !1, null: null }; + $.fn.serializeObject = function(coerce) { + var obj = {}; + var coerce_types = { true: !0, false: !1, null: null }; // Iterate over all name=value pairs. - $.each(this.serializeArray(), function (j, v) { - var key = v.name, - val = v.value, - cur = obj, - i = 0, + $.each( this.serializeArray(), function(j, v){ + var key = v.name; + var val = v.value; + var cur = obj; + var i = 0; - // If key is more complex than 'foo', like 'a[]' or 'a[b][c]', split it - // into its component parts. - keys = key.split(']['), - keys_last = keys.length - 1; + // If key is more complex than 'foo', like 'a[]' or 'a[b][c]', split it + // into its component parts. + var keys = key.split( '][' ); + var keys_last = keys.length - 1; // If the first keys part contains [ and the last ends with ], then [] // are correctly balanced. @@ -106,4 +106,4 @@ define( return $; } -); \ No newline at end of file +); diff --git a/assets/js/src/modal.js b/assets/js/src/modal.js index 081652c4e2..c197c180b4 100644 --- a/assets/js/src/modal.js +++ b/assets/js/src/modal.js @@ -345,13 +345,13 @@ define('modal', ['mailpoet', 'jquery'], setPosition: function () { switch (this.options.type) { case 'popup': - var screenWidth = jQuery(window).width(), - screenHeight = jQuery(window).height(), - modalWidth = jQuery('.mailpoet_' + this.options.type + '_wrapper').width(), - modalHeight = jQuery('.mailpoet_' + this.options.type + '_wrapper').height(); + var screenWidth = jQuery(window).width(); + var screenHeight = jQuery(window).height(); + var modalWidth = jQuery('.mailpoet_'+ this.options.type +'_wrapper').width(); + var modalHeight = jQuery('.mailpoet_'+ this.options.type +'_wrapper').height(); - var top = Math.max(48, parseInt((screenHeight / 2) - (modalHeight / 2))), - left = Math.max(0, parseInt((screenWidth / 2) - (modalWidth / 2))); + var top = Math.max(48, parseInt((screenHeight / 2) - (modalHeight / 2))); + var left = Math.max(0, parseInt((screenWidth / 2) - (modalWidth / 2))); // set position of popup depending on screen dimensions. jQuery('#mailpoet_popup').css({ diff --git a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js index a1408a213b..a14c6fefb5 100644 --- a/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ColorPickerBehavior.js @@ -12,9 +12,9 @@ define([ var BL = BehaviorsLookup; BL.ColorPickerBehavior = Marionette.Behavior.extend({ - onRender: function () { - var that = this, - preferredFormat = 'hex6'; + onRender: function() { + var that = this; + var preferredFormat = 'hex6'; this.view.$('.mailpoet_color').each(function () { var $input = that.view.$(this); var updateColorInput = function (color) { diff --git a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js index 6661fb2870..d71f8d0f4e 100644 --- a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js @@ -25,11 +25,11 @@ define([ this.addDropZone(); } }, - addDropZone: function (_event) { - var that = this, - view = this.view, - domElement = that.$el.get(0), - acceptableElementSelector; + addDropZone: function(_event) { + var that = this; + var view = this.view; + var domElement = that.$el.get(0); + var acceptableElementSelector; // TODO: Extract this limitation code to be controlled from containers if (this.view.renderOptions.depth === 0) { @@ -63,26 +63,26 @@ define([ // 3b. If insertion is special, compute position (which side) and which cell the insertion belongs to // 4. If insertion at that position is not visualized, display position visualization there, remove other visualizations from this container var dropPosition = that.getDropPosition( - event.dragmove.pageX, - event.dragmove.pageY, - view.$el, - view.model.get('orientation'), - view.model.get('blocks').length - ), - element = view.$el, - markerWidth = '', - markerHeight = '', - containerOffset = element.offset(), - viewCollection = that.getCollection(), - marker, - targetModel, - targetView, - targetElement, - topOffset, - leftOffset, - isLastBlockInsertion, - $targetBlock, - margin; + event.dragmove.pageX, + event.dragmove.pageY, + view.$el, + view.model.get('orientation'), + view.model.get('blocks').length + ); + var element = view.$el; + var markerWidth = ''; + var markerHeight = ''; + var containerOffset = element.offset(); + var viewCollection = that.getCollection(); + var marker; + var targetModel; + var targetView; + var targetElement; + var topOffset; + var leftOffset; + var isLastBlockInsertion; + var $targetBlock; + var margin; if (dropPosition === undefined) return; @@ -184,19 +184,19 @@ define([ // 4. Perform cleanup actions var dropPosition = that.getDropPosition( - event.dragEvent.pageX, - event.dragEvent.pageY, - view.$el, - view.model.get('orientation'), - view.model.get('blocks').length - ), - droppableModel = event.draggable.getDropModel(), - viewCollection = that.getCollection(), - droppedView, - droppedModel, - index, - tempCollection, - tempCollection2; + event.dragEvent.pageX, + event.dragEvent.pageY, + view.$el, + view.model.get('orientation'), + view.model.get('blocks').length + ); + var droppableModel = event.draggable.getDropModel(); + var viewCollection = that.getCollection(); + var droppedView; + var droppedModel; + var index; + var tempCollection; + var tempCollection2; if (dropPosition === undefined) return; @@ -281,31 +281,31 @@ define([ // 2. Remove visual markings of drop position visualization this.view.$('.mailpoet_drop_marker').remove(); }, - getDropPosition: function (eventX, eventY, is_unsafe) { - var SPECIAL_AREA_INSERTION_WIDTH = 0.00, // Disable special insertion. Default: 0.3 + getDropPosition: function(eventX, eventY, is_unsafe) { + var SPECIAL_AREA_INSERTION_WIDTH = 0.00; // Disable special insertion. Default: 0.3 - element = this.view.$el, - orientation = this.view.model.get('orientation'), + var element = this.view.$el; + var orientation = this.view.model.get('orientation'); - elementOffset = element.offset(), - elementPageX = elementOffset.left, - elementPageY = elementOffset.top, - elementWidth = element.outerWidth(true), - elementHeight = element.outerHeight(true), + var elementOffset = element.offset(); + var elementPageX = elementOffset.left; + var elementPageY = elementOffset.top; + var elementWidth = element.outerWidth(true); + var elementHeight = element.outerHeight(true); - relativeX = eventX - elementPageX, - relativeY = eventY - elementPageY, + var relativeX = eventX - elementPageX; + var relativeY = eventY - elementPageY; - relativeOffset, - elementLength, + var relativeOffset; + var elementLength; - canAcceptNormalInsertion = this._canAcceptNormalInsertion(), - canAcceptSpecialInsertion = this._canAcceptSpecialInsertion(), + var canAcceptNormalInsertion = this._canAcceptNormalInsertion(); + var canAcceptSpecialInsertion = this._canAcceptSpecialInsertion(); - insertionType, - index, - position, - indexAndPosition; + var insertionType; + var index; + var position; + var indexAndPosition; var unsafe = !!is_unsafe; @@ -373,14 +373,14 @@ define([ // target element if event happens on the second half of the element. // Halves depend on orientation. - var index = this._computeCellIndex(eventX, eventY), - // TODO: Handle case when there are no children, container is empty - targetView = this.getChildren().findByModel(this.getCollection().at(index)), - orientation = this.view.model.get('orientation'), - element = targetView.$el, - eventOffset, - closeOffset, - elementDimension; + var index = this._computeCellIndex(eventX, eventY); + // TODO: Handle case when there are no children, container is empty + var targetView = this.getChildren().findByModel(this.getCollection().at(index)); + var orientation = this.view.model.get('orientation'); + var element = targetView.$el; + var eventOffset; + var closeOffset; + var elementDimension; if (orientation === 'vertical') { eventOffset = eventY; @@ -409,41 +409,41 @@ define([ _computeSpecialIndex: function (eventX, eventY) { return this._computeCellIndex(eventX, eventY); }, - _computeCellIndex: function (eventX, eventY) { - var orientation = this.view.model.get('orientation'), - eventOffset = (orientation === 'vertical') ? eventY : eventX, - resultView = this.getChildren().find(function (view) { - var element = view.$el, - closeOffset, - farOffset; + _computeCellIndex: function(eventX, eventY) { + var orientation = this.view.model.get('orientation'); + var eventOffset = (orientation === 'vertical') ? eventY : eventX; + var resultView = this.getChildren().find(function(view) { + var element = view.$el; + var closeOffset; + var farOffset; - if (orientation === 'vertical') { - closeOffset = element.offset().top; - farOffset = element.outerHeight(true); - } else { - closeOffset = element.offset().left; - farOffset = element.outerWidth(true); - } - farOffset += closeOffset; + if (orientation === 'vertical') { + closeOffset = element.offset().top; + farOffset = element.outerHeight(true); + } else { + closeOffset = element.offset().left; + farOffset = element.outerWidth(true); + } + farOffset += closeOffset; - return closeOffset <= eventOffset && eventOffset <= farOffset; - }); + return closeOffset <= eventOffset && eventOffset <= farOffset; + }); var index = (typeof resultView === 'object') ? resultView._index : 0; return index; }, - _canAcceptNormalInsertion: function () { - var orientation = this.view.model.get('orientation'), - depth = this.view.renderOptions.depth, - childCount = this.getChildren().length; + _canAcceptNormalInsertion: function() { + var orientation = this.view.model.get('orientation'); + var depth = this.view.renderOptions.depth; + var childCount = this.getChildren().length; // Note that depth is zero indexed. Root container has depth=0 return orientation === 'vertical' || (orientation === 'horizontal' && depth === 1 && childCount < this.options.columnLimit); }, - _canAcceptSpecialInsertion: function () { - var orientation = this.view.model.get('orientation'), - depth = this.view.renderOptions.depth, - childCount = this.getChildren().length; + _canAcceptSpecialInsertion: function() { + var orientation = this.view.model.get('orientation'); + var depth = this.view.renderOptions.depth; + var childCount = this.getChildren().length; return depth === 0 || (depth === 1 && orientation === 'horizontal' && childCount <= this.options.columnLimit); }, getCollectionView: function () { diff --git a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js index c13f31cdc2..8ef4679fb1 100644 --- a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js @@ -31,9 +31,9 @@ define([ onDrop: function (model, view) {}, testAttachToInstance: function (model, view) { return true; } }, - onRender: function () { - var that = this, - interactable; + onRender: function() { + var that = this; + var interactable; // Give instances more control over whether Draggable should be applied if (!this.options.testAttachToInstance(this.view.model, this.view)) return; @@ -52,15 +52,15 @@ define([ if (that.options.cloneOriginal === true) { // Use substitution instead of a clone - var tempClone = (_.isFunction(that.options.onDragSubstituteBy)) ? that.options.onDragSubstituteBy(that) : undefined, - // Or use a clone - clone = tempClone || event.target.cloneNode(true), + var tempClone = (_.isFunction(that.options.onDragSubstituteBy)) ? that.options.onDragSubstituteBy(that) : undefined; + // Or use a clone + var clone = tempClone || event.target.cloneNode(true); - $original = jQuery(event.target), - $clone = jQuery(clone), - centerXOffset, - centerYOffset, - parentOffset; + var $original = jQuery(event.target); + var $clone = jQuery(clone); + var centerXOffset; + var centerYOffset; + var parentOffset; $clone.addClass('mailpoet_droppable_active'); $clone.css('position', 'absolute'); @@ -87,10 +87,10 @@ define([ }, // call this function on every dragmove event onmove: function (event) { - var target = event.target, - // keep the dragged position in the data-x/data-y attributes - x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx, - y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; + var target = event.target; + // keep the dragged position in the data-x/data-y attributes + var x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx; + var y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; // translate the element target.style.transform = 'translate(' + x + 'px, ' + y + 'px)'; diff --git a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js index 2c2f0a2c27..7b8a846f0e 100644 --- a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js @@ -36,9 +36,9 @@ define([ this.hideResizeHandle(); } }, - attachResize: function () { - var domElement = (this.options.elementSelector === null) ? this.view.$el.get(0) : this.view.$(this.options.elementSelector).get(0), - that = this; + attachResize: function() { + var domElement = (this.options.elementSelector === null) ? this.view.$el.get(0) : this.view.$(this.options.elementSelector).get(0); + var that = this; interact(domElement).resizable({ // axis: 'y', edges: { @@ -51,6 +51,13 @@ define([ .on('resizestart', function (event) { that.isBeingResized = true; that.$el.addClass('mailpoet_resize_active'); + }).on('resizemove', function(event) { + var currentLength = parseFloat(that.view.model.get(that.options.modelField)); + var newLength = currentLength + that.options.transformationFunction(event.dy); + + if (newLength < that.options.minLength) newLength = that.options.minLength; + + that.view.model.set(that.options.modelField, newLength + 'px'); }) .on('resizemove', function (event) { var onResize = that.options.onResize.bind(that); diff --git a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js index 593e12b38f..c746a67eaf 100644 --- a/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/SortableBehavior.js @@ -23,10 +23,10 @@ define([ end: function (event, ui) { ui.item.removeData('previousIndex'); }, - update: function (event, ui) { - var previousIndex = ui.item.data('previousIndex'), - newIndex = ui.item.index(), - model = collection.at(previousIndex); + update: function(event, ui) { + var previousIndex = ui.item.data('previousIndex'); + var newIndex = ui.item.index(); + var model = collection.at(previousIndex); // Replicate DOM changes. Move target model to a new position // within the collection diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js index 96a5b15960..69683ed11f 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js @@ -30,8 +30,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.ALCSupervisor = SuperModel.extend({ initialize: function () { @@ -59,9 +59,9 @@ define([ refreshBlocks: function (models, renderedBlocks) { _.each( _.zip(models, renderedBlocks), - function (args) { - var model = args[0], - contents = args[1]; + function(args) { + var model = args[0]; + var contents = args[1]; model.trigger('refreshPosts', contents); } ); @@ -148,14 +148,14 @@ define([ events: _.extend(base.BlockView.prototype.events, { 'click .mailpoet_automated_latest_content_block_overlay': 'showSettings' }), - onDragSubstituteBy: function () { return Module.AutomatedLatestContentWidgetView; }, - onRender: function () { - var ContainerView = App.getBlockTypeView('container'), - renderOptions = { - disableTextEditor: true, - disableDragAndDrop: true, - emptyContainerMessage: MailPoet.I18n.t('noPostsToDisplay') - }; + onDragSubstituteBy: function() { return Module.AutomatedLatestContentWidgetView; }, + onRender: function() { + var ContainerView = App.getBlockTypeView('container'); + var renderOptions = { + disableTextEditor: true, + disableDragAndDrop: true, + emptyContainerMessage: MailPoet.I18n.t('noPostsToDisplay') + }; this.toolsView = new Module.AutomatedLatestContentBlockToolsView({ model: this.model }); this.showChildView('toolsRegion', this.toolsView); this.showChildView('postsRegion', new ContainerView({ model: this.model.get('_container'), renderOptions: renderOptions })); @@ -264,9 +264,9 @@ define([ } }).trigger('change'); }, - toggleDisplayOptions: function (event) { - var el = this.$('.mailpoet_automated_latest_content_display_options'), - showControl = this.$('.mailpoet_automated_latest_content_show_display_options'); + toggleDisplayOptions: function(event) { + var el = this.$('.mailpoet_automated_latest_content_display_options'); + var showControl = this.$('.mailpoet_automated_latest_content_show_display_options'); if (el.hasClass('mailpoet_closed')) { el.removeClass('mailpoet_closed'); showControl.addClass('mailpoet_hidden'); @@ -348,9 +348,9 @@ define([ } this.changeField('titleFormat', event); }, - _updateContentTypes: function (postTypes) { - var select = this.$('.mailpoet_automated_latest_content_content_type'), - selectedValue = this.model.get('contentType'); + _updateContentTypes: function(postTypes) { + var select = this.$('.mailpoet_automated_latest_content_content_type'); + var selectedValue = this.model.get('contentType'); select.find('option').remove(); _.each(postTypes, function (type) { diff --git a/assets/js/src/newsletter_editor/blocks/base.js b/assets/js/src/newsletter_editor/blocks/base.js index aed1bdee09..c01fb4c9c1 100644 --- a/assets/js/src/newsletter_editor/blocks/base.js +++ b/assets/js/src/newsletter_editor/blocks/base.js @@ -16,8 +16,8 @@ define([ 'use strict'; - var Module = {}, - AugmentedView = Marionette.View.extend({}); + var Module = {}; + var AugmentedView = Marionette.View.extend({}); Module.BlockModel = SuperModel.extend({ stale: [], // Attributes to be removed upon saving @@ -68,8 +68,8 @@ define([ options.dragBehavior.view.model.destroy(); }, onDragSubstituteBy: function(behavior) { - var WidgetView, - node; + var WidgetView; + var node; // When block is being dragged, display the widget icon instead. // This will create an instance of block's widget view and // use it's rendered DOM element instead of the content block diff --git a/assets/js/src/newsletter_editor/blocks/button.js b/assets/js/src/newsletter_editor/blocks/button.js index 3c4c8c7962..12f9f46ca2 100644 --- a/assets/js/src/newsletter_editor/blocks/button.js +++ b/assets/js/src/newsletter_editor/blocks/button.js @@ -11,8 +11,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.ButtonBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/blocks/container.js b/assets/js/src/newsletter_editor/blocks/container.js index 3c41564912..a2a94f00f5 100644 --- a/assets/js/src/newsletter_editor/blocks/container.js +++ b/assets/js/src/newsletter_editor/blocks/container.js @@ -14,9 +14,9 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock, - BlockCollection; + var Module = {}; + var base = BaseBlock; + var BlockCollection; BlockCollection = Backbone.Collection.extend({ model: base.BlockModel, @@ -121,8 +121,8 @@ define([ options.dragBehavior.view.model.destroy(); }, onDragSubstituteBy: function(behavior) { - var WidgetView, - node; + var WidgetView; + var node; // When block is being dragged, display the widget icon instead. // This will create an instance of block's widget view and // use it's rendered DOM element instead of the content block @@ -190,25 +190,25 @@ define([ this.toolsView.triggerMethod('hideTools'); } }, - toggleEditingLayer: function (event) { - var that = this, - $toggleButton = this.$('> .mailpoet_tools .mailpoet_newsletter_layer_selector'), - $overlay = jQuery('.mailpoet_layer_overlay'), - $container = this.$('> .mailpoet_container'), - enableContainerLayer = function () { - that.$el.addClass('mailpoet_container_layer_active'); - $toggleButton.addClass('mailpoet_container_layer_active'); - $container.addClass('mailpoet_layer_highlight'); - $overlay.click(disableContainerLayer); - $overlay.show(); - }, - disableContainerLayer = function () { - that.$el.removeClass('mailpoet_container_layer_active'); - $toggleButton.removeClass('mailpoet_container_layer_active'); - $container.removeClass('mailpoet_layer_highlight'); - $overlay.hide(); - $overlay.off('click'); - }; + toggleEditingLayer: function(event) { + var that = this; + var $toggleButton = this.$('> .mailpoet_tools .mailpoet_newsletter_layer_selector'); + var $overlay = jQuery('.mailpoet_layer_overlay'); + var $container = this.$('> .mailpoet_container'); + var enableContainerLayer = function() { + that.$el.addClass('mailpoet_container_layer_active'); + $toggleButton.addClass('mailpoet_container_layer_active'); + $container.addClass('mailpoet_layer_highlight'); + $overlay.click(disableContainerLayer); + $overlay.show(); + }; + var disableContainerLayer = function() { + that.$el.removeClass('mailpoet_container_layer_active'); + $toggleButton.removeClass('mailpoet_container_layer_active'); + $container.removeClass('mailpoet_layer_highlight'); + $overlay.hide(); + $overlay.off('click'); + }; if ($toggleButton.hasClass('mailpoet_container_layer_active')) { disableContainerLayer(); } else { diff --git a/assets/js/src/newsletter_editor/blocks/divider.js b/assets/js/src/newsletter_editor/blocks/divider.js index 9c04d1a7bd..df9bae50f0 100644 --- a/assets/js/src/newsletter_editor/blocks/divider.js +++ b/assets/js/src/newsletter_editor/blocks/divider.js @@ -11,8 +11,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.DividerBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/blocks/footer.js b/assets/js/src/newsletter_editor/blocks/footer.js index 096075b4f2..ee4bc0b343 100644 --- a/assets/js/src/newsletter_editor/blocks/footer.js +++ b/assets/js/src/newsletter_editor/blocks/footer.js @@ -10,8 +10,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.FooterBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/blocks/header.js b/assets/js/src/newsletter_editor/blocks/header.js index b5240fec99..12af06647f 100644 --- a/assets/js/src/newsletter_editor/blocks/header.js +++ b/assets/js/src/newsletter_editor/blocks/header.js @@ -10,8 +10,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.HeaderBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/blocks/image.js b/assets/js/src/newsletter_editor/blocks/image.js index 118b6c34a4..2597ab4c40 100644 --- a/assets/js/src/newsletter_editor/blocks/image.js +++ b/assets/js/src/newsletter_editor/blocks/image.js @@ -11,9 +11,9 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock, - ImageWidgetView; + var Module = {}; + var base = BaseBlock; + var ImageWidgetView; Module.ImageBlockModel = base.BlockModel.extend({ defaults: function () { @@ -243,10 +243,10 @@ define([ view.url.focus(); }, - editSelectionContent: function () { - var state = this.state(), - selection = state.get('selection'), - view; + editSelectionContent: function() { + var state = this.state(); + var selection = state.get('selection'); + var view; view = new window.wp.media.view.AttachmentsBrowser({ controller: this, @@ -301,9 +301,9 @@ define([ text: 'Select Image', requires: { selection: true }, - click: function () { - var state = controller.state(), - selection = state.get('selection'); + click: function() { + var state = controller.state(); + var selection = state.get('selection'); controller.close(); state.trigger('insert', selection).reset(); @@ -322,45 +322,45 @@ define([ }); var theFrame = new MediaManager({ - id: 'mailpoet-media-manager', - frame: 'select', - title: 'Select image', - editing: false, - multiple: false, - library: { - type: 'image' - }, - displaySettings: false, - button: { - text: 'Select' - } - }), - that = this; + id: 'mailpoet-media-manager', + frame: 'select', + title: 'Select image', + editing: false, + multiple: false, + library: { + type: 'image' + }, + displaySettings: false, + button: { + text: 'Select' + } + }); + var that = this; this._mediaManager = theFrame; this._mediaManager.on('insert', function () { // Append media manager image selections to Images tab var selection = theFrame.state().get('selection'); - selection.each(function (attachment) { - var sizes = attachment.get('sizes'), - // Following advice from Becs, the target width should - // be a double of one column width to render well on - // retina screen devices - targetImageWidth = 1320, + selection.each(function(attachment) { + var sizes = attachment.get('sizes'); + // Following advice from Becs, the target width should + // be a double of one column width to render well on + // retina screen devices + var targetImageWidth = 1320; - // For main image use the size, that's closest to being 660px in width - sizeKeys = _.keys(sizes), + // For main image use the size, that's closest to being 660px in width + var sizeKeys = _.keys(sizes); - // Pick the width that is closest to target width - increasingByWidthDifference = _.sortBy( - _.keys(sizes), - function (size) { return Math.abs(targetImageWidth - sizes[size].width); } - ), - bestWidth = sizes[_.first(increasingByWidthDifference)].width, - imagesOfBestWidth = _.filter(_.values(sizes), function (size) { return size.width === bestWidth; }), + // Pick the width that is closest to target width + var increasingByWidthDifference = _.sortBy( + _.keys(sizes), + function(size) { return Math.abs(targetImageWidth - sizes[size].width); } + ); + var bestWidth = sizes[_.first(increasingByWidthDifference)].width; + var imagesOfBestWidth = _.filter(_.values(sizes), function(size) { return size.width === bestWidth; }); - // Maximize the height if there are multiple images with same width - mainSize = _.max(imagesOfBestWidth, function (size) { return size.height; }); + // Maximize the height if there are multiple images with same width + var mainSize = _.max(imagesOfBestWidth, function(size) { return size.height; }); that.model.set({ height: mainSize.height + 'px', diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js index bbb4707c88..d96786d7d1 100644 --- a/assets/js/src/newsletter_editor/blocks/posts.js +++ b/assets/js/src/newsletter_editor/blocks/posts.js @@ -39,8 +39,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.PostsBlockModel = base.BlockModel.extend({ stale: ['_selectedPosts', '_availablePosts', '_transformedPosts'], @@ -88,11 +88,11 @@ define([ _transformedPosts: App.getBlockTypeModel('container') }; }, - initialize: function () { - var that = this, - POST_REFRESH_DELAY_MS = 500, - refreshAvailablePosts = _.debounce(this.fetchAvailablePosts.bind(this), POST_REFRESH_DELAY_MS), - refreshTransformedPosts = _.debounce(this._refreshTransformedPosts.bind(this), POST_REFRESH_DELAY_MS); + initialize: function() { + var that = this; + var POST_REFRESH_DELAY_MS = 500; + var refreshAvailablePosts = _.debounce(this.fetchAvailablePosts.bind(this), POST_REFRESH_DELAY_MS); + var refreshTransformedPosts = _.debounce(this._refreshTransformedPosts.bind(this), POST_REFRESH_DELAY_MS); // Attach Radio.Requests API primarily for highlighting _.extend(this, Radio.Requests); @@ -119,10 +119,10 @@ define([ MailPoet.Notice.error(MailPoet.I18n.t('failedToFetchAvailablePosts')); }); }, - _loadMorePosts: function () { - var that = this, - postCount = this.get('_availablePosts').length, - nextOffset = this.get('offset') + Number(this.get('amount')); + _loadMorePosts: function() { + var that = this; + var postCount = this.get('_availablePosts').length; + var nextOffset = this.get('offset') + Number(this.get('amount')); if (postCount === 0 || postCount < nextOffset) { // No more posts to load @@ -140,9 +140,9 @@ define([ that.trigger('morePostsLoaded'); }); }, - _refreshTransformedPosts: function () { - var that = this, - data = this.toJSON(); + _refreshTransformedPosts: function() { + var that = this; + var data = this.toJSON(); data.posts = this.get('_selectedPosts').pluck('ID'); @@ -157,11 +157,11 @@ define([ MailPoet.Notice.error(MailPoet.I18n.t('failedToFetchRenderedPosts')); }); }, - _insertSelectedPosts: function () { - var that = this, - data = this.toJSON(), - index = this.collection.indexOf(this), - collection = this.collection; + _insertSelectedPosts: function() { + var that = this; + var data = this.toJSON(); + var index = this.collection.indexOf(this); + var collection = this.collection; data.posts = this.get('_selectedPosts').pluck('ID'); @@ -195,12 +195,12 @@ define([ } this.trigger('showSettings'); - var ContainerView = App.getBlockTypeView('container'), - renderOptions = { - disableTextEditor: true, - disableDragAndDrop: true, - emptyContainerMessage: MailPoet.I18n.t('noPostsToDisplay') - }; + var ContainerView = App.getBlockTypeView('container'); + var renderOptions = { + disableTextEditor: true, + disableDragAndDrop: true, + emptyContainerMessage: MailPoet.I18n.t('noPostsToDisplay') + }; this.showChildView('postsRegion', new ContainerView({ model: this.model.get('_transformedPosts'), renderOptions: renderOptions })); }, notifyAboutSelf: function () { @@ -236,9 +236,9 @@ define([ this.selectionView = new PostSelectionSettingsView({ model: this.model }); this.displayOptionsView = new PostsDisplayOptionsSettingsView({ model: this.model }); }, - onRender: function () { - var that = this, - blockView = this.model.request('blockView'); + onRender: function() { + var that = this; + var blockView = this.model.request('blockView'); this.showChildView('selectionRegion', this.selectionView); this.showChildView('displayOptionsRegion', this.displayOptionsView); @@ -412,9 +412,9 @@ define([ changeField: function (field, event) { this.model.set(field, jQuery(event.target).val()); }, - _updateContentTypes: function (postTypes) { - var select = this.$('.mailpoet_settings_posts_content_type'), - selectedValue = this.model.get('contentType'); + _updateContentTypes: function(postTypes) { + var select = this.$('.mailpoet_settings_posts_content_type'); + var selectedValue = this.model.get('contentType'); select.find('option').remove(); _.each(postTypes, function (type) { @@ -447,9 +447,9 @@ define([ initialize: function (options) { this.blockModel = options.blockModel; }, - postSelectionChange: function (event) { - var checkBox = jQuery(event.target), - selectedPostsCollection = this.blockModel.get('_selectedPosts'); + postSelectionChange: function(event) { + var checkBox = jQuery(event.target); + var selectedPostsCollection = this.blockModel.get('_selectedPosts'); if (checkBox.prop('checked')) { selectedPostsCollection.add(this.model); } else { diff --git a/assets/js/src/newsletter_editor/blocks/social.js b/assets/js/src/newsletter_editor/blocks/social.js index a1a042e1ea..f0d3e50215 100644 --- a/assets/js/src/newsletter_editor/blocks/social.js +++ b/assets/js/src/newsletter_editor/blocks/social.js @@ -13,12 +13,12 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock, - SocialBlockSettingsIconSelectorView, - SocialBlockSettingsIconView, - SocialBlockSettingsIconCollectionView, - SocialBlockSettingsStylesView; + var Module = {}; + var base = BaseBlock; + var SocialBlockSettingsIconSelectorView; + var SocialBlockSettingsIconView; + var SocialBlockSettingsIconCollectionView; + var SocialBlockSettingsStylesView; Module.SocialIconModel = SuperModel.extend({ defaults: function () { @@ -36,9 +36,9 @@ define([ initialize: function (options) { var that = this; // Make model swap to default values for that type when iconType changes - this.on('change:iconType', function () { - var defaultValues = App.getConfig().get('socialIcons').get(that.get('iconType')), - iconSet = that.collection.iconBlockModel.getIconSet(); + this.on('change:iconType', function() { + var defaultValues = App.getConfig().get('socialIcons').get(that.get('iconType')); + var iconSet = that.collection.iconBlockModel.getIconSet(); this.set({ link: defaultValues.get('defaultLink'), image: iconSet.get(that.get('iconType')), @@ -174,11 +174,11 @@ define([ this.$('.mailpoet_social_icon_image').attr('alt', this.model.get('text')); } }, - templateContext: function () { - var icons = App.getConfig().get('socialIcons'), - // Construct icon type list of format [{iconType: 'type', title: 'Title'}, ...] - availableIconTypes = _.map(_.keys(icons.attributes), function (key) { return { iconType: key, title: icons.get(key).get('title') }; }), - allIconSets = App.getAvailableStyles().get('socialIconSets'); + templateContext: function() { + var icons = App.getConfig().get('socialIcons'); + // Construct icon type list of format [{iconType: 'type', title: 'Title'}, ...] + var availableIconTypes = _.map(_.keys(icons.attributes), function(key) { return { iconType: key, title: icons.get(key).get('title') }; }); + var allIconSets = App.getAvailableStyles().get('socialIconSets'); return _.extend({}, base.BlockView.prototype.templateContext.apply(this, arguments), { iconTypes: availableIconTypes, currentType: icons.get(this.model.get('iconType')).toJSON(), diff --git a/assets/js/src/newsletter_editor/blocks/spacer.js b/assets/js/src/newsletter_editor/blocks/spacer.js index 153b4e69d7..43fe067e22 100644 --- a/assets/js/src/newsletter_editor/blocks/spacer.js +++ b/assets/js/src/newsletter_editor/blocks/spacer.js @@ -9,8 +9,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.SpacerBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/blocks/text.js b/assets/js/src/newsletter_editor/blocks/text.js index 4c0f76fa72..dfb92bd962 100644 --- a/assets/js/src/newsletter_editor/blocks/text.js +++ b/assets/js/src/newsletter_editor/blocks/text.js @@ -10,8 +10,8 @@ define([ 'use strict'; - var Module = {}, - base = BaseBlock; + var Module = {}; + var base = BaseBlock; Module.TextBlockModel = base.BlockModel.extend({ defaults: function () { diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js index 815d6280f4..985aee4bf1 100644 --- a/assets/js/src/newsletter_editor/components/save.js +++ b/assets/js/src/newsletter_editor/components/save.js @@ -28,8 +28,8 @@ define([ 'use strict'; - var Module = {}, - saveTimeout; + var Module = {}; + var saveTimeout; // Save editor contents to server Module.save = function () { @@ -76,10 +76,10 @@ define([ // Temporary workaround for html2canvas-alpha2. // Removes 1px left transparent border from resulting canvas. - var oldContext = oldCanvas.getContext('2d'), - newCanvas = document.createElement('canvas'), - newContext = newCanvas.getContext('2d'), - leftBorderWidth = 1; + var oldContext = oldCanvas.getContext('2d'); + var newCanvas = document.createElement('canvas'); + var newContext = newCanvas.getContext('2d'); + var leftBorderWidth = 1; newCanvas.width = oldCanvas.width; newCanvas.height = oldCanvas.height; @@ -94,9 +94,9 @@ define([ }); }; - Module.saveTemplate = function (options) { - var that = this, - promise = jQuery.Deferred(); + Module.saveTemplate = function(options) { + var that = this; + var promise = jQuery.Deferred(); promise.then(function (thumbnail) { var data = _.extend(options || {}, { @@ -191,10 +191,10 @@ define([ hideSaveAsTemplate: function () { this.$('.mailpoet_save_as_template_container').addClass('mailpoet_hidden'); }, - saveAsTemplate: function () { - var templateName = this.$('.mailpoet_save_as_template_name').val(), - templateDescription = this.$('.mailpoet_save_as_template_description').val(), - that = this; + saveAsTemplate: function() { + var templateName = this.$('.mailpoet_save_as_template_name').val(); + var templateDescription = this.$('.mailpoet_save_as_template_description').val(); + var that = this; if (templateName === '') { MailPoet.Notice.error( @@ -247,10 +247,10 @@ define([ hideExportTemplate: function () { this.$('.mailpoet_export_template_container').addClass('mailpoet_hidden'); }, - exportTemplate: function () { - var templateName = this.$('.mailpoet_export_template_name').val(), - templateDescription = this.$('.mailpoet_export_template_description').val(), - that = this; + exportTemplate: function() { + var templateName = this.$('.mailpoet_export_template_name').val(); + var templateDescription = this.$('.mailpoet_export_template_description').val(); + var that = this; if (templateName === '') { MailPoet.Notice.error( diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js index 5bd7d5c2ec..f509264e73 100644 --- a/assets/js/src/newsletter_editor/components/sidebar.js +++ b/assets/js/src/newsletter_editor/components/sidebar.js @@ -61,9 +61,9 @@ define([ previewRegion: '.mailpoet_preview_region' }, events: { - 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function (event) { - var $openRegion = this.$el.find('.mailpoet_sidebar_region:not(.closed)'), - $targetRegion = this.$el.find(event.target).closest('.mailpoet_sidebar_region'); + 'click .mailpoet_sidebar_region h3, .mailpoet_sidebar_region .handlediv': function(event) { + var $openRegion = this.$el.find('.mailpoet_sidebar_region:not(.closed)'); + var $targetRegion = this.$el.find(event.target).closest('.mailpoet_sidebar_region'); $openRegion.find('.mailpoet_region_content').velocity( 'slideUp', @@ -113,10 +113,8 @@ define([ // position of the sidebar would be scrollable and not fixed // partially out of visible screen this.$el.parent().each(function () { - var calculated_left, - self; - - self = jQuery(this); + var calculated_left; + var self = jQuery(this); if (self.css('position') === 'fixed') { calculated_left = self.parent().offset().left - jQuery(window).scrollLeft(); @@ -372,9 +370,9 @@ define([ Application.getLayoutWidgets = Module.getLayoutWidgets; }); - App.on('start', function (App, options) { - var stylesModel = App.getGlobalStyles(), - sidebarView = new SidebarView(); + App.on('start', function(App, options) { + var stylesModel = App.getGlobalStyles(); + var sidebarView = new SidebarView(); App._appView.showChildView('sidebarRegion', sidebarView); diff --git a/assets/js/src/newsletter_editor/tinymce/mailpoet_shortcodes/plugin.js b/assets/js/src/newsletter_editor/tinymce/mailpoet_shortcodes/plugin.js index feb2ab56de..f6493d40c6 100644 --- a/assets/js/src/newsletter_editor/tinymce/mailpoet_shortcodes/plugin.js +++ b/assets/js/src/newsletter_editor/tinymce/mailpoet_shortcodes/plugin.js @@ -8,24 +8,24 @@ * its placeholder into editor text. */ -/* jshint unused:false */ -/* global tinymce:true */ -tinymce.PluginManager.add('mailpoet_shortcodes', function (editor, url) { - var appendLabelAndClose = function (shortcode) { - editor.insertContent(shortcode); - editor.windowManager.close(); - }, - generateOnClickFunc = function (shortcode) { - return function () { - appendLabelAndClose(shortcode); - }; +/*jshint unused:false */ +/*global tinymce:true */ +tinymce.PluginManager.add('mailpoet_shortcodes', function(editor, url) { + var appendLabelAndClose = function(shortcode) { + editor.insertContent(shortcode); + editor.windowManager.close(); + }; + var generateOnClickFunc = function(shortcode) { + return function() { + appendLabelAndClose(shortcode); }; + }; editor.addButton('mailpoet_shortcodes', { icon: 'mailpoet_shortcodes', - onclick: function () { - var shortcodes = [], - configShortcodes = editor.settings.mailpoet_shortcodes; + onclick: function() { + var shortcodes = []; + var configShortcodes = editor.settings.mailpoet_shortcodes; for (var segment in configShortcodes) { if (configShortcodes.hasOwnProperty(segment)) { diff --git a/assets/js/src/subscribers/importExport/export.js b/assets/js/src/subscribers/importExport/export.js index 25ee9be958..6a49e0a8f8 100644 --- a/assets/js/src/subscribers/importExport/export.js +++ b/assets/js/src/subscribers/importExport/export.js @@ -27,74 +27,74 @@ define( jQuery('#mailpoet_subscribers_export > div.inside').html(subscribers_export_template(window.exportData)); // define reusable variables - var segmentsContainerElement = jQuery('#export_lists'), - subscriberFieldsContainerElement = jQuery('#export_columns'), - exportConfirmedOptionElement = jQuery(':radio[name="option_confirmed"]'), - groupBySegmentOptionElement = jQuery(':checkbox[name="option_group_by_list"]'), - nextStepButton = jQuery('a.mailpoet_export_process'), - renderSegmentsAndFields = function (container, data) { - if (container.data('select2')) { - container - .html('') - .select2('destroy'); - } + var segmentsContainerElement = jQuery('#export_lists'); + var subscriberFieldsContainerElement = jQuery('#export_columns'); + var exportConfirmedOptionElement = jQuery(':radio[name="option_confirmed"]'); + var groupBySegmentOptionElement = jQuery(':checkbox[name="option_group_by_list"]'); + var nextStepButton = jQuery('a.mailpoet_export_process'); + var renderSegmentsAndFields = function (container, data) { + if (container.data('select2')) { container - .select2({ - data: data, - width: '20em', - templateResult: function (item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount).toLocaleString() + ')' - : item.name; - }, - templateSelection: function (item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount).toLocaleString() + ')' - : item.name; - } - }) - .on('select2:selecting', function (selectEvent) { - var selectElement = this, - selectedOptionId = selectEvent.params.args.data.id, - fieldsToExclude = [ - 'select', - 'deselect' - ]; - if (_.contains(fieldsToExclude, selectedOptionId)) { - selectEvent.preventDefault(); - if (selectedOptionId === 'deselect') { - jQuery(selectElement).val('').trigger('change'); - } else { - var allOptions = []; - _.each(container.find('option'), function (field) { - if (!_.contains(fieldsToExclude, field.value)) { - allOptions.push(field.value); - } - }); - jQuery(selectElement).val(allOptions).trigger('change'); - } - jQuery(selectElement).select2('close'); - } - }) - .on('change', function () { - if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) - || - (!window.exportData.segments && subscriberFieldsContainerElement.select2('data').length) - ) { - toggleNextStepButton('on'); - } - else { - toggleNextStepButton('off'); + .html('') + .select2('destroy'); + } + container + .select2({ + data: data, + width: '20em', + templateResult: function (item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount).toLocaleString() + ')' + : item.name; + }, + templateSelection: function (item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount).toLocaleString() + ')' + : item.name; + } + }) + .on('select2:selecting', function (selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; + var fieldsToExclude = [ + 'select', + 'deselect' + ]; + if (_.contains(fieldsToExclude, selectedOptionId)) { + selectEvent.preventDefault(); + if (selectedOptionId === 'deselect') { + jQuery(selectElement).val('').trigger('change'); + } else { + var allOptions = []; + _.each(container.find('option'), function (field) { + if (!_.contains(fieldsToExclude, field.value)) { + allOptions.push(field.value); + } + }); + jQuery(selectElement).val(allOptions).trigger('change'); } + jQuery(selectElement).select2('close'); + } + }) + .on('change', function () { + if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) + || + (!window.exportData.segments && subscriberFieldsContainerElement.select2('data').length) + ) { + toggleNextStepButton('on'); + } + else { + toggleNextStepButton('off'); + } - if (segmentsContainerElement.select2('data').length > 1 && window.exportData.groupBySegmentOption) { - jQuery('.mailpoet_group_by_list').show(); - } - else if (window.exportData.groupBySegmentOption) { - jQuery('.mailpoet_group_by_list').hide(); - } - }); - }; + if (segmentsContainerElement.select2('data').length > 1 && window.exportData.groupBySegmentOption) { + jQuery('.mailpoet_group_by_list').show(); + } + else if (window.exportData.groupBySegmentOption) { + jQuery('.mailpoet_group_by_list').hide(); + } + }); + }; // set confirmed subscribers export option to false window.exportData.exportConfirmedOption = false; diff --git a/assets/js/src/subscribers/importExport/import.js b/assets/js/src/subscribers/importExport/import.js index 61c31517f8..63129837f0 100644 --- a/assets/js/src/subscribers/importExport/import.js +++ b/assets/js/src/subscribers/importExport/import.js @@ -68,31 +68,29 @@ define( jQuery('.mailpoet_method_process').html(methodProcessContainerTemplate()); // define reusable variables - var currentStepE = jQuery(location.hash), - methodSelectionElement = jQuery('#select_method'), - pasteInputElement = jQuery('#paste_input'), - pasteInputPlaceholderElement = - pasteInputElement.data('placeholder').replace(/\\n/g, '\n'), - pasteProcessButtonElement = - jQuery('#method_paste > div.mailpoet_method_process') - .find('a.mailpoet_process'), - mailChimpKeyInputElement = jQuery('#mailchimp_key'), - mailChimpKeyVerifyButtonElement = jQuery('#mailchimp_key_verify'), - mailChimpListsContainerElement = jQuery('#mailchimp_lists'), - mailChimpProcessButtonElement = - jQuery('#method_mailchimp > div.mailpoet_method_process') - .find('a.mailpoet_process'), - uploadElement = jQuery('#file_local'), - uploadProcessButtonElement = - jQuery('#method_file > div.mailpoet_method_process') - .find('a.mailpoet_process'); + var currentStepE = jQuery(location.hash); + var methodSelectionElement = jQuery('#select_method'); + var pasteInputElement = jQuery('#paste_input'); + var pasteInputPlaceholderElement = + pasteInputElement.data('placeholder').replace(/\\n/g, '\n'); + var pasteProcessButtonElement = + jQuery('#method_paste > div.mailpoet_method_process') + .find('a.mailpoet_process'); + var mailChimpKeyInputElement = jQuery('#mailchimp_key'); + var mailChimpKeyVerifyButtonElement = jQuery('#mailchimp_key_verify'); + var mailChimpListsContainerElement = jQuery('#mailchimp_lists'); + var mailChimpProcessButtonElement = jQuery('#method_mailchimp > div.mailpoet_method_process') + .find('a.mailpoet_process'); + var uploadElement = jQuery('#file_local'); + var uploadProcessButtonElement = + jQuery('#method_file > div.mailpoet_method_process') + .find('a.mailpoet_process'); // define method change behavior methodSelectionElement.change(function () { MailPoet.Notice.hide(); - var available_methods = jQuery(':radio[name="select_method"]'), - selected_method = - available_methods.index(available_methods.filter(':checked')); + var available_methods = jQuery(':radio[name="select_method"]'); + var selected_method = available_methods.index(available_methods.filter(':checked')); // hide all methods currentStepE.find('.inside') .children('div[id^="method_"]') @@ -294,48 +292,48 @@ define( } function parseCSV(isFile) { - var processedSubscribers = [], - parsedEmails = [], - duplicateEmails = [], - invalidEmails = [], - emailColumnPosition = null, - columnCount = null, - isHeaderFound = false, - advancedOptionHeader = true, - advancedOptionDelimiter = '', - advancedOptionNewline = '', - advancedOptionComments = false, - // trim spaces, commas, periods, - // single/double quotes and convert to lowercase - detectAndCleanupEmail = function (emailString) { - var test; - // decode HTML entities - var email = jQuery('
').html(emailString).text(); - email = email - .toLowerCase() - // left/right trim spaces, punctuation (e.g., " 'email@email.com'; ") - // right trim non-printable characters (e.g., "email@email.com�") - .replace(/^["';.,\s]+|[^\x20-\x7E]+$|["';.,_\s]+$/g, '') - // remove spaces (e.g., "email @ email . com") - // remove urlencoded characters - .replace(/\s+|%\d+|,+/g, ''); - // detect e-mails that will be otherwise rejected by email regex - test = /<(.*?)>/.exec(email); - if (test) { - // is the email inside angle brackets (e.g., 'some@email.com ')? - email = test[1].trim(); - } - test = /mailto:(?:\s+)?(.*)/.exec(email); - if (test) { - // is the email in 'mailto:email' format? - email = test[1].trim(); - } - // test for valid characters using WP's rule (https://core.trac.wordpress.org/browser/tags/4.7.3/src/wp-includes/formatting.php#L2902) - if (!/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.\-@]+$/.test(email)) { - return false; - } - return email; - }; + var processedSubscribers = []; + var parsedEmails = []; + var duplicateEmails = []; + var invalidEmails = []; + var emailColumnPosition = null; + var columnCount = null; + var isHeaderFound = false; + var advancedOptionHeader = true; + var advancedOptionDelimiter = ''; + var advancedOptionNewline = ''; + var advancedOptionComments = false; + // trim spaces, commas, periods, + // single/double quotes and convert to lowercase + var detectAndCleanupEmail = function (emailString) { + var test; + // decode HTML entities + var email = jQuery('
').html(emailString).text(); + email = email + .toLowerCase() + // left/right trim spaces, punctuation (e.g., " 'email@email.com'; ") + // right trim non-printable characters (e.g., "email@email.com�") + .replace(/^["';.,\s]+|[^\x20-\x7E]+$|["';.,_\s]+$/g, '') + // remove spaces (e.g., "email @ email . com") + // remove urlencoded characters + .replace(/\s+|%\d+|,+/g, ''); + // detect e-mails that will be otherwise rejected by email regex + test = /<(.*?)>/.exec(email); + if (test) { + // is the email inside angle brackets (e.g., 'some@email.com ')? + email = test[1].trim(); + } + test = /mailto:(?:\s+)?(.*)/.exec(email); + if (test) { + // is the email in 'mailto:email' format? + email = test[1].trim(); + } + // test for valid characters using WP's rule (https://core.trac.wordpress.org/browser/tags/4.7.3/src/wp-includes/formatting.php#L2902) + if (!/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.\-@]+$/.test(email) ) { + return false; + } + return email; + }; return { skipEmptyLines: true, @@ -443,32 +441,23 @@ define( return; } // define reusable variables - var nextStepButton = jQuery('#step2_process'), - previousStepButton = jQuery('#return_to_step1'), + var nextStepButton = jQuery('#step2_process'); + var previousStepButton = jQuery('#return_to_step1'); // create a copy of subscribers object for further manipulation - subscribers = jQuery.extend(true, {}, window.importData.step1), - subscribersDataTemplate = - Handlebars - .compile(jQuery('#subscribers_data_template') - .html()), - subscribersDataTemplatePartial = - Handlebars - .compile(jQuery('#subscribers_data_template_partial') - .html()), - subscribersDataParseResultsTemplate = - Handlebars - .compile(jQuery('#subscribers_data_parse_results_template') - .html()), - segmentSelectElement = jQuery('#mailpoet_segments_select'), - maxRowsToShow = 10, - filler = '. . .', + var subscribers = jQuery.extend(true, {}, window.importData.step1); + var subscribersDataTemplate = Handlebars.compile(jQuery('#subscribers_data_template').html()); + var subscribersDataTemplatePartial = Handlebars.compile(jQuery('#subscribers_data_template_partial').html()); + var subscribersDataParseResultsTemplate = Handlebars.compile(jQuery('#subscribers_data_parse_results_template').html()); + var segmentSelectElement = jQuery('#mailpoet_segments_select'); + var maxRowsToShow = 10; + var filler = '. . .'; // create an array of filler data with the same number of // elements as in the subscribers' data row - fillerArray = Array.apply( - null, - new Array(subscribers.subscribers[0].length) - ).map(String.prototype.valueOf, filler), - fillerPosition; + var fillerArray = Array.apply( + null, + new Array(subscribers.subscribers[0].length) + ).map(String.prototype.valueOf, filler); + var fillerPosition; showCurrentStep(); @@ -642,20 +631,20 @@ define( Handlebars.registerHelper( 'show_and_match_columns', function (subscribers, options) { - var displayedColumns = [], - displayedColumnsIds = []; + var displayedColumns = []; + var displayedColumnsIds = []; // go through all elements of the first row in subscribers data for (var i in subscribers.subscribers[0]) { - var columnData = subscribers.subscribers[0][i], - columnId = 'ignore'; // set default column type + var columnData = subscribers.subscribers[0][i]; + var columnId = 'ignore'; // set default column type // if the column is not undefined and has a valid e-mail, set type as email if (columnData % 1 !== 0 && window.emailRegex.test(columnData)) { columnId = 'email'; } else if (subscribers.header) { - var headerName = subscribers.header[i], - headerNameMatch = window.mailpoetColumns.map(function (el) { - return el.name; - }).indexOf(headerName); + var headerName = subscribers.header[i]; + var headerNameMatch = window.mailpoetColumns.map(function (el) { + return el.name; + }).indexOf(headerName); // set column type using header if (headerNameMatch !== -1) { columnId = window.mailpoetColumns[headerNameMatch].id; @@ -733,8 +722,8 @@ define( } }) .on('select2:selecting', function (selectEvent) { - var selectElement = this, - selectedOptionId = selectEvent.params.args.data.id; + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; // CREATE CUSTOM FIELD if (selectedOptionId === 'create') { selectEvent.preventDefault(); @@ -807,8 +796,8 @@ define( // check for duplicate values in all select options jQuery('select.mailpoet_subscribers_column_data_match') .each(function () { - var element = this, - elementId = jQuery(element).val(); + var element = this; + var elementId = jQuery(element).val(); // if another column has the same value and it's not an 'ignore', prompt user if (elementId === selectedOptionId && elementId !== 'ignore') { @@ -824,8 +813,8 @@ define( } }) .on('select2:select', function (selectEvent) { - var selectElement = this, - selectedOptionId = selectEvent.params.data.id; + var selectElement = this; + var selectedOptionId = selectEvent.params.data.id; jQuery(selectElement).data('column-id', selectedOptionId); filterSubscribers(); }); @@ -835,15 +824,15 @@ define( jQuery( '[data-id="notice_invalidEmail"], [data-id="notice_invalidDate"]') .remove(); - var subscribersClone = jQuery.extend(true, {}, subscribers), - preventNextStep = false, - displayedColumns = jQuery.map( - jQuery('.mailpoet_subscribers_column_data_match'), function (element, elementIndex) { - var columnId = jQuery(element).data('column-id'); - var validationRule = jQuery(element).data('validation-rule'); - jQuery(element).val(columnId).trigger('change'); - return { id: columnId, index: elementIndex, validationRule: validationRule, element: element }; - }); + var subscribersClone = jQuery.extend(true, {}, subscribers); + var preventNextStep = false; + var displayedColumns = jQuery.map( + jQuery('.mailpoet_subscribers_column_data_match'), function (element, elementIndex) { + var columnId = jQuery(element).data('column-id'); + var validationRule = jQuery(element).data('validation-rule'); + jQuery(element).val(columnId).trigger('change'); + return { id: columnId, index: elementIndex, validationRule: validationRule, element: element }; + }); // iterate through the object of mailpoet columns jQuery.map(window.mailpoetColumns, function (column, columnIndex) { // check if the column id matches the selected id of one of the @@ -976,28 +965,28 @@ define( } MailPoet.Modal.loading(true); - var columns = {}, - queue = new jQuery.AsyncQueue(), - batchNumber = 0, - batchSize = 2000, - timestamp = Date.now() / 1000, - subscribers = [], - importResults = { - created: 0, - updated: 0, - errors: [], - segments: [] - }, - splitSubscribers = function (subscribers, size) { - return subscribers.reduce(function (res, item, index) { - if (index % size === 0) { - res.push([]); - } - res[res.length - 1].push(item); - return res; - }, []); - }, - subscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); + var columns = {}; + var queue = new jQuery.AsyncQueue(); + var batchNumber = 0; + var batchSize = 2000; + var timestamp = Date.now() / 1000; + var subscribers = []; + var importResults = { + created: 0, + updated: 0, + errors: [], + segments: [] + }; + var splitSubscribers = function (subscribers, size) { + return subscribers.reduce(function (res, item, index) { + if (index % size === 0) { + res.push([]); + } + res[res.length - 1].push(item); + return res; + }, []); + }; + var subscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); _.each(jQuery('select.mailpoet_subscribers_column_data_match'), function (column, columnIndex) { @@ -1086,25 +1075,23 @@ define( }); // display statistics - var subscribersDataImportResultsTemplate = - Handlebars - .compile(jQuery('#subscribers_data_import_results_template') - .html()), - exportMenuElement = jQuery('span.mailpoet_export'), - importResults = { - created: (window.importData.step2.created) - ? MailPoet.I18n.t('subscribersCreated') - .replace('%1$s', '' + window.importData.step2.created.toLocaleString() + '') - .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') - : false, - updated: (window.importData.step2.updated) - ? MailPoet.I18n.t('subscribersUpdated') - .replace('%1$s', '' + window.importData.step2.updated.toLocaleString() + '') - .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') - : false, - no_action: (!window.importData.step2.created && !window.importData.step2.updated), - added_to_segment_with_welcome_notification: window.importData.step2.added_to_segment_with_welcome_notification - }; + var subscribersDataImportResultsTemplate = + Handlebars.compile(jQuery('#subscribers_data_import_results_template').html()); + var exportMenuElement = jQuery('span.mailpoet_export'); + var importResults = { + created: (window.importData.step2.created) + ? MailPoet.I18n.t('subscribersCreated') + .replace('%1$s', '' + window.importData.step2.created.toLocaleString() + '') + .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') + : false, + updated: (window.importData.step2.updated) + ? MailPoet.I18n.t('subscribersUpdated') + .replace('%1$s', '' + window.importData.step2.updated.toLocaleString() + '') + .replace('%2$s', '"' + window.importData.step2.segments.join('", "') + '"') + : false, + no_action: (!window.importData.step2.created && !window.importData.step2.updated), + added_to_segment_with_welcome_notification: window.importData.step2.added_to_segment_with_welcome_notification + }; jQuery('#subscribers_data_import_results') .html(subscribersDataImportResultsTemplate(importResults))