diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx index f83ae74213..93bfa45915 100644 --- a/assets/js/src/listing/listing.jsx +++ b/assets/js/src/listing/listing.jsx @@ -456,20 +456,28 @@ const Listing = React.createClass({ sort_by: this.state.sort_by, sort_order: this.state.sort_order } + }).always(() => { + this.setState({ loading: false }); }).done((response) => { this.setState({ - items: response.items || [], - filters: response.filters || {}, - groups: response.groups || [], - count: response.count || 0, - loading: false + items: response.data || [], + filters: response.meta.filters || {}, + groups: response.meta.groups || [], + count: response.meta.count || 0 }, () => { // if viewing an empty trash - if (this.state.group === 'trash' && response.count === 0) { + if (this.state.group === 'trash' && response.meta.count === 0) { // redirect to default group this.handleGroup('all'); } }); + }).fail(function(response) { + if (response.errors.length > 0) { + MailPoet.Notice.error( + response.errors.map(function(error) { return error.message; }), + { scroll: true } + ); + } }); } }, diff --git a/lib/API/Endpoints/Forms.php b/lib/API/Endpoints/Forms.php index 0c82d9d8fd..b552e25c8e 100644 --- a/lib/API/Endpoints/Forms.php +++ b/lib/API/Endpoints/Forms.php @@ -32,8 +32,8 @@ class Forms extends APIEndpoint { $listing_data = $listing->get(); - // fetch segments relations for each returned item - foreach($listing_data['items'] as $key => $form) { + $data = array(); + foreach($listing_data['items'] as $form) { $form = $form->asArray(); $form['signups'] = StatisticsForms::getTotalSignups($form['id']); @@ -43,10 +43,15 @@ class Forms extends APIEndpoint { ? $form['settings']['segments'] : array() ); - $listing_data['items'][$key] = $form; + + $data[] = $form; } - return $listing_data; + return $this->successResponse($data, array( + 'count' => $listing_data['count'], + 'filters' => $listing_data['filters'], + 'groups' => $listing_data['groups'] + )); } function create() { diff --git a/lib/API/Endpoints/Newsletters.php b/lib/API/Endpoints/Newsletters.php index 1f91d3a9c8..99e423d920 100644 --- a/lib/API/Endpoints/Newsletters.php +++ b/lib/API/Endpoints/Newsletters.php @@ -285,15 +285,14 @@ class Newsletters extends APIEndpoint { } function listing($data = array()) { - $listing = new Listing\Handler( '\MailPoet\Models\Newsletter', $data ); $listing_data = $listing->get(); - $subscriber = Subscriber::getCurrentWPUser(); - foreach($listing_data['items'] as $key => $newsletter) { + $data = array(); + foreach($listing_data['items'] as $newsletter) { $queue = false; if($newsletter->type === Newsletter::TYPE_STANDARD) { @@ -325,14 +324,18 @@ class Newsletters extends APIEndpoint { } // get preview url + $subscriber = Subscriber::getCurrentWPUser(); $newsletter->preview_url = NewsletterUrl::getViewInBrowserUrl( $newsletter, $subscriber, $queue, $preview = true); - // convert object to array - $listing_data['items'][$key] = $newsletter->asArray(); + $data[] = $newsletter->asArray(); } - return $listing_data; + return $this->successResponse($data, array( + 'count' => $listing_data['count'], + 'filters' => $listing_data['filters'], + 'groups' => $listing_data['groups'] + )); } function bulkAction($data = array()) { diff --git a/lib/API/Endpoints/Segments.php b/lib/API/Endpoints/Segments.php index f37fe6ed5b..4d655d8946 100644 --- a/lib/API/Endpoints/Segments.php +++ b/lib/API/Endpoints/Segments.php @@ -32,18 +32,22 @@ class Segments extends APIEndpoint { $listing_data = $listing->get(); - // fetch segments relations for each returned item - foreach($listing_data['items'] as $key => $segment) { + $data = array(); + foreach($listing_data['items'] as $segment) { $segment->subscribers_url = admin_url( 'admin.php?page=mailpoet-subscribers#/filter[segment='.$segment->id.']' ); - $listing_data['items'][$key] = $segment + $data[] = $segment ->withSubscribersCount() ->asArray(); } - return $listing_data; + return $this->successResponse($data, array( + 'count' => $listing_data['count'], + 'filters' => $listing_data['filters'], + 'groups' => $listing_data['groups'] + )); } function save($data = array()) { diff --git a/lib/API/Endpoints/Subscribers.php b/lib/API/Endpoints/Subscribers.php index 6a47c96234..20d066600a 100644 --- a/lib/API/Endpoints/Subscribers.php +++ b/lib/API/Endpoints/Subscribers.php @@ -41,14 +41,18 @@ class Subscribers extends APIEndpoint { $listing_data = $listing->get(); - // fetch segments relations for each returned item - foreach($listing_data['items'] as $key => $subscriber) { - $listing_data['items'][$key] = $subscriber + $data = array(); + foreach($listing_data['items'] as $subscriber) { + $data[] = $subscriber ->withSubscriptions() ->asArray(); } - return $listing_data; + return $this->successResponse($data, array( + 'count' => $listing_data['count'], + 'filters' => $listing_data['filters'], + 'groups' => $listing_data['groups'] + )); } function subscribe($data = array()) { diff --git a/lib/Listing/Handler.php b/lib/Listing/Handler.php index 8bb37fd4eb..ceefff0b3b 100644 --- a/lib/Listing/Handler.php +++ b/lib/Listing/Handler.php @@ -106,6 +106,7 @@ class Handler { ); } + // get items and total count if(method_exists($this->model_class, 'listingQuery')) { $custom_query = call_user_func_array( array($this->model_class, 'listingQuery'), @@ -135,7 +136,6 @@ class Handler { ->findMany(); } - return array( 'count' => $count, 'filters' => $filters, diff --git a/tests/unit/API/FormsTest.php b/tests/unit/API/FormsTest.php index ac796064f2..2795d07e5b 100644 --- a/tests/unit/API/FormsTest.php +++ b/tests/unit/API/FormsTest.php @@ -34,13 +34,17 @@ class FormsTest extends MailPoetTest { function testItCanGetListingData() { $router = new Forms(); $response = $router->listing(); - expect($response)->hasKey('filters'); - expect($response)->hasKey('groups'); - expect($response['count'])->equals(3); - expect($response['items'])->count(3); - expect($response['items'][0]['name'])->equals('Form 1'); - expect($response['items'][1]['name'])->equals('Form 2'); - expect($response['items'][2]['name'])->equals('Form 3'); + + expect($response->status)->equals(APIResponse::STATUS_OK); + + expect($response->meta)->hasKey('filters'); + expect($response->meta)->hasKey('groups'); + expect($response->meta['count'])->equals(3); + + expect($response->data)->count(3); + expect($response->data[0]['name'])->equals('Form 1'); + expect($response->data[1]['name'])->equals('Form 2'); + expect($response->data[2]['name'])->equals('Form 3'); } function testItCanCreateANewForm() { diff --git a/tests/unit/API/NewslettersTest.php b/tests/unit/API/NewslettersTest.php index a6960bbca9..774fb8e920 100644 --- a/tests/unit/API/NewslettersTest.php +++ b/tests/unit/API/NewslettersTest.php @@ -220,25 +220,26 @@ class NewslettersTest extends MailPoetTest { $router = new Newsletters(); $response = $router->listing(); - expect($response)->hasKey('filters'); - expect($response)->hasKey('groups'); + expect($response->status)->equals(APIResponse::STATUS_OK); - expect($response['count'])->equals(2); - expect($response['items'])->count(2); + expect($response->meta)->hasKey('filters'); + expect($response->meta)->hasKey('groups'); + expect($response->meta['count'])->equals(2); - expect($response['items'][0]['subject'])->equals('My Standard Newsletter'); - expect($response['items'][1]['subject'])->equals('My Post Notification'); + expect($response->data)->count(2); + expect($response->data[0]['subject'])->equals('My Standard Newsletter'); + expect($response->data[1]['subject'])->equals('My Post Notification'); // 1st subscriber has 2 segments - expect($response['items'][0]['segments'])->count(2); - expect($response['items'][0]['segments'][0]['id']) + expect($response->data[0]['segments'])->count(2); + expect($response->data[0]['segments'][0]['id']) ->equals($segment_1->id); - expect($response['items'][0]['segments'][1]['id']) + expect($response->data[0]['segments'][1]['id']) ->equals($segment_2->id); // 2nd subscriber has 1 segment - expect($response['items'][1]['segments'])->count(1); - expect($response['items'][1]['segments'][0]['id']) + expect($response->data[1]['segments'])->count(1); + expect($response->data[1]['segments'][0]['id']) ->equals($segment_2->id); } @@ -279,9 +280,11 @@ class NewslettersTest extends MailPoetTest { ) )); + expect($response->status)->equals(APIResponse::STATUS_OK); + // we should only get the standard newsletter - expect($response['count'])->equals(1); - expect($response['items'][0]['subject'])->equals($this->newsletter->subject); + expect($response->meta['count'])->equals(1); + expect($response->data[0]['subject'])->equals($this->newsletter->subject); // filter by 2nd segment $response = $router->listing(array( @@ -290,8 +293,10 @@ class NewslettersTest extends MailPoetTest { ) )); + expect($response->status)->equals(APIResponse::STATUS_OK); + // we should have the 2 newsletters - expect($response['count'])->equals(2); + expect($response->meta['count'])->equals(2); } function testItCanLimitListing() { @@ -303,9 +308,11 @@ class NewslettersTest extends MailPoetTest { 'sort_order' => 'asc' )); - expect($response['count'])->equals(2); - expect($response['items'])->count(1); - expect($response['items'][0]['subject'])->equals( + expect($response->status)->equals(APIResponse::STATUS_OK); + + expect($response->meta['count'])->equals(2); + expect($response->data)->count(1); + expect($response->data[0]['subject'])->equals( $this->post_notification->subject ); @@ -317,9 +324,9 @@ class NewslettersTest extends MailPoetTest { 'sort_order' => 'asc' )); - expect($response['count'])->equals(2); - expect($response['items'])->count(1); - expect($response['items'][0]['subject'])->equals( + expect($response->meta['count'])->equals(2); + expect($response->data)->count(1); + expect($response->data[0]['subject'])->equals( $this->newsletter->subject ); } diff --git a/tests/unit/API/SegmentsTest.php b/tests/unit/API/SegmentsTest.php index e58b27713f..6f9c970ec9 100644 --- a/tests/unit/API/SegmentsTest.php +++ b/tests/unit/API/SegmentsTest.php @@ -31,15 +31,17 @@ class SegmentsTest extends MailPoetTest { function testItCanGetListingData() { $router = new Segments(); $response = $router->listing(); - expect($response)->hasKey('filters'); - expect($response)->hasKey('groups'); - expect($response['count'])->equals(3); - expect($response['items'])->count(3); + expect($response->status)->equals(APIResponse::STATUS_OK); - expect($response['items'][0]['name'])->equals($this->segment_1->name); - expect($response['items'][1]['name'])->equals($this->segment_2->name); - expect($response['items'][2]['name'])->equals($this->segment_3->name); + expect($response->meta)->hasKey('filters'); + expect($response->meta)->hasKey('groups'); + expect($response->meta['count'])->equals(3); + + expect($response->data)->count(3); + expect($response->data[0]['name'])->equals($this->segment_1->name); + expect($response->data[1]['name'])->equals($this->segment_2->name); + expect($response->data[2]['name'])->equals($this->segment_3->name); } function testItCanSaveASegment() { diff --git a/tests/unit/API/SubscribersTest.php b/tests/unit/API/SubscribersTest.php index 33ca434a50..edf562c3f6 100644 --- a/tests/unit/API/SubscribersTest.php +++ b/tests/unit/API/SubscribersTest.php @@ -155,7 +155,7 @@ class SubscribersTest extends MailPoetTest { )); // it should return all subscribers - expect($response['count'])->equals(2); + expect($response->meta['count'])->equals(2); // filter by 1st segment $response = $router->listing(array( @@ -164,8 +164,8 @@ class SubscribersTest extends MailPoetTest { ) )); - expect($response['count'])->equals(1); - expect($response['items'][0]['email'])->equals($this->subscriber_2->email); + expect($response->meta['count'])->equals(1); + expect($response->data[0]['email'])->equals($this->subscriber_2->email); // filter by 2nd segment $response = $router->listing(array( @@ -174,8 +174,8 @@ class SubscribersTest extends MailPoetTest { ) )); - expect($response['count'])->equals(1); - expect($response['items'][0]['email'])->equals($this->subscriber_2->email); + expect($response->meta['count'])->equals(1); + expect($response->data[0]['email'])->equals($this->subscriber_2->email); } function testItCanSearchListing() { @@ -191,29 +191,29 @@ class SubscribersTest extends MailPoetTest { $response = $router->listing(array( 'search' => '' )); - expect($response['count'])->equals(3); + expect($response->meta['count'])->equals(3); // search by email $response = $router->listing(array( 'search' => '.me' )); - expect($response['count'])->equals(1); - expect($response['items'][0]['email'])->equals($new_subscriber->email); + expect($response->meta['count'])->equals(1); + expect($response->data[0]['email'])->equals($new_subscriber->email); // search by last name $response = $router->listing(array( 'search' => 'doe' )); - expect($response['count'])->equals(2); - expect($response['items'][0]['email'])->equals($this->subscriber_1->email); - expect($response['items'][1]['email'])->equals($this->subscriber_2->email); + expect($response->meta['count'])->equals(2); + expect($response->data[0]['email'])->equals($this->subscriber_1->email); + expect($response->data[1]['email'])->equals($this->subscriber_2->email); // search by first name $response = $router->listing(array( 'search' => 'billy' )); - expect($response['count'])->equals(1); - expect($response['items'][0]['email'])->equals($new_subscriber->email); + expect($response->meta['count'])->equals(1); + expect($response->data[0]['email'])->equals($new_subscriber->email); } function testItCanGroupListing() { @@ -222,28 +222,28 @@ class SubscribersTest extends MailPoetTest { $subscribed_group = $router->listing(array( 'group' => Subscriber::STATUS_SUBSCRIBED )); - expect($subscribed_group['count'])->equals(1); - expect($subscribed_group['items'][0]['email'])->equals( + expect($subscribed_group->meta['count'])->equals(1); + expect($subscribed_group->data[0]['email'])->equals( $this->subscriber_2->email ); $unsubscribed_group = $router->listing(array( 'group' => Subscriber::STATUS_UNSUBSCRIBED )); - expect($unsubscribed_group['count'])->equals(0); + expect($unsubscribed_group->meta['count'])->equals(0); $unconfirmed_group = $router->listing(array( 'group' => Subscriber::STATUS_UNCONFIRMED )); - expect($unconfirmed_group['count'])->equals(1); - expect($unconfirmed_group['items'][0]['email'])->equals( + expect($unconfirmed_group->meta['count'])->equals(1); + expect($unconfirmed_group->data[0]['email'])->equals( $this->subscriber_1->email ); $trashed_group = $router->listing(array( 'group' => 'trash' )); - expect($trashed_group['count'])->equals(0); + expect($trashed_group->meta['count'])->equals(0); // trash 1st subscriber $this->subscriber_1->trash(); @@ -251,8 +251,8 @@ class SubscribersTest extends MailPoetTest { $trashed_group = $router->listing(array( 'group' => 'trash' )); - expect($trashed_group['count'])->equals(1); - expect($trashed_group['items'][0]['email'])->equals( + expect($trashed_group->meta['count'])->equals(1); + expect($trashed_group->data[0]['email'])->equals( $this->subscriber_1->email ); } @@ -266,9 +266,9 @@ class SubscribersTest extends MailPoetTest { 'sort_order' => 'asc' )); - expect($response['count'])->equals(2); - expect($response['items'])->count(1); - expect($response['items'][0]['email'])->equals( + expect($response->meta['count'])->equals(2); + expect($response->data)->count(1); + expect($response->data[0]['email'])->equals( $this->subscriber_2->email ); @@ -280,9 +280,9 @@ class SubscribersTest extends MailPoetTest { 'sort_order' => 'asc' )); - expect($response['count'])->equals(2); - expect($response['items'])->count(1); - expect($response['items'][0]['email'])->equals( + expect($response->meta['count'])->equals(2); + expect($response->data)->count(1); + expect($response->data[0]['email'])->equals( $this->subscriber_1->email ); }