diff --git a/assets/js/src/listing/bulk_actions.jsx b/assets/js/src/listing/bulk_actions.jsx index aee7c2f5bb..b7d44a2359 100644 --- a/assets/js/src/listing/bulk_actions.jsx +++ b/assets/js/src/listing/bulk_actions.jsx @@ -45,6 +45,10 @@ function( data.action = this.state.action; + if(action['onSuccess'] !== undefined) { + data.onSuccess = action.onSuccess; + } + if(data.action) { this.props.onBulkAction(selected_ids, data); } diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index d3b7839fd6..9ad3022628 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -340,6 +340,11 @@ define( this.setState({ loading: true }); var data = params || {}; + var callback = ((data['onSuccess'] !== undefined) + ? data['onSuccess'] + : function() {} + ); + delete data.onSuccess; data.listing = { offset: 0, @@ -354,8 +359,9 @@ define( endpoint: this.props.endpoint, action: 'bulk_action', data: data - }).done(function() { + }).done(function(response) { this.getItems(); + callback(response); }.bind(this)); }, handleSearch: function(search) { diff --git a/assets/js/src/notice.js b/assets/js/src/notice.js index bc3cd5f4f3..1718f9b963 100644 --- a/assets/js/src/notice.js +++ b/assets/js/src/notice.js @@ -121,6 +121,22 @@ define('notice', ['mailpoet', 'jquery'], function(MailPoet, jQuery) { // set message this.setMessage(this.options.message); + // position notice + this.element.insertAfter(jQuery('h2.title')); + + // set class name + switch(this.options.type) { + case 'success': + this.element.addClass('updated'); + break; + case 'system': + this.element.addClass('update-nag'); + break; + case 'error': + this.element.addClass('error'); + break; + } + // make the notice appear this.element.fadeIn(200); diff --git a/assets/js/src/subscribers/list.jsx b/assets/js/src/subscribers/list.jsx index 80995a3511..07e243c9b8 100644 --- a/assets/js/src/subscribers/list.jsx +++ b/assets/js/src/subscribers/list.jsx @@ -77,6 +77,13 @@ define( return { segment_id: ~~(jQuery('#move_to_segment').val()) } + }, + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers were moved to list %$2s.' + .replace('%$1d', ~~response.subscribers) + .replace('%$2s', response.segment) + ); } }, { @@ -96,6 +103,13 @@ define( return { segment_id: ~~(jQuery('#add_to_segment').val()) } + }, + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers were added to list %$2s.' + .replace('%$1d', ~~response.subscribers) + .replace('%$2s', response.segment) + ); } }, { @@ -115,19 +129,45 @@ define( return { segment_id: ~~(jQuery('#remove_from_segment').val()) } + }, + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers were removed from list %$2s.' + .replace('%$1d', ~~response.subscribers) + .replace('%$2s', response.segment) + ); } }, { name: 'removeFromAllLists', - label: 'Remove from all lists' + label: 'Remove from all lists', + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers were removed from all lists.' + .replace('%$1d', ~~response.subscribers) + .replace('%$2s', response.segment) + ); + } }, { name: 'confirmUnconfirmed', - label: 'Confirm unconfirmed' + label: 'Confirm unconfirmed', + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers have been confirmed.' + .replace('%$1d', ~~response.subscribers) + ); + } }, { name: 'trash', - label: 'Trash' + label: 'Trash', + onSuccess: function(response) { + MailPoet.Notice.success( + '%$1d subscribers were moved to the trash.' + .replace('%$1d', ~~response.subscribers) + ); + } } ]; diff --git a/lib/Models/Subscriber.php b/lib/Models/Subscriber.php index bed2bfab69..b5b5172a82 100644 --- a/lib/Models/Subscriber.php +++ b/lib/Models/Subscriber.php @@ -199,6 +199,7 @@ class Subscriber extends Model { $segment = Segment::findOne($segment_id); if($segment !== false) { + $subscribers_count = 0; $subscribers = $listing->getSelection()->findMany(); foreach($subscribers as $subscriber) { // remove subscriber from all segments @@ -209,8 +210,13 @@ class Subscriber extends Model { $association->subscriber_id = $subscriber->id; $association->segment_id = $segment->id; $association->save(); + + $subscribers_count++; } - return true; + return array( + 'subscribers' => $subscribers_count, + 'segment' => $segment->name + ); } return false; } @@ -225,7 +231,11 @@ class Subscriber extends Model { SubscriberSegment::whereIn('subscriber_id', $subscriber_ids) ->where('segment_id', $segment->id) ->deleteMany(); - return true; + + return array( + 'subscribers' => count($subscriber_ids), + 'segment' => $segment->name + ); } return false; } @@ -242,7 +252,10 @@ class Subscriber extends Model { SubscriberSegment::whereIn('subscriber_id', $subscriber_ids) ->whereIn('segment_id', $segment_ids) ->deleteMany(); - return true; + + return array( + 'subscribers' => count($subscriber_ids) + ); } return false; } @@ -254,11 +267,17 @@ class Subscriber extends Model { ->findMany(); if(!empty($subscribers)) { + $subscribers_count = 0; foreach($subscribers as $subscriber) { $subscriber->set('status', 'subscribed'); - $subscriber->save(); + if($subscriber->save() === true) { + $subscribers_count++; + } } - return true; + + return array( + 'subscribers' => $subscribers_count + ); } return false; } @@ -283,15 +302,21 @@ class Subscriber extends Model { $segment = Segment::findOne($segment_id); if($segment !== false) { + $subscribers_count = 0; $subscribers = $listing->getSelection()->findMany(); foreach($subscribers as $subscriber) { // create relation with segment $association = \MailPoet\Models\SubscriberSegment::create(); $association->subscriber_id = $subscriber->id; $association->segment_id = $segment->id; - $association->save(); + if($association->save()) { + $subscribers_count++; + } } - return true; + return array( + 'subscribers' => $subscribers_count, + 'segment' => $segment->name + ); } return false; } @@ -302,10 +327,15 @@ class Subscriber extends Model { $subscribers = $listing->getSelection()->findMany(); if(!empty($subscribers)) { + $subscribers_count = 0; foreach($subscribers as $subscriber) { - $subscriber->delete(); + if($subscriber->delete()) { + $subscribers_count++; + } } - return true; + return array( + 'subscribers' => $subscribers_count + ); } return false; } else { @@ -313,7 +343,11 @@ class Subscriber extends Model { $subscribers = $listing->getSelection()->findResultSet(); if(!empty($subscribers)) { $subscribers->set_expr('deleted_at', 'NOW()'); - return $subscribers->save(); + $subscribers->save(); + + return array( + 'subscribers' => $subscribers->count() + ); } return false; } diff --git a/views/layout.html b/views/layout.html index a4b521a283..ee5d6dde41 100644 --- a/views/layout.html +++ b/views/layout.html @@ -1,10 +1,10 @@ - +
- - + + <% block title %><% endblock %>