From a2c1b4f8bc5b5ccd4549896c381700f6afb58ae6 Mon Sep 17 00:00:00 2001 From: Pavel Dohnal Date: Tue, 20 Apr 2021 15:39:29 +0200 Subject: [PATCH] Display subscribers score on the listings page [MAILPOET-3525] --- assets/js/src/subscribers/list.jsx | 14 +++++++++++++- .../subscribers/listings_engagement_score.tsx | 18 ++++++++++++++++++ .../SubscribersResponseBuilder.php | 1 + lib/AdminPages/Pages/Subscribers.php | 7 +++++++ .../SubscriberListingRepository.php | 2 +- views/subscribers/subscribers.html | 2 ++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 assets/js/src/subscribers/listings_engagement_score.tsx diff --git a/assets/js/src/subscribers/list.jsx b/assets/js/src/subscribers/list.jsx index 0eecf39e85..220f938c07 100644 --- a/assets/js/src/subscribers/list.jsx +++ b/assets/js/src/subscribers/list.jsx @@ -15,6 +15,9 @@ import SubscribersLimitNotice from 'notices/subscribers_limit_notice.jsx'; import InvalidMssKeyNotice from 'notices/invalid_mss_key_notice'; import SubscribersInPlan from '../common/subscribers_in_plan'; import SubscribersHeading from './heading'; +import { ListingsEngagementScore } from './listings_engagement_score'; + +const mailpoetTrackingEnabled = (!!(window.mailpoet_tracking_enabled)); const columns = [ { @@ -31,7 +34,11 @@ const columns = [ name: 'segments', label: MailPoet.I18n.t('lists'), }, - + { + name: 'statistics', + label: MailPoet.I18n.t('statisticsColumn'), + display: mailpoetTrackingEnabled, + }, { name: 'created_at', label: MailPoet.I18n.t('subscribedOn'), @@ -412,6 +419,11 @@ const SubscriberList = ({ match }) => { + { (mailpoetTrackingEnabled === true) ? ( + + + + ) : null } { MailPoet.Date.short(subscriber.created_at) }
diff --git a/assets/js/src/subscribers/listings_engagement_score.tsx b/assets/js/src/subscribers/listings_engagement_score.tsx new file mode 100644 index 0000000000..8b9b9b4888 --- /dev/null +++ b/assets/js/src/subscribers/listings_engagement_score.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +interface Props { + subscriber: { + engagement_score?: number; + }; +} + +export const ListingsEngagementScore: React.FunctionComponent = ({ subscriber }) => ( +
+ {subscriber.engagement_score != null && ( +
+ {subscriber.engagement_score} + % +
+ )} +
+); diff --git a/lib/API/JSON/ResponseBuilders/SubscribersResponseBuilder.php b/lib/API/JSON/ResponseBuilders/SubscribersResponseBuilder.php index 7624f8e92f..e16130d344 100644 --- a/lib/API/JSON/ResponseBuilders/SubscribersResponseBuilder.php +++ b/lib/API/JSON/ResponseBuilders/SubscribersResponseBuilder.php @@ -65,6 +65,7 @@ class SubscribersResponseBuilder { 'wp_user_id' => $subscriber->getWpUserId(), 'is_woocommerce_user' => $subscriber->getIsWoocommerceUser(), 'created_at' => $subscriber->getCreatedAt()->format(self::DATE_FORMAT), + 'engagement_score' => $subscriber->getEngagementScore(), ]; } diff --git a/lib/AdminPages/Pages/Subscribers.php b/lib/AdminPages/Pages/Subscribers.php index d6012ee478..ebb6734bc3 100644 --- a/lib/AdminPages/Pages/Subscribers.php +++ b/lib/AdminPages/Pages/Subscribers.php @@ -9,6 +9,7 @@ use MailPoet\Listing\PageLimit; use MailPoet\Models\CustomField; use MailPoet\Segments\SegmentsSimpleListRepository; use MailPoet\Services\Bridge; +use MailPoet\Settings\SettingsController; use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoet\Util\License\License; @@ -36,6 +37,9 @@ class Subscribers { /** @var SegmentsSimpleListRepository */ private $segmentsListRepository; + /** @var SettingsController */ + private $settings; + public function __construct( PageRenderer $pageRenderer, PageLimit $listingPageLimit, @@ -43,6 +47,7 @@ class Subscribers { WPFunctions $wp, ServicesChecker $servicesChecker, Block\Date $dateBlock, + SettingsController $settings, SegmentsSimpleListRepository $segmentsListRepository ) { $this->pageRenderer = $pageRenderer; @@ -52,6 +57,7 @@ class Subscribers { $this->dateBlock = $dateBlock; $this->servicesChecker = $servicesChecker; $this->segmentsListRepository = $segmentsListRepository; + $this->settings = $settings; } public function render() { @@ -90,6 +96,7 @@ class Subscribers { $data['subscriber_count'] = $this->subscribersFeature->getSubscribersCount(); $data['has_premium_support'] = $this->subscribersFeature->hasPremiumSupport(); $data['link_premium'] = $this->wp->getSiteUrl(null, '/wp-admin/admin.php?page=mailpoet-premium'); + $data['tracking_enabled'] = $this->settings->get('tracking.enabled'); $this->pageRenderer->displayPage('subscribers/subscribers.html', $data); } diff --git a/lib/Subscribers/SubscriberListingRepository.php b/lib/Subscribers/SubscriberListingRepository.php index b34491fd5d..5a6d3a981c 100644 --- a/lib/Subscribers/SubscriberListingRepository.php +++ b/lib/Subscribers/SubscriberListingRepository.php @@ -94,7 +94,7 @@ class SubscriberListingRepository extends ListingRepository { } protected function applySelectClause(QueryBuilder $queryBuilder) { - $queryBuilder->select("PARTIAL s.{id,email,firstName,lastName,status,createdAt,countConfirmations,wpUserId,isWoocommerceUser}"); + $queryBuilder->select("PARTIAL s.{id,email,firstName,lastName,status,createdAt,countConfirmations,wpUserId,isWoocommerceUser,engagementScore}"); } protected function applyFromClause(QueryBuilder $queryBuilder) { diff --git a/views/subscribers/subscribers.html b/views/subscribers/subscribers.html index 5e63b0a546..ba0b5ccc08 100644 --- a/views/subscribers/subscribers.html +++ b/views/subscribers/subscribers.html @@ -11,6 +11,7 @@ var mailpoet_date_formats = <%= json_encode(date_formats) %>; var mailpoet_premium_active = <%= json_encode(premium_plugin_active) %>; var mailpoet_max_confirmation_emails = <%= max_confirmation_emails %>; + var mailpoet_tracking_enabled = <%= json_encode(tracking_enabled) %>; var mailpoet_beacon_articles = [ '57ce07ffc6979108399a044b', '57ce079f903360649f6e56fc', @@ -91,6 +92,7 @@ 'subscriber': __('Subscriber'), 'status': __('Status'), 'lists': __('Lists'), + 'statisticsColumn': __('Subscriber score'), 'subscribedOn': __('Subscribed on'), 'lastModifiedOn': __('Last modified on'), 'oneSubscriberTrashed': __('1 subscriber was moved to the trash.'),