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(