Newsletters listing

- added stylesheet for newsletters listing
- added "status" database column on Newsletters for grouping in listings
- added duplicate link to standard newsletters
This commit is contained in:
Jonathan Labreuille
2016-06-07 17:22:59 +02:00
parent a593347336
commit ecf15d53d9
8 changed files with 88 additions and 16 deletions

View File

@@ -9,6 +9,8 @@
@require 'form_editor' @require 'form_editor'
@require 'listing' @require 'listing'
@require 'listing/newsletters'
@require 'box' @require 'box'
@require 'breadcrumb' @require 'breadcrumb'

View File

@@ -0,0 +1,3 @@
#newsletters_container
h2.nav-tab-wrapper
margin-bottom: 1rem

View File

@@ -90,7 +90,7 @@ const item_actions = [
} }
}, },
{ {
name: 'duplicate_form', name: 'duplicate',
label: MailPoet.I18n.t('duplicate'), label: MailPoet.I18n.t('duplicate'),
onClick: function(item, refresh) { onClick: function(item, refresh) {
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
@@ -98,9 +98,11 @@ const item_actions = [
action: 'duplicate', action: 'duplicate',
data: item.id data: item.id
}).done(function(response) { }).done(function(response) {
if (response !== false && response['name'] !== undefined) {
MailPoet.Notice.success( MailPoet.Notice.success(
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name) (MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name)
); );
}
refresh(); refresh();
}); });
} }

View File

@@ -106,6 +106,26 @@ var item_actions = [
); );
} }
}, },
{
name: 'duplicate',
label: MailPoet.I18n.t('duplicate'),
onClick: function(item, refresh) {
return MailPoet.Ajax.post({
endpoint: 'newsletters',
action: 'duplicate',
data: item.id
}).done(function(response) {
if (response !== false && response.subject !== undefined) {
MailPoet.Notice.success(
(MailPoet.I18n.t('newsletterDuplicated')).replace(
'%$1s', response.subject
)
);
}
refresh();
});
}
},
{ {
name: 'trash' name: 'trash'
} }

View File

@@ -2,6 +2,7 @@
namespace MailPoet\Config; namespace MailPoet\Config;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\Newsletter;
if(!defined('ABSPATH')) exit; if(!defined('ABSPATH')) exit;
@@ -174,6 +175,7 @@ class Migrator {
'type varchar(20) NOT NULL DEFAULT "standard",', 'type varchar(20) NOT NULL DEFAULT "standard",',
'sender_address varchar(150) NOT NULL DEFAULT "",', 'sender_address varchar(150) NOT NULL DEFAULT "",',
'sender_name varchar(150) NOT NULL DEFAULT "",', 'sender_name varchar(150) NOT NULL DEFAULT "",',
'status varchar(20) NOT NULL DEFAULT "'.Newsletter::STATUS_DRAFT.'",',
'reply_to_address varchar(150) NOT NULL DEFAULT "",', 'reply_to_address varchar(150) NOT NULL DEFAULT "",',
'reply_to_name varchar(150) NOT NULL DEFAULT "",', 'reply_to_name varchar(150) NOT NULL DEFAULT "",',
'preheader varchar(250) NOT NULL DEFAULT "",', 'preheader varchar(250) NOT NULL DEFAULT "",',

View File

@@ -10,6 +10,9 @@ class Newsletter extends Model {
const TYPE_WELCOME = 'welcome'; const TYPE_WELCOME = 'welcome';
const TYPE_NOTIFICATION = 'notification'; const TYPE_NOTIFICATION = 'notification';
const STATUS_DRAFT = 'draft';
const STATUS_SENT = 'sent';
function __construct() { function __construct() {
parent::__construct(); parent::__construct();
@@ -205,6 +208,16 @@ class Newsletter extends Model {
'label' => __('All'), 'label' => __('All'),
'count' => Newsletter::getPublished()->where('type', $data['tab'])->count() 'count' => Newsletter::getPublished()->where('type', $data['tab'])->count()
), ),
array(
'name' => self::STATUS_DRAFT,
'label' => __('Draft'),
'count' => Newsletter::filter('filterDraft', $data)->count()
),
array(
'name' => self::STATUS_SENT,
'label' => __('Sent'),
'count' => Newsletter::filter('filterSent', $data)->count()
),
array( array(
'name' => 'trash', 'name' => 'trash',
'label' => __('Trash'), 'label' => __('Trash'),
@@ -213,22 +226,48 @@ class Newsletter extends Model {
); );
} }
static function listingQuery($data = array()) { static function groupBy($orm, $data = array()) {
return self::where('type', $data['tab']) $group = (!empty($data['group'])) ? $data['group'] : 'all';
->filter('filterBy', $data)
->filter('groupBy', $data['group'])
->filter('search', $data['search']);
}
static function groupBy($orm, $group = null) { switch($group) {
if($group === 'trash') { case self::STATUS_DRAFT:
$orm->filter('filterDraft', $data);
break;
case self::STATUS_SENT:
$orm->filter('filterSent', $data);
break;
case 'trash':
$orm->whereNotNull('deleted_at'); $orm->whereNotNull('deleted_at');
} else { break;
default:
$orm->whereNull('deleted_at'); $orm->whereNull('deleted_at');
} }
return $orm; return $orm;
} }
static function filterDraft($orm, $data = array()) {
$type = isset($data['tab']) ? $data['tab'] : self::TYPE_STANDARD;
return $orm
->where('type', $type)
->where('status', self::STATUS_DRAFT);
}
static function filterSent($orm, $data = array()) {
$type = isset($data['tab']) ? $data['tab'] : self::TYPE_STANDARD;
return $orm
->where('type', $type)
->where('status', self::STATUS_SENT);
}
static function listingQuery($data = array()) {
return self::where('type', $data['tab'])
->filter('filterBy', $data)
->filter('groupBy', $data)
->filter('search', $data['search']);
}
static function createOrUpdate($data = array()) { static function createOrUpdate($data = array()) {
$newsletter = false; $newsletter = false;

View File

@@ -124,13 +124,15 @@ class Newsletters {
} }
function duplicate($id = false) { function duplicate($id = false) {
$result = false;
$newsletter = Newsletter::findOne($id); $newsletter = Newsletter::findOne($id);
if($newsletter !== false) { if($newsletter !== false) {
return $newsletter->duplicate(array( $result = $newsletter->duplicate(array(
'subject' => sprintf(__('Copy of %s'), $newsletter->subject) 'subject' => sprintf(__('Copy of %s'), $newsletter->subject)
))->asArray(); ))->asArray();
} }
return false; return $result;
} }
function showPreview($data = array()) { function showPreview($data = array()) {

View File

@@ -70,6 +70,8 @@
'multipleNewslettersRestored': __('%$1d newsletters have been restored from the trash.'), 'multipleNewslettersRestored': __('%$1d newsletters have been restored from the trash.'),
'trash': __('Trash'), 'trash': __('Trash'),
'edit': __('Edit'), 'edit': __('Edit'),
'duplicate': __('Duplicate'),
'newsletterDuplicated': __('Newsletter "%$1s" has been duplicated.'),
'notSentYet': __('Not sent yet.'), 'notSentYet': __('Not sent yet.'),
'scheduledFor': __('Scheduled for'), 'scheduledFor': __('Scheduled for'),
'scheduleIt': __('Schedule it'), 'scheduleIt': __('Schedule it'),