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({
endpoint: 'forms',
action: 'duplicate',
data: item.id
}).done(function(response) {
if (response !== false && response['name'] !== undefined) {
MailPoet.Notice.success(
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name)
data: {
id: item.id
}
}).done((response) => {
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({
endpoint: 'forms',
action: 'create'
}).done(function(response) {
if(response.result && response.form_id) {
window.location = mailpoet_form_edit_url + response.form_id;
}).done((response) => {
window.location = mailpoet_form_edit_url + response.data.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({
endpoint: 'automatedLatestContent',
action: args.action,
data: args.options || {},
data: args.options || {}
});
};
Module._cachedQuery = _.memoize(Module._query, JSON.stringify);
@ -19,14 +19,14 @@ define([
Module.getNewsletter = function(options) {
return Module._query({
action: 'get',
options: options,
options: options
});
};
Module.getPostTypes = function() {
return Module._cachedQuery({
action: 'getPostTypes',
options: {},
options: {}
}).then(function(response) {
return _.values(response.data);
});
@ -83,7 +83,7 @@ define([
return MailPoet.Ajax.post({
endpoint: 'newsletters',
action: 'save',
data: options || {},
data: options || {}
});
};
@ -91,7 +91,7 @@ define([
return MailPoet.Ajax.post({
endpoint: 'newsletters',
action: 'sendPreview',
data: options || {},
data: options || {}
});
};

View File

@ -252,32 +252,31 @@ define([
endpoint: 'newsletters',
action: 'showPreview',
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() {
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() {
@ -302,28 +301,19 @@ define([
// send test email
MailPoet.Modal.loading(true);
CommunicationComponent.previewNewsletter(data).done(function(response) {
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,
}
);
}
}
CommunicationComponent.previewNewsletter(data).always(function() {
MailPoet.Modal.loading(false);
}).done(function(response) {
MailPoet.Notice.success(
MailPoet.I18n.t('newsletterPreviewSent'),
{ scroll: true });
}).fail(function(response) {
// an error occurred
MailPoet.Modal.loading(false);
if (response.errors.length > 0) {
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({
endpoint: 'newsletters',
action: 'get',
data: id
}).done((response) => {
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),
});
data: {
id: id
}
}).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) {

View File

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

View File

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

View File

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

View File

@ -1,5 +1,7 @@
<?php
namespace MailPoet\API\Endpoints;
use MailPoet\API\Endpoint as APIEndpoint;
use MailPoet\API\Error as APIError;
use \MailPoet\Models\Form;
use \MailPoet\Models\StatisticsForms;
@ -9,16 +11,17 @@ use \MailPoet\Form\Util;
if(!defined('ABSPATH')) exit;
class Forms {
function __construct() {
}
function get($id = false) {
class Forms extends APIEndpoint {
function get($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form = Form::findOne($id);
if($form !== false) {
$form = $form->asArray();
if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
return $this->successResponse($form->asArray());
}
return $form;
}
function listing($data = array()) {
@ -87,14 +90,10 @@ class Forms {
$errors = $form->getErrors();
if(!empty($errors)) {
return array(
'result' => false,
'errors' => $errors
);
return $this->badRequest($errors);
} else {
return array(
'result' => true,
'form_id' => $form->id()
return $this->successResponse(
Form::findOne($form->id)->asArray()
);
}
}
@ -109,76 +108,74 @@ class Forms {
// styles
$css = new Util\Styles(FormRenderer::getStyles($data));
return array(
return $this->successResponse(array(
'html' => $html,
'css' => $css->render()
);
));
}
function exportsEditor($id) {
$exports = false;
function exportsEditor($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$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());
return $this->successResponse($exports);
}
return $exports;
}
function saveEditor($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$form_id = (isset($data['id']) ? (int)$data['id'] : 0);
$name = (isset($data['name']) ? $data['name'] : __('New form'));
$body = (isset($data['body']) ? $data['body'] : array());
$settings = (isset($data['settings']) ? $data['settings'] : array());
$styles = (isset($data['styles']) ? $data['styles'] : '');
if(empty($body) || empty($settings)) {
// error
return false;
} else {
// check if the form is used as a widget
$is_widget = false;
$widgets = get_option('widget_mailpoet_form');
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'])
);
}
// check if the form is used as a widget
$is_widget = false;
$widgets = get_option('widget_mailpoet_form');
if(!empty($widgets)) {
foreach($widgets as $widget) {
if(isset($widget['form']) && (int)$widget['form'] === $form_id) {
$is_widget = true;
break;
}
}
}
// check list selection
if($has_segment_selection === true) {
$settings['segments_selected_by'] = 'user';
} else {
$settings['segments_selected_by'] = 'admin';
// 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;
}
}
// check list selection
if($has_segment_selection === true) {
$settings['segments_selected_by'] = 'user';
} else {
$settings['segments_selected_by'] = 'admin';
}
$form = Form::createOrUpdate(array(
'id' => $form_id,
'name' => $name,
@ -187,64 +184,101 @@ class Forms {
'styles' => $styles
));
if($form->getErrors() === false) {
return array(
'result' => true,
'is_widget' => $is_widget
);
$errors = $form->getErrors();
if(!empty($errors)) {
return $this->badRequest($errors);
} else {
return array(
'result' => false,
'errors' => $form->getErrors()
return $this->successResponse(
Form::findOne($form->id)->asArray(),
array('is_widget' => $is_widget)
);
}
}
function restore($id) {
function restore($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$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();
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);
if($form !== false) {
if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$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);
if($form !== false) {
if($form === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This form does not exist.')
));
} else {
$form->delete();
return 1;
return $this->successResponse(null, array('count' => 1));
}
return false;
}
function duplicate($id) {
$result = false;
function duplicate($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$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(
'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()) {
$bulk_action = new Listing\BulkAction(
'\MailPoet\Models\Form',
$data
);
return $bulk_action->apply();
try {
$bulk_action = new Listing\BulkAction(
'\MailPoet\Models\Form',
$data
);
$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');
class Newsletters extends APIEndpoint {
function get($id = false) {
function get($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
return false;
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$segments = $newsletter->segments()->findArray();
$options = $newsletter->options()->findArray();
$newsletter = $newsletter->asArray();
$newsletter['segments'] = array_map(function($segment) {
return $segment['id'];
}, $segments);
$newsletter['options'] = Helpers::arrayColumn($options, 'value', 'name');
return $newsletter;
return $this->successResponse(
$newsletter
->withSegments()
->withOptions()
->asArray()
);
}
}
@ -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);
if($newsletter !== false) {
$newsletter->restore();
}
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)
if($newsletter === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$newsletter->restore();
return $this->successResponse(
Newsletter::findOne($newsletter->id)->asArray(),
array('count' => 1)
);
}
}
if($duplicate !== false && $duplicate->getErrors() === false) {
$result = $duplicate->asArray();
function trash($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->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()) {
if(!isset($data['body'])) {
return array(
'result' => false,
'errors' => array(__('Newsletter data is missing'))
);
if(empty($data['body'])) {
return $this->badRequest(array(
APIError::BAD_REQUEST => __('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;
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
return array(
'result' => false
return $this->errorResponse(array(
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'])) {
return array(
'result' => false,
'errors' => array(__('Please specify receiver information.'))
);
return $this->badRequest(array(
APIError::BAD_REQUEST => __('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);
$rendered_newsletter = $renderer->render();
$divider = '***MailPoet***';
$data_for_shortcodes =
array_merge(array($newsletter['subject']), $rendered_newsletter);
$body = implode($divider, $data_for_shortcodes);
if($newsletter === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter does not exist.')
));
} else {
$newsletter = $newsletter->asArray();
$subscriber = Subscriber::getCurrentWPUser();
$subscriber = ($subscriber) ? $subscriber->asArray() : false;
$renderer = new Renderer($newsletter, $preview = true);
$rendered_newsletter = $renderer->render();
$divider = '***MailPoet***';
$data_for_shortcodes = array_merge(
array($newsletter['subject']),
$rendered_newsletter
);
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
$newsletter,
$subscriber
);
list($newsletter['subject'],
$newsletter['body']['html'],
$newsletter['body']['text']
$body = implode($divider, $data_for_shortcodes);
$subscriber = Subscriber::getCurrentWPUser();
$subscriber = ($subscriber) ? $subscriber->asArray() : false;
$shortcodes = new \MailPoet\Newsletter\Shortcodes\Shortcodes(
$newsletter,
$subscriber
);
list(
$newsletter['subject'],
$newsletter['body']['html'],
$newsletter['body']['text']
) = explode($divider, $shortcodes->replace($body));
try {
$mailer = new \MailPoet\Mailer\Mailer(
$mailer = false,
$sender = false,
$reply_to = false
);
$result = $mailer->send($newsletter, $data['subscriber']);
return array('result' => $result);
} catch(\Exception $e) {
return array(
'result' => false,
'errors' => array($e->getMessage()),
);
try {
$mailer = new \MailPoet\Mailer\Mailer(
$mailer = false,
$sender = false,
$reply_to = false
);
$mailer->send($newsletter, $data['subscriber']);
return $this->successResponse(
Newsletter::findOne($id)->asArray()
);
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
}
}
@ -298,11 +335,18 @@ class Newsletters extends APIEndpoint {
}
function bulkAction($data = array()) {
$bulk_action = new Listing\BulkAction(
'\MailPoet\Models\Newsletter',
$data
);
return $bulk_action->apply();
try {
$bulk_action = new Listing\BulkAction(
'\MailPoet\Models\Newsletter',
$data
);
$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()) {
@ -313,23 +357,25 @@ class Newsletters extends APIEndpoint {
}
$newsletter = Newsletter::createOrUpdate($data);
$errors = $newsletter->getErrors();
// try to load template data
$template_id = (!empty($data['template']) ? (int)$data['template'] : false);
$template = NewsletterTemplate::findOne($template_id);
if($template !== false) {
$newsletter->body = $template->body;
if(!empty($errors)) {
return $this->badRequest($errors);
} 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();
$errors = $newsletter->getErrors();
if(!empty($errors)) {
return array(
'result' => false,
'errors' =>$errors
);
return $this->badRequest($errors);
} else {
if(!empty($options)) {
$option_fields = NewsletterOptionField::where(
@ -346,15 +392,19 @@ class Newsletters extends APIEndpoint {
}
}
}
if(!isset($data['id']) &&
isset($data['type']) &&
$data['type'] === 'notification'
if(
empty($data['id'])
&&
isset($data['type'])
&&
$data['type'] === Newsletter::TYPE_NOTIFICATION
) {
Scheduler::processPostNotificationSchedule($newsletter->id);
}
return array(
'result' => true,
'newsletter' => $newsletter->asArray()
return $this->successResponse(
Newsletter::findOne($newsletter->id)->asArray()
);
}
}

View File

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

View File

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

View File

@ -414,6 +414,13 @@
MailPoet.Notice.success(
"<%= __('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({
title: "<%= __('Form preview') %>",
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) {
@ -490,7 +504,7 @@
if(callback !== false) {
var message = null;
if(response.is_widget === true) {
if(response.meta.is_widget === true) {
message = "<%= __('Saved! The changes are now active in your widget.') %>";
} else {
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.success(message, {
scroll: true,
static: (response.is_widget === false)
static: (response.meta.is_widget === false)
});
}
@ -539,10 +553,17 @@
MailPoet.Ajax.post({
endpoint: 'forms',
action: 'exportsEditor',
data: $('#mailpoet_form_id').val()
data: {
id: $('#mailpoet_form_id').val()
}
}).done(function(response) {
if(response.result !== false) {
$('#mailpoet_form_export').html(template({ exports: response }));
$('#mailpoet_form_export').html(template({ exports: response.data }));
}).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'),
'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'),
'newsletterPreviewFailed': __('Preview failed. Please check console log'),
'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'),
'templateDescriptionMissing': __('Please add a template description'),
'templateSaved': __('Template has been saved.'),
@ -1197,14 +1195,23 @@
MailPoet.Ajax.post({
endpoint: 'newsletters',
action: 'get',
data: <%= params('id') %>
}).done(function(newsletter) {
data: {
id: <%= params('id') %>
}
}).always(function() {
MailPoet.Modal.loading(false);
}).done(function(response) {
EditorApplication.start({
newsletter: newsletter,
newsletter: response.data,
config: config,
});
MailPoet.Modal.loading(false);
}).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}
});
</script>
<% endblock %>