diff --git a/.eslintrc.es6.json b/.eslintrc.es6.json index 528b734726..c03494a7a6 100644 --- a/.eslintrc.es6.json +++ b/.eslintrc.es6.json @@ -19,6 +19,25 @@ "comma-dangle": ["error", "always-multiline"], "no-script-url": 0, "import/extensions": 0, // we wouldn't be able to import jQuery without this line - "react/destructuring-assignment": 0 // that would be too many changes to fix this one + "react/destructuring-assignment": 0, // that would be too many changes to fix this one + "jsx-a11y/label-has-for": [2, { + "required": {"some": ["nesting", "id"]} // some of our labels are hidden and we cannot nest those + }], + "jsx-a11y/anchor-is-valid": 0, // cannot fix this one, it would break wprdpress themes + + + + "no-restricted-globals": 0, // todo + "max-len": 0, // todo + "prefer-destructuring": 0, // todo + "react/default-props-match-prop-types": 0, // todo + "react/no-access-state-in-setstate": 0, // todo + "react/jsx-closing-tag-location": 0, // todo + "react/require-default-props": 0, // todo + "react/jsx-no-target-blank": 0, // todo + "react/sort-comp": 0, // todo + "react/no-unused-state": 0, // todo + "react/no-this-in-sfc": 0 // todo } } + diff --git a/assets/js/src/announcements/feature_announcement.jsx b/assets/js/src/announcements/feature_announcement.jsx index f2d3c1e55a..61f02b96c3 100644 --- a/assets/js/src/announcements/feature_announcement.jsx +++ b/assets/js/src/announcements/feature_announcement.jsx @@ -56,15 +56,15 @@ class FeatureAnnouncement extends React.Component { ); return (
- - +
); diff --git a/assets/js/src/announcements/in_app_announcement_dot.jsx b/assets/js/src/announcements/in_app_announcement_dot.jsx index f042f2312a..13f6a9b71a 100644 --- a/assets/js/src/announcements/in_app_announcement_dot.jsx +++ b/assets/js/src/announcements/in_app_announcement_dot.jsx @@ -4,21 +4,31 @@ import ReactDOMServer from 'react-dom/server'; import classNames from 'classnames'; import MailPoet from 'mailpoet'; -const InAppAnnouncementDot = props => ( - { - MailPoet.Modal.popup({ - template: ReactDOMServer.renderToString(props.children), - width: props.width, - height: props.height, - }); - if (props.onUserTrigger) props.onUserTrigger(); - }} - /> -); +const InAppAnnouncementDot = (props) => { + const onClick = () => { + MailPoet.Modal.popup({ + template: ReactDOMServer.renderToString(props.children), + width: props.width, + height: props.height, + }); + if (props.onUserTrigger) props.onUserTrigger(); + }; + return ( + { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + onClick(); + } + }} + onClick={onClick} + /> + ); +}; InAppAnnouncementDot.propTypes = { children: PropTypes.element.isRequired, diff --git a/assets/js/src/common/confirm_alert.jsx b/assets/js/src/common/confirm_alert.jsx index a440701a13..11cf930079 100644 --- a/assets/js/src/common/confirm_alert.jsx +++ b/assets/js/src/common/confirm_alert.jsx @@ -48,7 +48,7 @@ class ConfirmAlert extends React.Component {
- -
diff --git a/assets/js/src/forms/list.jsx b/assets/js/src/forms/list.jsx index 40c29dd48c..5f786d74c4 100644 --- a/assets/js/src/forms/list.jsx +++ b/assets/js/src/forms/list.jsx @@ -189,14 +189,15 @@ class FormList extends React.Component {

{MailPoet.I18n.t('pageTitle')} {' '} - {MailPoet.I18n.t('new')} - +

diff --git a/assets/js/src/listing/listing_column.jsx b/assets/js/src/listing/listing_column.jsx index d524b5eb4a..8e748b352a 100644 --- a/assets/js/src/listing/listing_column.jsx +++ b/assets/js/src/listing/listing_column.jsx @@ -25,6 +25,13 @@ class ListingColumn extends React.Component { onClick={this.handleSort} role="button" tabIndex={0} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + this.handleSort(); + } + }} > { this.props.column.label } diff --git a/assets/js/src/listing/listing_item.jsx b/assets/js/src/listing/listing_item.jsx index 9e9f0935a9..5d381499b7 100644 --- a/assets/js/src/listing/listing_item.jsx +++ b/assets/js/src/listing/listing_item.jsx @@ -74,6 +74,7 @@ class ListingItem extends React.Component { {(!isFirst) ? ' | ' : ''} this.handleTrashItem(this.props.item.id)} > @@ -89,6 +90,13 @@ class ListingItem extends React.Component { className={action.name} role="button" tabIndex={index} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + this.props.onRefreshItems(); + } + }} > {(!isFirst) ? ' | ' : ''} { action.link(this.props.item) } diff --git a/assets/js/src/newsletters/send/congratulate/fail.jsx b/assets/js/src/newsletters/send/congratulate/fail.jsx index 19bab332ec..2bb31898ea 100644 --- a/assets/js/src/newsletters/send/congratulate/fail.jsx +++ b/assets/js/src/newsletters/send/congratulate/fail.jsx @@ -24,7 +24,7 @@ function Fail(props) { ) }

- +
); } diff --git a/assets/js/src/newsletters/send/congratulate/success.jsx b/assets/js/src/newsletters/send/congratulate/success.jsx index 90d577294c..8259d766f1 100644 --- a/assets/js/src/newsletters/send/congratulate/success.jsx +++ b/assets/js/src/newsletters/send/congratulate/success.jsx @@ -38,7 +38,7 @@ function Success(props) { /> ) } - +
); } diff --git a/assets/js/src/newsletters/templates/template_box.jsx b/assets/js/src/newsletters/templates/template_box.jsx index be55736aea..75beef4a7c 100644 --- a/assets/js/src/newsletters/templates/template_box.jsx +++ b/assets/js/src/newsletters/templates/template_box.jsx @@ -131,6 +131,13 @@ class TemplateBox extends React.Component { onClick={this.onSelect} role="button" tabIndex={0} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + this.onSelect(); + } + }} > {' '} {MailPoet.I18n.t('select')} diff --git a/assets/js/src/newsletters/types.jsx b/assets/js/src/newsletters/types.jsx index e9d5a9049e..c791c0e5a7 100644 --- a/assets/js/src/newsletters/types.jsx +++ b/assets/js/src/newsletters/types.jsx @@ -39,6 +39,13 @@ class NewsletterTypes extends React.Component { role="button" tabIndex={0} disabled={!window.mailpoet_premium_active} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + this.onClick(); + } + }} > { MailPoet.I18n.t('setUp') } @@ -91,6 +98,13 @@ class NewsletterTypes extends React.Component { onClick={createStandardNewsletter} role="button" tabIndex={0} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + createStandardNewsletter(); + } + }} > {MailPoet.I18n.t('create')} @@ -136,6 +150,13 @@ class NewsletterTypes extends React.Component { onClick={createNotificationNewsletter} role="button" tabIndex={0} + onKeyDown={(event) => { + if ((['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key)) + ) { + event.preventDefault(); + createNotificationNewsletter(); + } + }} > {MailPoet.I18n.t('setUp')} diff --git a/assets/js/src/newsletters/types/automatic_emails/event.jsx b/assets/js/src/newsletters/types/automatic_emails/event.jsx index 109898be56..4363646af8 100644 --- a/assets/js/src/newsletters/types/automatic_emails/event.jsx +++ b/assets/js/src/newsletters/types/automatic_emails/event.jsx @@ -28,12 +28,21 @@ class AutomaticEmailEvent extends React.PureComponent { ); } else { + const onClick = !disabled ? _.partial(this.props.eventsConfigurator, event.slug) : null; action = ( { + if ((['keydown', 'keypress'].includes(keyEvent.type) && ['Enter', ' '].includes(keyEvent.key)) + ) { + keyEvent.preventDefault(); + onClick(); + } + }} > {event.actionButtonTitle || MailPoet.I18n.t('setUp')} diff --git a/assets/js/src/welcome_wizard/steps/email_course_step.jsx b/assets/js/src/welcome_wizard/steps/email_course_step.jsx index cbf01140f9..7e91caad52 100644 --- a/assets/js/src/welcome_wizard/steps/email_course_step.jsx +++ b/assets/js/src/welcome_wizard/steps/email_course_step.jsx @@ -25,7 +25,7 @@ const WelcomeWizardEmailCourseStep = props => ( marginHeight="0" /> - + ); diff --git a/assets/js/src/welcome_wizard/steps/migrated_user_step.jsx b/assets/js/src/welcome_wizard/steps/migrated_user_step.jsx index 0554e60d1e..2785af4f02 100644 --- a/assets/js/src/welcome_wizard/steps/migrated_user_step.jsx +++ b/assets/js/src/welcome_wizard/steps/migrated_user_step.jsx @@ -7,7 +7,7 @@ const WelcomeWizardMigratedUserStep = props => (

{MailPoet.I18n.t('welcomeWizardLetsStartTitle')}

{MailPoet.I18n.t('welcomeWizardSenderMigratedUserText')}

- +
); diff --git a/assets/js/src/welcome_wizard/steps/usage_tracking_step.jsx b/assets/js/src/welcome_wizard/steps/usage_tracking_step.jsx index dc781a21cc..01275fd9ad 100644 --- a/assets/js/src/welcome_wizard/steps/usage_tracking_step.jsx +++ b/assets/js/src/welcome_wizard/steps/usage_tracking_step.jsx @@ -31,6 +31,7 @@ const WelcomeWizardUsageTrackingStep = props => ( } >