diff --git a/assets/js/src/notice.js b/assets/js/src/notice.js index f6fb71a541..6ddb05a741 100644 --- a/assets/js/src/notice.js +++ b/assets/js/src/notice.js @@ -1,75 +1,75 @@ -define('notice', ['mailpoet', 'jquery'], function(MailPoet, jQuery) { - "use strict"; - /*================================================================================================== - - MailPoet Notice: - - description: Handles notices - version: 0.2 - author: Jonathan Labreuille - company: Wysija - dependencies: jQuery - - Usage: - - // success message (static: false) - MailPoet.Notice.success('Yatta!'); - - // error message (static: false) - MailPoet.Notice.error('Boo!'); - - // system message (static: true) - MailPoet.Notice.system('You need to updated ASAP!'); - - Examples: - - MailPoet.Notice.success('- success #1 -'); - setTimeout(function() { - MailPoet.Notice.success('- success #2 -'); - setTimeout(function() { - MailPoet.Notice.error('- error -'); - setTimeout(function() { - MailPoet.Notice.system('- system -'); - - setTimeout(function() { - MailPoet.Notice.hide(); - }, 2500); - }, 300); - }, 400); - }, 500); - - ==================================================================================================*/ - - MailPoet.Notice = { - version: 0.2, - // default options - defaults: { - type: 'success', - message: '', - static: false, - hideClose: false, - id: null, +define('notice', ['mailpoet', 'jquery'], function(MailPoet, jQuery) { + "use strict"; + /*================================================================================================== + + MailPoet Notice: + + description: Handles notices + version: 0.2 + author: Jonathan Labreuille + company: Wysija + dependencies: jQuery + + Usage: + + // success message (static: false) + MailPoet.Notice.success('Yatta!'); + + // error message (static: false) + MailPoet.Notice.error('Boo!'); + + // system message (static: true) + MailPoet.Notice.system('You need to updated ASAP!'); + + Examples: + + MailPoet.Notice.success('- success #1 -'); + setTimeout(function() { + MailPoet.Notice.success('- success #2 -'); + setTimeout(function() { + MailPoet.Notice.error('- error -'); + setTimeout(function() { + MailPoet.Notice.system('- system -'); + + setTimeout(function() { + MailPoet.Notice.hide(); + }, 2500); + }, 300); + }, 400); + }, 500); + + ==================================================================================================*/ + + MailPoet.Notice = { + version: 0.2, + // default options + defaults: { + type: 'success', + message: '', + static: false, + hideClose: false, + id: null, positionAfter: false, - scroll: false, - timeout: 2000, - onOpen: null, - onClose: null - }, - options: {}, - init: function(options) { - // set options - this.options = jQuery.extend({}, this.defaults, options); - - // clone element - this.element = jQuery('#mailpoet_notice_'+this.options.type).clone(); - - // add data-id to the element - if (this.options.id) this.element.attr('data-id', 'notice_' + this.options.id); - - // remove id from clone - this.element.removeAttr('id'); - - // insert notice after its parent + scroll: false, + timeout: 2000, + onOpen: null, + onClose: null + }, + options: {}, + init: function(options) { + // set options + this.options = jQuery.extend({}, this.defaults, options); + + // clone element + this.element = jQuery('#mailpoet_notice_'+this.options.type).clone(); + + // add data-id to the element + if (this.options.id) this.element.attr('data-id', 'notice_' + this.options.id); + + // remove id from clone + this.element.removeAttr('id'); + + // insert notice after its parent var positionAfter; if (typeof this.options.positionAfter === 'object') { positionAfter = this.options.positionAfter; @@ -78,136 +78,135 @@ define('notice', ['mailpoet', 'jquery'], function(MailPoet, jQuery) { } else { positionAfter = jQuery('#mailpoet_notice_'+this.options.type); } - console.log('positionAfter', typeof this.options.positionAfter); - positionAfter.after(this.element); - - // setup onClose callback - var onClose = null; - if(this.options.onClose !== null) { - onClose = this.options.onClose; - } - - // listen to remove event - jQuery(this.element).on('close', function() { - jQuery(this).fadeOut(200, function() { - // on close callback - if(onClose !== null) { - onClose(); - } - // remove notice - jQuery(this).remove(); - }); - }.bind(this.element)); - - // listen to message event - jQuery(this.element).on('message', function(e, message) { - MailPoet.Notice.setMessage(message); - }.bind(this.element)); - - return this; - }, - isHTML: function(str) { - var a = document.createElement('div'); - a.innerHTML = str; - for(var c = a.childNodes, i = c.length; i--;) { - if(c[i].nodeType == 1) return true; - } - return false; - }, - setMessage: function(message) { - // if it's not an html message, let's sugar coat the message with a fancy

- if(this.isHTML(message) === false) { - message = '

'+message+'

'; - } - // set message - return this.element.html(message); - }, - show: function(options) { - // initialize - this.init(options); - - // show notice - this.showNotice(); - - // return this; - }, - showNotice: function() { - // set message - this.setMessage(this.options.message); - - // position notice - this.element.insertAfter(jQuery('h2.title')); - - // set class name - switch(this.options.type) { - case 'success': - this.element.addClass('updated'); - break; - case 'system': - this.element.addClass('update-nag'); - break; - case 'error': - this.element.addClass('error'); - break; - } - - // make the notice appear - this.element.fadeIn(200); - - // if scroll option is enabled, scroll to the notice - if(this.options.scroll === true) { - this.element.get(0).scrollIntoView(false); - } - - // if the notice is not static, it has to disappear after a timeout - if(this.options.static === false) { - this.element.delay(this.options.timeout).trigger('close'); - } else if (this.options.hideClose === false) { - this.element.append(''); - this.element.find('.mailpoet_notice_close').on('click', function() { - jQuery(this).trigger('close'); - }); - } - - // call onOpen callback - if(this.options.onOpen !== null) { - this.options.onOpen(this.element); - } - }, - hide: function(all) { - if(all !== undefined && all === true) { - jQuery('.mailpoet_notice:not([id])').trigger('close'); - } else if (all !== undefined && jQuery.isArray(all)) { - for (var id in all) { - jQuery('[data-id="notice_' + all[id] + '"]') - .trigger('close'); - } - } if (all !== undefined) { - jQuery('[data-id="notice_' + all + '"]') - .trigger('close'); - } else { - jQuery('.mailpoet_notice.updated:not([id]), .mailpoet_notice.error:not([id])') - .trigger('close'); - } - }, - error: function(message, options) { - this.show(jQuery.extend({}, { - type: 'error', - message: '

'+message+'

' - }, options)); - }, - success: function(message, options) { - this.show(jQuery.extend({}, { - type: 'success', - message: '

'+message+'

' - }, options)); - }, - system: function(message, options) { - this.show(jQuery.extend({}, { - type: 'system', - static: true, - message: message - }, options)); - } - }; + positionAfter.after(this.element); + + // setup onClose callback + var onClose = null; + if(this.options.onClose !== null) { + onClose = this.options.onClose; + } + + // listen to remove event + jQuery(this.element).on('close', function() { + jQuery(this).fadeOut(200, function() { + // on close callback + if(onClose !== null) { + onClose(); + } + // remove notice + jQuery(this).remove(); + }); + }.bind(this.element)); + + // listen to message event + jQuery(this.element).on('message', function(e, message) { + MailPoet.Notice.setMessage(message); + }.bind(this.element)); + + return this; + }, + isHTML: function(str) { + var a = document.createElement('div'); + a.innerHTML = str; + for(var c = a.childNodes, i = c.length; i--;) { + if(c[i].nodeType == 1) return true; + } + return false; + }, + setMessage: function(message) { + // if it's not an html message, let's sugar coat the message with a fancy

+ if(this.isHTML(message) === false) { + message = '

'+message+'

'; + } + // set message + return this.element.html(message); + }, + show: function(options) { + // initialize + this.init(options); + + // show notice + this.showNotice(); + + // return this; + }, + showNotice: function() { + // set message + this.setMessage(this.options.message); + + // position notice + this.element.insertAfter(jQuery('h2.title')); + + // set class name + switch(this.options.type) { + case 'success': + this.element.addClass('updated'); + break; + case 'system': + this.element.addClass('update-nag'); + break; + case 'error': + this.element.addClass('error'); + break; + } + + // make the notice appear + this.element.fadeIn(200); + + // if scroll option is enabled, scroll to the notice + if(this.options.scroll === true) { + this.element.get(0).scrollIntoView(false); + } + + // if the notice is not static, it has to disappear after a timeout + if(this.options.static === false) { + this.element.delay(this.options.timeout).trigger('close'); + } else if (this.options.hideClose === false) { + this.element.append(''); + this.element.find('.mailpoet_notice_close').on('click', function() { + jQuery(this).trigger('close'); + }); + } + + // call onOpen callback + if(this.options.onOpen !== null) { + this.options.onOpen(this.element); + } + }, + hide: function(all) { + if(all !== undefined && all === true) { + jQuery('.mailpoet_notice:not([id])').trigger('close'); + } else if (all !== undefined && jQuery.isArray(all)) { + for (var id in all) { + jQuery('[data-id="notice_' + all[id] + '"]') + .trigger('close'); + } + } if (all !== undefined) { + jQuery('[data-id="notice_' + all + '"]') + .trigger('close'); + } else { + jQuery('.mailpoet_notice.updated:not([id]), .mailpoet_notice.error:not([id])') + .trigger('close'); + } + }, + error: function(message, options) { + this.show(jQuery.extend({}, { + type: 'error', + message: '

'+message+'

' + }, options)); + }, + success: function(message, options) { + this.show(jQuery.extend({}, { + type: 'success', + message: '

'+message+'

' + }, options)); + }, + system: function(message, options) { + this.show(jQuery.extend({}, { + type: 'system', + static: true, + message: message + }, options)); + } + }; }); diff --git a/lib/Cron/Daemon.php b/lib/Cron/Daemon.php index a9e38e5cc8..91d659a9c5 100644 --- a/lib/Cron/Daemon.php +++ b/lib/Cron/Daemon.php @@ -48,9 +48,14 @@ class Daemon { $_SESSION['cron_daemon'] = 'started'; $_SESSION['cron_daemon'] = array('result' => true); $this->manageSession('end'); + $daemon['status'] = 'started'; $daemon['token'] = $this->refreshed_token; - $this->saveDaemon($daemon); + $this->saveDaemon(array( + 'status' => 'started', + 'token' => $this->refreshed_token, + 'updated_at' => time() + )); $this->callSelf(); } $this->manageSession('end'); @@ -79,10 +84,12 @@ class Daemon { if($elapsed_time < 30) { sleep(30 - $elapsed_time); } - // after each execution, read daemon in case it's status was modified + // after each execution, read daemon in case its status was modified $daemon = $this->getDaemon(); + if($daemon['status'] === 'stopping') $daemon['status'] = 'stopped'; if($daemon['status'] === 'starting') $daemon['status'] = 'started'; + $daemon['token'] = $this->refreshed_token; $daemon['counter']++; $this->saveDaemon($daemon); @@ -90,7 +97,7 @@ class Daemon { } function getDaemon() { - return Setting::getValue('cron_daemon', null); + return Setting::getValue('cron_daemon'); } function saveDaemon($daemon_data) { diff --git a/lib/Cron/Supervisor.php b/lib/Cron/Supervisor.php index 823f1ccab3..5eca868280 100644 --- a/lib/Cron/Supervisor.php +++ b/lib/Cron/Supervisor.php @@ -1,7 +1,6 @@ daemon) { return $this->startDaemon(); } - if(!$this->force_start && ( - $this->daemon['value']['status'] === 'stopped' || - $this->daemon['value']['status'] === 'stopping') + if( + !$this->force_start && + in_array($this->daemon['status'], array('stopped', 'stopping')) ) { - return $this->daemon['value']['status']; + return $this->daemon['status']; } - $time_since_last_run = $this->getDaemonLastRunTime(); - if($time_since_last_run < 40) { + + $elapsed_time = time() - (int)$this->daemon['updated_at']; + + if($elapsed_time < 40) { if(!$this->force_start) { return; } - if($this->daemon['value']['status'] === 'stopping' || - $this->daemon['value']['status'] === 'starting' + if($this->daemon['status'] === 'stopping' || + $this->daemon['status'] === 'starting' ) { - return $this->daemon['value']['status']; + return $this->daemon['status']; } } - $this->daemon['value']['status'] = 'starting'; - $this->saveDaemon($this->daemon['value']); + $this->daemon['status'] = 'starting'; + $this->saveDaemon($this->daemon); return $this->startDaemon(); } @@ -62,12 +63,7 @@ class Supervisor { } function getDaemon() { - $daemon = Setting::where('name', 'cron_daemon') - ->findOne(); - if(!$daemon) return false; - $daemon = $daemon->asArray(); - $daemon['value'] = unserialize($daemon['value']); - return $daemon; + return Setting::getValue('cron_daemon'); } function saveDaemon($daemon_data) { @@ -104,13 +100,4 @@ class Supervisor { // throw an error if all connections fail throw new \Exception(__('Site URL is unreachable.')); } - - function getDaemonLastRunTime() { - $current_time = Carbon::now('UTC'); - $last_update_time = Carbon::createFromFormat( - 'Y-m-d H:i:s', - $this->daemon['updated_at'], 'UTC' - ); - return $current_time->diffInSeconds($last_update_time); - } } \ No newline at end of file