diff --git a/assets/js/src/newsletters/sending_status.jsx b/assets/js/src/newsletters/sending_status.jsx index b8236233eb..216962439d 100644 --- a/assets/js/src/newsletters/sending_status.jsx +++ b/assets/js/src/newsletters/sending_status.jsx @@ -1,13 +1,32 @@ -import Hooks from 'wp-js-hooks'; import MailPoet from 'mailpoet'; import PropTypes from 'prop-types'; import classNames from 'classnames'; -import React, {Fragment} from 'react'; +import React, { Fragment } from 'react'; import { Link } from 'react-router-dom'; import Listing from 'listing/listing.jsx'; import { CronMixin, MailerMixin } from 'newsletters/listings/mixins.jsx'; -const SendingStatus = props => { +const columns = [ + { + name: 'subscriber_id', + label: MailPoet.I18n.t('subscriber'), + sortable: true, + }, + { + name: 'status', + label: MailPoet.I18n.t('sendingStatus'), + }, + { + name: 'failureReason', + label: MailPoet.I18n.t('failureReason'), + }, +]; + +const messages = { + onNoItemsFound: () => MailPoet.I18n.t('noSendingTaskFound'), +}; + +const SendingStatus = (props) => { const newsletterId = props.match.params.id; const [newsletterSubject, setNewsletterSubject] = React.useState(''); @@ -20,14 +39,14 @@ const SendingStatus = props => { id: newsletterId, }, }) - .done(res => setNewsletterSubject(res.data.subject)) - .fail((res) => { - setNewsletterSubject(''); - MailPoet.Notice.error( - res.errors.map(error => error.message), - { scroll: true } - ); - }); + .done(res => setNewsletterSubject(res.data.subject)) + .fail((res) => { + setNewsletterSubject(''); + MailPoet.Notice.error( + res.errors.map(error => error.message), + { scroll: true } + ); + }); }, [newsletterId]); return ( @@ -44,7 +63,7 @@ const SendingStatus = props => { endpoint="sending_task_subscribers" base_url="sending-status/:id" onRenderItem={item =>
} - getListingItemKey={item => item.taskId + '-' + item.subscriberId} + getListingItemKey={item => `${item.taskId}-${item.subscriberId}`} columns={columns} messages={messages} auto_refresh @@ -66,7 +85,7 @@ SendingStatus.propTypes = { }).isRequired, }; -const StatsLink = ({newsletterId, newsletterSubject}) => { +const StatsLink = ({ newsletterId, newsletterSubject }) => { if (!newsletterId || !newsletterSubject) return null; if (window.mailpoet_premium_active) { return

{ newsletterSubject }

; @@ -77,21 +96,27 @@ StatsLink.propTypes = { newsletterId: PropTypes.string, newsletterSubject: PropTypes.string, }; +StatsLink.defaultProps = { + newsletterId: null, + newsletterSubject: null, +}; -const ListingItem = ({error, failed, taskId, processed, email, subscriberId, lastName, firstName}) => { +const ListingItem = ({ + error, failed, taskId, processed, email, subscriberId, lastName, firstName, +}) => { const resend = () => { MailPoet.Ajax.post({ api_version: window.mailpoet_api_version, endpoint: 'sending_task_subscribers', action: 'resend', - data: {taskId, subscriberId}, + data: { taskId, subscriberId }, }) - .done(res => window.mailpoet_listing.forceUpdate()) - .fail((res) => MailPoet.Notice.error( - res.errors.map(error => error.message), - { scroll: true } - )); - } + .done(() => window.mailpoet_listing.forceUpdate()) + .fail(res => MailPoet.Notice.error( + res.errors.map(err => err.message), + { scroll: true } + )); + }; const rowClasses = classNames( 'manage-column', @@ -104,7 +129,7 @@ const ListingItem = ({error, failed, taskId, processed, email, subscriberId, las status = ( {MailPoet.I18n.t('failed')} -
+

- { firstName + ' ' + lastName } + { `${firstName} ${lastName}` }

@@ -152,25 +177,8 @@ ListingItem.propTypes = { processed: PropTypes.string.isRequired, subscriberId: PropTypes.string.isRequired, }; - -const columns = [ - { - name: 'subscriber_id', - label: MailPoet.I18n.t('subscriber'), - sortable: true, - }, - { - name: 'status', - label: MailPoet.I18n.t('sendingStatus'), - }, - { - name: 'failureReason', - label: MailPoet.I18n.t('failureReason'), - }, -]; - -const messages = { - onNoItemsFound: () => MailPoet.I18n.t('noSendingTaskFound') +ListingItem.defaultProps = { + error: '', }; export default SendingStatus; diff --git a/lib/API/JSON/v1/SendingTaskSubscribers.php b/lib/API/JSON/v1/SendingTaskSubscribers.php index 4ed284dc0e..5201c0e223 100644 --- a/lib/API/JSON/v1/SendingTaskSubscribers.php +++ b/lib/API/JSON/v1/SendingTaskSubscribers.php @@ -5,7 +5,6 @@ namespace MailPoet\API\JSON\v1; use MailPoet\Listing; use MailPoet\Cron\CronHelper; use MailPoet\Models\Newsletter; -use MailPoet\Models\SendingQueue; use MailPoet\Models\ScheduledTask; use MailPoet\Config\AccessControl; use MailPoet\API\JSON\Error as APIError; @@ -13,12 +12,13 @@ use MailPoet\Settings\SettingsController; use MailPoet\WP\Functions as WPFunctions; use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\API\JSON\Endpoint as APIEndpoint; +use MailPoet\Models\SendingQueue as SendingQueueModel; if (!defined('ABSPATH')) exit; class SendingTaskSubscribers extends APIEndpoint { public $permissions = [ - 'global' => AccessControl::PERMISSION_MANAGE_EMAILS + 'global' => AccessControl::PERMISSION_MANAGE_EMAILS, ]; /** @var Listing\Handler */ @@ -42,12 +42,12 @@ class SendingTaskSubscribers extends APIEndpoint { function listing($data = []) { $newsletter_id = !empty($data['params']['id']) ? (int)$data['params']['id'] : false; - $tasks_ids = SendingQueue::select('task_id') + $tasks_ids = SendingQueueModel::select('task_id') ->where('newsletter_id', $newsletter_id) ->findArray(); if (empty($tasks_ids)) { return $this->errorResponse([ - APIError::NOT_FOUND => __('This newsletter is not being sent to any subcriber yet.', 'mailpoet') + APIError::NOT_FOUND => __('This newsletter is not being sent to any subcriber yet.', 'mailpoet'), ]); } $data['params']['task_ids'] = array_map(function($item) { @@ -67,7 +67,7 @@ class SendingTaskSubscribers extends APIEndpoint { 'mta_log' => $this->settings->get('mta_log'), 'mta_method' => $this->settings->get('mta.method'), 'cron_accessible' => CronHelper::isDaemonAccessible(), - 'current_time' => $this->wp->currentTime('mysql') + 'current_time' => $this->wp->currentTime('mysql'), ]); } @@ -78,10 +78,10 @@ class SendingTaskSubscribers extends APIEndpoint { ->where('subscriber_id', $subscriber_id) ->findOne(); $task = ScheduledTask::findOne($task_id); - $sending_queue = SendingQueue::where('task_id', $task_id)->findOne(); - if (!$task || !$task_subscriber || !$sending_queue || $task_subscriber->failed !== '1') { + $sending_queue = SendingQueueModel::where('task_id', $task_id)->findOne(); + if (!$task || !$task_subscriber || !$sending_queue || $task_subscriber->failed != 1) { return $this->errorResponse([ - APIError::NOT_FOUND => __('Failed sending task not found!', 'mailpoet') + APIError::NOT_FOUND => __('Failed sending task not found!', 'mailpoet'), ]); } $newsletter = Newsletter::findOne($sending_queue->newsletter_id); diff --git a/lib/Models/Model.php b/lib/Models/Model.php index b22e95fab6..4a79a81373 100644 --- a/lib/Models/Model.php +++ b/lib/Models/Model.php @@ -44,6 +44,7 @@ if (!defined('ABSPATH')) exit; * @method $this rawJoin(string $table, string|array $constraint, string $table_alias, array $parameters = array()) * @method $this innerJoin(string $table, string|array $constraint, string $table_alias=null) * @method $this join(string $table, string|array $constraint, string $table_alias=null) + * @method static static join(string $table, string|array $constraint, string $table_alias=null) * @method $this leftOuterJoin(string $table, string|array $constraint, string $table_alias=null) * @method $this rightOuterJoin(string $table, string|array $constraint, string $table_alias=null) * @method $this fullOuterJoin(string $table, string|array $constraint, string $table_alias=null) diff --git a/lib/Models/ScheduledTaskSubscriber.php b/lib/Models/ScheduledTaskSubscriber.php index 60119a7fc1..881d542bf4 100644 --- a/lib/Models/ScheduledTaskSubscriber.php +++ b/lib/Models/ScheduledTaskSubscriber.php @@ -5,6 +5,13 @@ use MailPoet\WP\Functions as WPFunctions; if (!defined('ABSPATH')) exit; +/** + * @property int $task_id + * @property int $subscriber_id + * @property int $processed + * @property int $failed + * @property string $error + */ class ScheduledTaskSubscriber extends Model { const STATUS_UNPROCESSED = 0; const STATUS_PROCESSED = 1; @@ -70,7 +77,7 @@ class ScheduledTaskSubscriber extends Model { static function listingQuery($data) { $group = isset($data['group']) ? $data['group'] : 'all'; - return self::join(Subscriber::$_table, array("subscriber_id", "=", "subscribers.id"), "subscribers") + return self::join(Subscriber::$_table, ["subscriber_id", "=", "subscribers.id"], "subscribers") ->filter($group, $data['params']) ->select('error', 'error') ->select('failed', 'failed') @@ -92,17 +99,17 @@ class ScheduledTaskSubscriber extends Model { ], [ 'name' => self::SENDING_STATUS_SENT, - 'label' => WPFunctions::get()->x('Sent', 'status when a newsletter has been sent', 'mailpoet'), + 'label' => WPFunctions::get()->_x('Sent', 'status when a newsletter has been sent', 'mailpoet'), 'count' => self::filter(self::SENDING_STATUS_SENT, $params)->count(), ], [ 'name' => self::SENDING_STATUS_FAILED, - 'label' => WPFunctions::get()->x('Failed', 'status when the sending of a newsletter has failed', 'mailpoet'), + 'label' => WPFunctions::get()->_x('Failed', 'status when the sending of a newsletter has failed', 'mailpoet'), 'count' => self::filter(self::SENDING_STATUS_FAILED, $params)->count(), ], [ 'name' => self::SENDING_STATUS_UNPROCESSED, - 'label' => WPFunctions::get()->x('Unprocessed', 'status when the sending of a newsletter has not been processed', 'mailpoet'), + 'label' => WPFunctions::get()->_x('Unprocessed', 'status when the sending of a newsletter has not been processed', 'mailpoet'), 'count' => self::filter(self::SENDING_STATUS_UNPROCESSED, $params)->count(), ], ];