zent
Version:
一套前端设计语言和基于React的实现
374 lines (317 loc) • 12.4 kB
JavaScript
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'];
;