diff --git a/RoboFile.php b/RoboFile.php
index 5701bead21..87ee8d5dc6 100644
--- a/RoboFile.php
+++ b/RoboFile.php
@@ -47,6 +47,15 @@ class RoboFile extends \Robo\Tasks {
->run();
}
+ function watchCss() {
+ $css_files = $this->rsearch('assets/css/src/', array('styl'));
+ $this->taskWatch()
+ ->monitor($css_files, function() {
+ $this->compileCss();
+ })
+ ->run();
+ }
+
function watchJs() {
$this->_exec('./node_modules/webpack/bin/webpack.js --watch');
}
diff --git a/assets/css/src/admin.styl b/assets/css/src/admin.styl
index 0c9c45578e..294d5a5ecc 100644
--- a/assets/css/src/admin.styl
+++ b/assets/css/src/admin.styl
@@ -13,4 +13,5 @@
@require 'breadcrumb'
@require 'form'
-@require 'settings'
\ No newline at end of file
+@require 'settings'
+@require 'progress_bar'
\ No newline at end of file
diff --git a/assets/css/src/common.styl b/assets/css/src/common.styl
index ce9dbff2cb..1c49712483 100644
--- a/assets/css/src/common.styl
+++ b/assets/css/src/common.styl
@@ -26,3 +26,25 @@ textarea.regular-text
@media screen and (max-width: 782px)
.select2-container
width: 100% !important
+
+// progress bars
+progress-border-radius = 5px
+progress-background = #efefef
+progress-foreground = #69b1e9
+
+progress
+ background-color: progress-background;
+ height: 2em
+ border: 0
+ width: 100%
+
+progress::-webkit-progress-bar
+ background-color: progress-background;
+
+progress::-webkit-progress-value
+ background-color: progress-foreground
+ border-radius: progress-border-radius
+
+progress::-moz-progress-bar
+ background-color: progress-foreground
+ border-radius: progress-border-radius
diff --git a/assets/css/src/progress_bar.styl b/assets/css/src/progress_bar.styl
new file mode 100644
index 0000000000..f2fcb5b03f
--- /dev/null
+++ b/assets/css/src/progress_bar.styl
@@ -0,0 +1,21 @@
+.mailpoet_progress
+ background-color: #efefef
+ height: 25px
+ padding: 0
+ width: 100%
+ margin: 0
+ border-radius: 5px
+
+.mailpoet_progress span
+ display: inline-block
+ height: 100%
+ border-radius: 3px
+ box-shadow: 0 1px 0 rgba(255, 255, 255, .5) inset
+
+.blue span
+ background-color: #34c2e3
+ background-image: linear-gradient(top, #34c2e3, darken(#34c2e3, 20%))
+
+.orange span
+ background-color: #fecf23
+ background-image: linear-gradient(top, #fecf23, #fd9215)
\ No newline at end of file
diff --git a/assets/img/menu_icon.png b/assets/img/menu_icon.png
index cf84988ba2..497e581a5f 100644
Binary files a/assets/img/menu_icon.png and b/assets/img/menu_icon.png differ
diff --git a/assets/js/src/newsletters/list.jsx b/assets/js/src/newsletters/list.jsx
index 603d0e72a0..00f6ac0936 100644
--- a/assets/js/src/newsletters/list.jsx
+++ b/assets/js/src/newsletters/list.jsx
@@ -21,6 +21,10 @@ define(
label: 'Subject',
sortable: true
},
+ {
+ name: 'status',
+ label: 'Status'
+ },
{
name: 'segments',
label: 'Lists'
@@ -119,8 +123,28 @@ define(
];
var NewsletterList = React.createClass({
- renderItem: function(newsletter, actions) {
+ renderStatus: function(item) {
+ if(item.queue === null) {
+ return (
+ Not sent yet.
+ );
+ } else {
+ // calculate percentage done
+ var percentage = Math.round(
+ (item.queue.count_processed * 100) / (item.queue.count_total)
+ );
+ return (
+
+
+
+
+ { item.queue.count_processed } / { item.queue.count_total }
+
+ );
+ }
+ },
+ renderItem: function(newsletter, actions) {
var rowClasses = classNames(
'manage-column',
'column-primary',
@@ -141,6 +165,9 @@ define(
{ actions }
+
+ { this.renderStatus(newsletter) }
+ |
{ segments }
|
diff --git a/assets/js/src/newsletters/send.jsx b/assets/js/src/newsletters/send.jsx
index f3f0d760e7..afe8fd3548 100644
--- a/assets/js/src/newsletters/send.jsx
+++ b/assets/js/src/newsletters/send.jsx
@@ -94,16 +94,15 @@ define(
],
handleSend: function() {
MailPoet.Ajax.post({
- endpoint: 'newsletters',
- action: 'send',
+ endpoint: 'queue',
+ action: 'addQueue',
data: {
- id: this.props.params.id,
- newsletter: jQuery('#mailpoet_newsletter').serializeObject(),
+ newsletter_id: this.props.params.id,
segments: jQuery('#mailpoet_segments').val()
}
}).done(function(response) {
if(response === true) {
- this.history.pushState(null, '/');
+ //this.history.pushState(null, '/');
MailPoet.Notice.success(
'The newsletter has been sent!'
diff --git a/lib/Config/Widget.php b/lib/Config/Widget.php
index fd8facf8f7..eeb17ddf29 100644
--- a/lib/Config/Widget.php
+++ b/lib/Config/Widget.php
@@ -61,19 +61,25 @@ class Widget {
}
function setupAdminDependencies() {
- wp_enqueue_script('mailpoet_vendor',
- Env::$assets_url.'/js/vendor.js',
- array(),
- Env::$version,
- true
- );
+ if(
+ empty($_GET['page'])
+ or
+ isset($_GET['page']) && strpos($_GET['page'], 'mailpoet') === false
+ ) {
+ wp_enqueue_script('mailpoet_vendor',
+ Env::$assets_url.'/js/vendor.js',
+ array(),
+ Env::$version,
+ true
+ );
- wp_enqueue_script('mailpoet_admin',
- Env::$assets_url.'/js/mailpoet.js',
- array(),
- Env::$version,
- true
- );
+ wp_enqueue_script('mailpoet_admin',
+ Env::$assets_url.'/js/mailpoet.js',
+ array(),
+ Env::$version,
+ true
+ );
+ }
}
function setupActions() {
diff --git a/lib/Router/Newsletters.php b/lib/Router/Newsletters.php
index 91210db43a..62f2d35efe 100644
--- a/lib/Router/Newsletters.php
+++ b/lib/Router/Newsletters.php
@@ -12,6 +12,7 @@ use MailPoet\Models\NewsletterSegment;
use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\NewsletterOption;
use MailPoet\Newsletter\Renderer\Renderer;
+use MailPoet\Models\Queue as SendingQueue;
if(!defined('ABSPATH')) exit;
@@ -219,14 +220,19 @@ class Newsletters {
$listing_data = $listing->get();
- // fetch segments relations for each returned item
foreach($listing_data['items'] as &$item) {
+ // get segments
$segments = NewsletterSegment::select('segment_id')
->where('newsletter_id', $item['id'])
->findMany();
$item['segments'] = array_map(function($relation) {
return $relation->segment_id;
}, $segments);
+
+ // get queue
+ $queue = SendingQueue::where('newsletter_id', $item['id'])
+ ->findOne();
+ $item['queue'] = ($queue !== false) ? $queue->asArray() : null;
}
wp_send_json($listing_data);
diff --git a/lib/Router/Queue.php b/lib/Router/Queue.php
index 6e0feff5d5..9c2112c367 100644
--- a/lib/Router/Queue.php
+++ b/lib/Router/Queue.php
@@ -3,6 +3,8 @@ namespace MailPoet\Router;
use MailPoet\Queue\Daemon;
use MailPoet\Queue\Supervisor;
+use MailPoet\Models\Queue as SendingQueue;
+use MailPoet\Models\Segment;
use MailPoet\Util\Helpers;
if(!defined('ABSPATH')) exit;
@@ -48,14 +50,27 @@ class Queue {
}
function addQueue($data) {
- $queue = \MailPoet\Models\Queue::create();
+ $queue = SendingQueue::create();
+
$queue->newsletter_id = $data['newsletter_id'];
+
+ $subscriber_ids = array();
+ $segments = Segment::whereIn('id', $data['segments'])->findMany();
+ foreach($segments as $segment) {
+ $subscriber_ids = array_merge($subscriber_ids, Helpers::arrayColumn(
+ $segment->subscribers()->findArray(),
+ 'id'
+ ));
+ }
+
+ $subscriber_ids = array_unique($subscriber_ids);
$queue->subscribers = json_encode(
array(
- 'to_process' => $data['subscribers']
+ 'to_process' => $subscriber_ids
)
);
- $queue->count_total = $queue->count_to_process = count($data['subscribers']);
+
+ $queue->count_total = $queue->count_to_process = count($subscriber_ids);
$queue->save();
wp_send_json(
!$queue->save() ?
@@ -72,7 +87,7 @@ class Queue {
function addQueues($data) {
$result = array_map(function ($queueData) {
- $queue = \MailPoet\Models\Queue::create();
+ $queue = SendingQueue::create();
$queue->newsletter_id = $queueData['newsletter_id'];
$queue->subscribers = json_encode(
array(
@@ -102,7 +117,7 @@ class Queue {
}
function deleteQueue($data) {
- $queue = \MailPoet\Models\Queue::whereNull('deleted_at')
+ $queue = SendingQueue::whereNull('deleted_at')
->findOne($data['queue_id']);
if(!$queue) {
wp_send_json(
@@ -118,7 +133,7 @@ class Queue {
}
function deleteQueues($data) {
- $queues = \MailPoet\Models\Queue::whereNull('deleted_at')
+ $queues = SendingQueue::whereNull('deleted_at')
->whereIn('id', $data['queue_ids'])
->findResultSet();
if(!$queues->count()) {
@@ -137,7 +152,7 @@ class Queue {
}
function getQueueStatus($data) {
- $queue = \MailPoet\Models\Queue::whereNull('deleted_at')
+ $queue = SendingQueue::whereNull('deleted_at')
->findOne($data['queue_id'])
->asArray();
wp_send_json(
@@ -154,7 +169,7 @@ class Queue {
}
function getQueuesStatus($data) {
- $queues = \MailPoet\Models\Queue::whereNull('deleted_at')
+ $queues = SendingQueue::whereNull('deleted_at')
->whereIn('id', $data['queue_ids'])
->findArray();
wp_send_json(