Fix WP Sync

- added missing translations in listings (responsive view)
This commit is contained in:
Jonathan Labreuille
2016-05-19 14:28:28 +02:00
parent 046127eeba
commit 6074aa927b
6 changed files with 67 additions and 63 deletions

View File

@@ -119,7 +119,6 @@ define([
} }
extractTimeStamp() { extractTimeStamp() {
const timeStamp = parseInt(this.props.item[this.props.field.name], 10); const timeStamp = parseInt(this.props.item[this.props.field.name], 10);
this.setState({ this.setState({
year: Moment.unix(timeStamp).year(), year: Moment.unix(timeStamp).year(),
// Moment returns the month as [0..11] // Moment returns the month as [0..11]

View File

@@ -106,7 +106,6 @@ define(
item[field.name] = this.state.item[field.name]; item[field.name] = this.state.item[field.name];
} }
}.bind(this)); }.bind(this));
// set id if specified // set id if specified
if(this.props.params.id !== undefined) { if(this.props.params.id !== undefined) {
item.id = this.props.params.id; item.id = this.props.params.id;

View File

@@ -253,7 +253,7 @@ define(
var statistics_column = var statistics_column =
(!mailpoet_settings.tracking || !mailpoet_settings.tracking.enabled) ? (!mailpoet_settings.tracking || !mailpoet_settings.tracking.enabled) ?
false : false :
<td className="column {statistics_class}" data-colname="Statistics"> <td className="column {statistics_class}" data-colname={ MailPoet.I18n.t('statistics') }>
{ this.renderStatistics(newsletter) } { this.renderStatistics(newsletter) }
</td>; </td>;
@@ -265,17 +265,17 @@ define(
</strong> </strong>
{ actions } { actions }
</td> </td>
<td className="column" data-colname="Status"> <td className="column" data-colname={ MailPoet.I18n.t('status') }>
{ this.renderStatus(newsletter) } { this.renderStatus(newsletter) }
</td> </td>
<td className="column" data-colname="Lists"> <td className="column" data-colname={ MailPoet.I18n.t('lists') }>
{ segments } { segments }
</td> </td>
{ statistics_column } { statistics_column }
<td className="column-date" data-colname="Subscribed on"> <td className="column-date" data-colname={ MailPoet.I18n.t('createdOn') }>
<abbr>{ MailPoet.Date.format(newsletter.created_at) }</abbr> <abbr>{ MailPoet.Date.format(newsletter.created_at) }</abbr>
</td> </td>
<td className="column-date" data-colname="Last modified on"> <td className="column-date" data-colname={ MailPoet.I18n.t('lastModifiedOn') }>
<abbr>{ MailPoet.Date.format(newsletter.updated_at) }</abbr> <abbr>{ MailPoet.Date.format(newsletter.updated_at) }</abbr>
</td> </td>
</div> </div>

View File

@@ -99,7 +99,6 @@ const bulk_actions = [
const item_actions = [ const item_actions = [
{ {
name: 'edit', name: 'edit',
label: MailPoet.I18n.t('edit'),
link: function(item) { link: function(item) {
return ( return (
<Link to={ `/edit/${item.id}` }>{MailPoet.I18n.t('edit')}</Link> <Link to={ `/edit/${item.id}` }>{MailPoet.I18n.t('edit')}</Link>
@@ -111,7 +110,7 @@ const item_actions = [
}, },
{ {
name: 'duplicate_segment', name: 'duplicate_segment',
label: 'Duplicate', label: MailPoet.I18n.t('duplicate'),
onClick: function(item, refresh) { onClick: function(item, refresh) {
return MailPoet.Ajax.post({ return MailPoet.Ajax.post({
endpoint: 'segments', endpoint: 'segments',
@@ -130,13 +129,13 @@ const item_actions = [
}, },
{ {
name: 'read_more', name: 'read_more',
label: MailPoet.I18n.t('readMore'), link: function(item) {
className: 'read_more', return (
onClick: function(item, refresh) { <a
// TODO: add URL with KB article href="https://www.mailpoet.com/#TODO"
var url = 'http://example.com', target="_blank"
link = window.open(url, '_blank'); >{MailPoet.I18n.t('readMore')}</a>
win.focus(); );
}, },
display: function(segment) { display: function(segment) {
return (segment.type === 'wp_users'); return (segment.type === 'wp_users');
@@ -145,7 +144,6 @@ const item_actions = [
{ {
name: 'synchronize_segment', name: 'synchronize_segment',
label: MailPoet.I18n.t('forceSync'), label: MailPoet.I18n.t('forceSync'),
className: 'update',
onClick: function(item, refresh) { onClick: function(item, refresh) {
MailPoet.Modal.loading(true); MailPoet.Modal.loading(true);
MailPoet.Ajax.post({ MailPoet.Ajax.post({
@@ -187,32 +185,42 @@ const SegmentList = React.createClass({
'manage-column', 'manage-column',
'column-primary', 'column-primary',
'has-row-actions' 'has-row-actions'
), );
subscribed = segment.subscribers_count.subscribed || 0,
unconfirmed = segment.subscribers_count.unconfirmed || 0, const subscribed = ~~(segment.subscribers_count.subscribed || 0);
unsubscribed = segment.subscribers_count.unsubscribed || 0; const unconfirmed = ~~(segment.subscribers_count.unconfirmed || 0);
const unsubscribed = ~~(segment.subscribers_count.unsubscribed || 0);
let segment_name = (
<Link to={ `/edit/${segment.id}` }>{ segment.name }</Link>
);
// the WP users segment is not editable so just display its name
if (segment.type === 'wp_users') {
segment_name = segment.name;
}
return ( return (
<div> <div>
<td className={ rowClasses }> <td className={ rowClasses }>
<strong> <strong>
<a>{ segment.name }</a> { segment_name }
</strong> </strong>
{ actions } { actions }
</td> </td>
<td className="column-date" data-colname="Description"> <td className="column-date" data-colname={ MailPoet.I18n.t('description') }>
<abbr>{ segment.description }</abbr> <abbr>{ segment.description }</abbr>
</td> </td>
<td className="column-date" data-colname="Subscribed"> <td className="column-date" data-colname={ MailPoet.I18n.t('subscribed') }>
<abbr>{ parseInt(subscribed).toLocaleString() }</abbr> <abbr>{ subscribed }</abbr>
</td> </td>
<td className="column-date" data-colname="Unconfirmed"> <td className="column-date" data-colname={ MailPoet.I18n.t('unconfirmed') }>
<abbr>{ parseInt(unconfirmed).toLocaleString() }</abbr> <abbr>{ unconfirmed }</abbr>
</td> </td>
<td className="column-date" data-colname="Unsubscribed"> <td className="column-date" data-colname={ MailPoet.I18n.t('unsubscribed') }>
<abbr>{ parseInt(unsubscribed).toLocaleString() }</abbr> <abbr>{ unsubscribed }</abbr>
</td> </td>
<td className="column-date" data-colname="Created on"> <td className="column-date" data-colname={ MailPoet.I18n.t('createdOn') }>
<abbr>{ MailPoet.Date.format(segment.created_at) }</abbr> <abbr>{ MailPoet.Date.format(segment.created_at) }</abbr>
</td> </td>
</div> </div>

View File

@@ -2,15 +2,20 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use \MailPoet\Models\Subscriber; use \MailPoet\Models\Subscriber;
use \MailPoet\Models\Segment; use \MailPoet\Models\Segment;
use \MailPoet\Models\SubscriberSegment;
use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Scheduler\Scheduler;
class WP { class WP {
static function synchronizeUser($wp_user_id, $old_wp_user_data = false) { static function synchronizeUser($wp_user_id, $old_wp_user_data = false) {
$wp_user = \get_userdata($wp_user_id); $wp_user = \get_userdata($wp_user_id);
$segment = Segment::getWPUsers(); $wp_users_segment = Segment::getWPUsers();
if($wp_user === false or $segment === false) return;
if($wp_user === false or $wp_users_segment === false) return;
$subscriber = Subscriber::where('wp_user_id', $wp_user->ID) $subscriber = Subscriber::where('wp_user_id', $wp_user->ID)
->findOne(); ->findOne();
$schedule_welcome_newsletter = false;
switch(current_filter()) { switch(current_filter()) {
case 'delete_user': case 'delete_user':
case 'deleted_user': case 'deleted_user':
@@ -36,18 +41,25 @@ class WP {
'email' => $wp_user->user_email, 'email' => $wp_user->user_email,
'first_name' => $first_name, 'first_name' => $first_name,
'last_name' => $last_name, 'last_name' => $last_name,
'status' => 'subscribed' 'status' => Subscriber::STATUS_SUBSCRIBED,
); );
if($subscriber !== false) { if($subscriber !== false) {
$data['id'] = $subscriber->id(); $data['id'] = $subscriber->id();
$data['deleted_at'] = null; // remove the user from the trash
unset($data['status']); // don't override status for existing users
} }
$subscriber = Subscriber::createOrUpdate($data); $subscriber = Subscriber::createOrUpdate($data);
if($subscriber->getErrors() === false && $subscriber->id > 0) { if($subscriber->getErrors() === false && $subscriber->id > 0) {
if($segment !== false) { // add subscriber to the WP Users segment
$segment->addSubscriber($subscriber->id); SubscriberSegment::addSubscriptions(
} $subscriber,
if(isset($schedule_welcome_newsletter)) { array($wp_users_segment->id)
);
// welcome email
if($schedule_welcome_newsletter === true) {
Scheduler::scheduleWPUserWelcomeNotification( Scheduler::scheduleWPUserWelcomeNotification(
$subscriber->id, $subscriber->id,
(array) $wp_user, (array) $wp_user,
@@ -61,34 +73,19 @@ class WP {
static function synchronizeUsers() { static function synchronizeUsers() {
// get wordpress users list // get wordpress users list
$segment = Segment::getWPUsers(); $wp_users_segment = Segment::getWPUsers();
// count WP users // fetch all wp users id
$users_count = \count_users(); $wp_users = \get_users(array(
$linked_subscribers_count = $segment->subscribers()->count(); 'count_total' => false,
'fields' => 'ID'
));
if($users_count['total_users'] !== $linked_subscribers_count) { // update data for each wp user
$linked_subscribers = Subscriber::select('wp_user_id') foreach($wp_users as $wp_user_id) {
->whereNotNull('wp_user_id') static::synchronizeUser($wp_user_id);
->findArray();
$exclude_ids = array();
if(!empty($linked_subscribers)) {
$exclude_ids = array_map(function($subscriber) {
return $subscriber['wp_user_id'];
}, $linked_subscribers);
}
$users = \get_users(array(
'count_total' => false,
'fields' => 'ID',
'exclude' => $exclude_ids
));
foreach($users as $user) {
static::synchronizeUser($user);
}
} }
return true; return true;
} }
} }

View File

@@ -33,12 +33,13 @@
'multipleSegmentsDeleted': __('%$1d segments were permanently deleted.'), 'multipleSegmentsDeleted': __('%$1d segments were permanently deleted.'),
'oneSegmentRestored': __('1 segment has been restored from the trash.'), 'oneSegmentRestored': __('1 segment has been restored from the trash.'),
'multipleSegmentsRestored': __('%$1d segments have been restored from the trash.'), 'multipleSegmentsRestored': __('%$1d segments have been restored from the trash.'),
'duplicate': __('Duplicate'),
'listDuplicated': __('List "%$1s" has been duplicated.'), 'listDuplicated': __('List "%$1s" has been duplicated.'),
'update': __('Update'), 'update': __('Update'),
'forceSync': __('Force Sync'), 'forceSync': __('Force Sync'),
'readMore': __('Read More'), 'readMore': __('Read More'),
'listSynchronized': __('List "%$1s" has been synchronized.'), 'listSynchronized': __('List "%$1s" has been synchronized.'),
'viewSubscribers': __('View subscribers'), 'viewSubscribers': __('View Subscribers'),
'new': __('New'), 'new': __('New'),
'edit': __('Edit'), 'edit': __('Edit'),
'trash': __('Trash'), 'trash': __('Trash'),