UNPKG

zent

Version:

一套前端设计语言和基于React的实现

374 lines (317 loc) 12.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _class, _temp, _initialiseProps; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _classnames = require('zent-utils/classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _DatePanel = require('./date/DatePanel'); var _DatePanel2 = _interopRequireDefault(_DatePanel); var _PanelFooter = require('./common/PanelFooter'); var _PanelFooter2 = _interopRequireDefault(_PanelFooter); var _utils = require('./utils'); var _format = require('./utils/format'); var _clickOutside = require('./utils/clickOutside'); var _clickOutside2 = _interopRequireDefault(_clickOutside); var _constants = require('./constants'); 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 isValidValue = function isValidValue(val) { if (!(0, _utils.isArray)(val)) return false; var ret = val.filter(function (item) { return !!item; }); return ret.length === 2; }; var getDateTime = function getDateTime(date, time) { return new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds()); }; var getState = function getState(props) { var showPlaceholder = void 0; var selected = []; var actived = []; var range = []; var value = []; var format = props.format; if (isValidValue(props.value)) { showPlaceholder = false; if (props.showTime) { format = props.format + ' ' + (props.showTime.format || _constants.TIME_PROPS.format); } var tmp = [(0, _format.parseDate)(props.value[0], format), (0, _format.parseDate)(props.value[1], format)]; selected = tmp.slice(); actived = tmp.slice(); range = tmp.slice(); if (props.showTime) { var tmpFull = [getDateTime(selected[0], actived[0]), getDateTime(selected[1], actived[1])]; value = [(0, _format.formatDate)(tmpFull[0], format), (0, _format.formatDate)(tmpFull[1], format)]; } else { value = [(0, _format.formatDate)(selected[0], format), (0, _format.formatDate)(selected[1], format)]; } } else { showPlaceholder = true; var now = new Date(); actived = [now, (0, _utils.goMonths)(now, 1)]; } return { value: value, range: range, selected: selected, actived: actived, activedTime: actived.slice(), openPanel: false, showPlaceholder: showPlaceholder }; }; var DateRangePicker = (_temp = _class = function (_Component) { _inherits(DateRangePicker, _Component); function DateRangePicker(props) { _classCallCheck(this, DateRangePicker); var _this = _possibleConstructorReturn(this, (DateRangePicker.__proto__ || Object.getPrototypeOf(DateRangePicker)).call(this, props)); _initialiseProps.call(_this); _this.state = getState(props); return _this; } _createClass(DateRangePicker, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(next) { var state = getState(next); this.setState(state); } }, { key: 'render', value: function render() { var _this2 = this; var state = this.state; var props = this.props; var prefixCls = props.prefix + '-datetime-picker ' + props.className; var inputCls = (0, _classnames2['default'])({ 'picker-input--range picker-input': true, 'picker-input--filled': !state.showPlaceholder, 'picker-input--showTime': props.showTime, 'picker-input--disabled': props.disabled }); var rangePicker = void 0; var getTimeConfig = function getTimeConfig(type) { if (!props.showTime) return false; var timeFnMap = { start: _this2.onChangeStartTime, end: _this2.onChangeEndTime }; var indexMap = { start: 0, end: 1 }; return _extends({}, { actived: state.activedTime[indexMap[type]], format: _constants.TIME_PROPS.format, disabledTime: _constants.TIME_PROPS.disabledTime }, props.showTime || {}, { disabledTime: props.disabledTime && props.disabledTime(type), onChange: timeFnMap[type] }); }; if (state.openPanel) { var pickerCls = (0, _classnames2['default'])({ 'range-picker': true, 'range-picker--showTime': props.showTime }); rangePicker = _react2['default'].createElement( 'div', { className: pickerCls }, _react2['default'].createElement( 'div', { className: 'date-picker' }, _react2['default'].createElement(_DatePanel2['default'], { range: state.range, showTime: getTimeConfig('start'), actived: state.actived[0], selected: state.selected, disabledDate: this.isDisabled, onSelect: this.onSelect, onChange: this.onChangeStart, onHover: this.onHover }) ), _react2['default'].createElement( 'div', { className: 'date-picker' }, _react2['default'].createElement(_DatePanel2['default'], { range: state.range, showTime: getTimeConfig('end'), actived: state.actived[1], selected: state.selected, disabledDate: this.isDisabled, onSelect: this.onSelect, onChange: this.onChangeEnd, onHover: this.onHover }) ), _react2['default'].createElement(_PanelFooter2['default'], { onClickButton: this.onConfirm }) ); } return _react2['default'].createElement( 'div', { className: prefixCls, ref: function ref(_ref) { return _this2.picker = _ref; } }, _react2['default'].createElement( 'div', { className: 'picker-wrapper' }, _react2['default'].createElement( 'div', { className: inputCls, onClick: this.onClickInput }, state.showPlaceholder ? props.placeholder.join(' ~ ') : state.value.join(' ~ '), _react2['default'].createElement('span', { className: 'zenticon zenticon-calendar-o' }), _react2['default'].createElement('span', { onClick: this.onClearInput, className: 'zenticon zenticon-close-circle' }) ), state.openPanel ? rangePicker : '' ) ); } }]); return DateRangePicker; }(_react.Component), _class.defaultProps = _constants.RANGE_PROPS, _initialiseProps = function _initialiseProps() { var _this3 = this; this.clickOutside = function (e) { if (!_this3.picker.contains(e.target)) { _this3.setState({ openPanel: false }); } }; this.onHover = function (val) { var _state = _this3.state, selected = _state.selected, range = _state.range; var scp = selected.slice(); var rcp = range.slice(); if (scp.length !== 1) { rcp.splice(0, 2); return false; } if (rcp[0] && rcp[0] < val) { rcp.splice(1, 1, val); _this3.setState({ range: rcp }); } }; this.onSelect = function (val) { var _state2 = _this3.state, selected = _state2.selected, actived = _state2.actived, range = _state2.range; var scp = selected.slice(); var acp = actived.slice(); var rcp = range.slice(); if (scp.length === 2) { scp.splice(0, 2, val); rcp.splice(0, 2, val); acp.splice(0, 2, val, (0, _utils.goMonths)(val, 1)); } else if (scp[0] && scp[0] < val) { scp.splice(1, 1, val); if (scp[0].getMonth() < val.getMonth()) { acp.splice(1, 1, val); } } else { scp.splice(0, 1, val); rcp.splice(0, 1, val); acp.splice(0, 1, val); } _this3.setState({ selected: scp, actived: acp, range: rcp }); }; this.isDisabled = function (val) { var props = _this3.props; if (props.disabledDate) { if ((0, _utils.isFunction)(props.disabledDate)) { return props.disabledDate(val); } if (isValidValue(props.disabledDate)) { var format = props.format; if (props.showTime) { format = props.format + ' ' + (props.showTime.format || _constants.TIME_PROPS.format); } var tmp = [(0, _format.parseDate)(props.disabledDate[0], format), (0, _format.parseDate)(props.disabledDate[1], format)]; return !(val > tmp[0] && val < new Date(tmp[1])); } } return false; }; this.onChangeDate = function (val, i) { var actived = _this3.state.actived; var acp = actived.slice(); acp.splice(i, 1, val); _this3.setState({ actived: acp }); }; this.onChangeStart = function (val) { _this3.onChangeDate(val, 0); }; this.onChangeEnd = function (val) { _this3.onChangeDate(val, 1); }; this.onChangeTime = function (val, i) { var activedTime = _this3.state.activedTime; var tcp = activedTime.slice(); tcp.splice(i, 1, val); _this3.setState({ activedTime: tcp }); }; this.onChangeStartTime = function (val) { _this3.onChangeTime(val, 0); }; this.onChangeEndTime = function (val) { _this3.onChangeTime(val, 1); }; this.onClickInput = function () { if (_this3.props.disabled) return; _this3.setState({ openPanel: !_this3.state.openPanel }); }; this.onClearInput = function (evt) { evt.stopPropagation(); _this3.props.onChange([]); }; this.onConfirm = function () { var _state3 = _this3.state, value = _state3.value, selected = _state3.selected, activedTime = _state3.activedTime; var props = _this3.props; if (selected.length !== 2) { return false; } var vcp = value.slice(); if (props.showTime) { var tmp = [getDateTime(selected[0], activedTime[0]), getDateTime(selected[1], activedTime[1])]; var tmpFormat = props.format + ' ' + (props.showTime.format || _constants.TIME_PROPS.format); vcp = [(0, _format.formatDate)(tmp[0], tmpFormat), (0, _format.formatDate)(tmp[1], tmpFormat)]; } else { vcp = [(0, _format.formatDate)(selected[0], props.format), (0, _format.formatDate)(selected[1], props.format)]; } _this3.setState({ value: vcp, showPlaceholder: false, openPanel: false }); _this3.props.onChange(vcp); }; }, _temp); exports['default'] = (0, _clickOutside2['default'])(DateRangePicker); module.exports = exports['default'];