From bf58d8a22df5ea47e79f6725fdce034b1db74e19 Mon Sep 17 00:00:00 2001 From: Jonathan Labreuille Date: Wed, 2 Dec 2015 12:25:28 +0100 Subject: [PATCH] Queue - updated menu icon for our plugin - added watchCss command to watch only CSS files - added Status column in Newsletters listing - added progress bar styles - fixed issue with JS assets being loaded twice on non MP pages - changed subscriber_ids to segment_ids in addQueue --- RoboFile.php | 9 +++++++++ assets/css/src/admin.styl | 3 ++- assets/css/src/common.styl | 22 ++++++++++++++++++++ assets/css/src/progress_bar.styl | 21 +++++++++++++++++++ assets/img/menu_icon.png | Bin 1421 -> 1345 bytes assets/js/src/newsletters/list.jsx | 29 ++++++++++++++++++++++++++- assets/js/src/newsletters/send.jsx | 9 ++++----- lib/Config/Widget.php | 30 +++++++++++++++++----------- lib/Router/Newsletters.php | 8 +++++++- lib/Router/Queue.php | 31 +++++++++++++++++++++-------- 10 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 assets/css/src/progress_bar.styl 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 cf84988ba23683ffe8aa5bebc9233a27c76656b4..497e581a5fe9e7894c12b7d71544752ce5ff06e2 100644 GIT binary patch literal 1345 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%oUj-5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT-VtFWlg~VrW1CgG|37u|VHY&pf(~1RD?6IsxA(xEJ)Q4 zN-fSWElLK)N18HBGcfG%TLe-Fbd8mNQ6?}_5_4SglS^|`^GZBjY?XjAdMTMHRu;x7 zY37CombwN8#zwj($;pr6!i-7lq{K=fF}y zKt_H^esM;Afr7I$IMx+3d=ry1^FV@{pooI_+al8;uunKYt596 zUd)aH4&}mz5`5Bu0-P>ewh9PxOaFIpJR_fx`f_sm8T9lx;=tzT; z&XJ0Jp3fc?+=;a*cyRaaxijb9y*V?N|L}#s?IKSe?tS0H@_`|KgXGKJTKC+3gRC#- zZVDT&YujIxU7ixxBA&cnD*C;Prcw9drkU#xRHS8bep>sUcX9OevkPacUl6r%>1$(CgGt+rw;A;uO|IY#5!umv-sZk| zcKg;tbMs7gG-h)Yv2d33u6Y~&R#wb$%JW^_mv`U1`qAvniwL6`?V1*^pR`;?U{HO4qN>% UUAepb2&ho=boFyt=akR{0LmHLa{vGU literal 1421 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|wj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAjMhfmPSj#WBP}kWq>C?k~pwAEW*Q72*Z^_)w*{pmM=HCM;rP2@PX| zSa1bM^r2gDsbn8DI2#v(YGK6qb`~er=s$epAKda6P?le0rejgBNot 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(