Refactor renderQueueStatus to be a component
This commit is contained in:
committed by
M. Shull
parent
ca1dc6fe59
commit
d9857731ea
@@ -3,163 +3,12 @@ import ReactDOM from 'react-dom';
|
|||||||
import ReactStringReplace from 'react-string-replace';
|
import ReactStringReplace from 'react-string-replace';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import MailPoet from 'mailpoet';
|
import MailPoet from 'mailpoet';
|
||||||
import classNames from 'classnames';
|
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import jQuery from 'jquery';
|
import jQuery from 'jquery';
|
||||||
import _ from 'underscore';
|
|
||||||
import Hooks from 'wp-js-hooks';
|
import Hooks from 'wp-js-hooks';
|
||||||
import StatsBadge from 'newsletters/badges/stats.jsx';
|
import StatsBadge from 'newsletters/badges/stats.jsx';
|
||||||
import HelpTooltip from 'help-tooltip.jsx';
|
import HelpTooltip from 'help-tooltip.jsx';
|
||||||
|
|
||||||
const pauseSending = (newsletter) => {
|
|
||||||
MailPoet.Ajax.post({
|
|
||||||
api_version: window.mailpoet_api_version,
|
|
||||||
endpoint: 'sendingQueue',
|
|
||||||
action: 'pause',
|
|
||||||
data: {
|
|
||||||
newsletter_id: newsletter.id,
|
|
||||||
},
|
|
||||||
}).done(() => {
|
|
||||||
jQuery(`#resume_${newsletter.id}`).show();
|
|
||||||
jQuery(`#pause_${newsletter.id}`).hide();
|
|
||||||
}).fail((response) => {
|
|
||||||
if (response.errors.length > 0) {
|
|
||||||
MailPoet.Notice.error(
|
|
||||||
response.errors.map(error => error.message),
|
|
||||||
{ scroll: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const resumeSending = (newsletter) => {
|
|
||||||
MailPoet.Ajax.post({
|
|
||||||
api_version: window.mailpoet_api_version,
|
|
||||||
endpoint: 'sendingQueue',
|
|
||||||
action: 'resume',
|
|
||||||
data: {
|
|
||||||
newsletter_id: newsletter.id,
|
|
||||||
},
|
|
||||||
}).done(() => {
|
|
||||||
jQuery(`#pause_${newsletter.id}`).show();
|
|
||||||
jQuery(`#resume_${newsletter.id}`).hide();
|
|
||||||
}).fail((response) => {
|
|
||||||
if (response.errors.length > 0) {
|
|
||||||
MailPoet.Notice.error(
|
|
||||||
response.errors.map(error => error.message),
|
|
||||||
{ scroll: true }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export const renderQueueStatus = (newsletter, mailerLog) => {
|
|
||||||
if (!newsletter.queue) {
|
|
||||||
return (
|
|
||||||
<span>{MailPoet.I18n.t('notSentYet')}</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (mailerLog.status === 'paused' && newsletter.queue.status !== 'completed') {
|
|
||||||
return (
|
|
||||||
<span>{MailPoet.I18n.t('paused')}</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (newsletter.queue.status === 'scheduled') {
|
|
||||||
return (
|
|
||||||
<span>
|
|
||||||
{ MailPoet.I18n.t('scheduledFor') }
|
|
||||||
{' '}
|
|
||||||
{ MailPoet.Date.format(newsletter.queue.scheduled_at) }
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const progressClasses = classNames(
|
|
||||||
'mailpoet_progress',
|
|
||||||
{ mailpoet_progress_complete: newsletter.queue.status === 'completed' }
|
|
||||||
);
|
|
||||||
|
|
||||||
// calculate percentage done
|
|
||||||
let percentage = Math.round(
|
|
||||||
(newsletter.queue.count_processed * 100) / (newsletter.queue.count_total)
|
|
||||||
);
|
|
||||||
|
|
||||||
let label;
|
|
||||||
|
|
||||||
if (newsletter.queue.status === 'completed') {
|
|
||||||
label = (
|
|
||||||
<Link to={`/sending-status/${newsletter.id}`} data-automation-id={`sending_status_${newsletter.id}`}>
|
|
||||||
<span>
|
|
||||||
{
|
|
||||||
MailPoet.I18n.t('newsletterQueueCompleted')
|
|
||||||
.replace('%$1d', parseInt(newsletter.queue.count_processed, 10).toLocaleString())
|
|
||||||
.replace('%$2d', parseInt(newsletter.queue.count_total, 10).toLocaleString())
|
|
||||||
}
|
|
||||||
</span>
|
|
||||||
</Link>
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
const resumeSendingClick = _.partial(resumeSending, newsletter);
|
|
||||||
const pauseSendingClick = _.partial(pauseSending, newsletter);
|
|
||||||
label = (
|
|
||||||
<span>
|
|
||||||
{ parseInt(newsletter.queue.count_processed, 10).toLocaleString() }
|
|
||||||
/
|
|
||||||
{ parseInt(newsletter.queue.count_total, 10).toLocaleString() }
|
|
||||||
|
|
||||||
<a
|
|
||||||
id={`resume_${newsletter.id}`}
|
|
||||||
className="button"
|
|
||||||
style={{
|
|
||||||
display: (newsletter.queue.status === 'paused')
|
|
||||||
? 'inline-block' : 'none',
|
|
||||||
}}
|
|
||||||
href="javascript:;"
|
|
||||||
onClick={resumeSendingClick}
|
|
||||||
>
|
|
||||||
{MailPoet.I18n.t('resume')}
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
id={`pause_${newsletter.id}`}
|
|
||||||
className="button mailpoet_pause"
|
|
||||||
style={{
|
|
||||||
display: (newsletter.queue.status === null)
|
|
||||||
? 'inline-block' : 'none',
|
|
||||||
}}
|
|
||||||
href="javascript:;"
|
|
||||||
onClick={pauseSendingClick}
|
|
||||||
>
|
|
||||||
{MailPoet.I18n.t('pause')}
|
|
||||||
</a>
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let progressBarWidth = 0;
|
|
||||||
if (Number.isFinite(percentage)) {
|
|
||||||
progressBarWidth = percentage;
|
|
||||||
percentage += '%';
|
|
||||||
} else {
|
|
||||||
percentage = MailPoet.I18n.t('noSubscribers');
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div className={progressClasses}>
|
|
||||||
<span
|
|
||||||
className="mailpoet_progress_bar"
|
|
||||||
style={{ width: `${progressBarWidth}%` }}
|
|
||||||
/>
|
|
||||||
<span className="mailpoet_progress_label">
|
|
||||||
{ percentage }
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<p style={{ textAlign: 'center' }}>
|
|
||||||
{ label }
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
function trackStatsCTAClicked() {
|
function trackStatsCTAClicked() {
|
||||||
MailPoet.trackEvent(
|
MailPoet.trackEvent(
|
||||||
'User has clicked a CTA to view detailed stats',
|
'User has clicked a CTA to view detailed stats',
|
||||||
|
@@ -11,8 +11,8 @@ import ListingTabs from 'newsletters/listings/tabs.jsx';
|
|||||||
import ListingHeading from 'newsletters/listings/heading.jsx';
|
import ListingHeading from 'newsletters/listings/heading.jsx';
|
||||||
import FeatureAnnouncement from 'announcements/feature_announcement.jsx';
|
import FeatureAnnouncement from 'announcements/feature_announcement.jsx';
|
||||||
|
|
||||||
|
import QueueStatus from 'newsletters/listings/queue_status.jsx';
|
||||||
import {
|
import {
|
||||||
renderQueueStatus,
|
|
||||||
renderStatistics,
|
renderStatistics,
|
||||||
addStatsCTAAction,
|
addStatsCTAAction,
|
||||||
checkCronStatus,
|
checkCronStatus,
|
||||||
@@ -95,7 +95,7 @@ const NewsletterListNotificationHistory = createReactClass({ // eslint-disable-l
|
|||||||
{ actions }
|
{ actions }
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname={MailPoet.I18n.t('status')}>
|
<td className="column" data-colname={MailPoet.I18n.t('status')}>
|
||||||
{ renderQueueStatus(newsletter, meta.mta_log) }
|
<QueueStatus newsletter={newsletter} mailerLog={meta.mta_log} />
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname={MailPoet.I18n.t('lists')}>
|
<td className="column" data-colname={MailPoet.I18n.t('lists')}>
|
||||||
{ segments }
|
{ segments }
|
||||||
|
172
assets/js/src/newsletters/listings/queue_status.jsx
Normal file
172
assets/js/src/newsletters/listings/queue_status.jsx
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import _ from 'underscore';
|
||||||
|
import jQuery from 'jquery';
|
||||||
|
import MailPoet from 'mailpoet';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
|
const pauseSending = (newsletter) => {
|
||||||
|
MailPoet.Ajax.post({
|
||||||
|
api_version: window.mailpoet_api_version,
|
||||||
|
endpoint: 'sendingQueue',
|
||||||
|
action: 'pause',
|
||||||
|
data: {
|
||||||
|
newsletter_id: newsletter.id,
|
||||||
|
},
|
||||||
|
}).done(() => {
|
||||||
|
jQuery(`#resume_${newsletter.id}`).show();
|
||||||
|
jQuery(`#pause_${newsletter.id}`).hide();
|
||||||
|
}).fail((response) => {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
MailPoet.Notice.error(
|
||||||
|
response.errors.map(error => error.message),
|
||||||
|
{ scroll: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const resumeSending = (newsletter) => {
|
||||||
|
MailPoet.Ajax.post({
|
||||||
|
api_version: window.mailpoet_api_version,
|
||||||
|
endpoint: 'sendingQueue',
|
||||||
|
action: 'resume',
|
||||||
|
data: {
|
||||||
|
newsletter_id: newsletter.id,
|
||||||
|
},
|
||||||
|
}).done(() => {
|
||||||
|
jQuery(`#pause_${newsletter.id}`).show();
|
||||||
|
jQuery(`#resume_${newsletter.id}`).hide();
|
||||||
|
}).fail((response) => {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
MailPoet.Notice.error(
|
||||||
|
response.errors.map(error => error.message),
|
||||||
|
{ scroll: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const QueueStatus = ({ newsletter, mailerLog }) => {
|
||||||
|
if (!newsletter.queue) {
|
||||||
|
return (
|
||||||
|
<span>{MailPoet.I18n.t('notSentYet')}</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (mailerLog.status === 'paused' && newsletter.queue.status !== 'completed') {
|
||||||
|
return (
|
||||||
|
<span>{MailPoet.I18n.t('paused')}</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (newsletter.queue.status === 'scheduled') {
|
||||||
|
return (
|
||||||
|
<span>
|
||||||
|
{MailPoet.I18n.t('scheduledFor')}
|
||||||
|
{' '}
|
||||||
|
{MailPoet.Date.format(newsletter.queue.scheduled_at)}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const progressClasses = classNames(
|
||||||
|
'mailpoet_progress',
|
||||||
|
{ mailpoet_progress_complete: newsletter.queue.status === 'completed' }
|
||||||
|
);
|
||||||
|
|
||||||
|
// calculate percentage done
|
||||||
|
let percentage = Math.round(
|
||||||
|
(newsletter.queue.count_processed * 100) / (newsletter.queue.count_total)
|
||||||
|
);
|
||||||
|
|
||||||
|
let label;
|
||||||
|
|
||||||
|
if (newsletter.queue.status === 'completed') {
|
||||||
|
label = (
|
||||||
|
<Link to={`/sending-status/${newsletter.id}`} data-automation-id={`sending_status_${newsletter.id}`}>
|
||||||
|
<span>
|
||||||
|
{
|
||||||
|
MailPoet.I18n.t('newsletterQueueCompleted')
|
||||||
|
.replace('%$1d', parseInt(newsletter.queue.count_processed, 10).toLocaleString())
|
||||||
|
.replace('%$2d', parseInt(newsletter.queue.count_total, 10).toLocaleString())
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
const resumeSendingClick = _.partial(resumeSending, newsletter);
|
||||||
|
const pauseSendingClick = _.partial(pauseSending, newsletter);
|
||||||
|
label = (
|
||||||
|
<span>
|
||||||
|
{parseInt(newsletter.queue.count_processed, 10).toLocaleString()}
|
||||||
|
/
|
||||||
|
{parseInt(newsletter.queue.count_total, 10).toLocaleString()}
|
||||||
|
|
||||||
|
<a
|
||||||
|
id={`resume_${newsletter.id}`}
|
||||||
|
className="button"
|
||||||
|
style={{
|
||||||
|
display: (newsletter.queue.status === 'paused')
|
||||||
|
? 'inline-block' : 'none',
|
||||||
|
}}
|
||||||
|
href="javascript:;"
|
||||||
|
onClick={resumeSendingClick}
|
||||||
|
>
|
||||||
|
{MailPoet.I18n.t('resume')}
|
||||||
|
</a>
|
||||||
|
<a
|
||||||
|
id={`pause_${newsletter.id}`}
|
||||||
|
className="button mailpoet_pause"
|
||||||
|
style={{
|
||||||
|
display: (newsletter.queue.status === null)
|
||||||
|
? 'inline-block' : 'none',
|
||||||
|
}}
|
||||||
|
href="javascript:;"
|
||||||
|
onClick={pauseSendingClick}
|
||||||
|
>
|
||||||
|
{MailPoet.I18n.t('pause')}
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let progressBarWidth = 0;
|
||||||
|
if (Number.isFinite(percentage)) {
|
||||||
|
progressBarWidth = percentage;
|
||||||
|
percentage += '%';
|
||||||
|
} else {
|
||||||
|
percentage = MailPoet.I18n.t('noSubscribers');
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div className={progressClasses}>
|
||||||
|
<span
|
||||||
|
className="mailpoet_progress_bar"
|
||||||
|
style={{ width: `${progressBarWidth}%` }}
|
||||||
|
/>
|
||||||
|
<span className="mailpoet_progress_label">
|
||||||
|
{percentage}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p style={{ textAlign: 'center' }}>
|
||||||
|
{label}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
QueueStatus.propTypes = {
|
||||||
|
newsletter: PropTypes.shape({
|
||||||
|
id: PropTypes.number.isRequired,
|
||||||
|
queue: PropTypes.shape({
|
||||||
|
status: PropTypes.string,
|
||||||
|
count_processed: PropTypes.number.isRequired,
|
||||||
|
count_total: PropTypes.number.isRequired,
|
||||||
|
scheduled_at: PropTypes.instanceOf(Date),
|
||||||
|
}),
|
||||||
|
}).isRequired,
|
||||||
|
mailerLog: PropTypes.shape({
|
||||||
|
status: PropTypes.string,
|
||||||
|
}).isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
export default QueueStatus;
|
@@ -10,9 +10,8 @@ import Listing from 'listing/listing.jsx';
|
|||||||
import ListingTabs from 'newsletters/listings/tabs.jsx';
|
import ListingTabs from 'newsletters/listings/tabs.jsx';
|
||||||
import ListingHeading from 'newsletters/listings/heading.jsx';
|
import ListingHeading from 'newsletters/listings/heading.jsx';
|
||||||
import FeatureAnnouncement from 'announcements/feature_announcement.jsx';
|
import FeatureAnnouncement from 'announcements/feature_announcement.jsx';
|
||||||
|
import QueueStatus from 'newsletters/listings/queue_status.jsx';
|
||||||
import {
|
import {
|
||||||
renderQueueStatus,
|
|
||||||
renderStatistics,
|
renderStatistics,
|
||||||
addStatsCTAAction,
|
addStatsCTAAction,
|
||||||
checkCronStatus,
|
checkCronStatus,
|
||||||
@@ -207,7 +206,7 @@ const NewsletterListStandard = createReactClass({ // eslint-disable-line react/p
|
|||||||
{ actions }
|
{ actions }
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname={MailPoet.I18n.t('status')}>
|
<td className="column" data-colname={MailPoet.I18n.t('status')}>
|
||||||
{ renderQueueStatus(newsletter, meta.mta_log) }
|
<QueueStatus newsletter={newsletter} mailerLog={meta.mta_log} />
|
||||||
</td>
|
</td>
|
||||||
<td className="column" data-colname={MailPoet.I18n.t('lists')}>
|
<td className="column" data-colname={MailPoet.I18n.t('lists')}>
|
||||||
{ segments }
|
{ segments }
|
||||||
|
Reference in New Issue
Block a user