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 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 }) => {
|
||||
<td className="column" data-colname={MailPoet.I18n.t('lists')}>
|
||||
<Tags segments={subscribedSegments} dimension="large" />
|
||||
</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')}>
|
||||
{ MailPoet.Date.short(subscriber.created_at) }
|
||||
<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(),
|
||||
'is_woocommerce_user' => $subscriber->getIsWoocommerceUser(),
|
||||
'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\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);
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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.'),
|
||||
|
Reference in New Issue
Block a user