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:
@ -9,6 +9,8 @@
|
||||
|
||||
@require 'form_editor'
|
||||
@require 'listing'
|
||||
@require 'listing/newsletters'
|
||||
|
||||
@require 'box'
|
||||
@require 'breadcrumb'
|
||||
|
||||
|
3
assets/css/src/listing/newsletters.styl
Normal file
3
assets/css/src/listing/newsletters.styl
Normal file
@ -0,0 +1,3 @@
|
||||
#newsletters_container
|
||||
h2.nav-tab-wrapper
|
||||
margin-bottom: 1rem
|
@ -90,7 +90,7 @@ const item_actions = [
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'duplicate_form',
|
||||
name: 'duplicate',
|
||||
label: MailPoet.I18n.t('duplicate'),
|
||||
onClick: function(item, refresh) {
|
||||
return MailPoet.Ajax.post({
|
||||
@ -98,9 +98,11 @@ const item_actions = [
|
||||
action: 'duplicate',
|
||||
data: item.id
|
||||
}).done(function(response) {
|
||||
MailPoet.Notice.success(
|
||||
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name)
|
||||
);
|
||||
if (response !== false && response['name'] !== undefined) {
|
||||
MailPoet.Notice.success(
|
||||
(MailPoet.I18n.t('formDuplicated')).replace('%$1s', response.name)
|
||||
);
|
||||
}
|
||||
refresh();
|
||||
});
|
||||
}
|
||||
|
@ -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'
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
namespace MailPoet\Config;
|
||||
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\Models\Newsletter;
|
||||
|
||||
if(!defined('ABSPATH')) exit;
|
||||
|
||||
@ -174,6 +175,7 @@ class Migrator {
|
||||
'type varchar(20) NOT NULL DEFAULT "standard",',
|
||||
'sender_address 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_name varchar(150) NOT NULL DEFAULT "",',
|
||||
'preheader varchar(250) NOT NULL DEFAULT "",',
|
||||
|
@ -10,6 +10,9 @@ class Newsletter extends Model {
|
||||
const TYPE_WELCOME = 'welcome';
|
||||
const TYPE_NOTIFICATION = 'notification';
|
||||
|
||||
const STATUS_DRAFT = 'draft';
|
||||
const STATUS_SENT = 'sent';
|
||||
|
||||
function __construct() {
|
||||
parent::__construct();
|
||||
|
||||
@ -205,6 +208,16 @@ class Newsletter extends Model {
|
||||
'label' => __('All'),
|
||||
'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(
|
||||
'name' => 'trash',
|
||||
'label' => __('Trash'),
|
||||
@ -213,22 +226,48 @@ class Newsletter extends Model {
|
||||
);
|
||||
}
|
||||
|
||||
static function groupBy($orm, $data = array()) {
|
||||
$group = (!empty($data['group'])) ? $data['group'] : 'all';
|
||||
|
||||
switch($group) {
|
||||
case self::STATUS_DRAFT:
|
||||
$orm->filter('filterDraft', $data);
|
||||
break;
|
||||
case self::STATUS_SENT:
|
||||
$orm->filter('filterSent', $data);
|
||||
break;
|
||||
case 'trash':
|
||||
$orm->whereNotNull('deleted_at');
|
||||
break;
|
||||
default:
|
||||
$orm->whereNull('deleted_at');
|
||||
}
|
||||
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['group'])
|
||||
->filter('groupBy', $data)
|
||||
->filter('search', $data['search']);
|
||||
}
|
||||
|
||||
static function groupBy($orm, $group = null) {
|
||||
if($group === 'trash') {
|
||||
$orm->whereNotNull('deleted_at');
|
||||
} else {
|
||||
$orm->whereNull('deleted_at');
|
||||
}
|
||||
return $orm;
|
||||
}
|
||||
|
||||
static function createOrUpdate($data = array()) {
|
||||
$newsletter = false;
|
||||
|
||||
|
@ -124,13 +124,15 @@ class Newsletters {
|
||||
}
|
||||
|
||||
function duplicate($id = false) {
|
||||
$result = false;
|
||||
|
||||
$newsletter = Newsletter::findOne($id);
|
||||
if($newsletter !== false) {
|
||||
return $newsletter->duplicate(array(
|
||||
$result = $newsletter->duplicate(array(
|
||||
'subject' => sprintf(__('Copy of %s'), $newsletter->subject)
|
||||
))->asArray();
|
||||
}
|
||||
return false;
|
||||
return $result;
|
||||
}
|
||||
|
||||
function showPreview($data = array()) {
|
||||
|
@ -70,6 +70,8 @@
|
||||
'multipleNewslettersRestored': __('%$1d newsletters have been restored from the trash.'),
|
||||
'trash': __('Trash'),
|
||||
'edit': __('Edit'),
|
||||
'duplicate': __('Duplicate'),
|
||||
'newsletterDuplicated': __('Newsletter "%$1s" has been duplicated.'),
|
||||
'notSentYet': __('Not sent yet.'),
|
||||
'scheduledFor': __('Scheduled for'),
|
||||
'scheduleIt': __('Schedule it'),
|
||||
|
Reference in New Issue
Block a user