- Add input validation
- Unmount datepicker on destruction - Change prop propagation pipeline
This commit is contained in:
@@ -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()} />
|
||||||
|
|
||||||
<span>
|
<span>
|
||||||
{MailPoet.I18n.t('localTimeIs')} <code>{currentTime}</code>
|
{MailPoet.I18n.t('localTimeIs')} <code>{currentTime}</code>
|
||||||
</span>
|
</span>
|
||||||
|
@@ -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 %>
|
||||||
|
Reference in New Issue
Block a user