Display subscribers score on the listings page
[MAILPOET-3525]
This commit is contained in:
@ -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 />
|
||||||
|
18
assets/js/src/subscribers/listings_engagement_score.tsx
Normal file
18
assets/js/src/subscribers/listings_engagement_score.tsx
Normal 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>
|
||||||
|
);
|
@ -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(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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.'),
|
||||||
|
Reference in New Issue
Block a user