forms & newsletters endpoints

This commit is contained in:
Jonathan Labreuille
2016-08-20 13:35:39 +02:00
parent afbe25e215
commit f650455a90
13 changed files with 616 additions and 486 deletions

View File

@ -99,14 +99,21 @@ const item_actions = [
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'forms', endpoint: 'forms',
action: 'duplicate', action: 'duplicate',
data: item.id data: {
}).done(function(response) { id: item.id
if (response !== false && response['name'] !== undefined) { }
MailPoet.Notice.success( }).done((response) => {
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name) MailPoet.Notice.success(
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.data.name)
);
refresh();
}).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
); );
} }
refresh();
}); });
} }
}, },
@ -120,9 +127,14 @@ const FormList = React.createClass({
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'forms', endpoint: 'forms',
action: 'create' action: 'create'
}).done(function(response) { }).done((response) => {
if(response.result && response.form_id) { window.location = mailpoet_form_edit_url + response.data.id;
window.location = mailpoet_form_edit_url + response.form_id; }).fail((response) => {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
} }
}); });
}, },

View File

@ -11,7 +11,7 @@ define([
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'automatedLatestContent', endpoint: 'automatedLatestContent',
action: args.action, action: args.action,
data: args.options || {}, data: args.options || {}
}); });
}; };
Module._cachedQuery = _.memoize(Module._query, JSON.stringify); Module._cachedQuery = _.memoize(Module._query, JSON.stringify);
@ -19,14 +19,14 @@ define([
Module.getNewsletter = function(options) { Module.getNewsletter = function(options) {
return Module._query({ return Module._query({
action: 'get', action: 'get',
options: options, options: options
}); });
}; };
Module.getPostTypes = function() { Module.getPostTypes = function() {
return Module._cachedQuery({ return Module._cachedQuery({
action: 'getPostTypes', action: 'getPostTypes',
options: {}, options: {}
}).then(function(response) { }).then(function(response) {
return _.values(response.data); return _.values(response.data);
}); });
@ -83,7 +83,7 @@ define([
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'save', action: 'save',
data: options || {}, data: options || {}
}); });
}; };
@ -91,7 +91,7 @@ define([
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'sendPreview', action: 'sendPreview',
data: options || {}, data: options || {}
}); });
}; };

View File

@ -252,32 +252,31 @@ define([
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'showPreview', action: 'showPreview',
data: json, data: json,
}).done(function(response) {
if (response.result === true) {
this.previewView = new Module.NewsletterPreviewView({
previewUrl: response.data.url
});
var view = this.previewView.render();
MailPoet.Modal.popup({
template: '',
element: this.previewView.$el,
title: MailPoet.I18n.t('newsletterPreview'),
onCancel: function() {
this.previewView.destroy();
this.previewView = null;
}.bind(this)
});
} else {
MailPoet.Notice.error(response.errors);
}
}.bind(this)).fail(function(error) {
MailPoet.Notice.error(
MailPoet.I18n.t('newsletterPreviewFailed')
);
}).always(function() { }).always(function() {
MailPoet.Modal.loading(false); MailPoet.Modal.loading(false);
}).done(function(response) {
this.previewView = new Module.NewsletterPreviewView({
previewUrl: response.meta.preview_url
});
var view = this.previewView.render();
MailPoet.Modal.popup({
template: '',
element: this.previewView.$el,
title: MailPoet.I18n.t('newsletterPreview'),
onCancel: function() {
this.previewView.destroy();
this.previewView = null;
}.bind(this)
});
}.bind(this)).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}
}); });
}, },
sendPreview: function() { sendPreview: function() {
@ -302,28 +301,19 @@ define([
// send test email // send test email
MailPoet.Modal.loading(true); MailPoet.Modal.loading(true);
CommunicationComponent.previewNewsletter(data).done(function(response) { CommunicationComponent.previewNewsletter(data).always(function() {
if(response.result !== undefined && response.result === true) {
MailPoet.Notice.success(MailPoet.I18n.t('newsletterPreviewSent'), { scroll: true });
} else {
if (_.isArray(response.errors)) {
response.errors.map(function(error) {
MailPoet.Notice.error(error, { scroll: true });
});
} else {
MailPoet.Notice.error(
MailPoet.I18n.t('newsletterPreviewFailedToSend'),
{
scroll: true,
static: true,
}
);
}
}
MailPoet.Modal.loading(false); MailPoet.Modal.loading(false);
}).done(function(response) {
MailPoet.Notice.success(
MailPoet.I18n.t('newsletterPreviewSent'),
{ scroll: true });
}).fail(function(response) { }).fail(function(response) {
// an error occurred if (response.errors.length > 0) {
MailPoet.Modal.loading(false); MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true, static: true }
);
}
}); });
}, },
}); });

View File

@ -66,22 +66,22 @@ define(
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'get', action: 'get',
data: id data: {
}).done((response) => { id: id
if(response === false) {
this.setState({
loading: false,
item: {},
}, function() {
this.context.router.push('/new');
}.bind(this));
} else {
this.setState({
loading: false,
item: response,
fields: this.getFieldsByNewsletter(response),
});
} }
}).done((response) => {
this.setState({
loading: false,
item: response.data,
fields: this.getFieldsByNewsletter(response.data)
});
}).fail((response) => {
this.setState({
loading: false,
item: {}
}, () => {
this.context.router.push('/new');
});
}); });
}, },
handleSend: function(e) { handleSend: function(e) {

View File

@ -28,17 +28,16 @@ define(
type: type, type: type,
subject: MailPoet.I18n.t('draftNewsletterTitle'), subject: MailPoet.I18n.t('draftNewsletterTitle'),
} }
}).done(function(response) { }).done((response) => {
if(response.result && response.newsletter.id) { this.context.router.push(`/template/${response.data.id}`);
this.context.router.push(`/template/${response.newsletter.id}`); }).fail((response) => {
} else { if (response.errors.length > 0) {
if(response.errors.length > 0) { MailPoet.Notice.error(
response.errors.map(function(error) { response.errors.map(function(error) { return error.message; }),
MailPoet.Notice.error(error); { scroll: true }
}); );
}
} }
}.bind(this)); });
}, },
render: function() { render: function() {
return ( return (

View File

@ -50,17 +50,16 @@ define(
type: 'notification', type: 'notification',
subject: MailPoet.I18n.t('draftNewsletterTitle'), subject: MailPoet.I18n.t('draftNewsletterTitle'),
}), }),
}).done(function(response) { }).done((response) => {
if(response.result && response.newsletter.id) { this.showTemplateSelection(response.data.id);
this.showTemplateSelection(response.newsletter.id); }).fail((response) => {
} else { if (response.errors.length > 0) {
if(response.errors.length > 0) { MailPoet.Notice.error(
response.errors.map(function(error) { response.errors.map(function(error) { return error.message; }),
MailPoet.Notice.error(error); { scroll: true }
}); );
}
} }
}.bind(this)); });
}, },
showTemplateSelection: function(newsletterId) { showTemplateSelection: function(newsletterId) {
this.context.router.push(`/template/${newsletterId}`); this.context.router.push(`/template/${newsletterId}`);

View File

@ -25,19 +25,18 @@ define(
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'create', action: 'create',
data: { data: {
type: 'standard', type: 'standard'
} }
}).done(function(response) { }).done((response) => {
if(response.result && response.newsletter.id) { this.showTemplateSelection(response.data.id);
this.showTemplateSelection(response.newsletter.id); }).fail((response) => {
} else { if (response.errors.length > 0) {
if(response.errors.length > 0) { MailPoet.Notice.error(
response.errors.map(function(error) { response.errors.map(function(error) { return error.message; }),
MailPoet.Notice.error(error); { scroll: true }
}); );
}
} }
}.bind(this)); });
}, },
render: function() { render: function() {
return ( return (

View File

@ -1,5 +1,7 @@
<?php <?php
namespace MailPoet\API\Endpoints; namespace MailPoet\API\Endpoints;
use MailPoet\API\Endpoint as APIEndpoint;
use MailPoet\API\Error as APIError;
use \MailPoet\Models\Form; use \MailPoet\Models\Form;
use \MailPoet\Models\StatisticsForms; use \MailPoet\Models\StatisticsForms;
@ -9,16 +11,17 @@ use \MailPoet\Form\Util;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Forms { class Forms extends APIEndpoint {
function __construct() { function get($data = array()) {
} $id = (isset($data['id']) ? (int)$data['id'] : false);
function get($id = false) {
$form = Form::findOne($id); $form = Form::findOne($id);
if($form !== false) { if($form === false) {
$form = $form->asArray(); return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
return $this->successResponse($form->asArray());
} }
return $form;
} }
function listing($data = array()) { function listing($data = array()) {
@ -87,14 +90,10 @@ class Forms {
$errors = $form->getErrors(); $errors = $form->getErrors();
if(!empty($errors)) { if(!empty($errors)) {
return array( return $this->badRequest($errors);
'result' => false,
'errors' => $errors
);
} else { } else {
return array( return $this->successResponse(
'result' => true, Form::findOne($form->id)->asArray()
'form_id' => $form->id()
); );
} }
} }
@ -109,76 +108,74 @@ class Forms {
// styles // styles
$css = new Util\Styles(FormRenderer::getStyles($data)); $css = new Util\Styles(FormRenderer::getStyles($data));
return array( return $this->successResponse(array(
'html' => $html, 'html' => $html,
'css' => $css->render() 'css' => $css->render()
); ));
} }
function exportsEditor($id) { function exportsEditor($data = array()) {
$exports = false; $id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id); $form = Form::findOne($id);
if($form === false) {
if($form !== false) { return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$exports = Util\Export::getAll($form->asArray()); $exports = Util\Export::getAll($form->asArray());
return $this->successResponse($exports);
} }
return $exports;
} }
function saveEditor($data = array()) { function saveEditor($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form_id = (isset($data['id']) ? (int)$data['id'] : 0); $form_id = (isset($data['id']) ? (int)$data['id'] : 0);
$name = (isset($data['name']) ? $data['name'] : __('New form')); $name = (isset($data['name']) ? $data['name'] : __('New form'));
$body = (isset($data['body']) ? $data['body'] : array()); $body = (isset($data['body']) ? $data['body'] : array());
$settings = (isset($data['settings']) ? $data['settings'] : array()); $settings = (isset($data['settings']) ? $data['settings'] : array());
$styles = (isset($data['styles']) ? $data['styles'] : ''); $styles = (isset($data['styles']) ? $data['styles'] : '');
if(empty($body) || empty($settings)) { // check if the form is used as a widget
// error $is_widget = false;
return false; $widgets = get_option('widget_mailpoet_form');
} else { if(!empty($widgets)) {
// check if the form is used as a widget foreach($widgets as $widget) {
$is_widget = false; if(isset($widget['form']) && (int)$widget['form'] === $form_id) {
$widgets = get_option('widget_mailpoet_form'); $is_widget = true;
if(!empty($widgets)) {
foreach($widgets as $widget) {
if(isset($widget['form']) && (int)$widget['form'] === $form_id) {
$is_widget = true;
break;
}
}
}
// check if the user gets to pick his own lists
// or if it's selected by the admin
$has_segment_selection = false;
foreach($body as $i => $block) {
if($block['type'] === 'segment') {
$has_segment_selection = true;
if(!empty($block['params']['values'])) {
$list_selection = array_filter(
array_map(function($segment) {
return (isset($segment['id'])
? (int)$segment['id']
: null
);
}, $block['params']['values'])
);
}
break; break;
} }
} }
}
// check list selection // check if the user gets to pick his own lists
if($has_segment_selection === true) { // or if it's selected by the admin
$settings['segments_selected_by'] = 'user'; $has_segment_selection = false;
} else {
$settings['segments_selected_by'] = 'admin'; foreach($body as $i => $block) {
if($block['type'] === 'segment') {
$has_segment_selection = true;
if(!empty($block['params']['values'])) {
$list_selection = array_filter(
array_map(function($segment) {
return (isset($segment['id'])
? (int)$segment['id']
: null
);
}, $block['params']['values'])
);
}
break;
} }
} }
// check list selection
if($has_segment_selection === true) {
$settings['segments_selected_by'] = 'user';
} else {
$settings['segments_selected_by'] = 'admin';
}
$form = Form::createOrUpdate(array( $form = Form::createOrUpdate(array(
'id' => $form_id, 'id' => $form_id,
'name' => $name, 'name' => $name,
@ -187,64 +184,101 @@ class Forms {
'styles' => $styles 'styles' => $styles
)); ));
if($form->getErrors() === false) { $errors = $form->getErrors();
return array(
'result' => true, if(!empty($errors)) {
'is_widget' => $is_widget return $this->badRequest($errors);
);
} else { } else {
return array( return $this->successResponse(
'result' => false, Form::findOne($form->id)->asArray(),
'errors' => $form->getErrors() array('is_widget' => $is_widget)
); );
} }
} }
function restore($id) { function restore($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id); $form = Form::findOne($id);
if($form !== false) { if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$form->restore(); $form->restore();
return $this->successResponse(
Form::findOne($form->id)->asArray(),
array('count' => 1)
);
} }
return ($form->getErrors() === false);
} }
function trash($id) { function trash($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id); $form = Form::findOne($id);
if($form !== false) { if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$form->trash(); $form->trash();
return $this->successResponse(
Form::findOne($form->id)->asArray(),
array('count' => 1)
);
} }
return ($form->getErrors() === false);
} }
function delete($id) { function delete($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id); $form = Form::findOne($id);
if($form !== false) { if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$form->delete(); $form->delete();
return 1; return $this->successResponse(null, array('count' => 1));
} }
return false;
} }
function duplicate($id) { function duplicate($data = array()) {
$result = false; $id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id); $form = Form::findOne($id);
if($form !== false) {
if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$data = array( $data = array(
'name' => sprintf(__('Copy of %s'), $form->name) 'name' => sprintf(__('Copy of %s'), $form->name)
); );
$result = $form->duplicate($data)->asArray(); $duplicate = $form->duplicate($data);
} $errors = $duplicate->getErrors();
return $result; if(!empty($errors)) {
return $this->errorResponse($errors);
} else {
return $this->successResponse(
Form::findOne($duplicate->id)->asArray(),
array('count' => 1)
);
}
}
} }
function bulkAction($data = array()) { function bulkAction($data = array()) {
$bulk_action = new Listing\BulkAction( try {
'\MailPoet\Models\Form', $bulk_action = new Listing\BulkAction(
$data '\MailPoet\Models\Form',
); $data
);
return $bulk_action->apply(); $count = $bulk_action->apply();
return $this->successResponse(null, array('count' => $count));
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
} }

View File

@ -22,19 +22,20 @@ if(!defined('ABSPATH')) exit;
require_once(ABSPATH . 'wp-includes/pluggable.php'); require_once(ABSPATH . 'wp-includes/pluggable.php');
class Newsletters extends APIEndpoint { class Newsletters extends APIEndpoint {
function get($id = false) { function get($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id); $newsletter = Newsletter::findOne($id);
if($newsletter === false) { if($newsletter === false) {
return false; return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else { } else {
$segments = $newsletter->segments()->findArray(); return $this->successResponse(
$options = $newsletter->options()->findArray(); $newsletter
$newsletter = $newsletter->asArray(); ->withSegments()
$newsletter['segments'] = array_map(function($segment) { ->withOptions()
return $segment['id']; ->asArray()
}, $segments); );
$newsletter['options'] = Helpers::arrayColumn($options, 'value', 'name');
return $newsletter;
} }
} }
@ -124,125 +125,161 @@ class Newsletters extends APIEndpoint {
} }
} }
function restore($id) { function restore($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id); $newsletter = Newsletter::findOne($id);
if($newsletter !== false) { if($newsletter === false) {
$newsletter->restore(); return $this->errorResponse(array(
} APIError::NOT_FOUND => __('This newsletter does not exist.')
return ($newsletter->getErrors() === false);
}
function trash($id) {
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$newsletter->trash();
}
return ($newsletter->getErrors() === false);
}
function delete($id) {
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$newsletter->delete();
return 1;
}
return false;
}
function duplicate($id = false) {
$result = false;
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$duplicate = $newsletter->duplicate(array(
'subject' => sprintf(__('Copy of %s'), $newsletter->subject)
)); ));
} else {
$newsletter->restore();
return $this->successResponse(
Newsletter::findOne($newsletter->id)->asArray(),
array('count' => 1)
);
}
}
if($duplicate !== false && $duplicate->getErrors() === false) { function trash($data = array()) {
$result = $duplicate->asArray(); $id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$newsletter->trash();
return $this->successResponse(
Newsletter::findOne($newsletter->id)->asArray(),
array('count' => 1)
);
}
}
function delete($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$newsletter->delete();
return $this->successResponse(null, array('count' => 1));
}
}
function duplicate($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$data = array(
'subject' => sprintf(__('Copy of %s'), $newsletter->subject)
);
$duplicate = $newsletter->duplicate($data);
$errors = $duplicate->getErrors();
if(!empty($errors)) {
return $this->errorResponse($errors);
} else {
return $this->successResponse(
Newsletter::findOne($duplicate->id)->asArray(),
array('count' => 1)
);
} }
} }
return $result;
} }
function showPreview($data = array()) { function showPreview($data = array()) {
if(!isset($data['body'])) { if(empty($data['body'])) {
return array( return $this->badRequest(array(
'result' => false, APIError::BAD_REQUEST => __('Newsletter data is missing.')
'errors' => array(__('Newsletter data is missing')) ));
);
} }
$newsletter_id = (isset($data['id'])) ? (int)$data['id'] : null;
$newsletter = Newsletter::findOne($newsletter_id);
if(!$newsletter) {
return array(
'result' => false,
'errors' => array(__('Newsletter could not be read'))
);
}
$newsletter->body = $data['body'];
$newsletter->save();
$subscriber = Subscriber::getCurrentWPUser();
$preview_url = NewsletterUrl::getViewInBrowserUrl(
$data, $subscriber, $queue = false, $preview = true
);
return array(
'result' => true,
'data' => array('url' => $preview_url)
);
}
function sendPreview($data = array()) {
$id = (isset($data['id'])) ? (int)$data['id'] : false; $id = (isset($data['id'])) ? (int)$data['id'] : false;
$newsletter = Newsletter::findOne($id); $newsletter = Newsletter::findOne($id);
if($newsletter === false) { if($newsletter === false) {
return array( return $this->errorResponse(array(
'result' => false APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$newsletter->body = $data['body'];
$newsletter->save();
$subscriber = Subscriber::getCurrentWPUser();
$preview_url = NewsletterUrl::getViewInBrowserUrl(
$data, $subscriber, $queue = false, $preview = true
);
return $this->successResponse(
Newsletter::findOne($newsletter->id)->asArray(),
array('preview_url' => $preview_url)
); );
} }
}
function sendPreview($data = array()) {
if(empty($data['subscriber'])) { if(empty($data['subscriber'])) {
return array( return $this->badRequest(array(
'result' => false, APIError::BAD_REQUEST => __('Please specify receiver information.')
'errors' => array(__('Please specify receiver information.')) ));
);
} }
$newsletter = $newsletter->asArray(); $id = (isset($data['id'])) ? (int)$data['id'] : false;
$newsletter = Newsletter::findOne($id);
$renderer = new Renderer($newsletter, $preview = true); if($newsletter === false) {
$rendered_newsletter = $renderer->render(); return $this->errorResponse(array(
$divider = '***MailPoet***'; APIError::NOT_FOUND => __('This newsletter does not exist.')
$data_for_shortcodes = ));
array_merge(array($newsletter['subject']), $rendered_newsletter); } else {
$body = implode($divider, $data_for_shortcodes); $newsletter = $newsletter->asArray();
$subscriber = Subscriber::getCurrentWPUser(); $renderer = new Renderer($newsletter, $preview = true);
$subscriber = ($subscriber) ? $subscriber->asArray() : false; $rendered_newsletter = $renderer->render();
$divider = '***MailPoet***';
$data_for_shortcodes = array_merge(
array($newsletter['subject']),
$rendered_newsletter
);
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes( $body = implode($divider, $data_for_shortcodes);
$newsletter,
$subscriber $subscriber = Subscriber::getCurrentWPUser();
); $subscriber = ($subscriber) ? $subscriber->asArray() : false;
list($newsletter['subject'],
$newsletter['body']['html'], $shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
$newsletter['body']['text'] $newsletter,
$subscriber
);
list(
$newsletter['subject'],
$newsletter['body']['html'],
$newsletter['body']['text']
) = explode($divider, $shortcodes->replace($body)); ) = explode($divider, $shortcodes->replace($body));
try { try {
$mailer = new \MailPoet\Mailer\Mailer( $mailer = new \MailPoet\Mailer\Mailer(
$mailer = false, $mailer = false,
$sender = false, $sender = false,
$reply_to = false $reply_to = false
); );
$result = $mailer->send($newsletter, $data['subscriber']); $mailer->send($newsletter, $data['subscriber']);
return $this->successResponse(
return array('result' => $result); Newsletter::findOne($id)->asArray()
} catch(\Exception $e) { );
return array( } catch(\Exception $e) {
'result' => false, return $this->errorResponse(array(
'errors' => array($e->getMessage()), $e->getCode() => $e->getMessage()
); ));
}
} }
} }
@ -298,11 +335,18 @@ class Newsletters extends APIEndpoint {
} }
function bulkAction($data = array()) { function bulkAction($data = array()) {
$bulk_action = new Listing\BulkAction( try {
'\MailPoet\Models\Newsletter', $bulk_action = new Listing\BulkAction(
$data '\MailPoet\Models\Newsletter',
); $data
return $bulk_action->apply(); );
$count = $bulk_action->apply();
return $this->successResponse(null, array('count' => $count));
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
} }
function create($data = array()) { function create($data = array()) {
@ -313,23 +357,25 @@ class Newsletters extends APIEndpoint {
} }
$newsletter = Newsletter::createOrUpdate($data); $newsletter = Newsletter::createOrUpdate($data);
$errors = $newsletter->getErrors();
// try to load template data if(!empty($errors)) {
$template_id = (!empty($data['template']) ? (int)$data['template'] : false); return $this->badRequest($errors);
$template = NewsletterTemplate::findOne($template_id);
if($template !== false) {
$newsletter->body = $template->body;
} else { } else {
$newsletter->body = array(); // try to load template data
$template_id = (isset($data['template']) ? (int)$data['template'] : false);
$template = NewsletterTemplate::findOne($template_id);
if($template === false) {
$newsletter->body = array();
} else {
$newsletter->body = $template->body;
}
} }
$newsletter->save(); $newsletter->save();
$errors = $newsletter->getErrors(); $errors = $newsletter->getErrors();
if(!empty($errors)) { if(!empty($errors)) {
return array( return $this->badRequest($errors);
'result' => false,
'errors' =>$errors
);
} else { } else {
if(!empty($options)) { if(!empty($options)) {
$option_fields = NewsletterOptionField::where( $option_fields = NewsletterOptionField::where(
@ -346,15 +392,19 @@ class Newsletters extends APIEndpoint {
} }
} }
} }
if(!isset($data['id']) &&
isset($data['type']) && if(
$data['type'] === 'notification' empty($data['id'])
&&
isset($data['type'])
&&
$data['type'] === Newsletter::TYPE_NOTIFICATION
) { ) {
Scheduler::processPostNotificationSchedule($newsletter->id); Scheduler::processPostNotificationSchedule($newsletter->id);
} }
return array(
'result' => true, return $this->successResponse(
'newsletter' => $newsletter->asArray() Newsletter::findOne($newsletter->id)->asArray()
); );
} }
} }

View File

@ -1,31 +1,34 @@
<?php <?php
use \MailPoet\API\Endpoints\Forms; use \MailPoet\API\Endpoints\Forms;
use \MailPoet\API\Response as APIResponse;
use \MailPoet\Models\Form; use \MailPoet\Models\Form;
use \MailPoet\Models\Segment; use \MailPoet\Models\Segment;
class FormsTest extends MailPoetTest { class FormsTest extends MailPoetTest {
function _before() { function _before() {
Form::createOrUpdate(array('name' => 'Form 1')); $this->form_1 = Form::createOrUpdate(array('name' => 'Form 1'));
Form::createOrUpdate(array('name' => 'Form 2')); $this->form_2 = Form::createOrUpdate(array('name' => 'Form 2'));
Form::createOrUpdate(array('name' => 'Form 3')); $this->form_3 = Form::createOrUpdate(array('name' => 'Form 3'));
Segment::createOrUpdate(array('name' => 'Segment 1')); Segment::createOrUpdate(array('name' => 'Segment 1'));
Segment::createOrUpdate(array('name' => 'Segment 2')); Segment::createOrUpdate(array('name' => 'Segment 2'));
} }
function testItCanGetAForm() { function testItCanGetAForm() {
$form = Form::where('name', 'Form 1')->findOne();
$router = new Forms(); $router = new Forms();
$response = $router->get(/* missing id */); $response = $router->get(/* missing id */);
expect($response)->false(); expect($response->status)->equals(APIResponse::STATUS_NOT_FOUND);
expect($response->errors[0]['message'])->equals('This form does not exist.');
$response = $router->get('not_an_id'); $response = $router->get(array('id' => 'not_an_id'));
expect($response)->false(); expect($response->status)->equals(APIResponse::STATUS_NOT_FOUND);
expect($response->errors[0]['message'])->equals('This form does not exist.');
$response = $router->get($form->id); $response = $router->get(array('id' => $this->form_1->id));
expect($response['id'])->equals($form->id); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['name'])->equals($form->name); expect($response->data)->equals(
Form::findOne($this->form_1->id)->asArray()
);
} }
function testItCanGetListingData() { function testItCanGetListingData() {
@ -43,12 +46,11 @@ class FormsTest extends MailPoetTest {
function testItCanCreateANewForm() { function testItCanCreateANewForm() {
$router = new Forms(); $router = new Forms();
$response = $router->create(); $response = $router->create();
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['form_id'] > 0)->true(); expect($response->data)->equals(
expect($response)->hasntKey('errors'); Form::findOne($response->data['id'])->asArray()
);
$created_form = Form::findOne($response['form_id']); expect($response->data['name'])->equals('New form');
expect($created_form->name)->equals('New form');
} }
function testItCanSaveAForm() { function testItCanSaveAForm() {
@ -58,133 +60,127 @@ class FormsTest extends MailPoetTest {
$router = new Forms(); $router = new Forms();
$response = $router->save(/* missing data */); $response = $router->save(/* missing data */);
expect($response['result'])->false(); expect($response->status)->equals(APIResponse::STATUS_BAD_REQUEST);
expect($response['errors'][0])->equals('Please specify a name'); expect($response->errors[0]['message'])->equals('Please specify a name');
$response = $router->save($form_data); $response = $router->save($form_data);
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['form_id'] > 0)->true(); expect($response->data)->equals(
Form::where('name', 'My first form')->findOne()->asArray()
$form = Form::where('name', 'My first form')->findOne(); );
expect($form->id)->equals($response['form_id']);
expect($form->name)->equals('My first form');
} }
function testItCanPreviewAForm() { function testItCanPreviewAForm() {
$router = new Forms(); $router = new Forms();
$response = $router->create(); $response = $router->create();
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['form_id'] > 0)->true(); expect($response->data)->equals(
Form::where('name', 'New form')->findOne()->asArray()
);
$form = Form::findOne($response['form_id']); $response = $router->previewEditor($response->data);
$response = $router->previewEditor($form->asArray()); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['html'])->notEmpty(); expect($response->data['html'])->notEmpty();
expect($response['css'])->notEmpty(); expect($response->data['css'])->notEmpty();
} }
function testItCanExportAForm() { function testItCanExportAForm() {
$router = new Forms(); $router = new Forms();
$response = $router->create(); $response = $router->create();
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['form_id'] > 0)->true();
$response = $router->exportsEditor($response['form_id']); $response = $router->exportsEditor($response->data);
expect($response['html'])->notEmpty(); expect($response->data['html'])->notEmpty();
expect($response['php'])->notEmpty(); expect($response->data['php'])->notEmpty();
expect($response['iframe'])->notEmpty(); expect($response->data['iframe'])->notEmpty();
expect($response['shortcode'])->notEmpty(); expect($response->data['shortcode'])->notEmpty();
} }
function testItCanSaveFormEditor() { function testItCanSaveFormEditor() {
$router = new Forms(); $router = new Forms();
$response = $router->create(); $response = $router->create();
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['form_id'] > 0)->true();
$form = Form::findOne($response['form_id'])->asArray(); $form = Form::findOne($response->data['id'])->asArray();
$form['name'] = 'Updated form'; $form['name'] = 'Updated form';
$response = $router->saveEditor($form); $response = $router->saveEditor($form);
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['is_widget'])->false(); expect($response->meta['is_widget'])->false();
expect($response->data['name'])->equals('Updated form');
$saved_form = Form::findOne($form['id']);
expect($saved_form->name)->equals('Updated form');
} }
function testItCanRestoreAForm() { function testItCanRestoreAForm() {
$form = Form::where('name', 'Form 1')->findOne(); $this->form_1->trash();
$form->trash();
$trashed_form = Form::findOne($form->id); $trashed_form = Form::findOne($this->form_1->id);
expect($trashed_form->deleted_at)->notNull(); expect($trashed_form->deleted_at)->notNull();
$router = new Forms(); $router = new Forms();
$response = $router->restore($form->id); $response = $router->restore(array('id' => $this->form_1->id));
expect($response)->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals(
$restored_form = Form::findOne($form->id); Form::findOne($this->form_1->id)->asArray()
expect($restored_form->deleted_at)->null(); );
expect($response->data['deleted_at'])->null();
expect($response->meta['count'])->equals(1);
} }
function testItCanTrashAForm() { function testItCanTrashAForm() {
$form = Form::where('name', 'Form 1')->findOne();
expect($form->deleted_at)->null();
$router = new Forms(); $router = new Forms();
$response = $router->trash($form->id); $response = $router->trash(array('id' => $this->form_2->id));
expect($response)->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals(
$trashed_form = Form::findOne($form->id); Form::findOne($this->form_2->id)->asArray()
expect($trashed_form->deleted_at)->notNull(); );
expect($response->data['deleted_at'])->notNull();
expect($response->meta['count'])->equals(1);
} }
function testItCanDeleteAForm() { function testItCanDeleteAForm() {
$form = Form::where('name', 'Form 2')->findOne();
expect($form->deleted_at)->null();
$router = new Forms(); $router = new Forms();
$response = $router->delete($form->id); $response = $router->delete(array('id' => $this->form_3->id));
expect($response)->equals(1); expect($response->data)->isEmpty();
expect($response->status)->equals(APIResponse::STATUS_OK);
$deleted_form = Form::findOne($form->id); expect($response->meta['count'])->equals(1);
expect($deleted_form)->false();
} }
function testItCanDuplicateAForm() { function testItCanDuplicateAForm() {
$form = Form::where('name', 'Form 3')->findOne();
$router = new Forms(); $router = new Forms();
$response = $router->duplicate($form->id); $response = $router->duplicate(array('id' => $this->form_1->id));
expect($response['name'])->equals('Copy of '.$form->name); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals(
$duplicated_form = Form::findOne($response['id']); Form::where('name', 'Copy of Form 1')->findOne()->asArray()
expect($duplicated_form->name)->equals('Copy of '.$form->name); );
expect($response->meta['count'])->equals(1);
} }
function testItCanBulkDeleteForms() { function testItCanBulkDeleteForms() {
expect(Form::count())->equals(3); $router = new Forms();
$response = $router->bulkAction(array(
$forms = Form::findMany(); 'action' => 'trash',
foreach($forms as $form) { 'listing' => array('group' => 'all')
$form->trash(); ));
} expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(3);
$router = new Forms(); $router = new Forms();
$response = $router->bulkAction(array( $response = $router->bulkAction(array(
'action' => 'delete', 'action' => 'delete',
'listing' => array('group' => 'trash') 'listing' => array('group' => 'trash')
)); ));
expect($response)->equals(3); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(3);
$response = $router->bulkAction(array( $response = $router->bulkAction(array(
'action' => 'delete', 'action' => 'delete',
'listing' => array('group' => 'trash') 'listing' => array('group' => 'trash')
)); ));
expect($response)->equals(0); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(0);
} }
function _after() { function _after() {

View File

@ -23,14 +23,24 @@ class NewslettersTest extends MailPoetTest {
function testItCanGetANewsletter() { function testItCanGetANewsletter() {
$router = new Newsletters(); $router = new Newsletters();
$response = $router->get($this->newsletter->id()); $response = $router->get(/* missing id */);
expect($response['id'])->equals($this->newsletter->id()); expect($response->status)->equals(APIResponse::STATUS_NOT_FOUND);
expect($response->errors[0]['message'])
->equals('This newsletter does not exist.');
$response = $router->get('not_an_id'); $response = $router->get(array('id' => 'not_an_id'));
expect($response)->false(); expect($response->status)->equals(APIResponse::STATUS_NOT_FOUND);
expect($response->errors[0]['message'])
->equals('This newsletter does not exist.');
$response = $router->get(/* missing argument */); $response = $router->get(array('id' => $this->newsletter->id));
expect($response)->false(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals(
Newsletter::findOne($this->newsletter->id)
->withSegments()
->withOptions()
->asArray()
);
} }
function testItCanSaveANewNewsletter() { function testItCanSaveANewNewsletter() {
@ -110,43 +120,57 @@ class NewslettersTest extends MailPoetTest {
function testItCanRestoreANewsletter() { function testItCanRestoreANewsletter() {
$this->newsletter->trash(); $this->newsletter->trash();
expect($this->newsletter->deleted_at)->notNull(); $trashed_newsletter = Newsletter::findOne($this->newsletter->id);
expect($trashed_newsletter->deleted_at)->notNull();
$router = new Newsletters(); $router = new Newsletters();
$router->restore($this->newsletter->id()); $response = $router->restore(array('id' => $this->newsletter->id));
expect($response->status)->equals(APIResponse::STATUS_OK);
$restored_subscriber = Newsletter::findOne($this->newsletter->id()); expect($response->data)->equals(
expect($restored_subscriber->deleted_at)->null(); Newsletter::findOne($this->newsletter->id)->asArray()
);
expect($response->data['deleted_at'])->null();
expect($response->meta['count'])->equals(1);
} }
function testItCanTrashANewsletter() { function testItCanTrashANewsletter() {
$router = new Newsletters(); $router = new Newsletters();
$response = $router->trash($this->newsletter->id()); $response = $router->trash(array('id' => $this->newsletter->id));
expect($response)->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->data)->equals(
$trashed_subscriber = Newsletter::findOne($this->newsletter->id()); Newsletter::findOne($this->newsletter->id)->asArray()
expect($trashed_subscriber->deleted_at)->notNull(); );
expect($response->data['deleted_at'])->notNull();
expect($response->meta['count'])->equals(1);
} }
function testItCanDeleteANewsletter() { function testItCanDeleteANewsletter() {
$router = new Newsletters(); $router = new Newsletters();
$response = $router->delete($this->newsletter->id()); $response = $router->delete(array('id' => $this->newsletter->id));
expect($response)->equals(1); expect($response->data)->isEmpty();
expect($response->status)->equals(APIResponse::STATUS_OK);
expect(Newsletter::findOne($this->newsletter->id()))->false(); expect($response->meta['count'])->equals(1);
} }
function testItCanDuplicateANewsletter() { function testItCanDuplicateANewsletter() {
$router = new Newsletters(); $router = new Newsletters();
$response = $router->duplicate($this->newsletter->id()); $response = $router->duplicate(array('id' => $this->newsletter->id));
expect($response['subject'])->equals('Copy of My Standard Newsletter'); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['type'])->equals(Newsletter::TYPE_STANDARD); expect($response->data)->equals(
expect($response['body'])->equals($this->newsletter->body); Newsletter::where('subject', 'Copy of My Standard Newsletter')
->findOne()
->asArray()
);
expect($response->meta['count'])->equals(1);
$response = $router->duplicate($this->post_notification->id()); $response = $router->duplicate(array('id' => $this->post_notification->id));
expect($response['subject'])->equals('Copy of My Post Notification'); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['type'])->equals(Newsletter::TYPE_NOTIFICATION); expect($response->data)->equals(
expect($response['body'])->equals($this->post_notification->body); Newsletter::where('subject', 'Copy of My Post Notification')
->findOne()
->asArray()
);
expect($response->meta['count'])->equals(1);
} }
function testItCanCreateANewsletter() { function testItCanCreateANewsletter() {
@ -156,16 +180,16 @@ class NewslettersTest extends MailPoetTest {
); );
$router = new Newsletters(); $router = new Newsletters();
$response = $router->create($data); $response = $router->create($data);
expect($response['result'])->true(); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['newsletter']['id'] > 0)->true(); expect($response->data)->equals(
expect($response['newsletter']['subject'])->equals('My New Newsletter'); Newsletter::where('subject', 'My New Newsletter')
expect($response['newsletter']['type'])->equals(Newsletter::TYPE_STANDARD); ->findOne()
expect($response['newsletter']['body'])->equals(array()); ->asArray()
expect($response)->hasntKey('errors'); );
$response = $router->create(); $response = $router->create();
expect($response['result'])->false(); expect($response->status)->equals(APIResponse::STATUS_BAD_REQUEST);
expect($response['errors'][0])->equals('Please specify a type'); expect($response->errors[0]['message'])->equals('Please specify a type');
} }
function testItCanGetListingData() { function testItCanGetListingData() {
@ -174,22 +198,22 @@ class NewslettersTest extends MailPoetTest {
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->newsletter->id(), 'newsletter_id' => $this->newsletter->id,
'segment_id' => $segment_1->id() 'segment_id' => $segment_1->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->newsletter->id(), 'newsletter_id' => $this->newsletter->id,
'segment_id' => $segment_2->id() 'segment_id' => $segment_2->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->post_notification->id(), 'newsletter_id' => $this->post_notification->id,
'segment_id' => $segment_2->id() 'segment_id' => $segment_2->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
@ -226,23 +250,23 @@ class NewslettersTest extends MailPoetTest {
// link standard newsletter to the 2 segments // link standard newsletter to the 2 segments
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->newsletter->id(), 'newsletter_id' => $this->newsletter->id,
'segment_id' => $segment_1->id() 'segment_id' => $segment_1->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->newsletter->id(), 'newsletter_id' => $this->newsletter->id,
'segment_id' => $segment_2->id() 'segment_id' => $segment_2->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
// link post notification to the 2nd segment // link post notification to the 2nd segment
$newsletter_segment = NewsletterSegment::create(); $newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array( $newsletter_segment->hydrate(array(
'newsletter_id' => $this->post_notification->id(), 'newsletter_id' => $this->post_notification->id,
'segment_id' => $segment_2->id() 'segment_id' => $segment_2->id
)); ));
$newsletter_segment->save(); $newsletter_segment->save();
@ -301,14 +325,9 @@ class NewslettersTest extends MailPoetTest {
} }
function testItCanBulkDeleteSelectionOfNewsletters() { function testItCanBulkDeleteSelectionOfNewsletters() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'To be deleted',
'type' => Newsletter::TYPE_STANDARD
));
$selection_ids = array( $selection_ids = array(
$newsletter->id, $this->newsletter->id,
$this->newsletter->id $this->post_notification->id
); );
$router = new Newsletters(); $router = new Newsletters();
@ -319,29 +338,33 @@ class NewslettersTest extends MailPoetTest {
'action' => 'delete' 'action' => 'delete'
)); ));
expect($response)->equals(count($selection_ids)); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(count($selection_ids));
} }
function testItCanBulkDeleteNewsletters() { function testItCanBulkDeleteNewsletters() {
expect(Newsletter::count())->equals(2); $router = new Newsletters();
$response = $router->bulkAction(array(
$newsletters = Newsletter::findMany(); 'action' => 'trash',
foreach($newsletters as $newsletter) { 'listing' => array('group' => 'all')
$newsletter->trash(); ));
} expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(2);
$router = new Newsletters(); $router = new Newsletters();
$response = $router->bulkAction(array( $response = $router->bulkAction(array(
'action' => 'delete', 'action' => 'delete',
'listing' => array('group' => 'trash') 'listing' => array('group' => 'trash')
)); ));
expect($response)->equals(2); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(2);
$response = $router->bulkAction(array( $response = $router->bulkAction(array(
'action' => 'delete', 'action' => 'delete',
'listing' => array('group' => 'trash') 'listing' => array('group' => 'trash')
)); ));
expect($response)->equals(0); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response->meta['count'])->equals(0);
} }
function _after() { function _after() {

View File

@ -414,6 +414,13 @@
MailPoet.Notice.success( MailPoet.Notice.success(
"<%= __('The form name was successfully updated!') %>" "<%= __('The form name was successfully updated!') %>"
); );
}).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}
}); });
} }
} }
@ -454,9 +461,16 @@
MailPoet.Modal.popup({ MailPoet.Modal.popup({
title: "<%= __('Form preview') %>", title: "<%= __('Form preview') %>",
template: $('#mailpoet_form_preview_template').html(), template: $('#mailpoet_form_preview_template').html(),
data: response data: response.data
}); });
}) }).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}
});
} }
function mailpoet_form_save(callback) { function mailpoet_form_save(callback) {
@ -490,7 +504,7 @@
if(callback !== false) { if(callback !== false) {
var message = null; var message = null;
if(response.is_widget === true) { if(response.meta.is_widget === true) {
message = "<%= __('Saved! The changes are now active in your widget.') %>"; message = "<%= __('Saved! The changes are now active in your widget.') %>";
} else { } else {
message = "<%= __('Saved! Add this form to %1$sa widget%2$s.') | format("<a href='widgets.php' target='_blank'>", '</a>') | raw %>"; message = "<%= __('Saved! Add this form to %1$sa widget%2$s.') | format("<a href='widgets.php' target='_blank'>", '</a>') | raw %>";
@ -500,7 +514,7 @@
MailPoet.Notice.hide(); MailPoet.Notice.hide();
MailPoet.Notice.success(message, { MailPoet.Notice.success(message, {
scroll: true, scroll: true,
static: (response.is_widget === false) static: (response.meta.is_widget === false)
}); });
} }
@ -539,10 +553,17 @@
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'forms', endpoint: 'forms',
action: 'exportsEditor', action: 'exportsEditor',
data: $('#mailpoet_form_id').val() data: {
id: $('#mailpoet_form_id').val()
}
}).done(function(response) { }).done(function(response) {
if(response.result !== false) { $('#mailpoet_form_export').html(template({ exports: response.data }));
$('#mailpoet_form_export').html(template({ exports: response })); }).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
} }
}); });
} }

View File

@ -324,9 +324,7 @@
'shortcodesWindowTitle': __('Select a shortcode'), 'shortcodesWindowTitle': __('Select a shortcode'),
'unsubscribeLinkMissing': __('All newsletters must include an "Unsubscribe" link. Add a footer widget to your newsletter to continue'), 'unsubscribeLinkMissing': __('All newsletters must include an "Unsubscribe" link. Add a footer widget to your newsletter to continue'),
'newsletterPreviewEmailMissing': __('Enter an email address to send the preview newsletter to'), 'newsletterPreviewEmailMissing': __('Enter an email address to send the preview newsletter to'),
'newsletterPreviewFailed': __('Preview failed. Please check console log'),
'newsletterPreviewSent': __('Your test email has been sent!'), 'newsletterPreviewSent': __('Your test email has been sent!'),
'newsletterPreviewFailedToSend': __('Attempt to send a newsletter preview email failed. Please verify that your sending method is configured correctly and try again'),
'templateNameMissing': __('Please add a template name'), 'templateNameMissing': __('Please add a template name'),
'templateDescriptionMissing': __('Please add a template description'), 'templateDescriptionMissing': __('Please add a template description'),
'templateSaved': __('Template has been saved.'), 'templateSaved': __('Template has been saved.'),
@ -1197,14 +1195,23 @@
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: 'newsletters', endpoint: 'newsletters',
action: 'get', action: 'get',
data: <%= params('id') %> data: {
}).done(function(newsletter) { id: <%= params('id') %>
}
}).always(function() {
MailPoet.Modal.loading(false);
}).done(function(response) {
EditorApplication.start({ EditorApplication.start({
newsletter: newsletter, newsletter: response.data,
config: config, config: config,
}); });
}).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 }
);
}
}); });
</script> </script>
<% endblock %> <% endblock %>