Merge pull request #208 from mailpoet/listing_tests

Listings
This commit is contained in:
Marco
2015-11-10 10:39:53 +01:00
16 changed files with 176 additions and 94 deletions

View File

@ -20,7 +20,17 @@ function(
this.loadCachedItems(); this.loadCachedItems();
this.setupSelect2(); this.setupSelect2();
}, },
componentDidUpdate: function() { componentDidUpdate: function(prevProps, prevState) {
if(
(this.props.item !== undefined && prevProps.item !== undefined)
&& (this.props.item.id !== prevProps.item.id)
) {
jQuery('#'+this.refs.select.id).select2(
'val',
this.props.item[this.props.field.name]
);
}
this.setupSelect2(); this.setupSelect2();
}, },
setupSelect2: function() { setupSelect2: function() {
@ -54,6 +64,11 @@ function(
loadCachedItems: function() { loadCachedItems: function() {
if(typeof(window['mailpoet_'+this.props.field.endpoint]) !== 'undefined') { if(typeof(window['mailpoet_'+this.props.field.endpoint]) !== 'undefined') {
var items = window['mailpoet_'+this.props.field.endpoint]; var items = window['mailpoet_'+this.props.field.endpoint];
if(this.props.field['filter'] !== undefined) {
items = items.filter(this.props.field.filter);
}
this.setState({ this.setState({
items: items items: items
}); });
@ -76,37 +91,33 @@ function(
return true; return true;
}, },
render: function() { render: function() {
if(this.state.items.length === 0) { var options = this.state.items.map(function(item, index) {
return false;
} else {
var options = this.state.items.map(function(item, index) {
return (
<option
key={ item.id }
value={ item.id }
>
{ item.name }
</option>
);
});
var default_value = (
(this.props.item !== undefined && this.props.field.name !== undefined)
? this.props.item[this.props.field.name]
: null
);
return ( return (
<select <option
id={ this.props.field.id || this.props.field.name } key={ item.id }
ref="select" value={ item.id }
placeholder={ this.props.field.placeholder } >
multiple={ this.props.field.multiple } { item.name }
onChange={ this.handleChange } </option>
defaultValue={ default_value }
>{ options }</select>
); );
} });
var default_value = (
(this.props.item !== undefined && this.props.field.name !== undefined)
? this.props.item[this.props.field.name]
: null
);
return (
<select
id={ this.props.field.id || this.props.field.name }
ref="select"
placeholder={ this.props.field.placeholder }
multiple={ this.props.field.multiple }
onChange={ this.handleChange }
defaultValue={ default_value }
>{ options }</select>
);
} }
}); });

View File

@ -88,7 +88,7 @@ define(
}).done(function(response) { }).done(function(response) {
this.setState({ loading: false }); this.setState({ loading: false });
if(response === true) { if(response.result === true) {
if(this.props.onSuccess !== undefined) { if(this.props.onSuccess !== undefined) {
this.props.onSuccess() this.props.onSuccess()
} else { } else {
@ -101,10 +101,10 @@ define(
this.props.messages['created'](); this.props.messages['created']();
} }
} else { } else {
if(response === false) { if(response.result === false) {
// unknown error occurred if(response.errors.length > 0) {
} else { this.setState({ errors: response.errors });
this.setState({ errors: response }); }
} }
} }
}.bind(this)); }.bind(this));
@ -121,13 +121,15 @@ define(
return true; return true;
}, },
render: function() { render: function() {
var errors = this.state.errors.map(function(error, index) { if(this.state.errors !== undefined) {
return ( var errors = this.state.errors.map(function(error, index) {
<p key={ 'error-'+index } className="mailpoet_error"> return (
{ error } <p key={ 'error-'+index } className="mailpoet_error">
</p> { error }
); </p>
}); );
});
}
var formClasses = classNames( var formClasses = classNames(
'mailpoet_form', 'mailpoet_form',

View File

@ -15,16 +15,16 @@ function(
this.setState({ this.setState({
action: e.target.value, action: e.target.value,
extra: false extra: false
}); }, function() {
var action = this.getSelectedAction();
var action = this.getSelectedAction(); // action on select callback
if(action !== null && action['onSelect'] !== undefined) {
// action on select callback this.setState({
if(action !== null && action['onSelect'] !== undefined) { extra: action.onSelect(e)
this.setState({ });
extra: action.onSelect(e) }
}); }.bind(this));
}
}, },
handleApplyAction: function(e) { handleApplyAction: function(e) {
e.preventDefault(); e.preventDefault();

View File

@ -34,7 +34,10 @@ define(
placeholder: "Select a list", placeholder: "Select a list",
id: "mailpoet_segments", id: "mailpoet_segments",
endpoint: "segments", endpoint: "segments",
multiple: true multiple: true,
filter: function(segment) {
return !!(!segment.deleted_at);
}
}, },
{ {
name: 'sender', name: 'sender',

View File

@ -37,6 +37,17 @@ define(
'subscribed': 'Subscribed', 'subscribed': 'Subscribed',
'unsubscribed': 'Unsubscribed' 'unsubscribed': 'Unsubscribed'
} }
},
{
name: 'segments',
label: 'Lists',
type: 'selection',
placeholder: "Select a list",
endpoint: "segments",
multiple: true,
filter: function(segment) {
return !!(!segment.deleted_at);
}
} }
]; ];

View File

@ -101,7 +101,10 @@ const bulk_actions = [
onSelect: function() { onSelect: function() {
let field = { let field = {
id: 'move_to_segment', id: 'move_to_segment',
endpoint: 'segments' endpoint: 'segments',
filter: function(segment) {
return !!(!segment.deleted_at);
}
}; };
return ( return (
@ -127,7 +130,10 @@ const bulk_actions = [
onSelect: function() { onSelect: function() {
let field = { let field = {
id: 'add_to_segment', id: 'add_to_segment',
endpoint: 'segments' endpoint: 'segments',
filter: function(segment) {
return !!(!segment.deleted_at);
}
}; };
return ( return (

View File

@ -156,7 +156,7 @@ class Menu {
$data = array( $data = array(
'settings' => $settings, 'settings' => $settings,
'segments' => Segment::findArray(), 'segments' => Segment::getPublished()->findArray(),
'pages' => Pages::getAll(), 'pages' => Pages::getAll(),
'flags' => $flags, 'flags' => $flags,
'charsets' => Charsets::getAll(), 'charsets' => Charsets::getAll(),
@ -230,7 +230,7 @@ class Menu {
$data = array( $data = array(
'form' => $form, 'form' => $form,
'pages' => Pages::getAll(), 'pages' => Pages::getAll(),
'segments' => Segment::findArray(), 'segments' => Segment::getPublished()->findArray(),
'styles' => FormRenderer::getStyles($form), 'styles' => FormRenderer::getStyles($form),
'date_types' => Block\Date::getDateTypes(), 'date_types' => Block\Date::getDateTypes(),
'date_formats' => Block\Date::getDateFormats() 'date_formats' => Block\Date::getDateFormats()

View File

@ -72,7 +72,7 @@ class Widget extends \WP_Widget {
$selected_form = isset($instance['form']) ? (int)($instance['form']) : 0; $selected_form = isset($instance['form']) ? (int)($instance['form']) : 0;
// get forms list // get forms list
$forms = Form::whereNull('deleted_at')->orderByAsc('name')->findArray(); $forms = Form::getPublished()->orderByAsc('name')->findArray();
?><p> ?><p>
<label for="<?php $this->get_field_id( 'title' ) ?>"><?php _e( 'Title:' ); ?></label> <label for="<?php $this->get_field_id( 'title' ) ?>"><?php _e( 'Title:' ); ?></label>
<input <input
@ -94,23 +94,20 @@ class Widget extends \WP_Widget {
</select> </select>
</p> </p>
<p> <p>
<a href="javascript:;" class="mailpoet_form_new"><?php _e("Create a new form"); ?></a> <a href="javascript:;" onClick="createSubscriptionForm()" class="mailpoet_form_new"><?php _e("Create a new form"); ?></a>
</p> </p>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function($) { function createSubscriptionForm() {
$(function() { MailPoet.Ajax.post({
$('.mailpoet_form_new').on('click', function() { endpoint: 'forms',
MailPoet.Ajax.post({ action: 'create'
endpoint: 'forms', }).done(function(response) {
action: 'create' if(response !== false) {
}).done(function(response) { window.location = response;
if(response !== false) { }
window.location = response;
}
});
}); });
}); return false;
}); }
</script> </script>
<?php <?php
} }
@ -134,7 +131,7 @@ class Widget extends \WP_Widget {
); );
// get form // get form
$form = Form::whereNull('deleted_at')->findOne($instance['form']); $form = Form::getPublished()->findOne($instance['form']);
// if the form was not found, return nothing. // if the form was not found, return nothing.
if($form === false) { if($form === false) {

View File

@ -54,12 +54,12 @@ class Form extends Model {
array( array(
'name' => 'all', 'name' => 'all',
'label' => __('All'), 'label' => __('All'),
'count' => Form::whereNull('deleted_at')->count() 'count' => Form::getPublished()->count()
), ),
array( array(
'name' => 'trash', 'name' => 'trash',
'label' => __('Trash'), 'label' => __('Trash'),
'count' => Form::whereNotNull('deleted_at')->count() 'count' => Form::getTrashed()->count()
) )
); );
} }

View File

@ -90,4 +90,12 @@ class Model extends \Sudzy\ValidModel {
}, $searchCriteria); }, $searchCriteria);
return $orm->having_raw(implode(' ' . $searchCondition . ' ', $havingFields), array_values($havingValues)); return $orm->having_raw(implode(' ' . $searchCondition . ' ', $havingFields), array_values($havingValues));
} }
static function getPublished() {
return static::whereNull('deleted_at');
}
static function getTrashed() {
return static::whereNotNull('deleted_at');
}
} }

View File

@ -106,12 +106,12 @@ class Newsletter extends Model {
array( array(
'name' => 'all', 'name' => 'all',
'label' => __('All'), 'label' => __('All'),
'count' => Newsletter::whereNull('deleted_at')->count() 'count' => Newsletter::getPublished()->count()
), ),
array( array(
'name' => 'trash', 'name' => 'trash',
'label' => __('Trash'), 'label' => __('Trash'),
'count' => Newsletter::whereNotNull('deleted_at')->count() 'count' => Newsletter::getTrashed()->count()
) )
); );
} }

View File

@ -68,7 +68,7 @@ class Segment extends Model {
} }
static function search($orm, $search = '') { static function search($orm, $search = '') {
return $orm->where_like('name', '%'.$search.'%'); return $orm->whereLike('name', '%'.$search.'%');
} }
static function groups() { static function groups() {
@ -76,12 +76,12 @@ class Segment extends Model {
array( array(
'name' => 'all', 'name' => 'all',
'label' => __('All'), 'label' => __('All'),
'count' => Segment::whereNull('deleted_at')->count() 'count' => Segment::getPublished()->count()
), ),
array( array(
'name' => 'trash', 'name' => 'trash',
'label' => __('Trash'), 'label' => __('Trash'),
'count' => Segment::whereNotNull('deleted_at')->count() 'count' => Segment::getTrashed()->count()
) )
); );
} }

View File

@ -90,7 +90,7 @@ class Subscriber extends Model {
array( array(
'name' => 'all', 'name' => 'all',
'label' => __('All'), 'label' => __('All'),
'count' => Subscriber::whereNull('deleted_at')->count() 'count' => Subscriber::getPublished()->count()
), ),
array( array(
'name' => 'subscribed', 'name' => 'subscribed',
@ -110,7 +110,7 @@ class Subscriber extends Model {
array( array(
'name' => 'trash', 'name' => 'trash',
'label' => __('Trash'), 'label' => __('Trash'),
'count' => Subscriber::whereNotNull('deleted_at')->count() 'count' => Subscriber::getTrashed()->count()
) )
); );
} }

View File

@ -33,7 +33,6 @@ class Newsletters {
}, $segments); }, $segments);
$newsletter['options'] = $options; $newsletter['options'] = $options;
wp_send_json($newsletter); wp_send_json($newsletter);
} }
} }
@ -54,9 +53,16 @@ class Newsletters {
unset($data['options']); unset($data['options']);
} }
$errors = array();
$result = false;
$newsletter = Newsletter::createOrUpdate($data); $newsletter = Newsletter::createOrUpdate($data);
if($newsletter->id) { if($newsletter !== false && !$newsletter->id()) {
$errors = $newsletter->getValidationErrors();
} else {
$result = true;
if(!empty($segment_ids)) { if(!empty($segment_ids)) {
NewsletterSegment::where('newsletter_id', $newsletter->id) NewsletterSegment::where('newsletter_id', $newsletter->id)
->deleteMany(); ->deleteMany();
@ -89,8 +95,10 @@ class Newsletters {
} }
} }
} }
wp_send_json(array(
wp_send_json(($newsletter->id !== false)); 'result' => $result,
'errors' => $errors
));
} }
function delete($data = array()) { function delete($data = array()) {

View File

@ -71,13 +71,20 @@ class Segments {
} }
function save($data = array()) { function save($data = array()) {
$result = Segment::createOrUpdate($data); $errors = array();
$result = false;
if($result !== true) { $segment = Segment::createOrUpdate($data);
wp_send_json($result);
if($segment !== false && !$segment->id()) {
$errors = $segment->getValidationErrors();
} else { } else {
wp_send_json(true); $result = true;
} }
wp_send_json(array(
'result' => $result,
'errors' => $errors
));
} }
function restore($id) { function restore($id) {

View File

@ -21,7 +21,14 @@ class Subscribers {
if($subscriber === false) { if($subscriber === false) {
wp_send_json(false); wp_send_json(false);
} else { } else {
wp_send_json($subscriber->asArray()); $segments = $subscriber->segments()->findArray();
$subscriber = $subscriber->asArray();
$subscriber['segments'] = array_map(function($segment) {
return $segment['id'];
}, $segments);
wp_send_json($subscriber);
} }
} }
@ -58,18 +65,40 @@ class Subscribers {
} }
function save($data = array()) { function save($data = array()) {
$errors = array();
$result = false; $result = false;
$segments = false;
if(array_key_exists('segments', $data)) {
$segments = $data['segments'];
unset($data['segments']);
}
$subscriber = Subscriber::createOrUpdate($data); $subscriber = Subscriber::createOrUpdate($data);
if($subscriber !== false && !$subscriber->id()) { if($subscriber !== false && !$subscriber->id()) {
$result = array( $errors = $subscriber->getValidationErrors();
'errors' => $subscriber->getValidationErrors()
);
} else { } else {
$result = true; $result = true;
if($segments !== false) {
SubscriberSegment::where('subscriber_id', $subscriber->id)
->deleteMany();
if(!empty($segments)) {
foreach($segments as $segment_id) {
$relation = SubscriberSegment::create();
$relation->segment_id = $segment_id;
$relation->subscriber_id = $subscriber->id;
$relation->save();
}
}
}
} }
wp_send_json($result); wp_send_json(array(
'result' => $result,
'errors' => $errors
));
} }
function subscribe($data = array()) { function subscribe($data = array()) {