Add validation for WooCommerce schedule forms

[MAILPOET-3848]
This commit is contained in:
Jan Lysý
2021-10-13 12:56:26 +02:00
committed by Veljko V
parent 315a1856a4
commit dfd4fc5551
2 changed files with 88 additions and 53 deletions

View File

@@ -104,6 +104,9 @@ class EventScheduling extends React.Component {
name: 'scheduling_time_duration', name: 'scheduling_time_duration',
defaultValue: afterTimeNumber ? afterTimeNumber.toString() : '', defaultValue: afterTimeNumber ? afterTimeNumber.toString() : '',
size: afterTimeNumberSize, size: afterTimeNumberSize,
validation: {
'data-parsley-required': true,
},
}, },
item: {}, item: {},
onValueChange: _.partial(this.handleChange, _, 'afterTimeNumber'), onValueChange: _.partial(this.handleChange, _, 'afterTimeNumber'),

View File

@@ -11,6 +11,7 @@ import MailPoet from 'mailpoet';
import _ from 'underscore'; import _ from 'underscore';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { GlobalContext } from 'context/index.jsx'; import { GlobalContext } from 'context/index.jsx';
import jQuery from 'jquery';
const defaultAfterTimeType = 'immediate'; const defaultAfterTimeType = 'immediate';
const defaultAfterTimeNumber = 1; const defaultAfterTimeNumber = 1;
@@ -74,9 +75,18 @@ class EventsConditions extends React.Component {
} }
this.setState(newState); this.setState(newState);
// we need to reset validation due to changes in the afterTimeType field
this.resetValidationErrors();
if (this.isValid()) {
this.validate();
}
} }
handleNextStep() { handleNextStep(e) {
e.preventDefault();
if (!this.isValid()) {
this.validate();
} else {
const { history } = this.props; const { history } = this.props;
const { const {
eventSlug, afterTimeType, afterTimeNumber, event, segment, eventOptionValue, eventSlug, afterTimeType, afterTimeNumber, event, segment, eventOptionValue,
@@ -121,6 +131,7 @@ class EventsConditions extends React.Component {
} }
}); });
} }
}
getEvent(eventSlug) { getEvent(eventSlug) {
return this.emailEvents[eventSlug]; return this.emailEvents[eventSlug];
@@ -130,6 +141,25 @@ class EventsConditions extends React.Component {
return (_.isArray(this.segments) && this.segments[0].id) ? this.segments[0].id : null; return (_.isArray(this.segments) && this.segments[0].id) ? this.segments[0].id : null;
} }
isValid = () => {
if (jQuery('#newsletter_scheduling').parsley()) {
return jQuery('#newsletter_scheduling').parsley().isValid();
}
return true;
}
validate = () => {
if (jQuery('#newsletter_scheduling').parsley()) {
jQuery('#newsletter_scheduling').parsley().validate();
}
}
resetValidationErrors = () => {
if (jQuery('#newsletter_scheduling').parsley()) {
jQuery('#newsletter_scheduling').parsley().reset();
}
};
displayHeader() { displayHeader() {
const { event } = this.state; const { event } = this.state;
return event.title; return event.title;
@@ -220,6 +250,7 @@ class EventsConditions extends React.Component {
<ListingHeadingStepsRoute emailType="woocommerce" automationId="woocommerce_email_creation_heading" /> <ListingHeadingStepsRoute emailType="woocommerce" automationId="woocommerce_email_creation_heading" />
<Grid.Column align="center" className="mailpoet-schedule-email"> <Grid.Column align="center" className="mailpoet-schedule-email">
<form id="newsletter_scheduling">
<Heading level={4}>{this.displayHeader()}</Heading> <Heading level={4}>{this.displayHeader()}</Heading>
<div>{this.displayEventOptions()}</div> <div>{this.displayEventOptions()}</div>
<div>{this.displaySegments()}</div> <div>{this.displaySegments()}</div>
@@ -228,10 +259,11 @@ class EventsConditions extends React.Component {
<Button <Button
isFullWidth isFullWidth
onClick={this.handleNextStep} onClick={this.handleNextStep}
type="button" type="submit"
> >
{MailPoet.I18n.t('next')} {MailPoet.I18n.t('next')}
</Button> </Button>
</form>
</Grid.Column> </Grid.Column>
{this.displayEventTip()} {this.displayEventTip()}