From f8628c1f4e142dbd6343fafec1959918348aa64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tautvidas=20Sipavi=C4=8Dius?= Date: Wed, 11 May 2016 13:49:46 +0300 Subject: [PATCH] - Add input validation - Unmount datepicker on destruction - Change prop propagation pipeline --- assets/js/src/newsletters/send/standard.jsx | 74 +++++++++++++++------ views/newsletters.html | 1 + 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/assets/js/src/newsletters/send/standard.jsx b/assets/js/src/newsletters/send/standard.jsx index 8b87fbda62..53429519fe 100644 --- a/assets/js/src/newsletters/send/standard.jsx +++ b/assets/js/src/newsletters/send/standard.jsx @@ -18,6 +18,7 @@ define( var settings = window.mailpoet_settings || {}, currentTime = window.mailpoet_current_time || '00:00', + defaultDateTime = window.mailpoet_current_date + ' ' + '00:00:00'; timeOfDayItems = window.mailpoet_schedule_time_of_day; var isScheduledField = { @@ -30,17 +31,29 @@ define( if ($element.datepicker) { $element.datepicker({ dateFormat: "yy-mm-dd", + onSelect: function() { + jQuery(this).change(); + } }); + + this.datepickerInitialized = true; + } + }, + componentWillUnmount: function() { + if (this.datepickerInitialized) { + jQuery(this.refs.dateInput).datepicker('destroy'); } }, render: function() { return ( + ref="dateInput" + {...this.props.validation} /> ); }, }); @@ -64,6 +77,7 @@ define( name={this.props.name || 'time'} value={this.props.value} onChange={this.props.onChange} + {...this.props.validation} > {options} @@ -80,7 +94,8 @@ define( this.setState(this._buildStateFromProps(nextProps)); }, _buildStateFromProps: function(props) { - const [date, time] = props.value.split(this._DATE_TIME_SEPARATOR) + let value = props.value || defaultDateTime; + const [date, time] = value.split(this._DATE_TIME_SEPARATOR) return { date: date, time: time, @@ -96,7 +111,7 @@ define( }, propagateChange: function() { if (this.props.onChange) { - this.props.onChange({ + return this.props.onChange({ target: { name: this.props.name || '', value: this.getDateTime(), @@ -113,46 +128,61 @@ define( + onChange={this.handleChange} + validation={this.props.dateValidation}/> + onChange={this.handleChange} + validation={this.props.timeValidation} /> ); } }); var StandardScheduling = React.createClass({ - getInitialState: function() { - return { - isScheduled: '0', - scheduledAt: '2016-05-04 14:00:00', - }; + _getCurrentValue: function() { + return this.props.item[this.props.field.name] || {}; }, - handleChange: function(event) { - var newState = {}; - newState[event.target.name] = event.target.value; - this.setState(newState); + handleValueChange: function(event) { + var oldValue = this._getCurrentValue(), + newValue = {}; + newValue[event.target.name] = event.target.value; + + return this.props.onValueChange({ + target: { + name: this.props.field.name, + value: _.extend({}, oldValue, newValue) + } + }); }, handleCheckboxChange: function(event) { event.target.value = this.refs.isScheduled.checked ? '1' : '0'; - this.handleChange(event); + return this.handleValueChange(event); }, isScheduled: function() { - return this.state.isScheduled === '1'; + return this._getCurrentValue().isScheduled === '1'; + }, + getDateValidation: function() { + return { + 'data-parsley-required': true, + 'data-parsley-required-message': MailPoet.I18n.t('noScheduledDateError'), + 'data-parsley-pattern': '[0-9]{4}-[0-9]{2}-[0-9]{2}', + 'data-parsley-errors-container': '#mailpoet_scheduling', + }; }, render: function() { - var isChecked = this.isScheduled(), - schedulingOptions; + var schedulingOptions; - if (isChecked) { + if (this.isScheduled()) { schedulingOptions = ( - + + value={this._getCurrentValue().scheduledAt} + onChange={this.handleValueChange} + dateValidation={this.getDateValidation()} /> +   {MailPoet.I18n.t('localTimeIs')} {currentTime} diff --git a/views/newsletters.html b/views/newsletters.html index ad2c89fe89..60c7581dde 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -150,5 +150,6 @@ 'orSimply': __('or simply'), 'goBackToDesign': __('go back to design'), 'localTimeIs': __('Local time is'), + 'noScheduledDateError': __('Please enter the scheduled date'), }) %> <% endblock %>