Mixpanel analytics [MAILPOET-686] (#940)
* Send analytics data to mixpanel [MAILPOET-686]
This commit is contained in:
committed by
stoletniy
parent
823cd3cd07
commit
812c6634ba
@ -1,8 +1,15 @@
|
|||||||
(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable time_event track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" ");
|
(function(e,a){if(!a.__SV){var b=window;try{var c,l,i,j=b.location,g=j.hash;c=function(a,b){return(l=a.match(RegExp(b+"=([^&]*)")))?l[1]:null};g&&c(g,"state")&&(i=JSON.parse(decodeURIComponent(c(g,"state"))),"mpeditor"===i.action&&(b.sessionStorage.setItem("_mpcehash",g),history.replaceState(i.desiredHash||"",e.title,j.pathname+j.search)))}catch(m){}var k,h;window.mixpanel=a;a._i=[];a.init=function(b,c,f){function e(b,a){var c=a.split(".");2==c.length&&(b=b[c[0]],a=c[1]);b[a]=function(){b.push([a].concat(Array.prototype.slice.call(arguments,
|
||||||
for(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,e,d])};b.__SV=1.2;a=e.createElement("script");a.type="text/javascript";a.async=!0;a.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:"file:"===e.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";f=e.getElementsByTagName("script")[0];f.parentNode.insertBefore(a,f)}})(document,window.mixpanel||[]);
|
0)))}}var d=a;"undefined"!==typeof f?d=a[f]=[]:f="mixpanel";d.people=d.people||[];d.toString=function(b){var a="mixpanel";"mixpanel"!==f&&(a+="."+f);b||(a+=" (stub)");return a};d.people.toString=function(){return d.toString(1)+".people (stub)"};k="disable time_event track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config reset people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user".split(" ");
|
||||||
|
for(h=0;h<k.length;h++)e(d,k[h]);a._i.push([b,c,f])};a.__SV=1.2;b=e.createElement("script");b.type="text/javascript";b.async=!0;b.src="undefined"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:"file:"===e.location.protocol&&"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//)?"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js":"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";c=e.getElementsByTagName("script")[0];c.parentNode.insertBefore(b,c)}})(document,window.mixpanel||[]);
|
||||||
|
|
||||||
mixpanel.init("f683d388fb25fcf331f1b2b5c4449798");
|
window.mixpanelTrackingId = "8cce373b255e5a76fb22d57b85db0c92";
|
||||||
|
|
||||||
|
if (mailpoet_analytics_enabled) {
|
||||||
|
|
||||||
|
mixpanel.init(window.mixpanelTrackingId);
|
||||||
|
|
||||||
|
if (mailpoet_analytics_data != null) {
|
||||||
|
mixpanel.track('MailPoet 3', mailpoet_analytics_data);
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof mailpoet_analytics_data === 'object') {
|
|
||||||
mixpanel.track('Wysija Usage', mailpoet_analytics_data || {});
|
|
||||||
}
|
}
|
||||||
|
71
assets/js/src/analytics_event.js
Normal file
71
assets/js/src/analytics_event.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* This creates two functions and adds them to MailPoet object
|
||||||
|
* - `trackEvent` which should be used in normal circumstances.
|
||||||
|
* This function tracks an event and sends it to mixpanel.
|
||||||
|
* This function does nothing if analytics is disabled.
|
||||||
|
* - `forceTrackEvent` which sends given event to analytics
|
||||||
|
* even if it has been disabled.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is to cache events which are triggered before the mixpanel
|
||||||
|
* library is loaded. This might happen if an event is tracked
|
||||||
|
* on page load and the mixpanel library takes a long time to load.
|
||||||
|
* After it is loaded all events are posted.
|
||||||
|
* @type {Array.Object}
|
||||||
|
*/
|
||||||
|
var eventsCache = [];
|
||||||
|
|
||||||
|
function track(name, data){
|
||||||
|
if (typeof window.mixpanel.track !== "function") {
|
||||||
|
window.mixpanel.init(window.mixpanelTrackingId);
|
||||||
|
}
|
||||||
|
window.mixpanel.track(name, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function exportMixpanel(MailPoet) {
|
||||||
|
MailPoet.forceTrackEvent = track;
|
||||||
|
|
||||||
|
if (window.mailpoet_analytics_enabled) {
|
||||||
|
MailPoet.trackEvent = track;
|
||||||
|
} else {
|
||||||
|
MailPoet.trackEvent = function () {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function trackCachedEvents() {
|
||||||
|
eventsCache.map(function (event) {
|
||||||
|
if (window.mailpoet_analytics_enabled || event.forced) {
|
||||||
|
window.mixpanel.track(event.name, event.data)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initializeMixpanelWhenLoaded() {
|
||||||
|
if (typeof window.mixpanel === "object") {
|
||||||
|
exportMixpanel(MailPoet);
|
||||||
|
trackCachedEvents();
|
||||||
|
} else {
|
||||||
|
setTimeout(initializeMixpanelWhenLoaded, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function cacheEvent(forced, name, data) {
|
||||||
|
eventsCache.push({
|
||||||
|
name: name,
|
||||||
|
data: data,
|
||||||
|
forced: forced,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
define(
|
||||||
|
['mailpoet', 'underscore'],
|
||||||
|
function(MailPoet, _) {
|
||||||
|
|
||||||
|
MailPoet.trackEvent = _.partial(cacheEvent, false);
|
||||||
|
MailPoet.forceTrackEvent = _.partial(cacheEvent, true);
|
||||||
|
|
||||||
|
initializeMixpanelWhenLoaded();
|
||||||
|
}
|
||||||
|
);
|
43
assets/js/src/settings/reinstall_from_scratch.js
Normal file
43
assets/js/src/settings/reinstall_from_scratch.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
define(
|
||||||
|
[
|
||||||
|
'mailpoet'
|
||||||
|
],
|
||||||
|
function(
|
||||||
|
MailPoet
|
||||||
|
) {
|
||||||
|
|
||||||
|
function eventHandler() {
|
||||||
|
if (confirm(MailPoet.I18n.t('reinstallConfirmation'))) {
|
||||||
|
MailPoet.trackEvent(
|
||||||
|
'User has reinstalled MailPoet via Settings',
|
||||||
|
{'MailPoet Free version': window.mailpoet_version}
|
||||||
|
);
|
||||||
|
|
||||||
|
MailPoet.Modal.loading(true);
|
||||||
|
MailPoet.Ajax.post({
|
||||||
|
'api_version': window.mailpoet_api_version,
|
||||||
|
'endpoint': 'setup',
|
||||||
|
'action': 'reset'
|
||||||
|
}).always(function () {
|
||||||
|
MailPoet.Modal.loading(false);
|
||||||
|
}).done(function () {
|
||||||
|
window.location = 'admin.php?page=mailpoet-newsletters';
|
||||||
|
}).fail(function (response) {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
MailPoet.Notice.error(
|
||||||
|
response.errors.map(function (error) {
|
||||||
|
return error.message;
|
||||||
|
}),
|
||||||
|
{scroll: true}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var element = document.getElementById('mailpoet_reinstall');
|
||||||
|
if (element) {
|
||||||
|
element.addEventListener('click', eventHandler, false);
|
||||||
|
}
|
||||||
|
});
|
51
lib/Analytics/Analytics.php
Normal file
51
lib/Analytics/Analytics.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Analytics;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use MailPoet\Models\Setting;
|
||||||
|
|
||||||
|
if(!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
|
class Analytics {
|
||||||
|
|
||||||
|
const SETTINGS_LAST_SENT_KEY = "analytics_last_sent";
|
||||||
|
const SEND_AFTER_DAYS = 7;
|
||||||
|
|
||||||
|
/** @var Reporter */
|
||||||
|
private $reporter;
|
||||||
|
|
||||||
|
public function __construct(Reporter $reporter) {
|
||||||
|
$this->reporter = $reporter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return array */
|
||||||
|
function generateAnalytics() {
|
||||||
|
if($this->shouldSend()) {
|
||||||
|
$data = $this->reporter->getData();
|
||||||
|
$this->recordDataSent();
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return boolean */
|
||||||
|
function isEnabled() {
|
||||||
|
$analytics_settings = Setting::getValue('analytics', array());
|
||||||
|
return ($analytics_settings["enabled"] === "1") || ($analytics_settings["enabled"] === "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
private function shouldSend() {
|
||||||
|
if(!$this->isEnabled()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$lastSent = Setting::getValue(Analytics::SETTINGS_LAST_SENT_KEY);
|
||||||
|
if(!$lastSent) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$lastSentCarbon = Carbon::createFromTimestamp(strtotime($lastSent))->addDays(Analytics::SEND_AFTER_DAYS);
|
||||||
|
return $lastSentCarbon->isPast();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function recordDataSent() {
|
||||||
|
Setting::setValue(Analytics::SETTINGS_LAST_SENT_KEY, Carbon::now());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,23 +1,33 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Analytics;
|
namespace MailPoet\Analytics;
|
||||||
|
|
||||||
|
use MailPoet\Config\Installer;
|
||||||
|
use MailPoet\Models\Newsletter;
|
||||||
|
use MailPoet\Models\Setting;
|
||||||
|
use MailPoet\Models\Subscriber;
|
||||||
|
|
||||||
class Reporter {
|
class Reporter {
|
||||||
|
|
||||||
private $fields = array(
|
|
||||||
'Plugin Version' => 'pluginVersion',
|
|
||||||
);
|
|
||||||
|
|
||||||
function getData() {
|
function getData() {
|
||||||
$_this = $this;
|
|
||||||
|
|
||||||
$analytics_data = array_map(function($func) use ($_this) {
|
$mta = Setting::getValue('mta', array());
|
||||||
return $_this->$func();
|
$premium_status = Installer::getPremiumStatus();
|
||||||
}, $this->fields);
|
$newsletters = Newsletter::getAnalytics();
|
||||||
|
|
||||||
return $analytics_data;
|
|
||||||
|
return array(
|
||||||
|
'MailPoet Free version' => MAILPOET_VERSION,
|
||||||
|
'MailPoet Premium version' => (defined('MAILPOET_PREMIUM_VERSION')) ? MAILPOET_PREMIUM_VERSION : 'N/A',
|
||||||
|
'Premium Plugin Installed' => $premium_status['premium_plugin_installed'],
|
||||||
|
'Premium Plugin Active' => $premium_status['premium_plugin_active'],
|
||||||
|
'Total number of subscribers' => Subscriber::getTotalSubscribers(),
|
||||||
|
'Sending Method' => $mta['method'],
|
||||||
|
'Date of plugin installation' => Setting::getValue('installed_at'),
|
||||||
|
'Number of standard newsletters sent in last 3 months' => $newsletters['sent_newsletters'],
|
||||||
|
'Number of active post notifications' => $newsletters['notifications_count'],
|
||||||
|
'Number of active welcome emails' => $newsletters['welcome_newsletters_count'],
|
||||||
|
'Is WooCommerce plugin installed' => is_plugin_active("woocommerce/woocommerce.php"),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function pluginVersion() {
|
|
||||||
return MAILPOET_VERSION;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace MailPoet\Config;
|
|
||||||
use MailPoet\Analytics\Reporter;
|
|
||||||
use MailPoet\Models\Setting;
|
|
||||||
|
|
||||||
if(!defined('ABSPATH')) exit;
|
|
||||||
|
|
||||||
class Analytics {
|
|
||||||
function __construct() {
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
add_action('admin_enqueue_scripts', array($this, 'setupAdminDependencies'));
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupAdminDependencies() {
|
|
||||||
if(Setting::getValue('send_analytics_now', false)) {
|
|
||||||
$analytics = new Reporter();
|
|
||||||
wp_enqueue_script(
|
|
||||||
'analytics',
|
|
||||||
Env::$assets_url . '/js/lib/analytics.js',
|
|
||||||
array(),
|
|
||||||
Env::$version
|
|
||||||
);
|
|
||||||
wp_localize_script(
|
|
||||||
'analytics',
|
|
||||||
'mailpoet_analytics_data',
|
|
||||||
$analytics->getData()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -88,7 +88,6 @@ class Initializer {
|
|||||||
$this->setupUpdater();
|
$this->setupUpdater();
|
||||||
$this->setupLocalizer();
|
$this->setupLocalizer();
|
||||||
$this->setupMenu();
|
$this->setupMenu();
|
||||||
$this->setupAnalytics();
|
|
||||||
$this->setupChangelog();
|
$this->setupChangelog();
|
||||||
$this->setupShortcodes();
|
$this->setupShortcodes();
|
||||||
$this->setupImages();
|
$this->setupImages();
|
||||||
@ -178,11 +177,6 @@ class Initializer {
|
|||||||
$menu->init();
|
$menu->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setupAnalytics() {
|
|
||||||
$analytics = new Analytics();
|
|
||||||
$analytics->init();
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupChangelog() {
|
function setupChangelog() {
|
||||||
$changelog = new Changelog();
|
$changelog = new Changelog();
|
||||||
$changelog->init();
|
$changelog->init();
|
||||||
|
@ -34,6 +34,7 @@ class Renderer {
|
|||||||
$this->setupFilters();
|
$this->setupFilters();
|
||||||
$this->setupHandlebars();
|
$this->setupHandlebars();
|
||||||
$this->setupHelpscout();
|
$this->setupHelpscout();
|
||||||
|
$this->setupAnalytics();
|
||||||
$this->setupGlobalVariables();
|
$this->setupGlobalVariables();
|
||||||
$this->setupSyntax();
|
$this->setupSyntax();
|
||||||
}
|
}
|
||||||
@ -58,6 +59,10 @@ class Renderer {
|
|||||||
$this->renderer->addExtension(new Twig\Helpscout());
|
$this->renderer->addExtension(new Twig\Helpscout());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupAnalytics() {
|
||||||
|
$this->renderer->addExtension(new Twig\Analytics());
|
||||||
|
}
|
||||||
|
|
||||||
function setupGlobalVariables() {
|
function setupGlobalVariables() {
|
||||||
$this->renderer->addExtension(new Twig\Assets(array(
|
$this->renderer->addExtension(new Twig\Assets(array(
|
||||||
'version' => Env::$version,
|
'version' => Env::$version,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Models;
|
namespace MailPoet\Models;
|
||||||
|
use Carbon\Carbon;
|
||||||
use MailPoet\Newsletter\Renderer\Renderer;
|
use MailPoet\Newsletter\Renderer\Renderer;
|
||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
use MailPoet\Util\Security;
|
use MailPoet\Util\Security;
|
||||||
@ -492,6 +493,37 @@ class Newsletter extends Model {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function getAnalytics() {
|
||||||
|
$welcome_newsletters_count = Newsletter::getPublished()
|
||||||
|
->filter('filterType', self::TYPE_WELCOME)
|
||||||
|
->filter('filterStatus', self::STATUS_ACTIVE)
|
||||||
|
->count();
|
||||||
|
|
||||||
|
$notifications_count = Newsletter::getPublished()
|
||||||
|
->filter('filterType', self::TYPE_NOTIFICATION)
|
||||||
|
->filter('filterStatus', self::STATUS_ACTIVE)
|
||||||
|
->count();
|
||||||
|
|
||||||
|
$sent_newsletters = static::table_alias('newsletters')
|
||||||
|
->where('newsletters.type', self::TYPE_STANDARD)
|
||||||
|
->where('newsletters.status', self::STATUS_SENT)
|
||||||
|
->join(
|
||||||
|
MP_SENDING_QUEUES_TABLE,
|
||||||
|
'queues.newsletter_id = newsletters.id',
|
||||||
|
'queues'
|
||||||
|
)
|
||||||
|
->where('queues.status', SendingQueue::STATUS_COMPLETED)
|
||||||
|
->whereGte('queues.processed_at', Carbon::now()->subMonths(3))
|
||||||
|
->count();
|
||||||
|
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'welcome_newsletters_count' => $welcome_newsletters_count,
|
||||||
|
'notifications_count' => $notifications_count,
|
||||||
|
'sent_newsletters' => $sent_newsletters,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static function search($orm, $search = '') {
|
static function search($orm, $search = '') {
|
||||||
if(strlen(trim($search)) > 0) {
|
if(strlen(trim($search)) > 0) {
|
||||||
$orm->whereLike('subject', '%' . $search . '%');
|
$orm->whereLike('subject', '%' . $search . '%');
|
||||||
|
30
lib/Twig/Analytics.php
Normal file
30
lib/Twig/Analytics.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Twig;
|
||||||
|
|
||||||
|
use MailPoet\Analytics\Reporter;
|
||||||
|
use MailPoet\Analytics\Analytics as AnalyticsGenerator;
|
||||||
|
|
||||||
|
if(!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
|
class Analytics extends \Twig_Extension {
|
||||||
|
|
||||||
|
public function getName() {
|
||||||
|
return 'analytics';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFunctions() {
|
||||||
|
$analytics = new AnalyticsGenerator(new Reporter());
|
||||||
|
return array(
|
||||||
|
new \Twig_SimpleFunction(
|
||||||
|
'get_analytics_data',
|
||||||
|
array($analytics, 'generateAnalytics'),
|
||||||
|
array('is_safe' => array('all'))
|
||||||
|
),
|
||||||
|
new \Twig_SimpleFunction(
|
||||||
|
'is_analytics_enabled',
|
||||||
|
array($analytics, 'isEnabled'),
|
||||||
|
array('is_safe' => array('all'))
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -56,6 +56,11 @@ class Functions extends \Twig_Extension {
|
|||||||
array($this, 'getWPDateFormat'),
|
array($this, 'getWPDateFormat'),
|
||||||
array('is_safe' => array('all'))
|
array('is_safe' => array('all'))
|
||||||
),
|
),
|
||||||
|
new \Twig_SimpleFunction(
|
||||||
|
'mailpoet_version',
|
||||||
|
array($this, 'getMailPoetVersion'),
|
||||||
|
array('is_safe' => array('all'))
|
||||||
|
),
|
||||||
new \Twig_SimpleFunction(
|
new \Twig_SimpleFunction(
|
||||||
'wp_time_format',
|
'wp_time_format',
|
||||||
array($this, 'getWPTimeFormat'),
|
array($this, 'getWPTimeFormat'),
|
||||||
@ -116,6 +121,10 @@ class Functions extends \Twig_Extension {
|
|||||||
'F j, Y';
|
'F j, Y';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getMailPoetVersion() {
|
||||||
|
return MAILPOET_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
function getWPTimeFormat() {
|
function getWPTimeFormat() {
|
||||||
return (get_option('time_format')) ?
|
return (get_option('time_format')) ?
|
||||||
get_option('time_format') :
|
get_option('time_format') :
|
||||||
|
104
tests/unit/Analytics/AnalyticsTest.php
Normal file
104
tests/unit/Analytics/AnalyticsTest.php
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Analytics;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Codeception\Util\Stub;
|
||||||
|
use MailPoet\Models\Setting;
|
||||||
|
|
||||||
|
class AnalyticsTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
protected $backupGlobals = false;
|
||||||
|
|
||||||
|
function testIsEnabledReturnsTrueIfSettingEnabled() {
|
||||||
|
|
||||||
|
Setting::setValue('analytics', array('enabled' => '1'));
|
||||||
|
|
||||||
|
$analytics = new Analytics(new Reporter());
|
||||||
|
expect($analytics->isEnabled())->true();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testIsEnabledReturnsFalseIfEmptySettings() {
|
||||||
|
|
||||||
|
Setting::setValue('analytics', array());
|
||||||
|
|
||||||
|
$analytics = new Analytics(new Reporter());
|
||||||
|
expect($analytics->isEnabled())->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testIsEnabledReturnsFalseIfNotEnabled() {
|
||||||
|
|
||||||
|
Setting::setValue('analytics', array('enabled' => ''));
|
||||||
|
|
||||||
|
$analytics = new Analytics(new Reporter());
|
||||||
|
expect($analytics->isEnabled())->false();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetDataIfSettingsIsDisabled() {
|
||||||
|
$reporter = Stub::makeEmpty(
|
||||||
|
'MailPoet\Analytics\Reporter',
|
||||||
|
array(
|
||||||
|
'getData' => Stub::never(),
|
||||||
|
),
|
||||||
|
$this
|
||||||
|
);
|
||||||
|
Setting::setValue('analytics', array('enabled' => ''));
|
||||||
|
$analytics = new Analytics($reporter);
|
||||||
|
|
||||||
|
expect($analytics->generateAnalytics())->null();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetDataIfSentRecently() {
|
||||||
|
$reporter = Stub::makeEmpty(
|
||||||
|
'MailPoet\Analytics\Reporter',
|
||||||
|
array(
|
||||||
|
'getData' => Stub::never(),
|
||||||
|
),
|
||||||
|
$this
|
||||||
|
);
|
||||||
|
Setting::setValue('analytics', array('enabled' => '1'));
|
||||||
|
Setting::setValue('analytics_last_sent', Carbon::now()->subHours(1));
|
||||||
|
$analytics = new Analytics($reporter);
|
||||||
|
|
||||||
|
expect($analytics->generateAnalytics())->null();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetDataIfEnabledButNeverSent() {
|
||||||
|
$data = array();
|
||||||
|
$reporter = Stub::makeEmpty(
|
||||||
|
'MailPoet\Analytics\Reporter',
|
||||||
|
array(
|
||||||
|
'getData' => Stub::once(function() use ($data){
|
||||||
|
return $data;
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
$this
|
||||||
|
);
|
||||||
|
Setting::setValue('analytics', array('enabled' => '1'));
|
||||||
|
Setting::setValue('analytics_last_sent', null);
|
||||||
|
|
||||||
|
$analytics = new Analytics($reporter);
|
||||||
|
|
||||||
|
expect($analytics->generateAnalytics())->equals($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetDataIfEnabledAndSentLongTimeAgo() {
|
||||||
|
$data = array();
|
||||||
|
$reporter = Stub::makeEmpty(
|
||||||
|
'MailPoet\Analytics\Reporter',
|
||||||
|
array(
|
||||||
|
'getData' => Stub::once(function() use ($data){
|
||||||
|
return $data;
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
$this
|
||||||
|
);
|
||||||
|
Setting::setValue('analytics', array('enabled' => '1'));
|
||||||
|
Setting::setValue('analytics_last_sent', Carbon::now()->subYear());
|
||||||
|
|
||||||
|
$analytics = new Analytics($reporter);
|
||||||
|
|
||||||
|
expect($analytics->generateAnalytics())->equals($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -44,6 +44,9 @@ jQuery('.toplevel_page_mailpoet-newsletters.menu-top-last')
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var mailpoet_date_format = "<%= wp_datetime_format()|escape('js') %>";
|
var mailpoet_date_format = "<%= wp_datetime_format()|escape('js') %>";
|
||||||
var mailpoet_time_format = "<%= wp_time_format()|escape('js') %>";
|
var mailpoet_time_format = "<%= wp_time_format()|escape('js') %>";
|
||||||
|
var mailpoet_version = "<%= mailpoet_version() %>";
|
||||||
|
var mailpoet_analytics_enabled = <%= is_analytics_enabled() | json_encode %>;
|
||||||
|
var mailpoet_analytics_data = <%= json_encode(get_analytics_data()) %>;
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- javascripts -->
|
<!-- javascripts -->
|
||||||
@ -66,6 +69,8 @@ jQuery('.toplevel_page_mailpoet-newsletters.menu-top-last')
|
|||||||
'admin.js'
|
'admin.js'
|
||||||
)%>
|
)%>
|
||||||
|
|
||||||
|
<%= javascript('lib/analytics.js') %>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
if(window['HS'] !== undefined) {
|
if(window['HS'] !== undefined) {
|
||||||
// HelpScout Beacon: Configuration
|
// HelpScout Beacon: Configuration
|
||||||
|
@ -135,3 +135,8 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<% endblock %>
|
<% endblock %>
|
||||||
|
<% block translations %>
|
||||||
|
<%= localize({
|
||||||
|
'reinstallConfirmation': __('Are you sure? All of your MailPoet data will be permanently erased (newsletters, statistics, subscribers, etc.).')
|
||||||
|
}) %>
|
||||||
|
<% endblock %>
|
@ -165,34 +165,3 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
jQuery(function($) {
|
|
||||||
$(function() {
|
|
||||||
$('#mailpoet_reinstall').on('click', function() {
|
|
||||||
if(confirm(
|
|
||||||
"<%= __('Are you sure? All of your MailPoet data will be permanently erased (newsletters, statistics, subscribers, etc.).') %>"
|
|
||||||
)) {
|
|
||||||
MailPoet.Modal.loading(true);
|
|
||||||
MailPoet.Ajax.post({
|
|
||||||
'api_version': window.mailpoet_api_version,
|
|
||||||
'endpoint': 'setup',
|
|
||||||
'action': 'reset'
|
|
||||||
}).always(function() {
|
|
||||||
MailPoet.Modal.loading(false);
|
|
||||||
}).done(function(response) {
|
|
||||||
window.location = "<%= admin_url('admin.php?page=mailpoet-newsletters') %>";
|
|
||||||
}).fail(function(response) {
|
|
||||||
if (response.errors.length > 0) {
|
|
||||||
MailPoet.Notice.error(
|
|
||||||
response.errors.map(function(error) { return error.message; }),
|
|
||||||
{ scroll: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
@ -47,4 +47,16 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function($) {
|
||||||
|
$(function() {
|
||||||
|
MailPoet.trackEvent(
|
||||||
|
'User has updated MailPoet',
|
||||||
|
{'MailPoet Free version': window.mailpoet_version}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
<% endblock %>
|
<% endblock %>
|
||||||
|
|
||||||
|
@ -124,7 +124,15 @@ jQuery(function($) {
|
|||||||
data: {
|
data: {
|
||||||
analytics: { enabled: (is_enabled)}
|
analytics: { enabled: (is_enabled)}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
|
if (is_enabled) {
|
||||||
|
MailPoet.forceTrackEvent(
|
||||||
|
'User has installed MailPoet',
|
||||||
|
{'MailPoet Free version': window.mailpoet_version}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -138,7 +138,8 @@ config.push(_.extend({}, baseConfig, {
|
|||||||
'notice',
|
'notice',
|
||||||
'num',
|
'num',
|
||||||
'jquery.serialize_object',
|
'jquery.serialize_object',
|
||||||
'parsleyjs'
|
'parsleyjs',
|
||||||
|
'analytics_event',
|
||||||
],
|
],
|
||||||
admin_vendor: [
|
admin_vendor: [
|
||||||
'react',
|
'react',
|
||||||
@ -156,6 +157,7 @@ config.push(_.extend({}, baseConfig, {
|
|||||||
'segments/segments.jsx',
|
'segments/segments.jsx',
|
||||||
'forms/forms.jsx',
|
'forms/forms.jsx',
|
||||||
'settings/tabs.js',
|
'settings/tabs.js',
|
||||||
|
'settings/reinstall_from_scratch.js',
|
||||||
'subscribers/importExport/import.js',
|
'subscribers/importExport/import.js',
|
||||||
'subscribers/importExport/export.js',
|
'subscribers/importExport/export.js',
|
||||||
'helpscout'
|
'helpscout'
|
||||||
|
Reference in New Issue
Block a user