Display subscribers score on the listings page

[MAILPOET-3525]
This commit is contained in:
Pavel Dohnal
2021-04-20 15:39:29 +02:00
committed by Veljko V
parent c1f7fb6cd4
commit a2c1b4f8bc
6 changed files with 42 additions and 2 deletions

View File

@ -15,6 +15,9 @@ import SubscribersLimitNotice from 'notices/subscribers_limit_notice.jsx';
import InvalidMssKeyNotice from 'notices/invalid_mss_key_notice'; import InvalidMssKeyNotice from 'notices/invalid_mss_key_notice';
import SubscribersInPlan from '../common/subscribers_in_plan'; import SubscribersInPlan from '../common/subscribers_in_plan';
import SubscribersHeading from './heading'; import SubscribersHeading from './heading';
import { ListingsEngagementScore } from './listings_engagement_score';
const mailpoetTrackingEnabled = (!!(window.mailpoet_tracking_enabled));
const columns = [ const columns = [
{ {
@ -31,7 +34,11 @@ const columns = [
name: 'segments', name: 'segments',
label: MailPoet.I18n.t('lists'), label: MailPoet.I18n.t('lists'),
}, },
{
name: 'statistics',
label: MailPoet.I18n.t('statisticsColumn'),
display: mailpoetTrackingEnabled,
},
{ {
name: 'created_at', name: 'created_at',
label: MailPoet.I18n.t('subscribedOn'), label: MailPoet.I18n.t('subscribedOn'),
@ -412,6 +419,11 @@ const SubscriberList = ({ match }) => {
<td className="column" data-colname={MailPoet.I18n.t('lists')}> <td className="column" data-colname={MailPoet.I18n.t('lists')}>
<Tags segments={subscribedSegments} dimension="large" /> <Tags segments={subscribedSegments} dimension="large" />
</td> </td>
{ (mailpoetTrackingEnabled === true) ? (
<td className="column mailpoet-listing-stats-column" data-colname={MailPoet.I18n.t('statisticsColumn')}>
<ListingsEngagementScore subscriber={subscriber} />
</td>
) : null }
<td className="column-date mailpoet-hide-on-mobile" data-colname={MailPoet.I18n.t('subscribedOn')}> <td className="column-date mailpoet-hide-on-mobile" data-colname={MailPoet.I18n.t('subscribedOn')}>
{ MailPoet.Date.short(subscriber.created_at) } { MailPoet.Date.short(subscriber.created_at) }
<br /> <br />

View File

@ -0,0 +1,18 @@
import React from 'react';
interface Props {
subscriber: {
engagement_score?: number;
};
}
export const ListingsEngagementScore: React.FunctionComponent<Props> = ({ subscriber }) => (
<div className="mailpoet-listing-stats-opened-clicked">
{subscriber.engagement_score != null && (
<div className="mailpoet-listing-stats-percentages">
{subscriber.engagement_score}
%
</div>
)}
</div>
);

View File

@ -65,6 +65,7 @@ class SubscribersResponseBuilder {
'wp_user_id' => $subscriber->getWpUserId(), 'wp_user_id' => $subscriber->getWpUserId(),
'is_woocommerce_user' => $subscriber->getIsWoocommerceUser(), 'is_woocommerce_user' => $subscriber->getIsWoocommerceUser(),
'created_at' => $subscriber->getCreatedAt()->format(self::DATE_FORMAT), 'created_at' => $subscriber->getCreatedAt()->format(self::DATE_FORMAT),
'engagement_score' => $subscriber->getEngagementScore(),
]; ];
} }

View File

@ -9,6 +9,7 @@ use MailPoet\Listing\PageLimit;
use MailPoet\Models\CustomField; use MailPoet\Models\CustomField;
use MailPoet\Segments\SegmentsSimpleListRepository; use MailPoet\Segments\SegmentsSimpleListRepository;
use MailPoet\Services\Bridge; use MailPoet\Services\Bridge;
use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature; use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
use MailPoet\Util\License\License; use MailPoet\Util\License\License;
@ -36,6 +37,9 @@ class Subscribers {
/** @var SegmentsSimpleListRepository */ /** @var SegmentsSimpleListRepository */
private $segmentsListRepository; private $segmentsListRepository;
/** @var SettingsController */
private $settings;
public function __construct( public function __construct(
PageRenderer $pageRenderer, PageRenderer $pageRenderer,
PageLimit $listingPageLimit, PageLimit $listingPageLimit,
@ -43,6 +47,7 @@ class Subscribers {
WPFunctions $wp, WPFunctions $wp,
ServicesChecker $servicesChecker, ServicesChecker $servicesChecker,
Block\Date $dateBlock, Block\Date $dateBlock,
SettingsController $settings,
SegmentsSimpleListRepository $segmentsListRepository SegmentsSimpleListRepository $segmentsListRepository
) { ) {
$this->pageRenderer = $pageRenderer; $this->pageRenderer = $pageRenderer;
@ -52,6 +57,7 @@ class Subscribers {
$this->dateBlock = $dateBlock; $this->dateBlock = $dateBlock;
$this->servicesChecker = $servicesChecker; $this->servicesChecker = $servicesChecker;
$this->segmentsListRepository = $segmentsListRepository; $this->segmentsListRepository = $segmentsListRepository;
$this->settings = $settings;
} }
public function render() { public function render() {
@ -90,6 +96,7 @@ class Subscribers {
$data['subscriber_count'] = $this->subscribersFeature->getSubscribersCount(); $data['subscriber_count'] = $this->subscribersFeature->getSubscribersCount();
$data['has_premium_support'] = $this->subscribersFeature->hasPremiumSupport(); $data['has_premium_support'] = $this->subscribersFeature->hasPremiumSupport();
$data['link_premium'] = $this->wp->getSiteUrl(null, '/wp-admin/admin.php?page=mailpoet-premium'); $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); $this->pageRenderer->displayPage('subscribers/subscribers.html', $data);
} }

View File

@ -94,7 +94,7 @@ class SubscriberListingRepository extends ListingRepository {
} }
protected function applySelectClause(QueryBuilder $queryBuilder) { 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) { protected function applyFromClause(QueryBuilder $queryBuilder) {

View File

@ -11,6 +11,7 @@
var mailpoet_date_formats = <%= json_encode(date_formats) %>; var mailpoet_date_formats = <%= json_encode(date_formats) %>;
var mailpoet_premium_active = <%= json_encode(premium_plugin_active) %>; var mailpoet_premium_active = <%= json_encode(premium_plugin_active) %>;
var mailpoet_max_confirmation_emails = <%= max_confirmation_emails %>; var mailpoet_max_confirmation_emails = <%= max_confirmation_emails %>;
var mailpoet_tracking_enabled = <%= json_encode(tracking_enabled) %>;
var mailpoet_beacon_articles = [ var mailpoet_beacon_articles = [
'57ce07ffc6979108399a044b', '57ce07ffc6979108399a044b',
'57ce079f903360649f6e56fc', '57ce079f903360649f6e56fc',
@ -91,6 +92,7 @@
'subscriber': __('Subscriber'), 'subscriber': __('Subscriber'),
'status': __('Status'), 'status': __('Status'),
'lists': __('Lists'), 'lists': __('Lists'),
'statisticsColumn': __('Subscriber score'),
'subscribedOn': __('Subscribed on'), 'subscribedOn': __('Subscribed on'),
'lastModifiedOn': __('Last modified on'), 'lastModifiedOn': __('Last modified on'),
'oneSubscriberTrashed': __('1 subscriber was moved to the trash.'), 'oneSubscriberTrashed': __('1 subscriber was moved to the trash.'),