deer-ui
Version:
React.js UI components for PC Web
414 lines (361 loc) • 18.7 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _reactDom = require("react-dom");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _moment = _interopRequireDefault(require("moment"));
var _scrollIntoViewIfNeeded = _interopRequireDefault(require("scroll-into-view-if-needed"));
var _localeWrapper = _interopRequireDefault(require("../locale/localeWrapper"));
var _classnames = _interopRequireDefault(require("classnames"));
var _input = _interopRequireDefault(require("../input"));
var _spin = _interopRequireDefault(require("../spin"));
var _icon = require("../icon");
function _createSuper(Derived) { return function () { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var sizes = {
default: "default",
small: "small",
large: "large"
};
var WEEKDAY = 7;
var DatePicker = /*#__PURE__*/function (_Component) {
(0, _inherits2.default)(DatePicker, _Component);
var _super = _createSuper(DatePicker);
function DatePicker(props) {
var _this;
(0, _classCallCheck2.default)(this, DatePicker);
_this = _super.call(this, props);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "state", {
momentSelected: _this.props.defaultValue || _this.props.value || (0, _moment.default)(),
momentSelectedTemp: _this.props.defaultValue || _this.props.value || (0, _moment.default)(),
visible: _this.props.visible || false,
isSelectedMoment: !!(_this.props.defaultValue || _this.props.value),
left: 0,
top: 0,
width: 0
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onClickOutsideHandler", function (e) {
e.stopPropagation();
if (_this.state.visible && !_this.toggleContainer.current.contains(e.target) && !_this.wrapper.current.contains(e.target)) {
_this.setState({
visible: false
});
}
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "addMonth", function () {
_this.setState({
momentSelected: _this.state.momentSelected.clone().add(1, "month")
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "subtractMonth", function () {
_this.setState({
momentSelected: _this.state.momentSelected.clone().add(-1, "month")
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onClickHandler", function () {
var visible = !_this.state.visible;
_this.setState({
visible: visible
}, function () {
if (visible) {
_this.setWrapperBounding(function () {
(0, _scrollIntoViewIfNeeded.default)(_this.wrapper.current, {
scrollMode: "if-needed",
behavior: "smooth",
block: "nearest",
inline: "nearest"
});
});
}
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selectedDate", function (currentDate) {
return function (isNextMonth) {
return function () {
var momentSelected = _this.state.momentSelected.clone();
if (isNextMonth === true) {
momentSelected.add(1, "month").date(currentDate);
} else if (isNextMonth === false) {
momentSelected.subtract(1, "month").date(currentDate);
} else {
momentSelected.date(currentDate);
}
_this.setState({
momentSelected: momentSelected,
visible: false,
momentSelectedTemp: momentSelected.clone(),
isSelectedMoment: true
}, function () {
_this.props.onChange(currentDate, _this.state.momentSelected, _this.state.momentSelected.format(_this.props.format));
});
};
};
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderCalendarContent", function () {
var _this$props = _this.props,
prefixCls = _this$props.prefixCls,
disabledDate = _this$props.disabledDate,
showDayInPrevMonth = _this$props.showDayInPrevMonth,
showDayInNextMonth = _this$props.showDayInNextMonth,
locale = _this$props.locale;
var momentDateFirst = _this.state.momentSelected.clone().date(1);
var dayOfFirstDate = momentDateFirst.day(); //获取第一天在周几 0是周天
var weekdayInMonth = momentDateFirst.isoWeekday(); //获取或设置 ISO 星期几 其中 1 是星期一、7 是星期日。
var momentLastMonth = momentDateFirst.clone().add(-1, "months");
var lastMonthDaysInMonth = momentLastMonth.daysInMonth(); //获取上个月的天数
var daysInMonth = momentDateFirst.daysInMonth(); //获取本月天数
var lastDaysInMonth = (daysInMonth + weekdayInMonth - 1) % WEEKDAY; // 后面还剩余几天
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", null, locale.week_days.map(function (day) {
return /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-item"), "".concat(prefixCls, "-day-title")),
key: day
}, day);
})), new Array(weekdayInMonth - 1).fill().map(function (_, date) {
var currentDate = dayOfFirstDate === 0 ? lastMonthDaysInMonth - WEEKDAY + date + 2 : lastMonthDaysInMonth - dayOfFirstDate + date + 2;
var isDisabled = disabledDate(momentDateFirst.clone().date(date + 1));
return /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-item"), "".concat(prefixCls, "-last-month"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled-date"), isDisabled)),
key: "first-date-".concat(date),
onClick: !isDisabled ? _this.selectedDate(currentDate)(false) : undefined
}, showDayInPrevMonth && currentDate);
}), new Array(daysInMonth).fill(null).map(function (_, date) {
var _cls2;
var currentDate = date + 1;
var isDisabled = disabledDate(momentDateFirst.clone().date(currentDate));
return /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-item"), "".concat(prefixCls, "-current-month"), (_cls2 = {}, (0, _defineProperty2.default)(_cls2, "".concat(prefixCls, "-selected-date"), _this.state.momentSelected.date() === currentDate), (0, _defineProperty2.default)(_cls2, "".concat(prefixCls, "-disabled-date"), isDisabled), _cls2)),
key: "date-".concat(date),
onClick: !isDisabled ? _this.selectedDate(currentDate)() : undefined
}, currentDate);
}), new Array(lastDaysInMonth === 0 ? 0 : WEEKDAY - lastDaysInMonth).fill(null).map(function (_, date) {
var currentDate = date + 1;
var isDisabled = disabledDate(momentDateFirst.clone().add(1, "month").date(currentDate));
return /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-item"), "".concat(prefixCls, "-next-month"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled-date"), isDisabled)),
key: "next-date-".concat(date),
onClick: showDayInNextMonth && !isDisabled ? _this.selectedDate(currentDate)(true) : undefined
}, showDayInNextMonth && currentDate);
}));
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onClear", function () {
var momentSelected = (0, _moment.default)();
_this.setState({
momentSelected: momentSelected,
visible: _this.state.visible === null ? null : false,
isSelectedMoment: false
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onSelectToday", function () {
var momentSelected = (0, _moment.default)();
_this.setState({
momentSelected: momentSelected,
selectedDate: momentSelected.date(),
isSelectedMoment: false
}, function () {
_this.selectedDate(_this.state.selectedDate)()();
});
});
_this.wrapper = (0, _react.createRef)();
_this.toggleContainer = (0, _react.createRef)();
return _this;
}
(0, _createClass2.default)(DatePicker, [{
key: "componentDidMount",
value: function componentDidMount() {
window.addEventListener("click", this.onClickOutsideHandler, false);
if (this.props.visible) {
this.setWrapperBounding();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
window.removeEventListener("click", this.onClickOutsideHandler);
}
}, {
key: "setWrapperBounding",
value: function setWrapperBounding() {
var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {};
var _this$getWrapperBound = this.getWrapperBounding(),
left = _this$getWrapperBound.left,
top = _this$getWrapperBound.top,
width = _this$getWrapperBound.width;
this.setState({
left: left,
top: top,
width: width
}, cb);
}
}, {
key: "getWrapperBounding",
value: function getWrapperBounding() {
var _this$toggleContainer = this.toggleContainer.current.getBoundingClientRect(),
left = _this$toggleContainer.left,
top = _this$toggleContainer.top,
height = _this$toggleContainer.height,
width = _this$toggleContainer.width;
var _this$wrapper$current = this.wrapper.current.getBoundingClientRect(),
wrapperHeight = _this$wrapper$current.height;
var _window = window,
scrollY = _window.scrollY,
scrollX = _window.scrollX;
var positions = {
//显示在上
top: {
top: top + scrollY - wrapperHeight - 10,
left: left + scrollX,
width: width
},
//显示在下
bottom: {
top: top + height + scrollY,
left: left + scrollX,
width: width
}
};
return positions[this.props.position];
}
}, {
key: "render",
value: function render() {
var _cls5, _cls7;
var _this$state = this.state,
visible = _this$state.visible,
width = _this$state.width,
left = _this$state.left,
top = _this$state.top,
momentSelectedTemp = _this$state.momentSelectedTemp,
isSelectedMoment = _this$state.isSelectedMoment;
var _this$props2 = this.props,
prefixCls = _this$props2.prefixCls,
className = _this$props2.className,
size = _this$props2.size,
getPopupContainer = _this$props2.getPopupContainer,
style = _this$props2.style,
placeholder = _this$props2.placeholder,
allowClear = _this$props2.allowClear,
disabled = _this$props2.disabled,
loading = _this$props2.loading,
tip = _this$props2.tip,
format = _this$props2.format,
suffix = _this$props2.suffix,
extraFooter = _this$props2.extraFooter,
showToday = _this$props2.showToday,
locale = _this$props2.locale,
disabledDate = _this$props2.disabledDate,
showDayInPrevMonth = _this$props2.showDayInPrevMonth,
showDayInNextMonth = _this$props2.showDayInNextMonth,
attr = (0, _objectWithoutProperties2.default)(_this$props2, ["prefixCls", "className", "size", "getPopupContainer", "style", "placeholder", "allowClear", "disabled", "loading", "tip", "format", "suffix", "extraFooter", "showToday", "locale", "disabledDate", "showDayInPrevMonth", "showDayInNextMonth"]);
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
className: (0, _classnames.default)(prefixCls, className)
}, attr, {
style: style,
ref: this.toggleContainer
}), /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-inner"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-active"), visible))
}, /*#__PURE__*/_react.default.createElement(_input.default, {
value: isSelectedMoment ? momentSelectedTemp.format(format) : "",
disabled: disabled,
readOnly: true,
size: size,
placeholder: placeholder || locale.placeholder,
style: {
width: style && style.width
},
suffix: suffix,
allowClear: allowClear,
onClear: this.onClear,
onClick: this.onClickHandler
})), (0, _reactDom.createPortal)( /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-content"), (_cls5 = {}, (0, _defineProperty2.default)(_cls5, "".concat(prefixCls, "-open"), visible), (0, _defineProperty2.default)(_cls5, "".concat(prefixCls, "-close"), !visible), _cls5)),
ref: this.wrapper,
style: {
width: width,
left: left,
top: top
}
}, /*#__PURE__*/_react.default.createElement(_spin.default, {
spinning: loading,
tip: tip,
size: "large"
}, /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-header"))
}, /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-date"))
}, this.state.momentSelected.year(), "\u5E74 ", " ", this.state.momentSelected.month() + 1, "\u6708"), /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-switch"))
}, /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-switch-group")),
onClick: this.subtractMonth
}, /*#__PURE__*/_react.default.createElement(_icon.ArrowLeftIcon, null)), /*#__PURE__*/_react.default.createElement("span", {
className: (0, _classnames.default)("".concat(prefixCls, "-switch-group")),
onClick: this.addMonth
}, /*#__PURE__*/_react.default.createElement(_icon.ArrowRightIcon, null)))), /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-items"), (0, _defineProperty2.default)({}, "".concat(prefixCls, "-loading"), loading))
}, this.renderCalendarContent()), extraFooter && /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(prefixCls, "-footer-extra")
}, extraFooter), showToday || allowClear ? /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-footer"), (_cls7 = {}, (0, _defineProperty2.default)(_cls7, "".concat(prefixCls, "-has-extra-footer"), extraFooter), (0, _defineProperty2.default)(_cls7, "".concat(prefixCls, "-has-border"), showToday || allowClear), _cls7))
}, showToday && /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-footer-today")),
onClick: this.onSelectToday
}, locale.today), allowClear && /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-footer-clear")),
onClick: this.onClear
}, locale.clear)) : undefined)), getPopupContainer()));
}
}]);
return DatePicker;
}(_react.Component);
(0, _defineProperty2.default)(DatePicker, "propTypes", {
prefixCls: _propTypes.default.string.isRequired,
format: _propTypes.default.string,
placeholder: _propTypes.default.string,
allowClear: _propTypes.default.bool,
size: _propTypes.default.oneOf(Object.values(sizes)),
onChange: _propTypes.default.func,
getPopupContainer: _propTypes.default.func,
position: _propTypes.default.string,
loading: _propTypes.default.bool,
tip: _propTypes.default.string,
showDayInPrevMonth: _propTypes.default.bool,
showDayInNextMonth: _propTypes.default.bool,
showToday: _propTypes.default.bool
});
(0, _defineProperty2.default)(DatePicker, "defaultProps", {
prefixCls: "deer-ui-date-picker",
format: "YYYY-MM-DD",
size: "default",
placeholder: "",
allowClear: true,
onChange: function onChange() {},
getPopupContainer: function getPopupContainer() {
return document.body;
},
position: "bottom",
loading: false,
tip: "",
suffix: /*#__PURE__*/_react.default.createElement(_icon.CalendarIcon, null),
disabledDate: function disabledDate() {
return false;
},
showDayInPrevMonth: true,
showDayInNextMonth: true,
showToday: true
});
var _default = (0, _localeWrapper.default)(DatePicker, 'DatePicker');
exports.default = _default;