form & listing jsx update + Segment endpoint conversion

This commit is contained in:
Jonathan Labreuille
2016-08-12 13:42:48 +02:00
parent 6223ef77d9
commit d93249f077
5 changed files with 189 additions and 116 deletions

View File

@ -66,22 +66,22 @@ define(
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: this.props.endpoint, endpoint: this.props.endpoint,
action: 'get', action: 'get',
data: id data: {
}).done(function(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
});
} }
}.bind(this)); }).done((response) => {
this.setState({
loading: false,
item: response.data
});
}).fail((response) => {
this.setState({
loading: false,
item: {}
}, function() {
this.context.router.push('/new');
});
});
}, },
handleSubmit: function(e) { handleSubmit: function(e) {
e.preventDefault(); e.preventDefault();
@ -115,29 +115,25 @@ define(
endpoint: this.props.endpoint, endpoint: this.props.endpoint,
action: 'save', action: 'save',
data: item data: item
}).done(function(response) { }).always(() => {
this.setState({ loading: false }); this.setState({ loading: false });
}).done((response) => {
if(response.result === true) { if(this.props.onSuccess !== undefined) {
if(this.props.onSuccess !== undefined) { this.props.onSuccess();
this.props.onSuccess();
} else {
this.context.router.push('/');
}
if(this.props.params.id !== undefined) {
this.props.messages.onUpdate();
} else {
this.props.messages.onCreate();
}
} else { } else {
if(response.result === false) { this.context.router.push('/');
if(response.errors.length > 0) {
this.setState({ errors: response.errors });
}
}
} }
}.bind(this));
if(this.props.params.id !== undefined) {
this.props.messages.onUpdate();
} else {
this.props.messages.onCreate();
}
}).fail((response) => {
if(response.errors.length > 0) {
this.setState({ errors: response.errors });
}
});
}, },
handleValueChange: function(e) { handleValueChange: function(e) {
if (this.props.onChange) { if (this.props.onChange) {
@ -159,7 +155,7 @@ define(
var errors = this.getErrors().map(function(error, index) { var errors = this.getErrors().map(function(error, index) {
return ( return (
<p key={ 'error-'+index } className="mailpoet_error"> <p key={ 'error-'+index } className="mailpoet_error">
{ error } { error.message }
</p> </p>
); );
}); });

View File

@ -456,22 +456,29 @@ const Listing = React.createClass({
sort_by: this.state.sort_by, sort_by: this.state.sort_by,
sort_order: this.state.sort_order sort_order: this.state.sort_order
} }
}).done(function(response) { }).done((response) => {
this.setState({ this.setState({
items: response.items || [], items: response.items || [],
filters: response.filters || {}, filters: response.filters || {},
groups: response.groups || [], groups: response.groups || [],
count: response.count || 0, count: response.count || 0,
loading: false loading: false
}, function() { }, () => {
// if viewing an empty trash
if (this.state.group === 'trash' && response.count === 0) {
// redirect to default group
this.handleGroup('all');
}
// TODO: remove this....
if (this.props['onGetItems'] !== undefined) { if (this.props['onGetItems'] !== undefined) {
const count = (response.groups[0] !== undefined) const count = (response.groups[0] !== undefined)
? ~~(response.groups[0].count) ? ~~(response.groups[0].count)
: 0; : 0;
this.props.onGetItems(count); this.props.onGetItems(count);
} }
}.bind(this)); });
}.bind(this)); });
} }
}, },
handleRestoreItem: function(id) { handleRestoreItem: function(id) {
@ -483,8 +490,10 @@ const Listing = React.createClass({
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: this.props.endpoint, endpoint: this.props.endpoint,
action: 'restore', action: 'restore',
data: id data: {
}).done(function(response) { id: id
}
}).done((response) => {
if ( if (
this.props.messages !== undefined this.props.messages !== undefined
&& this.props.messages['onRestore'] !== undefined && this.props.messages['onRestore'] !== undefined
@ -492,7 +501,12 @@ const Listing = React.createClass({
this.props.messages.onRestore(response); this.props.messages.onRestore(response);
} }
this.getItems(); this.getItems();
}.bind(this)); }).fail((response) => {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
});
}, },
handleTrashItem: function(id) { handleTrashItem: function(id) {
this.setState({ this.setState({
@ -503,8 +517,10 @@ const Listing = React.createClass({
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: this.props.endpoint, endpoint: this.props.endpoint,
action: 'trash', action: 'trash',
data: id data: {
}).done(function(response) { id: id
}
}).done((response) => {
if ( if (
this.props.messages !== undefined this.props.messages !== undefined
&& this.props.messages['onTrash'] !== undefined && this.props.messages['onTrash'] !== undefined
@ -512,7 +528,12 @@ const Listing = React.createClass({
this.props.messages.onTrash(response); this.props.messages.onTrash(response);
} }
this.getItems(); this.getItems();
}.bind(this)); }).fail((response) => {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
});
}, },
handleDeleteItem: function(id) { handleDeleteItem: function(id) {
this.setState({ this.setState({
@ -523,8 +544,10 @@ const Listing = React.createClass({
MailPoet.Ajax.post({ MailPoet.Ajax.post({
endpoint: this.props.endpoint, endpoint: this.props.endpoint,
action: 'delete', action: 'delete',
data: id data: {
}).done(function(response) { id: id
}
}).done((response) => {
if ( if (
this.props.messages !== undefined this.props.messages !== undefined
&& this.props.messages['onDelete'] !== undefined && this.props.messages['onDelete'] !== undefined
@ -532,22 +555,29 @@ const Listing = React.createClass({
this.props.messages.onDelete(response); this.props.messages.onDelete(response);
} }
this.getItems(); this.getItems();
}.bind(this)); }).fail((response) => {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
});
}, },
handleEmptyTrash: function() { handleEmptyTrash: function() {
return this.handleBulkAction('all', { return this.handleBulkAction('all', {
action: 'delete', action: 'delete',
group: 'trash' group: 'trash'
}).then(function(response) { }).done((response) => {
if (~~(response) > 0) { MailPoet.Notice.success(
MailPoet.Notice.success( MailPoet.I18n.t('permanentlyDeleted').replace('%d', response.meta.count)
MailPoet.I18n.t('permanentlyDeleted').replace('%d', response) );
);
}
// redirect to default group // redirect to default group
this.handleGroup('all'); this.handleGroup('all');
}.bind(this)); }).fail((response) => {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
});
}, },
handleBulkAction: function(selected_ids, params) { handleBulkAction: function(selected_ids, params) {
if ( if (

View File

@ -36,11 +36,11 @@ var columns = [
]; ];
const messages = { const messages = {
onTrash: function(response) { onTrash: (response) => {
var count = ~~response; let count = ~~response.meta.count;
var message = null; let message = null;
if(count === 1) { if (count === 1) {
message = ( message = (
MailPoet.I18n.t('oneSegmentTrashed') MailPoet.I18n.t('oneSegmentTrashed')
); );
@ -51,11 +51,11 @@ const messages = {
} }
MailPoet.Notice.success(message); MailPoet.Notice.success(message);
}, },
onDelete: function(response) { onDelete: (response) => {
var count = ~~response; let count = ~~response.meta.count;
var message = null; let message = null;
if(count === 1) { if (count === 1) {
message = ( message = (
MailPoet.I18n.t('oneSegmentDeleted') MailPoet.I18n.t('oneSegmentDeleted')
); );
@ -66,11 +66,11 @@ const messages = {
} }
MailPoet.Notice.success(message); MailPoet.Notice.success(message);
}, },
onRestore: function(response) { onRestore: (response) => {
var count = ~~response; let count = ~~response.meta.count;
var message = null; let message = null;
if(count === 1) { if (count === 1) {
message = ( message = (
MailPoet.I18n.t('oneSegmentRestored') MailPoet.I18n.t('oneSegmentRestored')
); );
@ -106,16 +106,23 @@ const item_actions = [
{ {
name: 'duplicate_segment', name: 'duplicate_segment',
label: MailPoet.I18n.t('duplicate'), label: MailPoet.I18n.t('duplicate'),
onClick: function(item, refresh) { onClick: (item, refresh) => {
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'segments', endpoint: 'segments',
action: 'duplicate', action: 'duplicate',
data: item.id data: {
}).done(function(response) { id: item.id
}
}).done((response) => {
MailPoet.Notice.success( MailPoet.Notice.success(
(MailPoet.I18n.t('listDuplicated')).replace('%$1s', response.name) MailPoet.I18n.t('listDuplicated').replace('%$1s', response.data.name)
); );
refresh(); refresh();
}).fail((response) => {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}); });
}, },
display: function(segment) { display: function(segment) {

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\Segment; use \MailPoet\Models\Segment;
use \MailPoet\Models\SubscriberSegment; use \MailPoet\Models\SubscriberSegment;
@ -9,16 +11,16 @@ use \MailPoet\Segments\WP;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
class Segments { class Segments extends APIEndpoint {
function __construct() { function get($data = array()) {
} $id = (isset($data['id']) ? (int)$data['id'] : false);
function get($id = false) {
$segment = Segment::findOne($id); $segment = Segment::findOne($id);
if($segment === false) { if($segment === false) {
return false; return $this->errorResponse(array(
APIError::NOT_FOUND => __('This list does not exist.')
));
} else { } else {
return $segment->asArray(); return $this->successResponse($segment->asArray());
} }
} }
@ -49,68 +51,109 @@ class Segments {
$errors = $segment->getErrors(); $errors = $segment->getErrors();
if(!empty($errors)) { if(!empty($errors)) {
return array( return $this->errorResponse($errors);
'result' => false,
'errors' => $errors
);
} else { } else {
return array( return $this->successResponse(
'result' => true Segment::findOne($segment->id)->asArray()
); );
} }
} }
function restore($id) { function restore($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$segment = Segment::findOne($id); $segment = Segment::findOne($id);
if($segment !== false) { if($segment === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This list does not exist.')
));
} else {
$segment->restore(); $segment->restore();
return $this->successResponse(
Segment::findOne($segment->id)->asArray(),
array('count' => 1)
);
} }
return ($segment->getErrors() === false);
} }
function trash($id) { function trash($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$segment = Segment::findOne($id); $segment = Segment::findOne($id);
if($segment !== false) { if($segment === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This list does not exist.')
));
} else {
$segment->trash(); $segment->trash();
return $this->successResponse(
Segment::findOne($segment->id)->asArray(),
array('count' => 1)
);
} }
return ($segment->getErrors() === false);
} }
function delete($id) { function delete($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$segment = Segment::findOne($id); $segment = Segment::findOne($id);
if($segment !== false) { if($segment === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This list does not exist.')
));
} else {
$segment->delete(); $segment->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);
$segment = Segment::findOne($id); $segment = Segment::findOne($id);
if($segment !== false) {
if($segment === false) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This list does not exist.')
));
} else {
$data = array( $data = array(
'name' => sprintf(__('Copy of %s'), $segment->name) 'name' => sprintf(__('Copy of %s'), $segment->name)
); );
$result = $segment->duplicate($data)->asArray(); $duplicate = $segment->duplicate($data);
} $errors = $duplicate->getErrors();
return $result; if(!empty($errors)) {
return $this->errorResponse($errors);
} else {
return $this->successResponse(
Segment::findOne($duplicate->id)->asArray(),
array('count' => 1)
);
}
}
} }
function synchronize() { function synchronize() {
$result = WP::synchronizeUsers(); try {
WP::synchronizeUsers();
} catch(\Exception $e) {
return $this->errorResponse(array(
$e->getCode() => $e->getMessage()
));
}
return $result; return $this->successResponse(null);
} }
function bulkAction($data = array()) { function bulkAction($data = array()) {
$bulk_action = new Listing\BulkAction( try {
'\MailPoet\Models\Segment', $bulk_action = new Listing\BulkAction(
$data '\MailPoet\Models\Segment',
); $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

@ -145,11 +145,8 @@ class Model extends \Sudzy\ValidModel {
$duplicate->set_expr('updated_at', 'NOW()'); $duplicate->set_expr('updated_at', 'NOW()');
$duplicate->set_expr('deleted_at', 'NULL'); $duplicate->set_expr('deleted_at', 'NULL');
if($duplicate->save()) { $duplicate->save();
return $duplicate; return $duplicate;
} else {
return false;
}
} }
private function setTimestamp() { private function setTimestamp() {