diff --git a/assets/js/src/listing/listing.jsx b/assets/js/src/listing/listing.jsx
index 066f7c1e55..18470b5fc7 100644
--- a/assets/js/src/listing/listing.jsx
+++ b/assets/js/src/listing/listing.jsx
@@ -427,9 +427,13 @@ define(
this.clearSelection();
+ const action = (this.props.action !== undefined)
+ ? this.props.action
+ : 'listing';
+
MailPoet.Ajax.post({
endpoint: this.props.endpoint,
- action: 'listing',
+ action: action,
data: {
offset: (this.state.page - 1) * this.state.limit,
limit: this.state.limit,
diff --git a/assets/js/src/newsletters/list.jsx b/assets/js/src/newsletters/list.jsx
index 0b9bd972cc..cc8e789793 100644
--- a/assets/js/src/newsletters/list.jsx
+++ b/assets/js/src/newsletters/list.jsx
@@ -295,6 +295,31 @@ define(
limit={ mailpoet_listing_per_page }
params={ this.props.params }
endpoint="newsletters"
+ action="listingStandard"
+ onRenderItem={this.renderItem}
+ columns={columns}
+ bulk_actions={ bulk_actions }
+ item_actions={ item_actions }
+ messages={ messages }
+ auto_refresh={ true } />
+
+
+
+ table_name = $model_class::$_table;
+ $this->model_class = $model_class;
+ $this->model = \Model::factory($this->model_class);
+
+ if($query_function !== false) {
+ // execute query function to filter results
+ $query_function($this->model);
+
+ // store query function for later use with groups/filters
+ $this->query_function = $query_function;
+ }
- function __construct($model_class, $data = array()) {
- $class = new \ReflectionClass($model_class);
- $this->table_name = $class->getStaticPropertyValue('_table');
- $this->model = $model_class::select('*');
$this->data = array(
// pagination
'offset' => (isset($data['offset']) ? (int)$data['offset'] : 0),
@@ -32,11 +43,6 @@ class Handler {
// selection
'selection' => (isset($data['selection']) ? $data['selection'] : null)
);
-
- $this->setFilter();
- $this->setSearch();
- $this->setGroup();
- $this->setOrder();
}
private function setSearch() {
@@ -83,7 +89,24 @@ class Handler {
}, $models);
}
- function get() {
+ function getData() {
+ // get groups
+ $groups = call_user_func_array(
+ array($this->model_class, 'groups'),
+ array($this->query_function)
+ );
+
+ // get filters
+ $filters = call_user_func_array(
+ array($this->model_class, 'filters'),
+ array($this->query_function, $this->data['group'])
+ );
+
+ $this->setGroup();
+ $this->setFilter();
+ $this->setSearch();
+ $this->setOrder();
+
$count = $this->model->count();
$items = $this->model
@@ -91,10 +114,11 @@ class Handler {
->limit($this->data['limit'])
->findMany();
+
return array(
'count' => $count,
- 'filters' => $this->model->filter('filters', $this->data['group']),
- 'groups' => $this->model->filter('groups'),
+ 'filters' => $filters,
+ 'groups' => $groups,
'items' => $items
);
}
diff --git a/lib/Models/Newsletter.php b/lib/Models/Newsletter.php
index ec8b943fc8..40e083018f 100644
--- a/lib/Models/Newsletter.php
+++ b/lib/Models/Newsletter.php
@@ -5,7 +5,9 @@ if(!defined('ABSPATH')) exit;
class Newsletter extends Model {
public static $_table = MP_NEWSLETTERS_TABLE;
- const TYPE_WELCOME = 'wecome';
+
+ const TYPE_STANDARD = 'standard';
+ const TYPE_WELCOME = 'welcome';
const TYPE_NOTIFICATION = 'notification';
function __construct() {
@@ -127,7 +129,7 @@ class Newsletter extends Model {
return $orm->where_like('subject', '%' . $search . '%');
}
- static function filters($orm, $group = 'all') {
+ static function filters($query_function = false, $group = 'all') {
$segments = Segment::orderByAsc('name')->findMany();
$segment_list = array();
$segment_list[] = array(
@@ -136,13 +138,16 @@ class Newsletter extends Model {
);
foreach($segments as $segment) {
- $newsletters_count = $segment->newsletters()
- ->filter('groupBy', $group)
- ->count();
+ $newsletters = $segment->newsletters()->filter('groupBy', $group);
+ if($query_function !== false) {
+ $newsletters = $query_function($newsletters);
+ }
+ $newsletters_count = $newsletters->count();
+
if($newsletters_count > 0) {
$segment_list[] = array(
'label' => sprintf('%s (%d)', $segment->name, $newsletters_count),
- 'value' => $segment->id()
+ 'value' => $segment->id
);
}
}
@@ -190,26 +195,27 @@ class Newsletter extends Model {
return $orm;
}
- static function groups() {
+ static function groups($query_function = false) {
return array(
array(
'name' => 'all',
'label' => __('All'),
- 'count' => Newsletter::getPublished()->count()
+ 'count' => $query_function(Newsletter::getPublished())->count()
),
array(
'name' => 'trash',
'label' => __('Trash'),
- 'count' => Newsletter::getTrashed()->count()
+ 'count' => $query_function(Newsletter::getTrashed())->count()
)
);
}
static function groupBy($orm, $group = null) {
if($group === 'trash') {
- return $orm->whereNotNull('deleted_at');
+ $orm->whereNotNull('deleted_at');
}
- return $orm->whereNull('deleted_at');
+ $orm->whereNull('deleted_at');
+ return $orm;
}
static function createOrUpdate($data = array()) {
diff --git a/lib/Router/Newsletters.php b/lib/Router/Newsletters.php
index 7d5635bd0d..39c296ac90 100644
--- a/lib/Router/Newsletters.php
+++ b/lib/Router/Newsletters.php
@@ -216,19 +216,52 @@ class Newsletters {
}
}
- function listing($data = array()) {
+ function listingStandard($data = array()) {
$listing = new Listing\Handler(
'\MailPoet\Models\Newsletter',
- $data
+ $data,
+ function($orm) {
+ return $orm ->where('type', Newsletter::TYPE_STANDARD);
+ }
);
- $listing_data = $listing->get();
+ return $this->getListingData($listing, $data);
+ }
+
+ function listingWelcome($data = array()) {
+ $listing = new Listing\Handler(
+ '\MailPoet\Models\Newsletter',
+ $data,
+ function($orm) {
+ return $orm->where('type', Newsletter::TYPE_WELCOME);
+ }
+ );
+
+
+ return $this->getListingData($listing, $data);
+ }
+
+ function listingNotification($data = array()) {
+ $listing = new Listing\Handler(
+ '\MailPoet\Models\Newsletter',
+ $data,
+ function($orm) {
+ return $orm->where('type', Newsletter::TYPE_NOTIFICATION);
+ }
+ );
+
+ return $this->getListingData($listing, $data);
+ }
+
+ function getListingData($listing, $data = array()) {
+ $listing_data = $listing->getData();
foreach($listing_data['items'] as $key => $newsletter) {
$newsletter = $newsletter
->withSegments()
->withSendingQueue();
- if((boolean) Setting::getValue('tracking.enabled')) {
+
+ if((bool) Setting::getValue('tracking.enabled')) {
$newsletter = $newsletter->withStatistics();
}
$listing_data['items'][$key] = $newsletter->asArray();