From 683e9c9fa1b14bdbb7f144e658611774ffa95fbb Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Wed, 13 Jun 2018 09:28:53 +0100 Subject: [PATCH] Update eslint Only indentation updated in this commit --- assets/js/src/admin.js | 12 +- assets/js/src/ajax.js | 16 +- assets/js/src/common/thumbnail.jsx | 4 +- assets/js/src/date.js | 16 +- assets/js/src/form/fields/checkbox.jsx | 2 +- assets/js/src/form/fields/radio.jsx | 2 +- assets/js/src/form/fields/select.jsx | 2 +- assets/js/src/form/fields/text.jsx | 8 +- assets/js/src/form/form.jsx | 4 +- assets/js/src/form_editor/form_editor.js | 2 +- assets/js/src/handlebars_helpers.js | 4 +- assets/js/src/i18n.js | 2 +- assets/js/src/listing/bulk_actions.jsx | 2 +- assets/js/src/listing/filters.jsx | 10 +- assets/js/src/listing/groups.jsx | 4 +- assets/js/src/listing/listing.jsx | 160 +- assets/js/src/modal.js | 174 +- .../behaviors/ContainerDropZoneBehavior.js | 2 +- .../behaviors/DraggableBehavior.js | 16 +- .../behaviors/ResizableBehavior.js | 22 +- .../behaviors/TextEditorBehavior.js | 10 +- .../blocks/automatedLatestContent.js | 2 +- .../blocks/automatedLatestContentLayout.js | 2 +- .../js/src/newsletter_editor/blocks/posts.js | 2 +- .../src/newsletter_editor/components/save.js | 2 +- .../newsletter_editor/components/sidebar.js | 2 +- .../js/src/newsletter_editor/initializer.jsx | 86 +- .../js/src/newsletters/listings/heading.jsx | 4 +- assets/js/src/newsletters/listings/mixins.jsx | 26 +- .../src/newsletters/listings/notification.jsx | 32 +- .../js/src/newsletters/listings/welcome.jsx | 4 +- assets/js/src/newsletters/send.jsx | 46 +- assets/js/src/newsletters/send/standard.jsx | 2 +- assets/js/src/newsletters/types.jsx | 2 +- .../types/automatic_emails/event.jsx | 2 +- .../types/automatic_emails/events_list.jsx | 2 +- .../newsletters/types/welcome/scheduling.jsx | 6 +- assets/js/src/num.js | 10 +- assets/js/src/public.js | 28 +- assets/js/src/segments/list.jsx | 10 +- assets/js/src/settings/tabs.js | 4 +- assets/js/src/subscribers/form.jsx | 16 +- .../js/src/subscribers/importExport/export.js | 268 +- .../js/src/subscribers/importExport/import.js | 2168 ++++++++--------- assets/js/src/subscribers/list.jsx | 16 +- package-lock.json | 1021 ++++---- package.json | 4 +- .../blocks/automatedLatestContent.spec.js | 2 +- .../blocks/container.spec.js | 4 +- .../components/communication.spec.js | 8 +- 50 files changed, 2104 insertions(+), 2151 deletions(-) diff --git a/assets/js/src/admin.js b/assets/js/src/admin.js index 4a73c898f2..25e1999441 100644 --- a/assets/js/src/admin.js +++ b/assets/js/src/admin.js @@ -1,12 +1,12 @@ define('admin', [ 'jquery' ], - function admin(jQuery) { - jQuery(function adminDomReady($) { - // dom ready - $(function domReady() { +function admin(jQuery) { + jQuery(function adminDomReady($) { + // dom ready + $(function domReady() { - }); }); - } + }); +} ); diff --git a/assets/js/src/ajax.js b/assets/js/src/ajax.js index c686c59e57..f1df900f7e 100644 --- a/assets/js/src/ajax.js +++ b/assets/js/src/ajax.js @@ -70,15 +70,15 @@ define('ajax', ['mailpoet', 'jquery', 'underscore'], function ajax(mp, jQuery, _ // ajax request deferred = jQuery.post( - this.options.url, - params, - null, - 'json' - ).then(function resultHandler(data) { - return data; - }, _.partial(requestFailed, MailPoet.I18n.t('ajaxFailedErrorMessage'))); + this.options.url, + params, + null, + 'json' + ).then(function resultHandler(data) { + return data; + }, _.partial(requestFailed, MailPoet.I18n.t('ajaxFailedErrorMessage'))); - // clear options + // clear options this.options = {}; return deferred; diff --git a/assets/js/src/common/thumbnail.jsx b/assets/js/src/common/thumbnail.jsx index f79117be66..8ce2e923fd 100644 --- a/assets/js/src/common/thumbnail.jsx +++ b/assets/js/src/common/thumbnail.jsx @@ -69,8 +69,8 @@ export const fromNewsletter = data => action: 'showPreview', data: json, }).done(response => fromUrl(response.meta.preview_url) - .then(resolve) - .catch(reject) + .then(resolve) + .catch(reject) ).fail(response => reject(response.errors)); }); diff --git a/assets/js/src/date.js b/assets/js/src/date.js index 12383cc1f5..fe8f651056 100644 --- a/assets/js/src/date.js +++ b/assets/js/src/date.js @@ -7,7 +7,7 @@ define('date', mp, jQuery, Moment -) { + ) { 'use strict'; var MailPoet = mp; @@ -22,21 +22,21 @@ define('date', init: function init(opts) { var options = opts || {}; - // set UTC offset + // set UTC offset if ( - options.offset === undefined + options.offset === undefined && window.mailpoet_date_offset !== undefined - ) { + ) { options.offset = window.mailpoet_date_offset; } - // set date format + // set date format if ( - options.format === undefined + options.format === undefined && window.mailpoet_date_format !== undefined - ) { + ) { options.format = window.mailpoet_date_format; } - // merge options + // merge options this.options = jQuery.extend({}, this.defaults, options); return this; diff --git a/assets/js/src/form/fields/checkbox.jsx b/assets/js/src/form/fields/checkbox.jsx index 3bc2c68134..8149addaf4 100644 --- a/assets/js/src/form/fields/checkbox.jsx +++ b/assets/js/src/form/fields/checkbox.jsx @@ -29,7 +29,7 @@ const FormFieldCheckbox = React.createClass({ { this.props.field.values[value] }

- ) + ) ); return ( diff --git a/assets/js/src/form/fields/radio.jsx b/assets/js/src/form/fields/radio.jsx index 9bdfa79b67..f640fc9b4d 100644 --- a/assets/js/src/form/fields/radio.jsx +++ b/assets/js/src/form/fields/radio.jsx @@ -22,7 +22,7 @@ const FormFieldRadio = React.createClass({ { this.props.field.values[value] }

- ) + ) ); return ( diff --git a/assets/js/src/form/fields/select.jsx b/assets/js/src/form/fields/select.jsx index 9022235c6a..f2014ae3df 100644 --- a/assets/js/src/form/fields/select.jsx +++ b/assets/js/src/form/fields/select.jsx @@ -54,7 +54,7 @@ const FormFieldSelect = React.createClass({ > { this.props.field.values[value] } - ) + ) ); return ( diff --git a/assets/js/src/form/fields/text.jsx b/assets/js/src/form/fields/text.jsx index 1bd3546983..0a042139d6 100644 --- a/assets/js/src/form/fields/text.jsx +++ b/assets/js/src/form/fields/text.jsx @@ -33,14 +33,14 @@ const FormFieldText = React.createClass({ type="text" disabled={ (this.props.field.disabled !== undefined) - ? this.props.field.disabled(this.props.item) - : false + ? this.props.field.disabled(this.props.item) + : false } className={className} size={ (this.props.field.size !== 'auto' && this.props.field.size > 0) - ? this.props.field.size - : false + ? this.props.field.size + : false } name={name} id={id} diff --git a/assets/js/src/form/form.jsx b/assets/js/src/form/form.jsx index deded4a187..a2e6a46c6d 100644 --- a/assets/js/src/form/form.jsx +++ b/assets/js/src/form/form.jsx @@ -213,8 +213,8 @@ const Form = React.createClass({ className={formClasses} onSubmit={ (this.props.onSubmit !== undefined) - ? this.props.onSubmit - : this.handleSubmit + ? this.props.onSubmit + : this.handleSubmit } > { errors } diff --git a/assets/js/src/form_editor/form_editor.js b/assets/js/src/form_editor/form_editor.js index e72950e2b6..38a0fe1668 100644 --- a/assets/js/src/form_editor/form_editor.js +++ b/assets/js/src/form_editor/form_editor.js @@ -596,7 +596,7 @@ WysijaForm = { WysijaForm.toolbar.left + window.$(WysijaForm.options.container).getDimensions().width + 15 - , 10); + , 10); } }, setToolbarPosition: function () { diff --git a/assets/js/src/handlebars_helpers.js b/assets/js/src/handlebars_helpers.js index 13fc65dc33..447e57940a 100644 --- a/assets/js/src/handlebars_helpers.js +++ b/assets/js/src/handlebars_helpers.js @@ -101,11 +101,11 @@ define('handlebars_helpers', ['handlebars'], function (Handlebars) { lines = value.trim().split('\n'); - // remove header & footer + // remove header & footer lines.shift(); lines.pop(); - // return concatenated lines + // return concatenated lines return lines.join(''); }); diff --git a/assets/js/src/i18n.js b/assets/js/src/i18n.js index c8d76f42f7..afe27df814 100644 --- a/assets/js/src/i18n.js +++ b/assets/js/src/i18n.js @@ -3,7 +3,7 @@ define('i18n', 'mailpoet' ], function i18n( mp -) { + ) { 'use strict'; var MailPoet = mp; diff --git a/assets/js/src/listing/bulk_actions.jsx b/assets/js/src/listing/bulk_actions.jsx index 6dc78802cc..e905d13d07 100644 --- a/assets/js/src/listing/bulk_actions.jsx +++ b/assets/js/src/listing/bulk_actions.jsx @@ -96,7 +96,7 @@ const ListingBulkActions = React.createClass({ value={action.name} key={`action-${action.name}`} >{ action.label } - )) } + )) } !( - filters[filter].length === 0 + filters[filter].length === 0 || ( filters[filter].length === 1 && !filters[filter][0].value ) - )); + )); }, componentDidUpdate: function componentDidUpdate() { const selectedFilters = this.props.filter; @@ -36,7 +36,7 @@ const ListingFilters = React.createClass({ .trigger('change'); } } - ); + ); }, render: function render() { const filters = this.props.filters; @@ -52,9 +52,9 @@ const ListingFilters = React.createClass({ value={option.value} key={`filter-option-${option.value}`} >{ option.label } - )) } + )) } - )); + )); let button; diff --git a/assets/js/src/listing/groups.jsx b/assets/js/src/listing/groups.jsx index 097948da46..226175f34a 100644 --- a/assets/js/src/listing/groups.jsx +++ b/assets/js/src/listing/groups.jsx @@ -19,8 +19,8 @@ class ListingGroups extends React.Component { } const classes = classNames( - { current: (group.name === this.props.group) } - ); + { current: (group.name === this.props.group) } + ); return (
  • diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index 915dd53f1e..464b6e48ba 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -66,70 +66,70 @@ const ListingItem = React.createClass({ if (customActions.length > 0) { let isFirst = true; itemActions = customActions - .filter(action => action.display === undefined || action.display(this.props.item)) - .map((action, index) => { - let customAction = null; + .filter(action => action.display === undefined || action.display(this.props.item)) + .map((action, index) => { + let customAction = null; - if (action.name === 'trash') { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - this.handleTrashItem(this.props.item.id)} + if (action.name === 'trash') { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + this.handleTrashItem(this.props.item.id)} + > + {MailPoet.I18n.t('moveToTrash')} + + + ); + } else if (action.refresh) { + customAction = ( + - {MailPoet.I18n.t('moveToTrash')} - - - ); - } else if (action.refresh) { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - { action.link(this.props.item) } - - ); - } else if (action.link) { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - { action.link(this.props.item) } - - ); - } else { - customAction = ( - - {(!isFirst) ? ' | ' : ''} - action.onClick(this.props.item, this.props.onRefreshItems) - : false - } - >{ action.label } - - ); - } + {(!isFirst) ? ' | ' : ''} + { action.link(this.props.item) } + + ); + } else if (action.link) { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + { action.link(this.props.item) } + + ); + } else { + customAction = ( + + {(!isFirst) ? ' | ' : ''} + action.onClick(this.props.item, this.props.onRefreshItems) + : false + } + >{ action.label } + + ); + } - if (customAction !== null && isFirst === true) { - isFirst = false; - } + if (customAction !== null && isFirst === true) { + isFirst = false; + } - return customAction; - }); + return customAction; + }); } else { itemActions = ( @@ -228,39 +228,39 @@ const ListingItems = React.createClass({ ); } const selectAllClasses = classNames( - 'mailpoet_select_all', + 'mailpoet_select_all', { mailpoet_hidden: ( - this.props.selection === false + this.props.selection === false || (this.props.count <= this.props.limit) - ), + ), } - ); + ); return ( { - (this.props.selection !== 'all') + (this.props.selection !== 'all') ? MailPoet.I18n.t('selectAllLabel') : MailPoet.I18n.t('selectedAllLabel').replace( '%d', this.props.count ) - } + }   { - (this.props.selection !== 'all') + (this.props.selection !== 'all') ? MailPoet.I18n.t('selectAllLink') : MailPoet.I18n.t('clearSelection') - } + } @@ -326,7 +326,7 @@ const Listing = React.createClass({ }, initWithParams: function initWithParams(params) { const state = this.getInitialState(); - // check for url params + // check for url params if (params.splat) { params.splat.split('/').forEach((param) => { const [key, value] = this.getParam(param); @@ -380,15 +380,15 @@ const Listing = React.createClass({ if (this.props.location) { const params = Object.keys(this.state) .filter(key => ( - [ - 'group', - 'filter', - 'search', - 'page', - 'sort_by', - 'sort_order', - ].indexOf(key) !== -1 - )) + [ + 'group', + 'filter', + 'search', + 'page', + 'sort_by', + 'sort_order', + ].indexOf(key) !== -1 + )) .map((key) => { let value = this.state[key]; if (value === Object(value)) { diff --git a/assets/js/src/modal.js b/assets/js/src/modal.js index 139ec47578..4b17fa2383 100644 --- a/assets/js/src/modal.js +++ b/assets/js/src/modal.js @@ -181,9 +181,9 @@ define('modal', ['mailpoet', 'jquery'], }, initOverlay: function () { if (jQuery('#mailpoet_modal_overlay').length === 0) { - // insert overlay into the DOM + // insert overlay into the DOM jQuery('body').append(this.templates.overlay); - // insert loading indicator into overlay + // insert loading indicator into overlay jQuery('#mailpoet_modal_overlay').append(this.templates.loading); } return this; @@ -191,10 +191,10 @@ define('modal', ['mailpoet', 'jquery'], toggleOverlay: function (toggle) { if (toggle === true) { jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_hidden'); + .removeClass('mailpoet_overlay_hidden'); } else { jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_hidden'); + .addClass('mailpoet_overlay_hidden'); } return this; @@ -250,60 +250,60 @@ define('modal', ['mailpoet', 'jquery'], }, loadTemplate: function () { if (this.subpanels.length > 0) { - // hide panel + // hide panel jQuery('.mailpoet_' + this.options.type + '_wrapper').hide(); - // add sub panel wrapper + // add sub panel wrapper jQuery('#mailpoet_' + this.options.type) - .append(this.templates.subpanel); + .append(this.templates.subpanel); - // add sub panel content + // add sub panel content jQuery('.mailpoet_' + this.options.type + '_body').last() - .html(this.subpanels[(this.subpanels.length - 1)].element); + .html(this.subpanels[(this.subpanels.length - 1)].element); - // focus on sub panel + // focus on sub panel if (this.options.focus) { this.focus(); } } else if (this.options.element) { jQuery('.mailpoet_' + this.options.type + '_body').empty(); jQuery('.mailpoet_' + this.options.type + '_body') - .append(this.options.element); + .append(this.options.element); } else { jQuery('.mailpoet_' + this.options.type + '_body') - .html( - this.options.body_template( - this.options.data - ) - ); + .html( + this.options.body_template( + this.options.data + ) + ); } return this; }, loadUrl: function () { if (this.options.method === 'get') { - // make ajax request + // make ajax request jQuery.getJSON(this.options.url, - function (data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this) - ); + function (data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this) + ); } else if (this.options.method === 'post') { - // make ajax request + // make ajax request jQuery.post(this.options.url, JSON.stringify(this.options.params), - function (data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this), - 'json' - ); + function (data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this), + 'json' + ); } return this; @@ -311,18 +311,18 @@ define('modal', ['mailpoet', 'jquery'], setDimensions: function () { switch (this.options.type) { case 'popup': - // set popup dimensions + // set popup dimensions jQuery('#mailpoet_popup').css({ width: this.options.width, height: this.options.height }); - // set popup wrapper height + // set popup wrapper height jQuery('#mailpoet_popup_wrapper').css({ height: this.options.height }); break; case 'panel': - // set dimensions + // set dimensions if (this.options.position === 'right') { jQuery('#mailpoet_panel').css({ width: this.options.width, @@ -365,7 +365,7 @@ define('modal', ['mailpoet', 'jquery'], break; case 'panel': setTimeout(function () { - // set position of popup depending on screen dimensions. + // set position of popup depending on screen dimensions. if (this.options.position === 'right') { jQuery('#mailpoet_panel').css({ marginRight: 0 @@ -383,22 +383,22 @@ define('modal', ['mailpoet', 'jquery'], return this; }, showModal: function () { - // set modal dimensions + // set modal dimensions this.setDimensions(); - // remember the previously focused element + // remember the previously focused element this.prevFocus = jQuery(':focus'); - // show popup + // show popup jQuery('#mailpoet_' + this.options.type).show(); - // display overlay + // display overlay this.showOverlay(); - // set modal position + // set modal position this.setPosition(); - // add class on highlighted elements + // add class on highlighted elements if (this.options.highlight !== null) { if (this.options.highlight.length > 0) { this.highlightOn(this.options.highlight); @@ -409,10 +409,10 @@ define('modal', ['mailpoet', 'jquery'], this.focus(); } - // set popup as opened + // set popup as opened this.opened = true; - // trigger init event if specified + // trigger init event if specified if (this.options.onInit !== null) { this.options.onInit(this); } @@ -423,9 +423,9 @@ define('modal', ['mailpoet', 'jquery'], if (this.options.type === 'popup') { jQuery('#mailpoet_' + this.options.type).focus(); } else { - // panel and subpanel + // panel and subpanel jQuery('#mailpoet_' + this.options.type + ' .mailpoet_panel_wrapper') - .filter(':visible').focus(); + .filter(':visible').focus(); } return this; }, @@ -435,17 +435,17 @@ define('modal', ['mailpoet', 'jquery'], }, highlightOff: function () { jQuery('.mailpoet_modal_highlight') - .removeClass('mailpoet_modal_highlight'); + .removeClass('mailpoet_modal_highlight'); return this; }, hideModal: function () { - // set modal as closed + // set modal as closed this.opened = false; - // hide modal + // hide modal jQuery('#mailpoet_' + this.options.type).hide(); - // remove class on highlighted elements + // remove class on highlighted elements this.highlightOff(); return this; @@ -459,46 +459,46 @@ define('modal', ['mailpoet', 'jquery'], return this; }, popup: function (opts) { - // get options + // get options var options = opts || {}; - // set modal type + // set modal type options.type = 'popup'; - // set overlay state + // set overlay state options.overlay = options.overlay || true; - // initialize modal + // initialize modal this.init(options); - // open modal + // open modal this.open(); return this; }, panel: function (opts) { - // get options + // get options var options = opts || {}; - // reset subpanels + // reset subpanels this.subpanels = []; - // set modal type + // set modal type options.type = 'panel'; - // set overlay state + // set overlay state options.overlay = options.overlay || false; - // set highlighted element + // set highlighted element options.highlight = options.highlight || null; - // set modal dimensions + // set modal dimensions options.width = options.width || '40%'; options.height = options.height || 'auto'; - // initialize modal + // initialize modal this.init(options); - // open modal + // open modal this.open(); return this; }, subpanel: function (options) { if (this.opened === false) { - // if no panel is already opened, let's create one instead + // if no panel is already opened, let's create one instead this.panel(options); } else { - // if a panel is already opened, add a sub panel to it + // if a panel is already opened, add a sub panel to it this.subpanels.push(options); this.loadTemplate(); } @@ -506,7 +506,7 @@ define('modal', ['mailpoet', 'jquery'], return this; }, loading: function (toggle) { - // make sure the overlay is initialized and that it's visible + // make sure the overlay is initialized and that it's visible this.initOverlay(true); if (toggle === true) { @@ -520,32 +520,32 @@ define('modal', ['mailpoet', 'jquery'], showLoading: function () { jQuery('#mailpoet_loading').show(); - // add loading class to overlay + // add loading class to overlay jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_loading'); + .addClass('mailpoet_overlay_loading'); return this; }, hideLoading: function () { jQuery('#mailpoet_loading').hide(); - // remove loading class from overlay + // remove loading class from overlay jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_loading'); + .removeClass('mailpoet_overlay_loading'); return this; }, open: function () { - // load template if specified + // load template if specified if (this.options.template !== null) { - // check if a url was specified to get extra data + // check if a url was specified to get extra data if (this.options.url !== null) { this.loadUrl(); } else { - // load template + // load template this.loadTemplate(); - // show modal window + // show modal window this.showModal(); } } else { @@ -585,7 +585,7 @@ define('modal', ['mailpoet', 'jquery'], destroy: function () { this.hideOverlay(); - // remove extra modal + // remove extra modal if (jQuery('#mailpoet_' + this.options.type).length > 0) { jQuery('#mailpoet_' + this.options.type).remove(); } @@ -598,16 +598,16 @@ define('modal', ['mailpoet', 'jquery'], if (this.isLocked() === true) { return this; } if (this.subpanels.length > 0) { - // close subpanel + // close subpanel jQuery('.mailpoet_' + this.options.type + '_wrapper').last().remove(); - // show previous panel + // show previous panel jQuery('.mailpoet_' + this.options.type + '_wrapper').last().show(); - // remove last subpanels + // remove last subpanels this.subpanels.pop(); - // focus on previous panel + // focus on previous panel if (this.options.focus) { this.focus(); } @@ -615,21 +615,21 @@ define('modal', ['mailpoet', 'jquery'], return this; } - // remove event handlers + // remove event handlers this.removeEvents(); - // hide modal window + // hide modal window this.hideModal(); - // destroy modal element + // destroy modal element this.destroy(); - // restore the previously focused element + // restore the previously focused element if (this.prevFocus !== undefined) { this.prevFocus.focus(); } - // reset options + // reset options this.options = { onSuccess: null, onCancel: null diff --git a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js index aeb24584ca..8e2347f2dd 100644 --- a/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ContainerDropZoneBehavior.js @@ -426,7 +426,7 @@ define([ position: 'before' }; } - // Second half of the element + // Second half of the element return { index: index, position: 'after' diff --git a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js index 512de5bb6c..cfb405e609 100644 --- a/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/DraggableBehavior.js @@ -119,16 +119,16 @@ define([ } } }) - .preventDefault('auto') - .styleCursor(false) - .actionChecker(function actionChecker(pointer, event, action) { + .preventDefault('auto') + .styleCursor(false) + .actionChecker(function actionChecker(pointer, event, action) { // Disable dragging with right click - if (event.button !== 0) { - return null; - } + if (event.button !== 0) { + return null; + } - return action; - }); + return action; + }); if (this.options.drop !== undefined) { interactable.getDropModel = this.options.drop; diff --git a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js index 4e7144044b..f22a355d82 100644 --- a/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/ResizableBehavior.js @@ -54,17 +54,17 @@ define([ bottom: (typeof this.options.resizeHandleSelector === 'string') ? this.view.$(this.options.resizeHandleSelector).get(0) : this.options.resizeHandleSelector } }) - .on('resizestart', function () { // eslint-disable-line func-names - that.isBeingResized = true; - that.$el.addClass('mailpoet_resize_active'); - }).on('resizemove', function (event) { // eslint-disable-line func-names - var onResize = that.options.onResize.bind(that); - return onResize(event); - }) - .on('resizeend', function () { // eslint-disable-line func-names - that.isBeingResized = null; - that.$el.removeClass('mailpoet_resize_active'); - }); + .on('resizestart', function () { // eslint-disable-line func-names + that.isBeingResized = true; + that.$el.addClass('mailpoet_resize_active'); + }).on('resizemove', function (event) { // eslint-disable-line func-names + var onResize = that.options.onResize.bind(that); + return onResize(event); + }) + .on('resizeend', function () { // eslint-disable-line func-names + that.isBeingResized = null; + that.$el.removeClass('mailpoet_resize_active'); + }); }, showResizeHandle: function () { // eslint-disable-line func-names if (typeof this.options.resizeHandleSelector === 'string') { diff --git a/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js b/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js index cd16200178..4a5697bed5 100644 --- a/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js +++ b/assets/js/src/newsletter_editor/behaviors/TextEditorBehavior.js @@ -65,11 +65,11 @@ define([ editor.focus(); if (that._isActivationClick) { editor.selection.setRng( - window.tinymce.dom.RangeUtils.getCaretRangeFromPoint( - e.clientX, - e.clientY, - editor.getDoc() - ) + window.tinymce.dom.RangeUtils.getCaretRangeFromPoint( + e.clientX, + e.clientY, + editor.getDoc() + ) ); that._isActivationClick = false; } diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js index c240096d2d..77cd50eae0 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js @@ -27,7 +27,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js index 3737ec6f47..1711982278 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContentLayout.js @@ -22,7 +22,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js index e7d323bd22..1f8adfd5c7 100644 --- a/assets/js/src/newsletter_editor/blocks/posts.js +++ b/assets/js/src/newsletter_editor/blocks/posts.js @@ -36,7 +36,7 @@ define([ BaseBlock, ButtonBlock, DividerBlock - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js index d9d0c4664f..15c34b6a4e 100644 --- a/assets/js/src/newsletter_editor/components/save.js +++ b/assets/js/src/newsletter_editor/components/save.js @@ -257,7 +257,7 @@ define([ if ((App.getNewsletter().get('type') === 'notification') && contents.indexOf('"type":"automatedLatestContent"') < 0 && contents.indexOf('"type":"automatedLatestContentLayout"') < 0 - ) { + ) { this.showValidationError(MailPoet.I18n.t('automatedLatestContentMissing')); return; } diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js index ce93751b19..56b62c3095 100644 --- a/assets/js/src/newsletter_editor/components/sidebar.js +++ b/assets/js/src/newsletter_editor/components/sidebar.js @@ -17,7 +17,7 @@ define([ SuperModel, _, jQuery - ) { +) { 'use strict'; var Module = {}; diff --git a/assets/js/src/newsletter_editor/initializer.jsx b/assets/js/src/newsletter_editor/initializer.jsx index 9f333d8606..a83b98f25c 100644 --- a/assets/js/src/newsletter_editor/initializer.jsx +++ b/assets/js/src/newsletter_editor/initializer.jsx @@ -32,52 +32,52 @@ const initializeEditor = (config) => { id: getUrlParam('id'), }, }) - .always(() => MailPoet.Modal.loading(false)) - .done((response) => { - const newsletter = response.data; + .always(() => MailPoet.Modal.loading(false)) + .done((response) => { + const newsletter = response.data; - Promise.resolve(Hooks.applyFilters('mailpoet_newsletters_editor_extend_config', config, newsletter)).then((extendedConfig) => { - window.EditorApplication.start({ - newsletter, - config: extendedConfig, - }); - }).catch(() => { - window.EditorApplication.start({ - newsletter, - config, + Promise.resolve(Hooks.applyFilters('mailpoet_newsletters_editor_extend_config', config, newsletter)).then((extendedConfig) => { + window.EditorApplication.start({ + newsletter, + config: extendedConfig, + }); + }).catch(() => { + window.EditorApplication.start({ + newsletter, + config, + }); }); + + renderBreadcrumb(newsletter.type); + + if (newsletter.status === 'sending' && newsletter.queue && newsletter.queue.status === null) { + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'sending_queue', + action: 'pause', + data: { + newsletter_id: newsletter.id, + }, + }) + .done(() => MailPoet.Notice.success(MailPoet.I18n.t('newsletterIsPaused'))) + .fail((pauseFailResponse) => { + if (pauseFailResponse.errors.length > 0) { + MailPoet.Notice.error( + pauseFailResponse.errors.map(error => error.message), + { scroll: true, static: true } + ); + } + }); + } + }) + .fail((response) => { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(error => error.message), + { scroll: true, static: true } + ); + } }); - - renderBreadcrumb(newsletter.type); - - if (newsletter.status === 'sending' && newsletter.queue && newsletter.queue.status === null) { - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'sending_queue', - action: 'pause', - data: { - newsletter_id: newsletter.id, - }, - }) - .done(() => MailPoet.Notice.success(MailPoet.I18n.t('newsletterIsPaused'))) - .fail((pauseFailResponse) => { - if (pauseFailResponse.errors.length > 0) { - MailPoet.Notice.error( - pauseFailResponse.errors.map(error => error.message), - { scroll: true, static: true } - ); - } - }); - } - }) - .fail((response) => { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true, static: true } - ); - } - }); }; Hooks.addAction('mailpoet_newsletters_editor_initialize', initializeEditor); diff --git a/assets/js/src/newsletters/listings/heading.jsx b/assets/js/src/newsletters/listings/heading.jsx index 0577e96b1b..a95a8fdafc 100644 --- a/assets/js/src/newsletters/listings/heading.jsx +++ b/assets/js/src/newsletters/listings/heading.jsx @@ -9,8 +9,8 @@ const ListingHeading = () => ( className="page-title-action" to="/new" onClick={() => MailPoet.trackEvent( - 'Emails > Add New', - { 'MailPoet Free version': window.mailpoet_version } + 'Emails > Add New', + { 'MailPoet Free version': window.mailpoet_version } )} data-automation-id="new_email" > diff --git a/assets/js/src/newsletters/listings/mixins.jsx b/assets/js/src/newsletters/listings/mixins.jsx index b9f44b19c7..547787b8c3 100644 --- a/assets/js/src/newsletters/listings/mixins.jsx +++ b/assets/js/src/newsletters/listings/mixins.jsx @@ -69,14 +69,14 @@ const QueueMixin = { ); } const progressClasses = classNames( - 'mailpoet_progress', - { mailpoet_progress_complete: newsletter.queue.status === 'completed' } - ); + 'mailpoet_progress', + { mailpoet_progress_complete: newsletter.queue.status === 'completed' } + ); // calculate percentage done let percentage = Math.round( - (newsletter.queue.count_processed * 100) / (newsletter.queue.count_total) - ); + (newsletter.queue.count_processed * 100) / (newsletter.queue.count_total) + ); let label; @@ -84,12 +84,12 @@ const QueueMixin = { label = ( { - MailPoet.I18n.t('newsletterQueueCompleted') + MailPoet.I18n.t('newsletterQueueCompleted') .replace('%$1d', parseInt(newsletter.queue.count_processed, 10).toLocaleString()) .replace('%$2d', parseInt(newsletter.queue.count_total, 10).toLocaleString()) - } + } - ); + ); } else { const resumeSendingClick = _.partial(this.resumeSending, newsletter); const pauseSendingClick = _.partial(this.pauseSending, newsletter); @@ -101,7 +101,7 @@ const QueueMixin = { id={`resume_${newsletter.id}`} className="button" style={{ display: (newsletter.queue.status === 'paused') - ? 'inline-block' : 'none' }} + ? 'inline-block' : 'none' }} href="javascript:;" onClick={resumeSendingClick} >{MailPoet.I18n.t('resume')} @@ -109,12 +109,12 @@ const QueueMixin = { id={`pause_${newsletter.id}`} className="button mailpoet_pause" style={{ display: (newsletter.queue.status === null) - ? 'inline-block' : 'none' }} + ? 'inline-block' : 'none' }} href="javascript:;" onClick={pauseSendingClick} >{MailPoet.I18n.t('pause')} - ); + ); } let progressBarWidth = 0; @@ -258,7 +258,7 @@ const StatisticsMixin = { { tooEarlyForStats && (
    {MailPoet.I18n.t('checkBackInHours') - .replace('%$1d', showStatsTimeout - sentHoursAgo)} + .replace('%$1d', showStatsTimeout - sentHoursAgo)}
    ) } @@ -406,7 +406,7 @@ const MailerMixin = { } if (state.meta.mta_log.error.error_code) { mailerErrorNotice += ` ${MailPoet.I18n.t('mailerErrorCode') - .replace('%$1s', state.meta.mta_log.error.error_code)}`; + .replace('%$1s', state.meta.mta_log.error.error_code)}`; } return (
    diff --git a/assets/js/src/newsletters/listings/notification.jsx b/assets/js/src/newsletters/listings/notification.jsx index 7a87ba1513..bde666dcae 100644 --- a/assets/js/src/newsletters/listings/notification.jsx +++ b/assets/js/src/newsletters/listings/notification.jsx @@ -216,34 +216,34 @@ const NewsletterListNotification = React.createClass({ switch (newsletter.options.intervalType) { case 'daily': sendingFrequency = MailPoet.I18n.t('sendDaily').replace( - '%$1s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'weekly': sendingFrequency = MailPoet.I18n.t('sendWeekly').replace( - '%$1s', weekDayValues[newsletter.options.weekDay] - ).replace( - '%$2s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', weekDayValues[newsletter.options.weekDay] + ).replace( + '%$2s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'monthly': sendingFrequency = MailPoet.I18n.t('sendMonthly').replace( - '%$1s', monthDayValues[newsletter.options.monthDay] - ).replace( - '%$2s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', monthDayValues[newsletter.options.monthDay] + ).replace( + '%$2s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'nthWeekDay': sendingFrequency = MailPoet.I18n.t('sendNthWeekDay').replace( - '%$1s', nthWeekDayValues[newsletter.options.nthWeekDay] - ).replace( - '%$2s', weekDayValues[newsletter.options.weekDay] - ).replace( - '%$3s', timeOfDayValues[newsletter.options.timeOfDay] - ); + '%$1s', nthWeekDayValues[newsletter.options.nthWeekDay] + ).replace( + '%$2s', weekDayValues[newsletter.options.weekDay] + ).replace( + '%$3s', timeOfDayValues[newsletter.options.timeOfDay] + ); break; case 'immediately': diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index 6d8684412e..1922c9cb8c 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -210,8 +210,8 @@ const NewsletterListWelcome = React.createClass({ ); } sendingEvent = MailPoet.I18n.t('welcomeEventSegment').replace( - '%$1s', segment.name - ); + '%$1s', segment.name + ); break; } diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx index 491cd493e8..158b3f9aef 100644 --- a/assets/js/src/newsletters/send.jsx +++ b/assets/js/src/newsletters/send.jsx @@ -109,20 +109,20 @@ const NewsletterSend = React.createClass({ return this.saveNewsletter(e).done(() => { this.setState({ loading: true }); }) - .done((response) => { - switch (response.data.type) { - case 'notification': - case 'welcome': - return this.activateNewsletter(response); - default: - return this.sendNewsletter(response); - } - }) - .fail((err) => { - this.showError(err); - this.setState({ loading: false }); - MailPoet.Modal.loading(false); - }); + .done((response) => { + switch (response.data.type) { + case 'notification': + case 'welcome': + return this.activateNewsletter(response); + default: + return this.sendNewsletter(response); + } + }) + .fail((err) => { + this.showError(err); + this.setState({ loading: false }); + MailPoet.Modal.loading(false); + }); }, sendNewsletter: function sendNewsletter(newsletter) { return MailPoet.Ajax.post( @@ -242,12 +242,12 @@ const NewsletterSend = React.createClass({ } }); }) - .fail((err) => { - this.showError(err); - }) - .always(() => { - this.setState({ loading: false }); - }); + .fail((err) => { + this.showError(err); + }) + .always(() => { + this.setState({ loading: false }); + }); } return false; }, @@ -289,8 +289,8 @@ const NewsletterSend = React.createClass({ 'status', 'updated_at', 'type', ]; const newsletterData = _.omit( - data, - IGNORED_NEWSLETTER_PROPERTIES + data, + IGNORED_NEWSLETTER_PROPERTIES ); return MailPoet.Ajax.post({ @@ -363,7 +363,7 @@ const NewsletterSend = React.createClass({ onClick={this.handleResume} value={MailPoet.I18n.t('resume')} /> - : + : { timeOfDayItems[value] } - ) + ) ); return ( diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index d0070db44a..d45155d6ae 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -155,7 +155,7 @@ const NewsletterTypes = React.createClass({
  • - ), this)} + ), this)} ); diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index 8d551f4d33..5ea3e53b9b 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -53,7 +53,7 @@ class AutomaticEmailEvent extends React.PureComponent { {event.badge.text} - ) : '' + ) : '' }

    {event.description}

    diff --git a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx index f09d31ad95..03c45e49c4 100644 --- a/assets/js/src/newsletters/types/automatic_emails/events_list.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/events_list.jsx @@ -25,7 +25,7 @@ class AutomaticEmailEventsList extends React.Component { key={index} eventsConfigurator={this.eventsConfigurator} /> - ) + ) ); return ( diff --git a/assets/js/src/newsletters/types/welcome/scheduling.jsx b/assets/js/src/newsletters/types/welcome/scheduling.jsx index 17d9b0d4fd..764d25fcd8 100644 --- a/assets/js/src/newsletters/types/welcome/scheduling.jsx +++ b/assets/js/src/newsletters/types/welcome/scheduling.jsx @@ -111,9 +111,9 @@ const WelcomeScheduling = React.createClass({ }).fail((response) => { if (response.errors.length > 0) { MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true } - ); + response.errors.map(error => error.message), + { scroll: true } + ); } }); }, diff --git a/assets/js/src/num.js b/assets/js/src/num.js index a26a0cfacd..ef55cf7186 100644 --- a/assets/js/src/num.js +++ b/assets/js/src/num.js @@ -3,7 +3,7 @@ define('num', 'mailpoet' ], function ( // eslint-disable-line func-names mp -) { + ) { 'use strict'; var MailPoet = mp; @@ -12,10 +12,10 @@ define('num', var precision = precisionOpts || 0; var factor = Math.pow(10, precision); return (Math.round(num * factor) / factor) - .toLocaleString( - undefined, - { minimumFractionDigits: precision, maximumFractionDigits: precision } - ); + .toLocaleString( + undefined, + { minimumFractionDigits: precision, maximumFractionDigits: precision } + ); } }; }); diff --git a/assets/js/src/public.js b/assets/js/src/public.js index f82089f7c0..787da900b6 100644 --- a/assets/js/src/public.js +++ b/assets/js/src/public.js @@ -64,43 +64,43 @@ function ( // eslint-disable-line func-names data: formData.data }).fail(function (response) { // eslint-disable-line func-names form.find('.mailpoet_validate_error').html( - response.errors.map(function (error) { // eslint-disable-line func-names - return error.message; - }).join('
    ') - ).show(); + response.errors.map(function (error) { // eslint-disable-line func-names + return error.message; + }).join('
    ') + ).show(); }).done(function (response) { // eslint-disable-line func-names if (window.grecaptcha && formData.recaptcha) { window.grecaptcha.reset(formData.recaptcha); } return response; }).done(function (response) { // eslint-disable-line func-names - // successfully subscribed + // successfully subscribed if ( - response.meta !== undefined + response.meta !== undefined && response.meta.redirect_url !== undefined - ) { - // go to page + ) { + // go to page window.location.href = response.meta.redirect_url; } else { - // display success message + // display success message form.find('.mailpoet_validate_success').show(); } - // reset form + // reset form form.trigger('reset'); - // reset validation + // reset validation parsley.reset(); // reset captcha if (window.grecaptcha && formData.recaptcha) { window.grecaptcha.reset(formData.recaptcha); } - // resize iframe + // resize iframe if ( - window.frameElement !== null + window.frameElement !== null && MailPoet !== undefined && MailPoet.Iframe - ) { + ) { MailPoet.Iframe.autoSize(window.frameElement); } }); diff --git a/assets/js/src/segments/list.jsx b/assets/js/src/segments/list.jsx index 8eca51ebfe..32856d153c 100644 --- a/assets/js/src/segments/list.jsx +++ b/assets/js/src/segments/list.jsx @@ -118,14 +118,14 @@ const itemActions = [ }, }).done((response) => { MailPoet.Notice.success( - MailPoet.I18n.t('listDuplicated').replace('%$1s', response.data.name) - ); + MailPoet.I18n.t('listDuplicated').replace('%$1s', response.data.name) + ); refresh(); }).fail((response) => { MailPoet.Notice.error( - response.errors.map(error => error.message), - { scroll: true } - ); + response.errors.map(error => error.message), + { scroll: true } + ); }), display: function display(segment) { return (segment.type !== 'wp_users'); diff --git a/assets/js/src/settings/tabs.js b/assets/js/src/settings/tabs.js index efba9f17a0..c40fcbfde1 100644 --- a/assets/js/src/settings/tabs.js +++ b/assets/js/src/settings/tabs.js @@ -39,8 +39,8 @@ define( // toggle SPF (hidden if the sending method is MailPoet) jQuery('#mailpoet_mta_spf')[ (group === 'mailpoet') - ? 'hide' - : 'show' + ? 'hide' + : 'show' ](); // hide sending methods diff --git a/assets/js/src/subscribers/form.jsx b/assets/js/src/subscribers/form.jsx index 063742b08c..0a4e2ff258 100644 --- a/assets/js/src/subscribers/form.jsx +++ b/assets/js/src/subscribers/form.jsx @@ -149,15 +149,15 @@ function beforeFormContent(subscriber) { return (

    { ReactStringReplace( - MailPoet.I18n.t('WPUserEditNotice'), - /\[link\](.*?)\[\/link\]/g, - (match, i) => ( - { match } - ) + MailPoet.I18n.t('WPUserEditNotice'), + /\[link\](.*?)\[\/link\]/g, + (match, i) => ( + { match } ) + ) }

    ); diff --git a/assets/js/src/subscribers/importExport/export.js b/assets/js/src/subscribers/importExport/export.js index 1266609c2b..e1f017411c 100644 --- a/assets/js/src/subscribers/importExport/export.js +++ b/assets/js/src/subscribers/importExport/export.js @@ -5,149 +5,149 @@ define( 'mailpoet', 'handlebars' ], - function exportSubscribers( - _, - jQuery, - MailPoet, - Handlebars - ) { - if (!jQuery('#mailpoet_subscribers_export').length) { - return; - } - jQuery(document).ready(function documentReady() { - var segmentsContainerElement; - var subscriberFieldsContainerElement; - var nextStepButton; - var renderSegmentsAndFields; - var subscribersExportTemplate; - if (!window.exportData.segments) { - return; - } - subscribersExportTemplate = + function exportSubscribers( + _, + jQuery, + MailPoet, + Handlebars + ) { + if (!jQuery('#mailpoet_subscribers_export').length) { + return; + } + jQuery(document).ready(function documentReady() { + var segmentsContainerElement; + var subscriberFieldsContainerElement; + var nextStepButton; + var renderSegmentsAndFields; + var subscribersExportTemplate; + if (!window.exportData.segments) { + return; + } + subscribersExportTemplate = Handlebars.compile(jQuery('#mailpoet_subscribers_export_template').html()); - // render template - jQuery('#mailpoet_subscribers_export > div.inside').html(subscribersExportTemplate(window.exportData)); + // render template + jQuery('#mailpoet_subscribers_export > div.inside').html(subscribersExportTemplate(window.exportData)); - function toggleNextStepButton(condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - nextStepButton.removeClass(disabled); - } else { - nextStepButton.addClass(disabled); - } - } + function toggleNextStepButton(condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + nextStepButton.removeClass(disabled); + } else { + nextStepButton.addClass(disabled); + } + } - // define reusable variables - segmentsContainerElement = jQuery('#export_lists'); - subscriberFieldsContainerElement = jQuery('#export_columns'); - nextStepButton = jQuery('a.mailpoet_export_process'); - renderSegmentsAndFields = function renderSegmentsFields(container, data) { - if (container.data('select2')) { - container - .html('') - .select2('destroy'); - } - container - .select2({ - data: data, - width: '20em', - templateResult: function templateResult(item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' - : item.name; - }, - templateSelection: function templateSelection(item) { - return (item.subscriberCount > 0) - ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' - : item.name; - } - }) - .on('select2:selecting', function onSelect2Selecting(selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.args.data.id; - var fieldsToExclude = [ - 'select', - 'deselect' - ]; - var allOptions; - if (_.contains(fieldsToExclude, selectedOptionId)) { - selectEvent.preventDefault(); - if (selectedOptionId === 'deselect') { - jQuery(selectElement).val('').trigger('change'); - } else { - allOptions = []; - _.each(container.find('option'), function eachOption(field) { - if (!_.contains(fieldsToExclude, field.value)) { - allOptions.push(field.value); - } - }); - jQuery(selectElement).val(allOptions).trigger('change'); - } - jQuery(selectElement).select2('close'); - } - }) - .on('change', function onCHange() { - if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) + // define reusable variables + segmentsContainerElement = jQuery('#export_lists'); + subscriberFieldsContainerElement = jQuery('#export_columns'); + nextStepButton = jQuery('a.mailpoet_export_process'); + renderSegmentsAndFields = function renderSegmentsFields(container, data) { + if (container.data('select2')) { + container + .html('') + .select2('destroy'); + } + container + .select2({ + data: data, + width: '20em', + templateResult: function templateResult(item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' + : item.name; + }, + templateSelection: function templateSelection(item) { + return (item.subscriberCount > 0) + ? item.name + ' (' + parseInt(item.subscriberCount, 10).toLocaleString() + ')' + : item.name; + } + }) + .on('select2:selecting', function onSelect2Selecting(selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; + var fieldsToExclude = [ + 'select', + 'deselect' + ]; + var allOptions; + if (_.contains(fieldsToExclude, selectedOptionId)) { + selectEvent.preventDefault(); + if (selectedOptionId === 'deselect') { + jQuery(selectElement).val('').trigger('change'); + } else { + allOptions = []; + _.each(container.find('option'), function eachOption(field) { + if (!_.contains(fieldsToExclude, field.value)) { + allOptions.push(field.value); + } + }); + jQuery(selectElement).val(allOptions).trigger('change'); + } + jQuery(selectElement).select2('close'); + } + }) + .on('change', function onCHange() { + if ((window.exportData.segments && segmentsContainerElement.select2('data').length && subscriberFieldsContainerElement.select2('data').length) || (!window.exportData.segments && subscriberFieldsContainerElement.select2('data').length) - ) { - toggleNextStepButton('on'); - } else { - toggleNextStepButton('off'); - } - }); - }; + ) { + toggleNextStepButton('on'); + } else { + toggleNextStepButton('off'); + } + }); + }; - renderSegmentsAndFields(subscriberFieldsContainerElement, window.subscriberFieldsSelect2); - renderSegmentsAndFields(segmentsContainerElement, window.segments); + renderSegmentsAndFields(subscriberFieldsContainerElement, window.subscriberFieldsSelect2); + renderSegmentsAndFields(segmentsContainerElement, window.segments); - subscriberFieldsContainerElement.val([ - 'email', - 'first_name', - 'last_name', - 'list_status', - 'global_status' - ]).trigger('change'); + subscriberFieldsContainerElement.val([ + 'email', + 'first_name', + 'last_name', + 'list_status', + 'global_status' + ]).trigger('change'); - nextStepButton.click(function nextClick() { - var exportFormat; - if (jQuery(this).hasClass('button-disabled')) { - return; - } - MailPoet.Modal.loading(true); - exportFormat = jQuery(':radio[name="option_format"]:checked').val(); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'processExport', - data: JSON.stringify({ - export_format_option: exportFormat, - segments: (window.exportData.segments) ? segmentsContainerElement.val() : false, - subscriber_fields: subscriberFieldsContainerElement.val() - }) - }).always(function always() { - MailPoet.Modal.loading(false); - }).done(function done(response) { - var resultMessage = MailPoet.I18n.t('exportMessage') - .replace('%1$s', '' + parseInt(response.data.totalExported, 133).toLocaleString() + '') - .replace('[link]', '') - .replace('[/link]', ''); - jQuery('#export_result_notice').html('

    ' + resultMessage + '

    ').show(); - window.location.href = response.data.exportFileURL; - MailPoet.trackEvent('Subscribers export completed', { - 'Total exported': response.data.totalExported, - 'File Format': exportFormat, - 'MailPoet Free version': window.mailpoet_version - }); - }).fail(function fail(response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( + nextStepButton.click(function nextClick() { + var exportFormat; + if (jQuery(this).hasClass('button-disabled')) { + return; + } + MailPoet.Modal.loading(true); + exportFormat = jQuery(':radio[name="option_format"]:checked').val(); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'processExport', + data: JSON.stringify({ + export_format_option: exportFormat, + segments: (window.exportData.segments) ? segmentsContainerElement.val() : false, + subscriber_fields: subscriberFieldsContainerElement.val() + }) + }).always(function always() { + MailPoet.Modal.loading(false); + }).done(function done(response) { + var resultMessage = MailPoet.I18n.t('exportMessage') + .replace('%1$s', '' + parseInt(response.data.totalExported, 133).toLocaleString() + '') + .replace('[link]', '') + .replace('[/link]', ''); + jQuery('#export_result_notice').html('

    ' + resultMessage + '

    ').show(); + window.location.href = response.data.exportFileURL; + MailPoet.trackEvent('Subscribers export completed', { + 'Total exported': response.data.totalExported, + 'File Format': exportFormat, + 'MailPoet Free version': window.mailpoet_version + }); + }).fail(function fail(response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( response.errors.map(function mapError(error) { return error.message; }), { scroll: true } ); - } - }); - }); - }); - }); + } + }); + }); + }); + }); diff --git a/assets/js/src/subscribers/importExport/import.js b/assets/js/src/subscribers/importExport/import.js index 2a96f26b41..087bed22ef 100644 --- a/assets/js/src/subscribers/importExport/import.js +++ b/assets/js/src/subscribers/importExport/import.js @@ -10,885 +10,283 @@ define( 'asyncqueue', 'moment' ], - function ( - Backbone, - _, - jQuery, - MailPoet, - Handlebars, - Papa, - AsyncQueue, - Moment - ) { - if (!jQuery('#mailpoet_subscribers_import').length) { - return; - } - jQuery(document).ready(function () { - var router; - jQuery('input[name="select_method"]').attr('checked', false); - // configure router - router = new (Backbone.Router.extend({ - routes: { - '': 'home', - step1: 'step1', - step2: 'step2', - step3: 'step3' - }, - home: function () { - this.navigate('step1', { trigger: true }); - } - }))(); - - function showCurrentStep() { - MailPoet.Notice.hide(); - MailPoet.Modal.loading(false); - jQuery('#mailpoet_subscribers_import > div[id^="step"]').hide(); - jQuery(location.hash).show(); + function ( + Backbone, + _, + jQuery, + MailPoet, + Handlebars, + Papa, + AsyncQueue, + Moment + ) { + if (!jQuery('#mailpoet_subscribers_import').length) { + return; + } + jQuery(document).ready(function () { + var router; + jQuery('input[name="select_method"]').attr('checked', false); + // configure router + router = new (Backbone.Router.extend({ + routes: { + '': 'home', + step1: 'step1', + step2: 'step2', + step3: 'step3' + }, + home: function () { + this.navigate('step1', { trigger: true }); } + }))(); - /* + function showCurrentStep() { + MailPoet.Notice.hide(); + MailPoet.Modal.loading(false); + jQuery('#mailpoet_subscribers_import > div[id^="step"]').hide(); + jQuery(location.hash).show(); + } + + /* * STEP 1 (upload or copy/paste) */ - router.on('route:step1', function () { - var methodProcessContainerTemplate; - var currentStepE; - var methodSelectionElement; - var pasteInputElement; - var pasteInputPlaceholderElement; - var pasteProcessButtonElement; - var mailChimpKeyInputElement; - var mailChimpKeyVerifyButtonElement; - var mailChimpListsContainerElement; - var mailChimpProcessButtonElement; - var uploadElement; - var uploadProcessButtonElement; - // set or reset temporary validation rule on all columns - window.mailpoetColumns = jQuery.map(window.mailpoetColumns, function (column) { - var col = column; - col.validation_rule = false; - return col; - }); + router.on('route:step1', function () { + var methodProcessContainerTemplate; + var currentStepE; + var methodSelectionElement; + var pasteInputElement; + var pasteInputPlaceholderElement; + var pasteProcessButtonElement; + var mailChimpKeyInputElement; + var mailChimpKeyVerifyButtonElement; + var mailChimpListsContainerElement; + var mailChimpProcessButtonElement; + var uploadElement; + var uploadProcessButtonElement; + // set or reset temporary validation rule on all columns + window.mailpoetColumns = jQuery.map(window.mailpoetColumns, function (column) { + var col = column; + col.validation_rule = false; + return col; + }); - if (typeof (window.importData.step1) !== 'undefined') { - showCurrentStep(); - return; - } + if (typeof (window.importData.step1) !== 'undefined') { + showCurrentStep(); + return; + } - // render process button for each method - methodProcessContainerTemplate = + // render process button for each method + methodProcessContainerTemplate = Handlebars.compile(jQuery('#method_process_template').html()); - jQuery('.mailpoet_method_process').html(methodProcessContainerTemplate()); + jQuery('.mailpoet_method_process').html(methodProcessContainerTemplate()); - // define reusable variables - currentStepE = jQuery(location.hash); - methodSelectionElement = jQuery('#select_method'); - pasteInputElement = jQuery('#paste_input'); - pasteInputPlaceholderElement = + // define reusable variables + currentStepE = jQuery(location.hash); + methodSelectionElement = jQuery('#select_method'); + pasteInputElement = jQuery('#paste_input'); + pasteInputPlaceholderElement = pasteInputElement.data('placeholder').replace(/\\n/g, '\n'); - pasteProcessButtonElement = + 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 = + 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'); - // define method change behavior - methodSelectionElement.change(function () { - var availableMethods = jQuery(':radio[name="select_method"]'); - var selectedMethod = availableMethods.index(availableMethods.filter(':checked')); - MailPoet.Notice.hide(); - // hide all methods - currentStepE.find('.inside') - .children('div[id^="method_"]') - .hide(); - // show selected method - currentStepE.find('.inside') - .children('div[id^="method_"]:eq(' + selectedMethod + ')') - .show() - .find('table') - .show(); - }); + // define method change behavior + methodSelectionElement.change(function () { + var availableMethods = jQuery(':radio[name="select_method"]'); + var selectedMethod = availableMethods.index(availableMethods.filter(':checked')); + MailPoet.Notice.hide(); + // hide all methods + currentStepE.find('.inside') + .children('div[id^="method_"]') + .hide(); + // show selected method + currentStepE.find('.inside') + .children('div[id^="method_"]:eq(' + selectedMethod + ')') + .show() + .find('table') + .show(); + }); - // start step 1 - showCurrentStep(); + // start step 1 + showCurrentStep(); - function toggleNextStepButton(element, condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - element.closest('table a').removeClass(disabled); - return; - } - element.closest('table a').addClass(disabled); + function toggleNextStepButton(element, condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + element.closest('table a').removeClass(disabled); + return; } + element.closest('table a').addClass(disabled); + } - function parseCSV(isFile) { - 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(); - } + function parseCSV(isFile) { + 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(); + } - // validate email - if (!window.mailpoet_email_regex.test(email)) { - return false; - } - return email; - }; + // validate email + if (!window.mailpoet_email_regex.test(email)) { + return false; + } + return email; + }; - return { - skipEmptyLines: true, - delimiter: advancedOptionDelimiter, - newline: advancedOptionNewline, - comments: advancedOptionComments, - error: function () { - MailPoet.Notice.hide(); - MailPoet.Notice.error(MailPoet.I18n.t('dataProcessingError')); - }, - complete: function (CSV) { - var email; - var emailAddress; - var rowData; - var rowColumnCount; - var errorNotice; - Object.keys(CSV.data).forEach(function csvDataEach(rowCount) { - rowData = CSV.data[rowCount].map(function (el) { - return el.trim(); - }); - rowColumnCount = rowData.length; - // set the number of row elements based on the first non-empty row - if (columnCount === null) { - columnCount = rowColumnCount; - } - // Process the row with the following assumptions: - // 1. Each row should contain the same number of elements - // 2. There should be at least 1 valid (as per HTML5 e-mail regex) - // e-mail address on each row EXCEPT when the header option is set to true - // 3. Duplicate addresses are skipped - if (rowColumnCount === columnCount) { - // determine position of email address inside an array; this is - // done once and then email regex is run just on that element for each row - if (emailColumnPosition === null) { - Object.keys(rowData).forEach(function rowDataEach(column) { - emailAddress = detectAndCleanupEmail(rowData[column]); - if (emailColumnPosition === null - && window.mailpoet_email_regex.test(emailAddress)) { - emailColumnPosition = column; - // add current e-mail to an object index - parsedEmails[emailAddress] = true; - rowData[column] = emailAddress; - processedSubscribers[emailAddress] = rowData; - } - }); + return { + skipEmptyLines: true, + delimiter: advancedOptionDelimiter, + newline: advancedOptionNewline, + comments: advancedOptionComments, + error: function () { + MailPoet.Notice.hide(); + MailPoet.Notice.error(MailPoet.I18n.t('dataProcessingError')); + }, + complete: function (CSV) { + var email; + var emailAddress; + var rowData; + var rowColumnCount; + var errorNotice; + Object.keys(CSV.data).forEach(function csvDataEach(rowCount) { + rowData = CSV.data[rowCount].map(function (el) { + return el.trim(); + }); + rowColumnCount = rowData.length; + // set the number of row elements based on the first non-empty row + if (columnCount === null) { + columnCount = rowColumnCount; + } + // Process the row with the following assumptions: + // 1. Each row should contain the same number of elements + // 2. There should be at least 1 valid (as per HTML5 e-mail regex) + // e-mail address on each row EXCEPT when the header option is set to true + // 3. Duplicate addresses are skipped + if (rowColumnCount === columnCount) { + // determine position of email address inside an array; this is + // done once and then email regex is run just on that element for each row + if (emailColumnPosition === null) { + Object.keys(rowData).forEach(function rowDataEach(column) { + emailAddress = detectAndCleanupEmail(rowData[column]); if (emailColumnPosition === null + && window.mailpoet_email_regex.test(emailAddress)) { + emailColumnPosition = column; + // add current e-mail to an object index + parsedEmails[emailAddress] = true; + rowData[column] = emailAddress; + processedSubscribers[emailAddress] = rowData; + } + }); + if (emailColumnPosition === null && advancedOptionHeader && parseInt(rowCount, 10) === 0) { - isHeaderFound = true; - processedSubscribers[0] = rowData; - } - } else if (rowData[emailColumnPosition] !== '') { - email = detectAndCleanupEmail(rowData[emailColumnPosition]); - if (_.has(parsedEmails, email)) { - duplicateEmails.push(email); - } else if (!window.mailpoet_email_regex.test(email)) { - invalidEmails.push(rowData[emailColumnPosition]); - } else { - // if we haven't yet processed this e-mail and it passed - // the regex test, then process the row - parsedEmails[email] = true; - rowData[emailColumnPosition] = email; - processedSubscribers[email] = rowData; - } + isHeaderFound = true; + processedSubscribers[0] = rowData; + } + } else if (rowData[emailColumnPosition] !== '') { + email = detectAndCleanupEmail(rowData[emailColumnPosition]); + if (_.has(parsedEmails, email)) { + duplicateEmails.push(email); + } else if (!window.mailpoet_email_regex.test(email)) { + invalidEmails.push(rowData[emailColumnPosition]); + } else { + // if we haven't yet processed this e-mail and it passed + // the regex test, then process the row + parsedEmails[email] = true; + rowData[emailColumnPosition] = email; + processedSubscribers[email] = rowData; } } - }); - // reindex array to avoid non-numeric indices - processedSubscribers = _.values(processedSubscribers); - // if the header options is set, there should be at least - // 2 data rows, otherwise at least 1 data row - if ( - processedSubscribers && + } + }); + // reindex array to avoid non-numeric indices + processedSubscribers = _.values(processedSubscribers); + // if the header options is set, there should be at least + // 2 data rows, otherwise at least 1 data row + if ( + processedSubscribers && ( (isHeaderFound && processedSubscribers.length >= 2) || (!isHeaderFound && processedSubscribers.length >= 1) ) - ) { - // since we assume that the header line is always present, we need - // to detect the header by checking if it contains a valid e-mail address - window.importData.step1 = { - header: (!window.mailpoet_email_regex.test( - processedSubscribers[0][emailColumnPosition]) - ) ? processedSubscribers.shift() : null, - subscribers: processedSubscribers, - subscribersCount: processedSubscribers.length, - duplicate: duplicateEmails, - invalid: invalidEmails - }; - MailPoet.trackEvent('Subscribers import started', { - source: isFile ? 'file upload' : 'pasted data', - 'MailPoet Free version': window.mailpoet_version - }); - router.navigate('step2', { trigger: true }); - } else { - MailPoet.Modal.loading(false); - errorNotice = MailPoet.I18n.t('noValidRecords'); - errorNotice = errorNotice.replace('[link]', MailPoet.I18n.t('csvKBLink')); - errorNotice = errorNotice.replace('[/link]', ''); - MailPoet.Notice.error(errorNotice); - } - } - }; - } - - function displayMailChimpLists(data) { - var listSelectElement = mailChimpListsContainerElement.find('select'); - if (listSelectElement.data('select2')) { - listSelectElement.select2('data', data); - listSelectElement.trigger('change'); - } else { - listSelectElement - .select2({ - data: data, - width: '20em', - templateResult: function (item) { - return item.name; - }, - templateSelection: function (item) { - return item.name; - } - }) - .change(function () { - if (jQuery(this).val() !== null) { - toggleNextStepButton(mailChimpProcessButtonElement, 'on'); - } else { - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } - }) - .trigger('change'); - } - mailChimpListsContainerElement.show(); - } - - /* - * Paste - */ - pasteInputElement - .attr('value', pasteInputPlaceholderElement).css('color', '#999') - .focus(function () { - if (jQuery(this).val() === pasteInputPlaceholderElement) { - jQuery(this).attr('value', '').css('color', '#222'); - } - }) - .blur(function () { - if (jQuery(this).val() === '') { - jQuery(this).attr('value', pasteInputPlaceholderElement).css('color', '#999'); - } - }) - .keyup(function () { - toggleNextStepButton( - pasteProcessButtonElement, - (this.value.trim() !== '') ? 'on' : 'off' - ); - }); - - pasteProcessButtonElement.click(function () { - var pasteSize = encodeURI(pasteInputElement.val()).split(/%..|./).length - 1; - MailPoet.Notice.hide(); - // get an approximate size of textarea paste in bytes - if (pasteSize > window.maxPostSizeBytes) { - MailPoet.Notice.error(MailPoet.I18n.t('maxPostSizeNotice')); - return; - } - // delay loading indicator for 10ms or else it's just too fast :) - MailPoet.Modal.loading(true); - setTimeout(function () { - Papa.parse(pasteInputElement.val(), parseCSV(false)); - }, 10); - }); - - /* - * CSV file - */ - uploadElement.change(function () { - var ext = this.value.match(/[^.]+$/); - MailPoet.Notice.hide(); - if (ext === null || ext[0].toLowerCase() !== 'csv') { - this.value = ''; - MailPoet.Notice.error(MailPoet.I18n.t('wrongFileFormat')); - } - - toggleNextStepButton( - uploadProcessButtonElement, - (this.value.trim() !== '') ? 'on' : 'off' - ); - }); - - uploadProcessButtonElement.click(function () { - if (uploadElement.val().trim() !== '') { - // delay loading indicator for 10ms or else it's just too fast :) - MailPoet.Modal.loading(true); - setTimeout(function () { - uploadElement.parse({ - config: parseCSV(true) - }); - }, 10); - } - }); - - /* - * MailChimp - */ - mailChimpKeyInputElement.keyup(function () { - if (this.value.trim() === '' - || !/[a-zA-Z0-9]{32}-/.exec(this.value.trim())) { - mailChimpListsContainerElement.hide(); - jQuery('.mailpoet_mailchimp-key-status') - .html('') - .removeClass('mailpoet_mailchimp-ok mailpoet_mailchimp-error'); - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } - }); - - mailChimpKeyVerifyButtonElement.click(function () { - MailPoet.Modal.loading(true); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'importExport', - action: 'getMailChimpLists', - data: { - api_key: mailChimpKeyInputElement.val() - } - }).always(function () { - MailPoet.Modal.loading(false); - }).done(function (response) { - jQuery('.mailpoet_mailchimp-key-status') - .html('') - .removeClass() - .addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok'); - if (response.data.length === 0) { - jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists')); - mailChimpListsContainerElement.hide(); - toggleNextStepButton(mailChimpProcessButtonElement, 'off'); - } else { - displayMailChimpLists(response.data); - } - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - }); - - mailChimpProcessButtonElement.click(function () { - if (mailChimpProcessButtonElement.closest('table a').hasClass('button-disabled')) { - return; - } - MailPoet.Modal.loading(true); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'importExport', - action: 'getMailChimpSubscribers', - data: { - api_key: mailChimpKeyInputElement.val(), - lists: mailChimpListsContainerElement.find('select').val() - } - }).always(function () { - MailPoet.Modal.loading(false); - }).done(function (response) { - window.importData.step1 = response.data; - MailPoet.trackEvent('Subscribers import started', { - source: 'MailChimp', - 'MailPoet Free version': window.mailpoet_version - }); - router.navigate('step2', { trigger: true }); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - }); - }); - - router.on('route:step2', function () { - var nextStepButton; - var previousStepButton; - var subscribers; - var subscribersDataTemplate; - var subscribersDataTemplatePartial; - var subscribersDataParseResultsTemplate; - var segmentSelectElement; - var maxRowsToShow; - var filler; - var fillerArray; - var fillerPosition; - var importResults; - var duplicates; - if (typeof (window.importData.step1) === 'undefined') { - router.navigate('step1', { trigger: true }); - return; - } - // define reusable variables - nextStepButton = jQuery('#step2_process'); - 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 = '. . .'; - // 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); - - showCurrentStep(); - - function toggleNextStepButton(condition) { - var disabled = 'button-disabled'; - if (condition === 'on') { - nextStepButton.removeClass(disabled); - return; - } - nextStepButton.addClass(disabled); - } - - // hide previous statistics/import results - jQuery('#subscribers_data_parse_results:visible').html(''); - jQuery('#subscribers_data_import_results:visible').hide(); - - // show parse statistics if any duplicate/invalid records were found - if (subscribers.invalid.length || subscribers.duplicate.length) { - // count repeating e-mails inside duplicate array and present them in - // 'email (xN)' format - duplicates = {}; - subscribers.duplicate.forEach(function (subscriberEmail) { - duplicates[subscriberEmail] = (duplicates[subscriberEmail] || 0) + 1; - }); - subscribers.duplicate = []; - Object.keys(duplicates).forEach(function emailDuplicates(email) { - if (duplicates[email] > 1) { - subscribers.duplicate.push(email + ' (x' + duplicates[email] + ')'); - } else { - subscribers.duplicate.push(email); - } - }); - - importResults = { - notice: MailPoet.I18n.t('importNoticeSkipped').replace( - '%1$s', - '' + (subscribers.invalid.length + subscribers.duplicate.length) + '' - ), - invalid: (subscribers.invalid.length) - ? MailPoet.I18n.t('importNoticeInvalid') - .replace('%1$s', '' + subscribers.invalid.length.toLocaleString() + '') - .replace('%2$s', subscribers.invalid.join(', ')) - : null, - duplicate: (subscribers.duplicate.length) - ? MailPoet.I18n.t('importNoticeDuplicate') - .replace('%1$s', '' + subscribers.duplicate.length + '') - .replace('%2$s', subscribers.duplicate.join(', ')) - : null - }; - jQuery('#subscribers_data_parse_results').html( - subscribersDataParseResultsTemplate(importResults) - ); - } - - jQuery('.mailpoet_subscribers_data_parse_results_details_show') - .click(function () { - var details = jQuery('.mailpoet_subscribers_data_parse_results_details'); - jQuery(details).toggle(); - this.text = - (jQuery(details).is(':visible')) - ? MailPoet.I18n.t('hideDetails') - : MailPoet.I18n.t('showDetails'); - }); - - // show available segments - if (window.mailpoetSegments.length) { - jQuery('.mailpoet_segments').show(); - } else { - jQuery('.mailpoet_no_segments').show(); - } - - function enableSegmentSelection(segments) { - if (segmentSelectElement.data('select2')) { - segmentSelectElement - .html('') - .select2('destroy'); - toggleNextStepButton('off'); - } - segmentSelectElement - .select2({ - data: segments, - width: '20em', - templateResult: function (item) { - var i = item; - i.subscriberCount = parseInt(i.subscriberCount, 10); - return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; - }, - templateSelection: function (item) { - var i = item; - i.subscriberCount = parseInt(i.subscriberCount, 10); - return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; - } - }) - .change(function () { - var segmentSelectionNotice = jQuery('[data-id="notice_segmentSelection"]'); - if (!this.value) { - if (!segmentSelectionNotice.length) { - MailPoet.Notice.error(MailPoet.I18n.t('segmentSelectionRequired'), { - static: true, - scroll: true, - id: 'notice_segmentSelection', - hideClose: true - }); - } - toggleNextStepButton('off'); - } else { - jQuery('[data-id="notice_segmentSelection"]').remove(); - if (!jQuery('.mailpoet_notice.error:visible').length) { - toggleNextStepButton('on'); - } - } - }); - } - - jQuery('.mailpoet_create_segment').click(function () { - MailPoet.Modal.popup({ - title: MailPoet.I18n.t('addNewList'), - template: jQuery('#new_segment_template').html() - }); - jQuery('#new_segment_name').keypress(function (e) { - if (e.which === 13) { - jQuery('#new_segment_process').click(); - } - }); - jQuery('#new_segment_process').click(function () { - var segmentName = jQuery('#new_segment_name').val().trim(); - var segmentDescription = jQuery('#new_segment_description').val().trim(); - - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'addSegment', - data: { - name: segmentName, - description: segmentDescription - } - }).done(function (response) { - var selectedValues; - window.mailpoetSegments.push({ - id: response.data.id, - name: response.data.name, - subscriberCount: 0 - }); - - selectedValues = segmentSelectElement.val(); - if (selectedValues === null) { - selectedValues = [response.data.id]; - } else { - selectedValues.push(response.data.id); - } - - enableSegmentSelection(window.mailpoetSegments); - segmentSelectElement.val(selectedValues).trigger('change'); - jQuery('.mailpoet_segments:hidden').show(); - jQuery('.mailpoet_no_segments:visible').hide(); - MailPoet.Modal.close(); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.hide(); - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { positionAfter: '#new_segment_name' } - ); - } - }); - }); - jQuery('#new_segment_cancel').click(function () { - MailPoet.Modal.close(); - }); - }); - - // register partial template that will contain subscribers data - Handlebars.registerPartial( - 'subscribers_data_template_partial', - subscribersDataTemplatePartial - ); - - // autodetect column types - Handlebars.registerHelper( - 'show_and_match_columns', - function (helperSubscribers, options) { - var displayedColumns = []; - var displayedColumnsIds = []; - var columnData; - var columnId; - var headerName; - var headerNameMatch; - // go through all elements of the first row in subscribers data - Object - .keys(helperSubscribers.subscribers[0]) - .forEach(function helperSubscribersLoop(i) { - columnData = helperSubscribers.subscribers[0][i]; - 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.mailpoet_email_regex.test(columnData)) { - columnId = 'email'; - } else if (helperSubscribers.header) { - headerName = helperSubscribers.header[i]; - headerNameMatch = window.mailpoetColumns.map(function (el) { - return el.name; - }).indexOf(headerName); - // set column type using header - if (headerNameMatch !== -1) { - columnId = window.mailpoetColumns[headerNameMatch].id; - } else if (headerName) { // set column type using header name - if (/first|first name|given name/i.test(headerName)) { - columnId = 'first_name'; - } else if (/last|last name/i.test(headerName)) { - columnId = 'last_name'; - } - } - } - // make sure the column id has not been previously selected - // (e.g., subscriber_first_name shouldn't be autodetected twice), - // except for "ignore" - columnId = - (columnId !== 'ignore' - && displayedColumnsIds.indexOf(columnId) === -1) - ? columnId - : 'ignore'; - displayedColumns[i] = { column_id: columnId }; - displayedColumnsIds.push(columnId); - }); - return options.fn(displayedColumns); - }); - - // sanitize unsafe data - Handlebars.registerHelper('sanitize_data', function (data) { - return (data instanceof Handlebars.SafeString) ? - data : - new Handlebars.SafeString(Handlebars.Utils.escapeExpression(data)); - }); - - // start array index from 1 - Handlebars.registerHelper('calculate_index', function (rawIndex) { - var index = parseInt(rawIndex, 10); - // display filler data (e.g., ellipsis) if we've reached the maximum number of rows and - // subscribers count is greater than the maximum number of rows we're displaying - if (index === maxRowsToShow && subscribers.subscribersCount > (maxRowsToShow + 1)) { - fillerPosition = index; - return filler; - } else if (index === (subscribers.subscribers.length - 1)) { - // if we're on the last line, show the total count of subscribers data - return subscribers.subscribersCount.toLocaleString(); - } - return index + 1; - }); - - // reduce subscribers object if the total length is greater than the - // maximum number of defined rows - if (subscribers.subscribersCount > (maxRowsToShow + 1)) { - subscribers.subscribers.splice( - maxRowsToShow, subscribers.subscribersCount - (maxRowsToShow + 1), - fillerArray - ); - } - - // filter subscribers' data to detect dates, emails, etc. - function filterSubscribers() { - var subscribersClone = jQuery.extend(true, {}, subscribers); - var preventNextStep = false; - var displayedColumns; - jQuery( - '[data-id="notice_invalidEmail"], [data-id="notice_invalidDate"]') - .remove(); - 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 + ) { + // since we assume that the header line is always present, we need + // to detect the header by checking if it contains a valid e-mail address + window.importData.step1 = { + header: (!window.mailpoet_email_regex.test( + processedSubscribers[0][emailColumnPosition]) + ) ? processedSubscribers.shift() : null, + subscribers: processedSubscribers, + subscribersCount: processedSubscribers.length, + duplicate: duplicateEmails, + invalid: invalidEmails }; - }); - // iterate through the object of mailpoet columns - jQuery.map(window.mailpoetColumns, function (column) { - var firstRowData; - var validationRule; - var testedFormat; - var allowedDateFormats; - // check if the column id matches the selected id of one of the - // subscriber's data columns - var matchedColumn = _.find( - displayedColumns, - function (data) { return data.id === column.id; } - ); - // EMAIL filter: if the first value in the column doesn't have a valid - // email, hide the next button - if (column.id === 'email') { - if (!window.mailpoet_email_regex.test( - subscribersClone.subscribers[0][matchedColumn.index]) - ) { - preventNextStep = true; - if (!jQuery('[data-id="notice_invalidEmail"]').length) { - MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidElement'), { - static: true, - scroll: true, - hideClose: true, - id: 'invalidEmail' - }); - } - } else { - MailPoet.Notice.hide('invalidEmail'); - } - } - // DATE filter: if column type is date, check if we can recognize it - if (column.type === 'date' && matchedColumn) { - allowedDateFormats = [ - Moment.ISO_8601, - 'YYYY/MM/DD', - 'MM/DD/YYYY', - 'DD/MM/YYYY', - 'YYYY/MM/DD', - 'YYYY/DD/MM', - 'MM/YYYY', - 'YYYY/MM', - 'YYYY' - ]; - firstRowData = subscribersClone.subscribers[0][matchedColumn.index]; - validationRule = false; - // check if date exists - if (firstRowData.trim() === '') { - subscribersClone.subscribers[0][matchedColumn.index] = - '' - + MailPoet.I18n.t('emptyFirstRowDate') - + ' '; - preventNextStep = true; - } else { - Object.keys(allowedDateFormats).forEach(function allowedDateFormatsLoop(format) { - testedFormat = allowedDateFormats[format]; - if (Moment(firstRowData, testedFormat, true).isValid()) { - validationRule = (typeof (testedFormat) === 'function') ? - 'datetime' : - testedFormat; - // set validation on the column element - jQuery(matchedColumn.element).data('validation-rule', validationRule); - return; - } - if (validationRule === 'datetime') { - validationRule = Moment.ISO_8601; - } - }); - } - jQuery.map(subscribersClone.subscribers, function (dataSubscribers, index) { - var data = dataSubscribers; - var rowData = data[matchedColumn.index]; - var date = Moment(rowData, testedFormat, true); - if (index === fillerPosition || rowData.trim() === '') return; - // validate date - if (date.isValid()) { - data[matchedColumn.index] = new Handlebars.SafeString( - Handlebars.Utils.escapeExpression(data[matchedColumn.index]) - + '' - + MailPoet.Date.format(date) - + ' ' - ); - } else { - data[matchedColumn.index] = new Handlebars.SafeString( - Handlebars.Utils.escapeExpression(data[matchedColumn.index]) - + '' - + (new Handlebars.SafeString(MailPoet.I18n.t('dateMatchError'))) - + ' ' - ); - preventNextStep = true; - } + MailPoet.trackEvent('Subscribers import started', { + source: isFile ? 'file upload' : 'pasted data', + 'MailPoet Free version': window.mailpoet_version }); - if (preventNextStep && !jQuery('.mailpoet_invalidDate').length) { - MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidDate'), { - static: true, - scroll: true, - hideClose: true, - id: 'invalidDate' - }); - } + router.navigate('step2', { trigger: true }); + } else { + MailPoet.Modal.loading(false); + errorNotice = MailPoet.I18n.t('noValidRecords'); + errorNotice = errorNotice.replace('[link]', MailPoet.I18n.t('csvKBLink')); + errorNotice = errorNotice.replace('[/link]', ''); + MailPoet.Notice.error(errorNotice); } - }); - // refresh table with susbcribers' data - jQuery('#subscribers_data > table > tbody') - .html(subscribersDataTemplatePartial(subscribersClone)); - - if (preventNextStep) { - toggleNextStepButton('off'); - } else if (!jQuery('.mailpoet_notice.error:visible').length - && segmentSelectElement.val()) { - toggleNextStepButton('on'); } - } + }; + } - // render template - jQuery('#subscribers_data > table').html(subscribersDataTemplate(subscribers)); - - // filter displayed data - jQuery('select.mailpoet_subscribers_column_data_match') + function displayMailChimpLists(data) { + var listSelectElement = mailChimpListsContainerElement.find('select'); + if (listSelectElement.data('select2')) { + listSelectElement.select2('data', data); + listSelectElement.trigger('change'); + } else { + listSelectElement .select2({ - data: window.mailpoetColumnsSelect2, - width: '15em', + data: data, + width: '20em', templateResult: function (item) { return item.name; }, @@ -896,275 +294,877 @@ define( return item.name; } }) - .on('select2:selecting', function (selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.args.data.id; - // CREATE CUSTOM FIELD - if (selectedOptionId === 'create') { - selectEvent.preventDefault(); - jQuery(selectElement).select2('close'); - MailPoet.Modal.popup({ - title: MailPoet.I18n.t('addNewField'), - template: jQuery('#form_template_field_form').html() - }); - jQuery('#form_field_new').parsley().on('form:submit', function () { - // get data - var data = jQuery(this.$element).mailpoetSerializeObject(); - - // save custom field - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'customFields', - action: 'save', - data: data - }).done(function (response) { - var newColumnData = { - id: response.data.id, - name: response.data.name, - type: response.data.type, - params: response.data.params, - custom: true - }; - // if this is the first custom column, create an "optgroup" - if (window.mailpoetColumnsSelect2.length === 2) { - window.mailpoetColumnsSelect2.push({ - name: MailPoet.I18n.t('userColumns'), - children: [] - }); - } - window.mailpoetColumnsSelect2[2].children.push(newColumnData); - window.mailpoetColumns.push(newColumnData); - jQuery('select.mailpoet_subscribers_column_data_match') - .each(function () { - jQuery(this) - .html('') - .select2('destroy') - .select2({ - data: window.mailpoetColumnsSelect2, - width: '15em', - templateResult: function (item) { - return item.name; - }, - templateSelection: function (item) { - return item.name; - } - }); - }); - jQuery(selectElement).data('column-id', newColumnData.id); - jQuery(selectElement).data('validation-rule', false); - filterSubscribers(); - // close popup - MailPoet.Modal.close(); - }).fail(function (response) { - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { positionAfter: '#field_name' } - ); - } - }); - return false; - }); + .change(function () { + if (jQuery(this).val() !== null) { + toggleNextStepButton(mailChimpProcessButtonElement, 'on'); } else { - // CHANGE COLUMN - // check for duplicate values in all select options - jQuery('select.mailpoet_subscribers_column_data_match') - .each(function () { - 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') { - if (confirm(MailPoet.I18n.t('selectedValueAlreadyMatched') + ' ' + MailPoet.I18n.t('confirmCorrespondingColumn'))) { // eslint-disable-line no-alert - jQuery(element).data('column-id', 'ignore'); - } else { - selectEvent.preventDefault(); - jQuery(selectElement).select2('close'); - } - } - }); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); } }) - .on('select2:select', function (selectEvent) { - var selectElement = this; - var selectedOptionId = selectEvent.params.data.id; - jQuery(selectElement).data('column-id', selectedOptionId); - filterSubscribers(); - }); + .trigger('change'); + } + mailChimpListsContainerElement.show(); + } - previousStepButton.off().on('click', function () { - router.navigate('step1', { trigger: true }); + /* + * Paste + */ + pasteInputElement + .attr('value', pasteInputPlaceholderElement).css('color', '#999') + .focus(function () { + if (jQuery(this).val() === pasteInputPlaceholderElement) { + jQuery(this).attr('value', '').css('color', '#222'); + } + }) + .blur(function () { + if (jQuery(this).val() === '') { + jQuery(this).attr('value', pasteInputPlaceholderElement).css('color', '#999'); + } + }) + .keyup(function () { + toggleNextStepButton( + pasteProcessButtonElement, + (this.value.trim() !== '') ? 'on' : 'off' + ); }); - nextStepButton.off().on('click', function () { - var columns = {}; - var queue = new jQuery.AsyncQueue(); - var batchNumber = 0; - var batchSize = 2000; - var timestamp = Date.now() / 1000; - var clickImportResults = { - created: 0, - updated: 0, - errors: [], - segments: [] - }; - var clickSubscribers; - var splitSubscribers; + pasteProcessButtonElement.click(function () { + var pasteSize = encodeURI(pasteInputElement.val()).split(/%..|./).length - 1; + MailPoet.Notice.hide(); + // get an approximate size of textarea paste in bytes + if (pasteSize > window.maxPostSizeBytes) { + MailPoet.Notice.error(MailPoet.I18n.t('maxPostSizeNotice')); + return; + } + // delay loading indicator for 10ms or else it's just too fast :) + MailPoet.Modal.loading(true); + setTimeout(function () { + Papa.parse(pasteInputElement.val(), parseCSV(false)); + }, 10); + }); - if (jQuery(this).hasClass('button-disabled')) { - return; - } + /* + * CSV file + */ + uploadElement.change(function () { + var ext = this.value.match(/[^.]+$/); + MailPoet.Notice.hide(); + if (ext === null || ext[0].toLowerCase() !== 'csv') { + this.value = ''; + MailPoet.Notice.error(MailPoet.I18n.t('wrongFileFormat')); + } + + toggleNextStepButton( + uploadProcessButtonElement, + (this.value.trim() !== '') ? 'on' : 'off' + ); + }); + + uploadProcessButtonElement.click(function () { + if (uploadElement.val().trim() !== '') { + // delay loading indicator for 10ms or else it's just too fast :) MailPoet.Modal.loading(true); - splitSubscribers = function (localSubscribers, size) { - return localSubscribers.reduce(function (res, item, index) { - if (index % size === 0) { - res.push([]); - } - res[res.length - 1].push(item); - return res; - }, []); - }; - clickSubscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); - - _.each(jQuery('select.mailpoet_subscribers_column_data_match'), - function (column, columnIndex) { - var columnId = jQuery(column).data('column-id'); - var validationRule = jQuery(column).data('validation-rule'); - if (columnId === 'ignore') { - return; - } - columns[columnId] = { index: columnIndex, validation_rule: validationRule }; + setTimeout(function () { + uploadElement.parse({ + config: parseCSV(true) }); + }, 10); + } + }); - _.each(clickSubscribers, function () { - queue.add(function (addQueue) { - addQueue.pause(); - MailPoet.Ajax.post({ - api_version: window.mailpoet_api_version, - endpoint: 'ImportExport', - action: 'processImport', - data: JSON.stringify({ - columns: columns, - subscribers: clickSubscribers[batchNumber], - timestamp: timestamp, - segments: segmentSelectElement.val(), - updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') - }) - }).done(function (response) { - clickImportResults.created += response.data.created; - clickImportResults.updated += response.data.updated; - clickImportResults.segments = response.data.segments; - clickImportResults.added_to_segment_with_welcome_notification = - response.data.added_to_segment_with_welcome_notification; - addQueue.run(); - }).fail(function (response) { - MailPoet.Modal.loading(false); - if (response.errors.length > 0) { - MailPoet.Notice.error( - response.errors.map(function (error) { return error.message; }), - { scroll: true } - ); - } - }); - batchNumber += 1; - }); + /* + * MailChimp + */ + mailChimpKeyInputElement.keyup(function () { + if (this.value.trim() === '' + || !/[a-zA-Z0-9]{32}-/.exec(this.value.trim())) { + mailChimpListsContainerElement.hide(); + jQuery('.mailpoet_mailchimp-key-status') + .html('') + .removeClass('mailpoet_mailchimp-ok mailpoet_mailchimp-error'); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); + } + }); + + mailChimpKeyVerifyButtonElement.click(function () { + MailPoet.Modal.loading(true); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'importExport', + action: 'getMailChimpLists', + data: { + api_key: mailChimpKeyInputElement.val() + } + }).always(function () { + MailPoet.Modal.loading(false); + }).done(function (response) { + jQuery('.mailpoet_mailchimp-key-status') + .html('') + .removeClass() + .addClass('mailpoet_mailchimp-key-status mailpoet_mailchimp-ok'); + if (response.data.length === 0) { + jQuery('.mailpoet_mailchimp-key-status').html(MailPoet.I18n.t('noMailChimpLists')); + mailChimpListsContainerElement.hide(); + toggleNextStepButton(mailChimpProcessButtonElement, 'off'); + } else { + displayMailChimpLists(response.data); + } + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + }); + + mailChimpProcessButtonElement.click(function () { + if (mailChimpProcessButtonElement.closest('table a').hasClass('button-disabled')) { + return; + } + MailPoet.Modal.loading(true); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'importExport', + action: 'getMailChimpSubscribers', + data: { + api_key: mailChimpKeyInputElement.val(), + lists: mailChimpListsContainerElement.find('select').val() + } + }).always(function () { + MailPoet.Modal.loading(false); + }).done(function (response) { + window.importData.step1 = response.data; + MailPoet.trackEvent('Subscribers import started', { + source: 'MailChimp', + 'MailPoet Free version': window.mailpoet_version }); + router.navigate('step2', { trigger: true }); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + }); + }); - queue.run(); + router.on('route:step2', function () { + var nextStepButton; + var previousStepButton; + var subscribers; + var subscribersDataTemplate; + var subscribersDataTemplatePartial; + var subscribersDataParseResultsTemplate; + var segmentSelectElement; + var maxRowsToShow; + var filler; + var fillerArray; + var fillerPosition; + var importResults; + var duplicates; + if (typeof (window.importData.step1) === 'undefined') { + router.navigate('step1', { trigger: true }); + return; + } + // define reusable variables + nextStepButton = jQuery('#step2_process'); + 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 = '. . .'; + // 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); - queue.onComplete(function () { - MailPoet.Modal.loading(false); - if ( - clickImportResults.errors.length > 0 - && !clickImportResults.updated - && !clickImportResults.created - ) { - MailPoet.Notice.error(_.flatten(clickImportResults.errors) - ); - } else { - window.mailpoetSegments = clickImportResults.segments; - clickImportResults.segments = _.map(segmentSelectElement.select2('data'), - function (data) { - return data.name; + showCurrentStep(); + + function toggleNextStepButton(condition) { + var disabled = 'button-disabled'; + if (condition === 'on') { + nextStepButton.removeClass(disabled); + return; + } + nextStepButton.addClass(disabled); + } + + // hide previous statistics/import results + jQuery('#subscribers_data_parse_results:visible').html(''); + jQuery('#subscribers_data_import_results:visible').hide(); + + // show parse statistics if any duplicate/invalid records were found + if (subscribers.invalid.length || subscribers.duplicate.length) { + // count repeating e-mails inside duplicate array and present them in + // 'email (xN)' format + duplicates = {}; + subscribers.duplicate.forEach(function (subscriberEmail) { + duplicates[subscriberEmail] = (duplicates[subscriberEmail] || 0) + 1; + }); + subscribers.duplicate = []; + Object.keys(duplicates).forEach(function emailDuplicates(email) { + if (duplicates[email] > 1) { + subscribers.duplicate.push(email + ' (x' + duplicates[email] + ')'); + } else { + subscribers.duplicate.push(email); + } + }); + + importResults = { + notice: MailPoet.I18n.t('importNoticeSkipped').replace( + '%1$s', + '' + (subscribers.invalid.length + subscribers.duplicate.length) + '' + ), + invalid: (subscribers.invalid.length) + ? MailPoet.I18n.t('importNoticeInvalid') + .replace('%1$s', '' + subscribers.invalid.length.toLocaleString() + '') + .replace('%2$s', subscribers.invalid.join(', ')) + : null, + duplicate: (subscribers.duplicate.length) + ? MailPoet.I18n.t('importNoticeDuplicate') + .replace('%1$s', '' + subscribers.duplicate.length + '') + .replace('%2$s', subscribers.duplicate.join(', ')) + : null + }; + jQuery('#subscribers_data_parse_results').html( + subscribersDataParseResultsTemplate(importResults) + ); + } + + jQuery('.mailpoet_subscribers_data_parse_results_details_show') + .click(function () { + var details = jQuery('.mailpoet_subscribers_data_parse_results_details'); + jQuery(details).toggle(); + this.text = + (jQuery(details).is(':visible')) + ? MailPoet.I18n.t('hideDetails') + : MailPoet.I18n.t('showDetails'); + }); + + // show available segments + if (window.mailpoetSegments.length) { + jQuery('.mailpoet_segments').show(); + } else { + jQuery('.mailpoet_no_segments').show(); + } + + function enableSegmentSelection(segments) { + if (segmentSelectElement.data('select2')) { + segmentSelectElement + .html('') + .select2('destroy'); + toggleNextStepButton('off'); + } + segmentSelectElement + .select2({ + data: segments, + width: '20em', + templateResult: function (item) { + var i = item; + i.subscriberCount = parseInt(i.subscriberCount, 10); + return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; + }, + templateSelection: function (item) { + var i = item; + i.subscriberCount = parseInt(i.subscriberCount, 10); + return i.name + ' (' + i.subscriberCount.toLocaleString() + ')'; + } + }) + .change(function () { + var segmentSelectionNotice = jQuery('[data-id="notice_segmentSelection"]'); + if (!this.value) { + if (!segmentSelectionNotice.length) { + MailPoet.Notice.error(MailPoet.I18n.t('segmentSelectionRequired'), { + static: true, + scroll: true, + id: 'notice_segmentSelection', + hideClose: true }); - window.importData.step2 = clickImportResults; - enableSegmentSelection(window.mailpoetSegments); - router.navigate('step3', { trigger: true }); + } + toggleNextStepButton('off'); + } else { + jQuery('[data-id="notice_segmentSelection"]').remove(); + if (!jQuery('.mailpoet_notice.error:visible').length) { + toggleNextStepButton('on'); + } + } + }); + } + + jQuery('.mailpoet_create_segment').click(function () { + MailPoet.Modal.popup({ + title: MailPoet.I18n.t('addNewList'), + template: jQuery('#new_segment_template').html() + }); + jQuery('#new_segment_name').keypress(function (e) { + if (e.which === 13) { + jQuery('#new_segment_process').click(); + } + }); + jQuery('#new_segment_process').click(function () { + var segmentName = jQuery('#new_segment_name').val().trim(); + var segmentDescription = jQuery('#new_segment_description').val().trim(); + + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'addSegment', + data: { + name: segmentName, + description: segmentDescription + } + }).done(function (response) { + var selectedValues; + window.mailpoetSegments.push({ + id: response.data.id, + name: response.data.name, + subscriberCount: 0 + }); + + selectedValues = segmentSelectElement.val(); + if (selectedValues === null) { + selectedValues = [response.data.id]; + } else { + selectedValues.push(response.data.id); + } + + enableSegmentSelection(window.mailpoetSegments); + segmentSelectElement.val(selectedValues).trigger('change'); + jQuery('.mailpoet_segments:hidden').show(); + jQuery('.mailpoet_no_segments:visible').hide(); + MailPoet.Modal.close(); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.hide(); + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { positionAfter: '#new_segment_name' } + ); } }); }); - - filterSubscribers(); - enableSegmentSelection(window.mailpoetSegments); + jQuery('#new_segment_cancel').click(function () { + MailPoet.Modal.close(); + }); }); - router.on('route:step3', function () { - var subscribersDataImportResultsTemplate; - var exportMenuElement; - var importResults; - if (typeof (window.importData.step2) === 'undefined') { - router.navigate('step2', { trigger: true }); + // register partial template that will contain subscribers data + Handlebars.registerPartial( + 'subscribers_data_template_partial', + subscribersDataTemplatePartial + ); + + // autodetect column types + Handlebars.registerHelper( + 'show_and_match_columns', + function (helperSubscribers, options) { + var displayedColumns = []; + var displayedColumnsIds = []; + var columnData; + var columnId; + var headerName; + var headerNameMatch; + // go through all elements of the first row in subscribers data + Object + .keys(helperSubscribers.subscribers[0]) + .forEach(function helperSubscribersLoop(i) { + columnData = helperSubscribers.subscribers[0][i]; + 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.mailpoet_email_regex.test(columnData)) { + columnId = 'email'; + } else if (helperSubscribers.header) { + headerName = helperSubscribers.header[i]; + headerNameMatch = window.mailpoetColumns.map(function (el) { + return el.name; + }).indexOf(headerName); + // set column type using header + if (headerNameMatch !== -1) { + columnId = window.mailpoetColumns[headerNameMatch].id; + } else if (headerName) { // set column type using header name + if (/first|first name|given name/i.test(headerName)) { + columnId = 'first_name'; + } else if (/last|last name/i.test(headerName)) { + columnId = 'last_name'; + } + } + } + // make sure the column id has not been previously selected + // (e.g., subscriber_first_name shouldn't be autodetected twice), + // except for "ignore" + columnId = + (columnId !== 'ignore' + && displayedColumnsIds.indexOf(columnId) === -1) + ? columnId + : 'ignore'; + displayedColumns[i] = { column_id: columnId }; + displayedColumnsIds.push(columnId); + }); + return options.fn(displayedColumns); + }); + + // sanitize unsafe data + Handlebars.registerHelper('sanitize_data', function (data) { + return (data instanceof Handlebars.SafeString) ? + data : + new Handlebars.SafeString(Handlebars.Utils.escapeExpression(data)); + }); + + // start array index from 1 + Handlebars.registerHelper('calculate_index', function (rawIndex) { + var index = parseInt(rawIndex, 10); + // display filler data (e.g., ellipsis) if we've reached the maximum number of rows and + // subscribers count is greater than the maximum number of rows we're displaying + if (index === maxRowsToShow && subscribers.subscribersCount > (maxRowsToShow + 1)) { + fillerPosition = index; + return filler; + } else if (index === (subscribers.subscribers.length - 1)) { + // if we're on the last line, show the total count of subscribers data + return subscribers.subscribersCount.toLocaleString(); + } + return index + 1; + }); + + // reduce subscribers object if the total length is greater than the + // maximum number of defined rows + if (subscribers.subscribersCount > (maxRowsToShow + 1)) { + subscribers.subscribers.splice( + maxRowsToShow, subscribers.subscribersCount - (maxRowsToShow + 1), + fillerArray + ); + } + + // filter subscribers' data to detect dates, emails, etc. + function filterSubscribers() { + var subscribersClone = jQuery.extend(true, {}, subscribers); + var preventNextStep = false; + var displayedColumns; + jQuery( + '[data-id="notice_invalidEmail"], [data-id="notice_invalidDate"]') + .remove(); + 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) { + var firstRowData; + var validationRule; + var testedFormat; + var allowedDateFormats; + // check if the column id matches the selected id of one of the + // subscriber's data columns + var matchedColumn = _.find( + displayedColumns, + function (data) { return data.id === column.id; } + ); + // EMAIL filter: if the first value in the column doesn't have a valid + // email, hide the next button + if (column.id === 'email') { + if (!window.mailpoet_email_regex.test( + subscribersClone.subscribers[0][matchedColumn.index]) + ) { + preventNextStep = true; + if (!jQuery('[data-id="notice_invalidEmail"]').length) { + MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidElement'), { + static: true, + scroll: true, + hideClose: true, + id: 'invalidEmail' + }); + } + } else { + MailPoet.Notice.hide('invalidEmail'); + } + } + // DATE filter: if column type is date, check if we can recognize it + if (column.type === 'date' && matchedColumn) { + allowedDateFormats = [ + Moment.ISO_8601, + 'YYYY/MM/DD', + 'MM/DD/YYYY', + 'DD/MM/YYYY', + 'YYYY/MM/DD', + 'YYYY/DD/MM', + 'MM/YYYY', + 'YYYY/MM', + 'YYYY' + ]; + firstRowData = subscribersClone.subscribers[0][matchedColumn.index]; + validationRule = false; + // check if date exists + if (firstRowData.trim() === '') { + subscribersClone.subscribers[0][matchedColumn.index] = + '' + + MailPoet.I18n.t('emptyFirstRowDate') + + ' '; + preventNextStep = true; + } else { + Object.keys(allowedDateFormats).forEach(function allowedDateFormatsLoop(format) { + testedFormat = allowedDateFormats[format]; + if (Moment(firstRowData, testedFormat, true).isValid()) { + validationRule = (typeof (testedFormat) === 'function') ? + 'datetime' : + testedFormat; + // set validation on the column element + jQuery(matchedColumn.element).data('validation-rule', validationRule); + return; + } + if (validationRule === 'datetime') { + validationRule = Moment.ISO_8601; + } + }); + } + jQuery.map(subscribersClone.subscribers, function (dataSubscribers, index) { + var data = dataSubscribers; + var rowData = data[matchedColumn.index]; + var date = Moment(rowData, testedFormat, true); + if (index === fillerPosition || rowData.trim() === '') return; + // validate date + if (date.isValid()) { + data[matchedColumn.index] = new Handlebars.SafeString( + Handlebars.Utils.escapeExpression(data[matchedColumn.index]) + + '' + + MailPoet.Date.format(date) + + ' ' + ); + } else { + data[matchedColumn.index] = new Handlebars.SafeString( + Handlebars.Utils.escapeExpression(data[matchedColumn.index]) + + '' + + (new Handlebars.SafeString(MailPoet.I18n.t('dateMatchError'))) + + ' ' + ); + preventNextStep = true; + } + }); + if (preventNextStep && !jQuery('.mailpoet_invalidDate').length) { + MailPoet.Notice.error(MailPoet.I18n.t('columnContainsInvalidDate'), { + static: true, + scroll: true, + hideClose: true, + id: 'invalidDate' + }); + } + } + }); + // refresh table with susbcribers' data + jQuery('#subscribers_data > table > tbody') + .html(subscribersDataTemplatePartial(subscribersClone)); + + if (preventNextStep) { + toggleNextStepButton('off'); + } else if (!jQuery('.mailpoet_notice.error:visible').length + && segmentSelectElement.val()) { + toggleNextStepButton('on'); + } + } + + // render template + jQuery('#subscribers_data > table').html(subscribersDataTemplate(subscribers)); + + // filter displayed data + jQuery('select.mailpoet_subscribers_column_data_match') + .select2({ + data: window.mailpoetColumnsSelect2, + width: '15em', + templateResult: function (item) { + return item.name; + }, + templateSelection: function (item) { + return item.name; + } + }) + .on('select2:selecting', function (selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.args.data.id; + // CREATE CUSTOM FIELD + if (selectedOptionId === 'create') { + selectEvent.preventDefault(); + jQuery(selectElement).select2('close'); + MailPoet.Modal.popup({ + title: MailPoet.I18n.t('addNewField'), + template: jQuery('#form_template_field_form').html() + }); + jQuery('#form_field_new').parsley().on('form:submit', function () { + // get data + var data = jQuery(this.$element).mailpoetSerializeObject(); + + // save custom field + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'customFields', + action: 'save', + data: data + }).done(function (response) { + var newColumnData = { + id: response.data.id, + name: response.data.name, + type: response.data.type, + params: response.data.params, + custom: true + }; + // if this is the first custom column, create an "optgroup" + if (window.mailpoetColumnsSelect2.length === 2) { + window.mailpoetColumnsSelect2.push({ + name: MailPoet.I18n.t('userColumns'), + children: [] + }); + } + window.mailpoetColumnsSelect2[2].children.push(newColumnData); + window.mailpoetColumns.push(newColumnData); + jQuery('select.mailpoet_subscribers_column_data_match') + .each(function () { + jQuery(this) + .html('') + .select2('destroy') + .select2({ + data: window.mailpoetColumnsSelect2, + width: '15em', + templateResult: function (item) { + return item.name; + }, + templateSelection: function (item) { + return item.name; + } + }); + }); + jQuery(selectElement).data('column-id', newColumnData.id); + jQuery(selectElement).data('validation-rule', false); + filterSubscribers(); + // close popup + MailPoet.Modal.close(); + }).fail(function (response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { positionAfter: '#field_name' } + ); + } + }); + return false; + }); + } else { + // CHANGE COLUMN + // check for duplicate values in all select options + jQuery('select.mailpoet_subscribers_column_data_match') + .each(function () { + 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') { + if (confirm(MailPoet.I18n.t('selectedValueAlreadyMatched') + ' ' + MailPoet.I18n.t('confirmCorrespondingColumn'))) { // eslint-disable-line no-alert + jQuery(element).data('column-id', 'ignore'); + } else { + selectEvent.preventDefault(); + jQuery(selectElement).select2('close'); + } + } + }); + } + }) + .on('select2:select', function (selectEvent) { + var selectElement = this; + var selectedOptionId = selectEvent.params.data.id; + jQuery(selectElement).data('column-id', selectedOptionId); + filterSubscribers(); + }); + + previousStepButton.off().on('click', function () { + router.navigate('step1', { trigger: true }); + }); + + nextStepButton.off().on('click', function () { + var columns = {}; + var queue = new jQuery.AsyncQueue(); + var batchNumber = 0; + var batchSize = 2000; + var timestamp = Date.now() / 1000; + var clickImportResults = { + created: 0, + updated: 0, + errors: [], + segments: [] + }; + var clickSubscribers; + var splitSubscribers; + + if (jQuery(this).hasClass('button-disabled')) { return; } - - showCurrentStep(); - - if (window.importData.step2.errors.length > 0) { - MailPoet.Notice.error(_.flatten(window.importData.step2.errors)); - } - - MailPoet.trackEvent('Subscribers import finished', { - 'Subscribers created': window.importData.step2.created, - 'Subscribers updated': window.importData.step2.updated, - 'MailPoet Free version': window.mailpoet_version - }); - - // display statistics - 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 + MailPoet.Modal.loading(true); + splitSubscribers = function (localSubscribers, size) { + return localSubscribers.reduce(function (res, item, index) { + if (index % size === 0) { + res.push([]); + } + res[res.length - 1].push(item); + return res; + }, []); }; + clickSubscribers = splitSubscribers(window.importData.step1.subscribers, batchSize); - jQuery('#subscribers_data_import_results') - .html(subscribersDataImportResultsTemplate(importResults)) - .show(); + _.each(jQuery('select.mailpoet_subscribers_column_data_match'), + function (column, columnIndex) { + var columnId = jQuery(column).data('column-id'); + var validationRule = jQuery(column).data('validation-rule'); + if (columnId === 'ignore') { + return; + } + columns[columnId] = { index: columnIndex, validation_rule: validationRule }; + }); - jQuery('a.mailpoet_import_again').off().click(function () { - jQuery('#subscribers_data_import_results').hide(); - router.navigate('step1', { trigger: true }); + _.each(clickSubscribers, function () { + queue.add(function (addQueue) { + addQueue.pause(); + MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'ImportExport', + action: 'processImport', + data: JSON.stringify({ + columns: columns, + subscribers: clickSubscribers[batchNumber], + timestamp: timestamp, + segments: segmentSelectElement.val(), + updateSubscribers: (jQuery(':radio[name="subscriber_update_option"]:checked').val() === 'yes') + }) + }).done(function (response) { + clickImportResults.created += response.data.created; + clickImportResults.updated += response.data.updated; + clickImportResults.segments = response.data.segments; + clickImportResults.added_to_segment_with_welcome_notification = + response.data.added_to_segment_with_welcome_notification; + addQueue.run(); + }).fail(function (response) { + MailPoet.Modal.loading(false); + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function (error) { return error.message; }), + { scroll: true } + ); + } + }); + batchNumber += 1; + }); }); - jQuery('a.mailpoet_view_subscribers').off().click(function () { - window.location.href = 'admin.php?page=mailpoet-subscribers'; + queue.run(); + + queue.onComplete(function () { + MailPoet.Modal.loading(false); + if ( + clickImportResults.errors.length > 0 + && !clickImportResults.updated + && !clickImportResults.created + ) { + MailPoet.Notice.error(_.flatten(clickImportResults.errors) + ); + } else { + window.mailpoetSegments = clickImportResults.segments; + clickImportResults.segments = _.map(segmentSelectElement.select2('data'), + function (data) { + return data.name; + }); + window.importData.step2 = clickImportResults; + enableSegmentSelection(window.mailpoetSegments); + router.navigate('step3', { trigger: true }); + } }); - - // if new subscribers were created and the export menu item is hidden - // (it's shown only when there are subscribers), display it - if (importResults.created && exportMenuElement.not(':visible')) { - exportMenuElement.show(); - } - - // reset previous step's data so that coming back to this step is prevented - window.importData.step2 = undefined; }); - if (!Backbone.History.started) { - Backbone.history.start(); - } + filterSubscribers(); + enableSegmentSelection(window.mailpoetSegments); }); + + router.on('route:step3', function () { + var subscribersDataImportResultsTemplate; + var exportMenuElement; + var importResults; + if (typeof (window.importData.step2) === 'undefined') { + router.navigate('step2', { trigger: true }); + return; + } + + showCurrentStep(); + + if (window.importData.step2.errors.length > 0) { + MailPoet.Notice.error(_.flatten(window.importData.step2.errors)); + } + + MailPoet.trackEvent('Subscribers import finished', { + 'Subscribers created': window.importData.step2.created, + 'Subscribers updated': window.importData.step2.updated, + 'MailPoet Free version': window.mailpoet_version + }); + + // display statistics + 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 + }; + + jQuery('#subscribers_data_import_results') + .html(subscribersDataImportResultsTemplate(importResults)) + .show(); + + jQuery('a.mailpoet_import_again').off().click(function () { + jQuery('#subscribers_data_import_results').hide(); + router.navigate('step1', { trigger: true }); + }); + + jQuery('a.mailpoet_view_subscribers').off().click(function () { + window.location.href = 'admin.php?page=mailpoet-subscribers'; + }); + + // if new subscribers were created and the export menu item is hidden + // (it's shown only when there are subscribers), display it + if (importResults.created && exportMenuElement.not(':visible')) { + exportMenuElement.show(); + } + + // reset previous step's data so that coming back to this step is prevented + window.importData.step2 = undefined; + }); + + if (!Backbone.History.started) { + Backbone.history.start(); + } }); + }); diff --git a/assets/js/src/subscribers/list.jsx b/assets/js/src/subscribers/list.jsx index 870e28f684..b0a419694f 100644 --- a/assets/js/src/subscribers/list.jsx +++ b/assets/js/src/subscribers/list.jsx @@ -128,8 +128,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersMovedToList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -160,8 +160,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersAddedToList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -192,8 +192,8 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersRemovedFromList') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) - .replace('%$2s', response.meta.segment) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$2s', response.meta.segment) ); }, }, @@ -203,7 +203,7 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleSubscribersRemovedFromAllLists') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) ); }, }, @@ -213,7 +213,7 @@ const bulkActions = [ onSuccess: function onSuccess(response) { MailPoet.Notice.success( MailPoet.I18n.t('multipleConfirmationEmailsSent') - .replace('%$1d', (Number(response.meta.count)).toLocaleString()) + .replace('%$1d', (Number(response.meta.count)).toLocaleString()) ); }, }, diff --git a/package-lock.json b/package-lock.json index d5b7ccea48..accf29cb4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,19 +65,21 @@ } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { @@ -116,9 +118,9 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, "ansi-regex": { @@ -144,9 +146,9 @@ } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -679,6 +681,12 @@ "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -760,6 +768,12 @@ "isarray": "^1.0.0" } }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -842,6 +856,12 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -896,12 +916,12 @@ } }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -939,17 +959,26 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "codemirror": { "version": "5.37.0", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==" }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1015,11 +1044,12 @@ "dev": true }, "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" @@ -1204,15 +1234,6 @@ "cssom": "0.3.x" } }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, "damerau-levenshtein": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", @@ -1374,9 +1395,9 @@ } }, "diff": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", - "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { @@ -1391,13 +1412,12 @@ } }, "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "dom-serializer": { @@ -1556,76 +1576,6 @@ "is-symbol": "^1.0.1" } }, - "es5-ext": { - "version": "0.10.35", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", - "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", - "dev": true, - "requires": { - "es6-iterator": "~2.0.1", - "es6-symbol": "~3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1660,61 +1610,87 @@ } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", "esquery": "^1.0.0", - "estraverse": "^4.2.0", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", + "inquirer": "^3.0.6", "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "table": "4.0.2", + "text-table": "~0.2.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -1730,15 +1706,21 @@ } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", + "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, "minimatch": { @@ -1750,13 +1732,22 @@ "brace-expansion": "^1.1.7" } }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" } } } @@ -1936,20 +1927,36 @@ "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", "dev": true }, - "espree": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", - "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "acorn": "^5.1.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" }, "dependencies": { "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.6.2.tgz", + "integrity": "sha512-zUzo1E5dI2Ey8+82egfnttyMlMZ2y0D8xOCO3PNPPlYXpl8NZvF6Qk9L9BEtJs+43FqEmfBViDqc5d1ckRDguw==", "dev": true } } @@ -1961,22 +1968,21 @@ "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "^4.0.0" } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0", - "object-assign": "^4.0.1" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1991,16 +1997,6 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -2017,12 +2013,6 @@ "safe-buffer": "^5.1.1" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2088,6 +2078,17 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2136,13 +2137,12 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -3209,21 +3209,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -3323,9 +3314,9 @@ "dev": true }, "growl": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", - "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "grunt-cli": { @@ -3461,6 +3452,12 @@ "sntp": "2.x.x" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "history": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/history/-/history-1.13.1.tgz", @@ -3579,9 +3576,9 @@ "dev": true }, "ignore": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.6.tgz", - "integrity": "sha512-HrxmNxKTGZ9a3uAl/FNG66Sdt0G9L4TtMbbUQjP1WhGmSj0FOyHvSgx7623aGJvXfPOur8MwmarlHT+37jmzlw==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "imports-loader": { @@ -3647,31 +3644,82 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", + "external-editor": "^2.0.4", + "figures": "^2.0.0", "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", "through": "^2.3.6" }, "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -3796,13 +3844,10 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true }, "is-glob": { "version": "2.0.1", @@ -3822,18 +3867,6 @@ "is-finite": "^1.0.0" } }, - "is-my-json-valid": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", - "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -3850,18 +3883,18 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { "is-path-inside": "^1.0.0" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "^1.0.1" @@ -3879,10 +3912,10 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { @@ -3904,13 +3937,10 @@ } }, "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true, - "requires": { - "tryit": "^1.0.1" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -3979,30 +4009,6 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", - "dev": true, - "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", - "dev": true - }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", - "dev": true - } - } - }, "jquery": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", @@ -4019,9 +4025,9 @@ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -4031,7 +4037,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", "dev": true } } @@ -4115,14 +4121,11 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -4145,18 +4148,6 @@ "graceful-fs": "^4.1.6" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4449,6 +4440,12 @@ "mime-db": "~1.33.0" } }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4493,102 +4490,76 @@ } }, "mocha": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.2.1.tgz", - "integrity": "sha1-BKL4rrFJ/lAXfgCn710IxjnpEms=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "commander": "2.3.0", - "debug": "2.0.0", - "diff": "1.0.8", - "escape-string-regexp": "1.0.2", - "glob": "3.2.3", - "growl": "1.8.1", - "jade": "0.26.3", - "mkdirp": "0.5.0", - "supports-color": "~1.2.0" + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" }, "dependencies": { "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "debug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", - "integrity": "sha1-ib2d9nMrUSVrxnBTQrugLtEhMe8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "0.6.2" + "ms": "2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", - "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", - "dev": true - }, "glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "graceful-fs": "~2.0.0", + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", "inherits": "2", - "minimatch": "~0.2.11" + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", - "dev": true - }, "supports-color": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.1.tgz", - "integrity": "sha1-Eu4hUHCGzZjBBY2ewPSsR2t687I=", - "dev": true + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -4604,9 +4575,9 @@ "dev": true }, "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { @@ -4776,10 +4747,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } }, "optimist": { "version": "0.6.1", @@ -4818,12 +4792,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -5028,9 +4996,9 @@ } }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "pn": { @@ -5069,9 +5037,9 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "promise": { @@ -5356,17 +5324,6 @@ } } }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" - } - }, "recast": { "version": "0.10.33", "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", @@ -5393,15 +5350,6 @@ } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", @@ -5431,6 +5379,12 @@ "is-equal-shallow": "^0.1.3" } }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, "regexpu": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", @@ -5584,13 +5538,13 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "right-align": { @@ -5646,20 +5600,29 @@ } }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "once": "^1.3.0" + "is-promise": "^2.1.0" } }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -5728,46 +5691,10 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", - "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "simple-fmt": { @@ -5806,10 +5733,13 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } }, "sntp": { "version": "2.1.0", @@ -5987,14 +5917,30 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string_decoder": { @@ -6090,54 +6036,58 @@ "dev": true }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" + "has-flag": "^3.0.0" } } } @@ -6174,6 +6124,15 @@ "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-4.5.6.tgz", "integrity": "sha1-Os2bUVMx2vP/TM2B1UTpFjDtDhs=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -6224,12 +6183,6 @@ "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", "dev": true }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, "tryor": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", diff --git a/package.json b/package.json index c950eb13e6..3e22878aea 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "chai-jq": "0.0.8", "clean-webpack-plugin": "^0.1.19", "cross-env": "^5.1.5", - "eslint": "^3.19.0", + "eslint": "^4.19.1", "eslint-config-airbnb": "^15.0.1", "eslint-import-resolver-webpack": "^0.8.4", "eslint-plugin-import": "^2.11.0", @@ -59,7 +59,7 @@ "imports-loader": "~0.7.1", "jsdom": "^11.10.0", "json-loader": "^0.5.7", - "mocha": "2.2.1", + "mocha": "^5.2.0", "nib": "~1.1.2", "sinon": "1.14.1", "sinon-chai": "2.7.0", diff --git a/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js b/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js index 12236fdf36..57625d1a23 100644 --- a/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js +++ b/tests/javascript/newsletter_editor/blocks/automatedLatestContent.spec.js @@ -15,7 +15,7 @@ define([ ContainerBlock, AutomatedLatestContentInjector, Communication - ) { +) { var EditorApplication = App; var CommunicationComponent = Communication; diff --git a/tests/javascript/newsletter_editor/blocks/container.spec.js b/tests/javascript/newsletter_editor/blocks/container.spec.js index c4f08c0cb5..ef0e7ebfe9 100644 --- a/tests/javascript/newsletter_editor/blocks/container.spec.js +++ b/tests/javascript/newsletter_editor/blocks/container.spec.js @@ -109,8 +109,8 @@ define([ expect(model.get('blocks').at(0).get('blocks')).to.have.length(2); expect( model.get('blocks').at(0) - .get('blocks').at(1) - .get('someField') + .get('blocks').at(1) + .get('someField') ).to.equal('some text 2'); }); }); diff --git a/tests/javascript/newsletter_editor/components/communication.spec.js b/tests/javascript/newsletter_editor/components/communication.spec.js index 1be1e77b13..63e353f42a 100644 --- a/tests/javascript/newsletter_editor/components/communication.spec.js +++ b/tests/javascript/newsletter_editor/components/communication.spec.js @@ -215,8 +215,8 @@ define([ var deferred = jQuery.Deferred(); deferred.resolve({ data: [ - { post_title: 'title 1' }, - { post_title: 'post title 2' } + { post_title: 'title 1' }, + { post_title: 'post title 2' } ] }); return deferred; @@ -286,8 +286,8 @@ define([ var deferred = jQuery.Deferred(); deferred.resolve({ data: [ - { type: 'text', text: 'something' }, - { type: 'text', text: 'something else' } + { type: 'text', text: 'something' }, + { type: 'text', text: 'something else' } ] }); return deferred;