diff --git a/assets/js/src/form/fields/selection.jsx b/assets/js/src/form/fields/selection.jsx index 7f5d3f64b5..3972112dcf 100644 --- a/assets/js/src/form/fields/selection.jsx +++ b/assets/js/src/form/fields/selection.jsx @@ -54,6 +54,11 @@ function( loadCachedItems: function() { if(typeof(window['mailpoet_'+this.props.field.endpoint]) !== 'undefined') { var items = window['mailpoet_'+this.props.field.endpoint]; + + if(this.props.field['filter'] !== undefined) { + items = items.filter(this.props.field.filter); + } + this.setState({ items: items }); @@ -76,7 +81,7 @@ function( return true; }, render: function() { - if(this.state.items.length === 0) { + if((this.props.item !== undefined && this.props.item.id === undefined)) { return false; } else { var options = this.state.items.map(function(item, index) { diff --git a/assets/js/src/form/form.jsx b/assets/js/src/form/form.jsx index accbfdbbaf..6c228ce31c 100644 --- a/assets/js/src/form/form.jsx +++ b/assets/js/src/form/form.jsx @@ -88,7 +88,7 @@ define( }).done(function(response) { this.setState({ loading: false }); - if(response === true) { + if(response.result === true) { if(this.props.onSuccess !== undefined) { this.props.onSuccess() } else { @@ -101,10 +101,10 @@ define( this.props.messages['created'](); } } else { - if(response === false) { - // unknown error occurred - } else { - this.setState({ errors: response }); + if(response.result === false) { + if(response.errors.length > 0) { + this.setState({ errors: response.errors }); + } } } }.bind(this)); @@ -121,13 +121,15 @@ define( return true; }, render: function() { - var errors = this.state.errors.map(function(error, index) { - return ( -
- { error } -
- ); - }); + if(this.state.errors !== undefined) { + var errors = this.state.errors.map(function(error, index) { + return ( ++ { error } +
+ ); + }); + } var formClasses = classNames( 'mailpoet_form', diff --git a/assets/js/src/listing/bulk_actions.jsx b/assets/js/src/listing/bulk_actions.jsx index fcc154d966..22fd3f730d 100644 --- a/assets/js/src/listing/bulk_actions.jsx +++ b/assets/js/src/listing/bulk_actions.jsx @@ -15,16 +15,16 @@ function( this.setState({ action: e.target.value, extra: false - }); + }, function() { + var action = this.getSelectedAction(); - var action = this.getSelectedAction(); - - // action on select callback - if(action !== null && action['onSelect'] !== undefined) { - this.setState({ - extra: action.onSelect(e) - }); - } + // action on select callback + if(action !== null && action['onSelect'] !== undefined) { + this.setState({ + extra: action.onSelect(e) + }); + } + }.bind(this)); }, handleApplyAction: function(e) { e.preventDefault(); diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx index a4ddc6a587..315dc8352d 100644 --- a/assets/js/src/newsletters/send.jsx +++ b/assets/js/src/newsletters/send.jsx @@ -34,7 +34,10 @@ define( placeholder: "Select a list", id: "mailpoet_segments", endpoint: "segments", - multiple: true + multiple: true, + filter: function(segment) { + return !!(!segment.deleted_at); + } }, { name: 'sender', diff --git a/assets/js/src/subscribers/form.jsx b/assets/js/src/subscribers/form.jsx index bad3e6d339..78e4a4b425 100644 --- a/assets/js/src/subscribers/form.jsx +++ b/assets/js/src/subscribers/form.jsx @@ -37,6 +37,17 @@ define( 'subscribed': 'Subscribed', 'unsubscribed': 'Unsubscribed' } + }, + { + name: 'segments', + label: 'Lists', + type: 'selection', + placeholder: "Select a list", + endpoint: "segments", + multiple: true, + filter: function(segment) { + return !!(!segment.deleted_at); + } } ]; diff --git a/assets/js/src/subscribers/list.jsx b/assets/js/src/subscribers/list.jsx index ba34980697..edb322e43a 100644 --- a/assets/js/src/subscribers/list.jsx +++ b/assets/js/src/subscribers/list.jsx @@ -101,7 +101,10 @@ const bulk_actions = [ onSelect: function() { let field = { id: 'move_to_segment', - endpoint: 'segments' + endpoint: 'segments', + filter: function(segment) { + return !!(!segment.deleted_at); + } }; return ( @@ -127,7 +130,10 @@ const bulk_actions = [ onSelect: function() { let field = { id: 'add_to_segment', - endpoint: 'segments' + endpoint: 'segments', + filter: function(segment) { + return !!(!segment.deleted_at); + } }; return ( diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 1721eeebb9..56564251a3 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -146,7 +146,7 @@ class Menu { $data = array( 'settings' => $settings, - 'segments' => Segment::findArray(), + 'segments' => Segment::getPublished()->findArray(), 'pages' => Pages::getAll(), 'flags' => $flags, 'charsets' => Charsets::getAll(), @@ -214,7 +214,7 @@ class Menu { $data = array( 'form' => $form, 'pages' => Pages::getAll(), - 'segments' => Segment::findArray(), + 'segments' => Segment::getPublished()->findArray(), 'styles' => FormRenderer::getStyles($form), 'date_types' => Block\Date::getDateTypes(), 'date_formats' => Block\Date::getDateFormats() diff --git a/lib/Models/Model.php b/lib/Models/Model.php index 98cd7e2910..4b2a2a3295 100644 --- a/lib/Models/Model.php +++ b/lib/Models/Model.php @@ -90,4 +90,12 @@ class Model extends \Sudzy\ValidModel { }, $searchCriteria); 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'); + } } \ No newline at end of file diff --git a/lib/Models/Segment.php b/lib/Models/Segment.php index 7f5abc51fe..f1e3ba95c0 100644 --- a/lib/Models/Segment.php +++ b/lib/Models/Segment.php @@ -68,7 +68,7 @@ class Segment extends Model { } static function search($orm, $search = '') { - return $orm->where_like('name', '%'.$search.'%'); + return $orm->whereLike('name', '%'.$search.'%'); } static function groups() { diff --git a/lib/Router/Newsletters.php b/lib/Router/Newsletters.php index 088fb80bf7..559d816cf9 100644 --- a/lib/Router/Newsletters.php +++ b/lib/Router/Newsletters.php @@ -33,7 +33,6 @@ class Newsletters { }, $segments); $newsletter['options'] = $options; - wp_send_json($newsletter); } } @@ -54,9 +53,16 @@ class Newsletters { unset($data['options']); } + $errors = array(); + $result = false; + $newsletter = Newsletter::createOrUpdate($data); - if($newsletter->id) { + if($newsletter !== false && !$newsletter->id()) { + $errors = $newsletter->getValidationErrors(); + } else { + $result = true; + if(!empty($segment_ids)) { NewsletterSegment::where('newsletter_id', $newsletter->id) ->deleteMany(); @@ -89,8 +95,10 @@ class Newsletters { } } } - - wp_send_json(($newsletter->id !== false)); + wp_send_json(array( + 'result' => $result, + 'errors' => $errors + )); } function delete($data = array()) { diff --git a/lib/Router/Segments.php b/lib/Router/Segments.php index 5b4f9be6bf..807c4552cd 100644 --- a/lib/Router/Segments.php +++ b/lib/Router/Segments.php @@ -71,13 +71,20 @@ class Segments { } function save($data = array()) { - $result = Segment::createOrUpdate($data); + $errors = array(); + $result = false; - if($result !== true) { - wp_send_json($result); + $segment = Segment::createOrUpdate($data); + + if($segment !== false && !$segment->id()) { + $errors = $segment->getValidationErrors(); } else { - wp_send_json(true); + $result = true; } + wp_send_json(array( + 'result' => $result, + 'errors' => $errors + )); } function restore($id) { diff --git a/lib/Router/Subscribers.php b/lib/Router/Subscribers.php index f8922ad495..538115a25e 100644 --- a/lib/Router/Subscribers.php +++ b/lib/Router/Subscribers.php @@ -21,7 +21,14 @@ class Subscribers { if($subscriber === false) { wp_send_json(false); } 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()) { + $errors = array(); $result = false; + $segments = false; + + if(array_key_exists('segments', $data)) { + $segments = $data['segments']; + unset($data['segments']); + } $subscriber = Subscriber::createOrUpdate($data); if($subscriber !== false && !$subscriber->id()) { - $result = array( - 'errors' => $subscriber->getValidationErrors() - ); + $errors = $subscriber->getValidationErrors(); } else { $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()) {