Use a colour to display stats values

[MAILPOET-2791]
This commit is contained in:
Pavel Dohnal
2020-10-15 13:33:23 +02:00
committed by Veljko V
parent 3128b24070
commit f133e4e664
4 changed files with 73 additions and 58 deletions

View File

@@ -79,6 +79,18 @@
} }
} }
.mailpoet-statistics-value-number-average {
color: $color-stats-average;
}
.mailpoet-statistics-value-number-excellent {
color: $color-stats-excellent;
}
.mailpoet-statistics-value-number-good {
color: $color-stats-good;
}
.mailpoet-statistics-with-left-separator { .mailpoet-statistics-with-left-separator {
border-left: solid 1px $color-tertiary-light; border-left: solid 1px $color-tertiary-light;
padding-left: $grid-gap; padding-left: $grid-gap;

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import StatsBadge from './newsletter_stats/stats'; import { StatsBadge } from './newsletter_stats/stats';
import Tooltip from '../tooltip/tooltip'; import Tooltip from '../tooltip/tooltip';
import Tag from '../tag/tag'; import Tag from '../tag/tag';

View File

@@ -8,7 +8,55 @@ type StatsBadgeProps = {
tooltipId?: string, tooltipId?: string,
} }
function StatsBadge(props: StatsBadgeProps) { const stats = {
opened: {
badgeRanges: [30, 10, 0],
badgeTypes: [
'excellent',
'good',
'average',
],
tooltipText: [
MailPoet.I18n.t('openedStatTooltipExcellent'),
MailPoet.I18n.t('openedStatTooltipGood'),
MailPoet.I18n.t('openedStatTooltipAverage'),
],
},
clicked: {
badgeRanges: [3, 1, 0],
badgeTypes: [
'excellent',
'good',
'average',
],
tooltipText: [
MailPoet.I18n.t('clickedStatTooltipExcellent'),
MailPoet.I18n.t('clickedStatTooltipGood'),
MailPoet.I18n.t('clickedStatTooltipAverage'),
],
},
};
export const getBadgeType = (statName, rate) => {
const stat = stats[statName] || null;
if (!stat) {
return null;
}
if (rate < 0 || rate > 100) {
return null;
}
const len = stat.badgeRanges.length;
for (let i = 0; i < len; i += 1) {
if (rate > stat.badgeRanges[i]) {
return stat.badgeTypes[i];
}
}
// rate must be zero at this point
return stat.badgeTypes[len - 1];
};
export const StatsBadge = (props: StatsBadgeProps) => {
const badges = { const badges = {
excellent: { excellent: {
name: MailPoet.I18n.t('excellentBadgeName'), name: MailPoet.I18n.t('excellentBadgeName'),
@@ -24,62 +72,17 @@ function StatsBadge(props: StatsBadgeProps) {
}, },
}; };
const stats = { const badgeType = getBadgeType(props.stat, props.rate);
opened: { const badge = badges[badgeType] || null;
badgeRanges: [30, 10, 0], if (!badge) {
badgeTypes: [ return null;
'excellent', }
'good',
'average',
],
tooltipText: [
MailPoet.I18n.t('openedStatTooltipExcellent'),
MailPoet.I18n.t('openedStatTooltipGood'),
MailPoet.I18n.t('openedStatTooltipAverage'),
],
},
clicked: {
badgeRanges: [3, 1, 0],
badgeTypes: [
'excellent',
'good',
'average',
],
tooltipText: [
MailPoet.I18n.t('clickedStatTooltipExcellent'),
MailPoet.I18n.t('clickedStatTooltipGood'),
MailPoet.I18n.t('clickedStatTooltipAverage'),
],
},
};
const getBadgeType = (stat, rate) => {
const len = stat.badgeRanges.length;
for (let i = 0; i < len; i += 1) {
if (rate > stat.badgeRanges[i]) {
return stat.badgeTypes[i];
}
}
// rate must be zero at this point
return stat.badgeTypes[len - 1];
};
const stat = stats[props.stat] || null; const stat = stats[props.stat] || null;
if (!stat) { if (!stat) {
return null; return null;
} }
const rate = props.rate;
if (rate < 0 || rate > 100) {
return null;
}
const badgeType = getBadgeType(stat, rate);
const badge = badges[badgeType] || null;
if (!badge) {
return null;
}
const tooltipId = props.tooltipId || null; const tooltipId = props.tooltipId || null;
const tooltipText = ( const tooltipText = (
<div key={`tooltip-${tooltipId}`}> <div key={`tooltip-${tooltipId}`}>
@@ -121,6 +124,4 @@ function StatsBadge(props: StatsBadgeProps) {
); );
return content; return content;
} };
export default StatsBadge;

View File

@@ -2,7 +2,7 @@ import React from 'react';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import Hooks from 'wp-js-hooks'; import Hooks from 'wp-js-hooks';
import Grid from 'common/grid'; import Grid from 'common/grid';
import StatsBadge from 'common/listings/newsletter_stats/stats'; import { StatsBadge, getBadgeType } from 'common/listings/newsletter_stats/stats';
import { NewsletterType } from './newsletter_type'; import { NewsletterType } from './newsletter_type';
@@ -39,10 +39,11 @@ export const NewsletterGeneralStats = ({
&& (newsletter.statistics.opened >= minNewslettersOpened) && (newsletter.statistics.opened >= minNewslettersOpened)
); );
const badgeTypeOpened = getBadgeType('opened', percentageOpened);
const opened = ( const opened = (
<> <>
<div className="mailpoet-statistics-value"> <div className="mailpoet-statistics-value">
<span className="mailpoet-statistics-value-number"> <span className={`mailpoet-statistics-value-number mailpoet-statistics-value-number-${badgeTypeOpened}`}>
{percentageOpenedDisplay} {percentageOpenedDisplay}
{'% '} {'% '}
</span> </span>
@@ -77,10 +78,11 @@ export const NewsletterGeneralStats = ({
</> </>
); );
const badgeTypeClicked = getBadgeType('clicked', percentageClicked);
const clicked = ( const clicked = (
<> <>
<div className="mailpoet-statistics-value"> <div className="mailpoet-statistics-value">
<span className="mailpoet-statistics-value-number"> <span className={`mailpoet-statistics-value-number mailpoet-statistics-value-number-${badgeTypeClicked}`}>
{percentageClickedDisplay} {percentageClickedDisplay}
{'% '} {'% '}
</span> </span>