- Add input validation

- Unmount datepicker on destruction
- Change prop propagation pipeline
This commit is contained in:
Tautvidas Sipavičius
2016-05-11 13:49:46 +03:00
parent f7c70be5eb
commit f8628c1f4e
2 changed files with 53 additions and 22 deletions

View File

@@ -18,6 +18,7 @@ define(
var settings = window.mailpoet_settings || {}, var settings = window.mailpoet_settings || {},
currentTime = window.mailpoet_current_time || '00:00', currentTime = window.mailpoet_current_time || '00:00',
defaultDateTime = window.mailpoet_current_date + ' ' + '00:00:00';
timeOfDayItems = window.mailpoet_schedule_time_of_day; timeOfDayItems = window.mailpoet_schedule_time_of_day;
var isScheduledField = { var isScheduledField = {
@@ -30,17 +31,29 @@ define(
if ($element.datepicker) { if ($element.datepicker) {
$element.datepicker({ $element.datepicker({
dateFormat: "yy-mm-dd", 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() { render: function() {
return ( return (
<input <input
type="text" type="text"
size="10"
name={this.props.name || 'date'} name={this.props.name || 'date'}
value={this.props.value} value={this.props.value}
onChange={this.props.onChange} onChange={this.props.onChange}
ref="dateInput" /> ref="dateInput"
{...this.props.validation} />
); );
}, },
}); });
@@ -64,6 +77,7 @@ define(
name={this.props.name || 'time'} name={this.props.name || 'time'}
value={this.props.value} value={this.props.value}
onChange={this.props.onChange} onChange={this.props.onChange}
{...this.props.validation}
> >
{options} {options}
</select> </select>
@@ -80,7 +94,8 @@ define(
this.setState(this._buildStateFromProps(nextProps)); this.setState(this._buildStateFromProps(nextProps));
}, },
_buildStateFromProps: function(props) { _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 { return {
date: date, date: date,
time: time, time: time,
@@ -96,7 +111,7 @@ define(
}, },
propagateChange: function() { propagateChange: function() {
if (this.props.onChange) { if (this.props.onChange) {
this.props.onChange({ return this.props.onChange({
target: { target: {
name: this.props.name || '', name: this.props.name || '',
value: this.getDateTime(), value: this.getDateTime(),
@@ -113,46 +128,61 @@ define(
<DateText <DateText
name="date" name="date"
value={this.state.date} value={this.state.date}
onChange={this.handleChange} /> onChange={this.handleChange}
validation={this.props.dateValidation}/>
<TimeSelect <TimeSelect
name="time" name="time"
value={this.state.time} value={this.state.time}
onChange={this.handleChange} /> onChange={this.handleChange}
validation={this.props.timeValidation} />
</span> </span>
); );
} }
}); });
var StandardScheduling = React.createClass({ var StandardScheduling = React.createClass({
getInitialState: function() { _getCurrentValue: function() {
return { return this.props.item[this.props.field.name] || {};
isScheduled: '0',
scheduledAt: '2016-05-04 14:00:00',
};
}, },
handleChange: function(event) { handleValueChange: function(event) {
var newState = {}; var oldValue = this._getCurrentValue(),
newState[event.target.name] = event.target.value; newValue = {};
this.setState(newState); newValue[event.target.name] = event.target.value;
return this.props.onValueChange({
target: {
name: this.props.field.name,
value: _.extend({}, oldValue, newValue)
}
});
}, },
handleCheckboxChange: function(event) { handleCheckboxChange: function(event) {
event.target.value = this.refs.isScheduled.checked ? '1' : '0'; event.target.value = this.refs.isScheduled.checked ? '1' : '0';
this.handleChange(event); return this.handleValueChange(event);
}, },
isScheduled: function() { 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() { render: function() {
var isChecked = this.isScheduled(), var schedulingOptions;
schedulingOptions;
if (isChecked) { if (this.isScheduled()) {
schedulingOptions = ( schedulingOptions = (
<span> <span id="mailpoet_scheduling">
<DateTime <DateTime
name="scheduledAt" name="scheduledAt"
value={this.state.scheduledAt} value={this._getCurrentValue().scheduledAt}
onChange={this.handleChange} /> onChange={this.handleValueChange}
dateValidation={this.getDateValidation()} />
&nbsp;
<span> <span>
{MailPoet.I18n.t('localTimeIs')} <code>{currentTime}</code> {MailPoet.I18n.t('localTimeIs')} <code>{currentTime}</code>
</span> </span>

View File

@@ -150,5 +150,6 @@
'orSimply': __('or simply'), 'orSimply': __('or simply'),
'goBackToDesign': __('go back to design'), 'goBackToDesign': __('go back to design'),
'localTimeIs': __('Local time is'), 'localTimeIs': __('Local time is'),
'noScheduledDateError': __('Please enter the scheduled date'),
}) %> }) %>
<% endblock %> <% endblock %>