UNPKG

@bigfishtv/cockpit

Version:

258 lines (215 loc) 8.52 kB
'use strict'; 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 valueDateTimeFormat = 'YYYY-MM-DDTHH:mm:ssZ'; var dateFormat = 'DD/MM/YY'; var timeFormat = 'h:mm A'; 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 timeFormats = ['', 'ha', 'h:mm', 'h:mma', 'h', 'hh']; var DateTimeInput = (_temp = _class = function (_Component) { _inherits(DateTimeInput, _Component); function DateTimeInput(props) { _classCallCheck(this, DateTimeInput); 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 // TODO: also support this when defaultTime is provided var date = (0, _moment2.default)(event.target.value, dateFormats); if (date.format(dateFormat) === event.target.value && !_this.props.defaultTime) { _this.props.onChange(date.format(valueDateTimeFormat)); return; } _this.setState({ dirtyDate: true, dateValue: event.target.value }); }; _this.handleChangeDatepicker = function (dateTime) { _this.setState({ dateValue: dateTime.format(dateFormat), dirtyDate: true, timeValue: _this.state.timeValue || _this.props.defaultTime, currentDate: dateTime }, function () { return _this.handleBlur(); }); setTimeout(function () { return _this.dateInputRef.focus(); }, 1); }; _this.handleChangeTime = function (event) { // if parsed + formatted time is the same as the // input value, then just send an onChange event var time = (0, _moment2.default)(event.target.value, timeFormats); if (time.format(timeFormat) === event.target.value) { var date = (0, _moment2.default)(_this.state.dateValue, dateFormats); date.hours(time.hours()); date.minutes(time.minutes()); date.seconds(time.seconds()); _this.props.onChange(date.format(valueDateTimeFormat)); return; } _this.setState({ dirtyTime: true, timeValue: event.target.value }); }; _this.handleBlur = function (event) { var _this$state = _this.state, dateValue = _this$state.dateValue, timeValue = _this$state.timeValue, dirtyDate = _this$state.dirtyDate, dirtyTime = _this$state.dirtyTime; // if no values have changed then donna worry bout ittt if (!dirtyTime && !dirtyDate) return; // attempt to parse date and time from input values var date = (0, _moment2.default)(dateValue, dateFormats); var time = (0, _moment2.default)(timeValue, timeFormats); // update state, including if values are valid _this.setState({ dirtyDate: false, dirtyTime: false, dateValid: date.isValid(), timeValid: time.isValid() }, function () { // return blank date if invalid if (!_this.state.dateValid) { _this.props.onChange(null); return; } // copy time value into date object if (_this.state.timeValid) { date.hours(time.hours()); date.minutes(time.minutes()); date.seconds(time.seconds()); } _this.props.onChange(date.format(valueDateTimeFormat)); }); }; _this.handleKeyDown = function (event) { if (event.key === 'Enter') { _this.handleBlur(); } }; var state = _this.getStateForValue(props); _this.state = _extends({ dirtyTime: false, dirtyDate: false, dateValid: state.dateValue !== '', timeValid: state.timeValue !== '' }, state); return _this; } DateTimeInput.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if (nextProps.value != this.props.value && !this.state.dirty) { this.setState(_extends({}, this.getStateForValue(nextProps))); } }; DateTimeInput.prototype.getStateForValue = function getStateForValue(nextProps) { var dateTimeString = nextProps.value; if (!dateTimeString) { return { dateValue: '', timeValue: nextProps.defaultTime, currentDate: null }; } var dateTime = (0, _moment2.default)(dateTimeString, valueDateTimeFormat); return { dateValue: dateTime.format(dateFormat), timeValue: dateTime.hour() == 0 && dateTime.minute() == 0 ? '' : dateTime.format(timeFormat), currentDate: dateTime }; }; DateTimeInput.prototype.render = function render() { var _this2 = this; var _state = this.state, timeValue = _state.timeValue, dateValue = _state.dateValue; var _props = this.props, value = _props.value, minDate = _props.minDate, maxDate = _props.maxDate, displayTime = _props.displayTime; 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, { showYearDropdown: true, selected: this.state.currentDate, onChange: this.handleChangeDatepicker, minDate: minDate ? (0, _moment2.default)(minDate) : null, maxDate: maxDate ? (0, _moment2.default)(maxDate) : null, tabIndex: -1 }), _react2.default.createElement(_Icon2.default, { name: 'calendar', size: '18' }) ), _react2.default.createElement('input', { ref: function ref(el) { return _this2.dateInputRef = el; }, type: 'text', placeholder: dateFormat, value: dateValue, onChange: this.handleChangeDate, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown, readOnly: this.props.readOnly, autoFocus: this.props.autoFocus }) ), displayTime && value && _react2.default.createElement( 'div', { className: 'input-group' }, _react2.default.createElement( 'div', { className: 'input-group-icon' }, _react2.default.createElement(_Icon2.default, { name: 'clock', size: '18' }) ), _react2.default.createElement('input', { type: 'text', placeholder: value ? '12:00 AM' : '', value: timeValue, onChange: this.handleChangeTime, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown, readOnly: this.props.readOnly }) ) ); }; return DateTimeInput; }(_react.Component), _class.propTypes = { value: _propTypes2.default.string, defaultTime: _propTypes2.default.string }, _class.defaultProps = { displayTime: true, defaultTime: '', onChange: function onChange(value) { return console.warn('No onChange prop set for DateTime'); }, readOnly: false }, _temp); exports.default = DateTimeInput;