@bigfishtv/cockpit
Version:
216 lines (175 loc) • 6.97 kB
JavaScript
;
exports.__esModule = true;
exports.default = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _class, _temp;
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDatepicker = require('react-datepicker');
var _reactDatepicker2 = _interopRequireDefault(_reactDatepicker);
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _Icon = require('../Icon');
var _Icon2 = _interopRequireDefault(_Icon);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var valueDateFormat = 'YYYY-MM-DD';
var dateFormat = 'DD/MM/YY';
var dateFormats = [
// day/month/year
'DD/MM/YYYY', 'D/MM/YYYY', 'DD/M/YYYY', 'D/M/YYYY', 'DD/MM/YY', 'D/M/YY', 'D/MM/YY', 'DD/M/YY',
// year-month-day
'YYYY-MM-DD', 'YYYY-MM-D', 'YYYY-M-DD', 'YYYY-M-D', 'YY-MM-DD', 'YY-MM-D', 'YY-M-DD', 'YY-M-D'];
var DateInput = (_temp = _class = function (_Component) {
_inherits(DateInput, _Component);
function DateInput(props) {
_classCallCheck(this, DateInput);
var _this = _possibleConstructorReturn(this, _Component.call(this));
_this.handleChangeDate = function (event) {
// if parsed + formatted date is the same as the
// input value, then just send an onChange event
var date = (0, _moment2.default)(event.target.value, dateFormats);
if (date.format(dateFormat) === event.target.value) {
_this.props.onChange(date.format(valueDateFormat));
return;
}
_this.setState({
dirtyDate: true,
dateValue: event.target.value
});
};
_this.handleChangeDatepicker = function (dateTime) {
_this.setState({
dateValue: dateTime.format(dateFormat),
dirtyDate: true
}, function () {
return _this.handleBlur();
});
setTimeout(function () {
return _this.setState({ currentDate: dateTime });
}, 1);
};
_this.handleFocus = function (event) {
if (_this.props.openOnFocus) {
_this.datePicker.setOpen(true);
}
};
_this.handleBlur = function (event) {
var _this$state = _this.state,
dateValue = _this$state.dateValue,
dirtyDate = _this$state.dirtyDate;
// close datepicker on blur
_this.datePicker.setOpen(false);
// if no values have changed then donna worry bout ittt
if (!dirtyDate) return;
// attempt to parse date and time from input values
var date = (0, _moment2.default)(dateValue, dateFormats);
// update state, including if values are valid
_this.setState({ initState: false, dirtyDate: false, dateValid: date.isValid() }, function () {
// return blank date if invalid
if (!_this.state.dateValid) {
_this.props.onChange(null);
return;
}
// this just triggers onChange prop
var dateValue = date.format(valueDateFormat);
_this.props.onChange(dateValue);
});
};
_this.handleKeyDown = function (event) {
if (event.key === 'Enter') {
_this.handleBlur();
}
};
var state = _this.getStateForValue(props.value);
_this.state = _extends({
dirtyDate: false,
dateValid: state.dateValue !== '',
initState: state.dateValue === '',
currentDate: null
}, state);
return _this;
}
DateInput.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.value != this.props.value && !this.state.dirty) {
this.setState(_extends({}, this.getStateForValue(nextProps.value)));
}
};
DateInput.prototype.getStateForValue = function getStateForValue(dateString) {
if (!dateString) {
return {
dateValue: ''
};
}
var dateTime = (0, _moment2.default)(dateString, valueDateFormat);
return {
dateValue: dateTime.format(dateFormat),
currentDate: dateTime
};
};
DateInput.prototype.render = function render() {
var _this2 = this;
var _state = this.state,
initState = _state.initState,
dateValid = _state.dateValid,
dateValue = _state.dateValue,
currentDate = _state.currentDate;
var _props = this.props,
minDate = _props.minDate,
maxDate = _props.maxDate;
return _react2.default.createElement(
'div',
{ className: 'inputs-inline' },
_react2.default.createElement(
'div',
{ className: 'input-group' },
_react2.default.createElement(
'div',
{ className: 'input-group-icon' },
!this.props.readOnly && !this.props.disabled && _react2.default.createElement(_reactDatepicker2.default, {
ref: function ref(el) {
return _this2.datePicker = el;
},
showYearDropdown: true,
dateFormat: 'YYYY-MM-DD',
selected: currentDate,
onChange: this.handleChangeDatepicker,
minDate: minDate ? (0, _moment2.default)(minDate, valueDateFormat) : null,
maxDate: maxDate ? (0, _moment2.default)(maxDate, valueDateFormat) : null,
tabIndex: -1
}),
_react2.default.createElement(_Icon2.default, { name: 'calendar', size: '18' })
),
_react2.default.createElement('input', {
type: 'text',
placeholder: dateFormat,
value: dateValue,
onFocus: this.handleFocus,
onChange: this.handleChangeDate,
onBlur: this.handleBlur,
onKeyDown: this.handleKeyDown,
className: !dateValid && !initState && dateValue != '' ? 'warning' : undefined,
readOnly: this.props.readOnly,
autoFocus: this.props.autoFocus
})
)
);
};
return DateInput;
}(_react.Component), _class.propTypes = {
value: _propTypes2.default.string,
onChange: _propTypes2.default.func,
readOnly: _propTypes2.default.bool,
openOnFocus: _propTypes2.default.bool
}, _class.defaultProps = {
onChange: function onChange(value) {
return console.warn('No onChange prop set for DateInput');
},
readOnly: false,
openOnFocus: false
}, _temp);
exports.default = DateInput;