UNPKG

@seafile/seafile-calendar

Version:
268 lines (209 loc) 7.72 kB
'use strict'; exports.__esModule = true; var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _KeyCode = require('rc-util/lib/KeyCode'); var _KeyCode2 = _interopRequireDefault(_KeyCode); var _reactLifecyclesCompat = require('react-lifecycles-compat'); var _dayjs = require('dayjs'); var _dayjs2 = _interopRequireDefault(_dayjs); var _util = require('../util'); var _icons = require('../icons'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var customParseFormat = require('dayjs/plugin/customParseFormat'); _dayjs2['default'].extend(customParseFormat); var cachedSelectionStart = void 0; var cachedSelectionEnd = void 0; var dateInputInstance = void 0; var DateInput = function (_React$Component) { (0, _inherits3['default'])(DateInput, _React$Component); function DateInput(props) { (0, _classCallCheck3['default'])(this, DateInput); var _this = (0, _possibleConstructorReturn3['default'])(this, _React$Component.call(this, props)); _initialiseProps.call(_this); var selectedValue = props.selectedValue; _this.state = { str: (0, _util.formatDate)(selectedValue, _this.props.format), hasFocus: false, isInputEmpty: false, localFormat: _this.props.format[0] }; return _this; } DateInput.prototype.componentDidMount = function componentDidMount() { var _this2 = this; setTimeout(function () { _this2.focus(); }, 100); }; DateInput.prototype.componentDidUpdate = function componentDidUpdate() { if (dateInputInstance && this.state.hasFocus && !(cachedSelectionStart === 0 && cachedSelectionEnd === 0)) { dateInputInstance.setSelectionRange(cachedSelectionStart, cachedSelectionEnd); } }; DateInput.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, state) { var newState = {}; if (dateInputInstance) { cachedSelectionStart = dateInputInstance.selectionStart; cachedSelectionEnd = dateInputInstance.selectionEnd; } // when popup show, click body will call this, bug! var selectedValue = nextProps.selectedValue; if (!state.hasFocus) { newState = { str: (0, _util.formatDate)(selectedValue, nextProps.format) }; } return newState; }; DateInput.getInstance = function getInstance() { return dateInputInstance; }; DateInput.prototype.render = function render() { var props = this.props; var str = this.state.str; var locale = props.locale, prefixCls = props.prefixCls, placeholder = props.placeholder, clearIcon = props.clearIcon, inputMode = props.inputMode; return _react2['default'].createElement( 'div', { className: prefixCls + '-input-wrap' }, _react2['default'].createElement( 'div', { className: prefixCls + '-date-input-wrap' }, _react2['default'].createElement('input', { id: 'date-input', ref: this.saveDateInput, className: prefixCls + '-input', value: str, disabled: props.disabled, placeholder: placeholder, onChange: this.onInputChange, onKeyDown: this.onKeyDown, onFocus: this.onFocus, onBlur: this.onBlur, inputMode: inputMode, tabIndex: '0' }) ), props.showClear && _react2['default'].createElement( 'a', { role: 'button', title: locale.clear, onClick: this.onClear }, clearIcon || _react2['default'].createElement( 'span', { className: prefixCls + '-clear-btn' }, _react2['default'].createElement(_icons.CloseIcon, null) ) ) ); }; return DateInput; }(_react2['default'].Component); DateInput.propTypes = { prefixCls: _propTypes2['default'].string, timePicker: _propTypes2['default'].object, value: _propTypes2['default'].object, disabledTime: _propTypes2['default'].any, format: _propTypes2['default'].oneOfType([_propTypes2['default'].string, _propTypes2['default'].arrayOf(_propTypes2['default'].string)]), locale: _propTypes2['default'].object, disabledDate: _propTypes2['default'].func, onChange: _propTypes2['default'].func, onClear: _propTypes2['default'].func, placeholder: _propTypes2['default'].string, onSelect: _propTypes2['default'].func, selectedValue: _propTypes2['default'].object, clearIcon: _propTypes2['default'].node, inputMode: _propTypes2['default'].string }; var _initialiseProps = function _initialiseProps() { var _this3 = this; this.onClear = function () { _this3.setState({ str: '' }); _this3.props.onClear(null); }; this.onInputChange = function (event) { var str = event.target.value; var calendarStr = (0, _util.initializeStr)(str, _this3.state.localFormat) || ''; var _props = _this3.props, disabledDate = _props.disabledDate, format = _props.format, onChange = _props.onChange, selectedValue = _props.selectedValue; if (!str || !calendarStr) { _this3.setState({ isInputEmpty: true }); _this3.onClear(); return; } if (_this3.state.isInputEmpty) { _this3.setState({ isInputEmpty: false }); } var parsed = (0, _dayjs2['default'])(calendarStr, format[0]); var value = _this3.props.value.clone(); value = value.year(parsed.year()).month(parsed.month()).date(parsed.date()).hour(parsed.hour()).minute(parsed.minute()).second(parsed.second()); if (!value || disabledDate && disabledDate(value)) { _this3.setState({ str: str }); return; } if (selectedValue !== value || selectedValue && value && !selectedValue.isSame(value)) { _this3.setState({ str: str }); onChange(value); } }; this.onFocus = function () { _this3.setState({ hasFocus: true }); }; this.onBlur = function () { _this3.setState(function (prevState, prevProps) { return { hasFocus: false, str: (0, _util.formatDate)(prevProps.value, prevProps.format) }; }); }; this.onKeyDown = function (event) { var keyCode = event.keyCode; var _props2 = _this3.props, onSelect = _props2.onSelect, value = _props2.value, disabledDate = _props2.disabledDate; if (keyCode === _KeyCode2['default'].ENTER && onSelect) { var validateDate = !disabledDate || !disabledDate(value); if (validateDate) { if (_this3.state.isInputEmpty) { onSelect(null); } else { onSelect(value.clone()); } } event.preventDefault(); } }; this.getRootDOMNode = function () { return _reactDom2['default'].findDOMNode(_this3); }; this.focus = function () { if (dateInputInstance) { dateInputInstance.focus(); } }; this.saveDateInput = function (dateInput) { dateInputInstance = dateInput; }; }; (0, _reactLifecyclesCompat.polyfill)(DateInput); exports['default'] = DateInput; module.exports = exports['default'];