ldx-widgets
Version:
widgets
263 lines (252 loc) • 8.64 kB
JavaScript
(function() {
var DatePicker, Input, React, ReactDatepicker, SelectInput, div, moment, ref, span;
React = require('react');
require('classlist-polyfill');
ReactDatepicker = React.createFactory(require('react-datepicker'));
Input = React.createFactory(require('./input_placeholder'));
SelectInput = React.createFactory(require('./select_input_2'));
moment = require('moment');
ref = React.DOM, div = ref.div, span = ref.span;
DatePicker = React.createClass({
displayName: 'DatePicker',
propTypes: {
placeholderText: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]),
dateFormat: React.PropTypes.string,
className: React.PropTypes.string,
minDate: React.PropTypes.object,
maxDate: React.PropTypes.object,
onChange: React.PropTypes.func.isRequired,
tabIndex: React.PropTypes.number,
selected: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.object])
},
getDefaultProps: function() {
return {
placeholderText: 'Select a date',
dateFormat: 'MM/DD/YYYY',
className: null,
includeTime: false,
returnDateString: null
};
},
getInitialState: function() {
var selected;
selected = this.props.selected;
return this.getDateState(selected);
},
getDateState: function(selected) {
if (selected == null) {
selected = moment();
}
return {
selected: moment(selected.format('YYYYMMDD'), 'YYYYMMDD'),
inputDate: '',
hours: selected.format('h'),
minutes: selected.format('mm'),
ampm: selected.format('a')
};
},
componentWillMount: function() {
var hour, i, includeTime, j, minute;
includeTime = this.props.includeTime;
if (!includeTime) {
return;
}
this.hoursOptions = [
{
label: '12',
value: '12'
}
];
for (hour = i = 1; i <= 11; hour = ++i) {
this.hoursOptions.push({
label: hour,
value: hour
});
}
this.minuteOptions = [];
for (minute = j = 0; j <= 59; minute = ++j) {
if (minute < 10) {
minute = "0" + minute;
}
this.minuteOptions.push({
label: minute,
value: minute
});
}
return this.ampmOptions = [
{
label: 'am',
value: 'am'
}, {
label: 'pm',
value: 'pm'
}
];
},
componentWillReceiveProps: function(nextProps) {
var ref1, selected;
selected = this.props.selected;
if ((selected != null ? selected.format('YYYYMMDDhmma') : void 0) !== ((ref1 = nextProps.selected) != null ? ref1.format('YYYYMMDDhmma') : void 0)) {
return this.setState(this.getDateState(nextProps.selected));
}
},
render: function() {
var ampm, className, dateFormat, hours, includeTime, inputDate, mainClass, maxDate, minDate, minutes, onChange, placeholderText, ref1, ref2, selected, tabIndex, value;
ref1 = this.props, placeholderText = ref1.placeholderText, className = ref1.className, dateFormat = ref1.dateFormat, minDate = ref1.minDate, maxDate = ref1.maxDate, onChange = ref1.onChange, tabIndex = ref1.tabIndex, includeTime = ref1.includeTime;
ref2 = this.state, selected = ref2.selected, inputDate = ref2.inputDate, hours = ref2.hours, minutes = ref2.minutes, ampm = ref2.ampm;
if (selected) {
switch (typeof selected) {
case 'string':
value = moment(selected).format(dateFormat);
selected = moment(selected, dateFormat);
break;
case 'object':
value = selected.format(dateFormat);
}
}
mainClass = 'datepicker-wrapper';
if (includeTime) {
mainClass += ' include-time';
}
if (className != null) {
mainClass += " " + className;
}
return div({
className: mainClass
}, [
Input({
key: 'input',
ref: 'input',
placeholder: placeholderText,
value: inputDate || value,
onChange: this.handleChange,
onKeyDown: this.handleKeyDown,
onBlur: this.handleBlur,
onFocus: this.handleFocus,
tabIndex: tabIndex
}), ReactDatepicker({
key: 'datepicker',
ref: 'datepicker',
selected: selected,
onChange: this.handleDateChange,
dateFormat: dateFormat,
minDate: minDate,
maxDate: maxDate
}), includeTime ? div({
key: 'time',
className: 'time-wrapper'
}, [
SelectInput({
key: 'hours',
ref: 'hours',
value: hours,
className: 'time-sel',
options: this.hoursOptions,
onChange: this.handleChange
}), span({
key: 'colon',
className: 'colon'
}, ':'), SelectInput({
key: 'minutes',
ref: 'minutes',
value: minutes,
className: 'time-sel',
options: this.minuteOptions,
onChange: this.handleChange
}), SelectInput({
key: 'ampm',
ref: 'ampm',
value: ampm,
className: 'time-sel ampm',
options: this.ampmOptions,
onChange: this.handleChange
})
]) : void 0
]);
},
hideCalendar: function() {
return this.refs.datepicker.setOpen(false);
},
handleFocus: function() {
return this.refs.datepicker.handleFocus();
},
handleChange: function(cb, blur) {
var includeTime, onChange, ref1, setData;
ref1 = this.props, includeTime = ref1.includeTime, onChange = ref1.onChange;
setData = {
inputDate: this.refs.input.getValue()
};
if (includeTime) {
setData.hours = this.refs.hours.getValue();
setData.minutes = this.refs.minutes.getValue();
setData.ampm = this.refs.ampm.getValue();
}
return this.setState(setData, function() {
if (typeof cb === "function") {
cb(null, blur);
}
return typeof onChange === "function" ? onChange() : void 0;
});
},
handleBlur: function() {
return this.handleChange(this.handleKeyDown, true);
},
handleKeyDown: function(e, blur) {
var dateFormat, inputAdjusted, inputDate, maxDate, minDate, ref1, ref2, state, unixInputDate, value;
value = this.refs.input.getValue();
ref1 = this.props, minDate = ref1.minDate, maxDate = ref1.maxDate, dateFormat = ref1.dateFormat;
inputDate = moment(value, dateFormat);
unixInputDate = inputDate.unix();
state = {};
if (inputDate.isValid() && (((ref2 = e != null ? e.key : void 0) === 'Enter' || ref2 === 'Tab') || (e == null))) {
if ((minDate != null) && unixInputDate <= minDate.unix()) {
inputAdjusted = true;
inputDate = minDate;
}
if ((maxDate != null) && unixInputDate >= maxDate.unix()) {
inputAdjusted = true;
inputDate = maxDate;
}
if (inputAdjusted) {
state.inputDate = inputDate.format(dateFormat);
}
state.selected = inputDate;
return this.setState(state, function() {
var base;
if (typeof (base = this.props).onChange === "function") {
base.onChange();
}
if (!blur) {
return this.hideCalendar();
}
});
}
},
handleDateChange: function(date) {
return this.setState({
selected: date,
inputDate: ''
}, function() {
var base;
return typeof (base = this.props).onChange === "function" ? base.onChange() : void 0;
});
},
getValue: function() {
var ampm, dateString, hours, includeTime, minutes, ref1, ref2, returnDateString, selected;
ref1 = this.props, returnDateString = ref1.returnDateString, includeTime = ref1.includeTime;
selected = this.state.selected;
if (includeTime) {
ref2 = this.state, hours = ref2.hours, minutes = ref2.minutes, ampm = ref2.ampm;
dateString = selected.format('YYYYMMDD');
dateString += hours + ":" + minutes + ampm;
selected = moment(dateString, 'YYYYMMDDh:mma');
}
if (returnDateString != null) {
return selected.format(returnDateString);
} else {
return selected;
}
}
});
module.exports = DatePicker;
}).call(this);