qt-public-ui
Version:
新设计规范下业务组件库
454 lines (444 loc) • 21 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = require("lodash");
var _qtPublicHooks = require("qt-public-hooks");
var _ = require("..");
var _constant = require("./constant");
var _utils = require("./utils");
var _unit = _interopRequireDefault(require("./unit"));
var _globalContext = _interopRequireDefault(require("../UmProvider/globalContext"));
var _utils2 = require("../utils");
require("./style");
var _excluded = ["style", "defaultValue", "styleType", "defaultDateType", "defaultDateConfig", "value", "disabledDate", "onChange", "dateConfig", "disabledShortcuts", "relatedDateMaxConfig", "shortcutsList", "rangeMax", "dateTypeList"];
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
var RangePicker = _antd.DatePicker.RangePicker;
var Option = _.Select.Option;
var DynamicTimePicker = function DynamicTimePicker(props) {
var style = props.style,
_props$defaultValue = props.defaultValue,
defaultValue = _props$defaultValue === void 0 ? _constant.DEFAULT_STATIC_DATE : _props$defaultValue,
_props$styleType = props.styleType,
styleType = _props$styleType === void 0 ? 'default' : _props$styleType,
_props$defaultDateTyp = props.defaultDateType,
defaultDateType = _props$defaultDateTyp === void 0 ? 'dynamic' : _props$defaultDateTyp,
defaultDateConfig = props.defaultDateConfig,
value = props.value,
disabledDate = props.disabledDate,
onChange = props.onChange,
dateConfig = props.dateConfig,
_props$disabledShortc = props.disabledShortcuts,
disabledShortcuts = _props$disabledShortc === void 0 ? [] : _props$disabledShortc,
_props$relatedDateMax = props.relatedDateMaxConfig,
relatedDateMaxConfig = _props$relatedDateMax === void 0 ? {} : _props$relatedDateMax,
_props$shortcutsList = props.shortcutsList,
shortcutsList = _props$shortcutsList === void 0 ? _constant.DYNAMIC_SHORTCUTS : _props$shortcutsList,
rangeMax = props.rangeMax,
_props$dateTypeList = props.dateTypeList,
dateTypeList = _props$dateTypeList === void 0 ? ['dynamic', 'static'] : _props$dateTypeList,
divProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
var isControlled = ('dateConfig' in props);
var gContext = (0, _react.useContext)(_globalContext["default"]);
var i18n = (gContext === null || gContext === void 0 ? void 0 : gContext.i18n) || _utils2.i18n;
var finalDateConfig = dateConfig || {};
var _useState = (0, _react.useState)((0, _utils.getDateFromProps)(finalDateConfig, defaultDateType)),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
dateValue = _useState2[0],
setDateValue = _useState2[1]; // 最终选择的日期
var _useState3 = (0, _react.useState)((finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.dateType) || defaultDateType),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
dateType = _useState4[0],
setDateType = _useState4[1]; // 时间类型:相对时段/固定时段
var _useState5 = (0, _react.useState)((finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.relatedDate) || _constant.DEFAULT_DYNAMIC_DATE),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
relatedDate = _useState6[0],
setRelatedDate = _useState6[1]; // 最终相对时段
var _useState7 = (0, _react.useState)((0, _utils.getCutomDay)(finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.relatedDate) || _constant.DEFAULT_CUSTOM),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
customDay = _useState8[0],
setCustomDay = _useState8[1]; // 自定义时段
var _useState9 = (0, _react.useState)((finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.relatedDate) && (finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.relatedDate).indexOf('custom_recent_') !== -1),
_useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
customDayShow = _useState10[0],
setCustomDayShow = _useState10[1]; // 显示自定义输入
var _useState11 = (0, _react.useState)(''),
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
staticFirstDate = _useState12[0],
setStaticFirstDate = _useState12[1];
var _useState13 = (0, _react.useState)((0, _utils.getCustomTips)(dateType, relatedDate, i18n) || ''),
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
customTips = _useState14[0],
setCustomTips = _useState14[1]; // 相对时段回选,显示选择项
var _useState15 = (0, _react.useState)(''),
_useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
hoverDate = _useState16[0],
setHoverDate = _useState16[1]; // 相对时段hover,显示选择时间段
var _useState17 = (0, _react.useState)(isControlled && value ? value : defaultValue),
_useState18 = (0, _slicedToArray2["default"])(_useState17, 2),
tempDateValue = _useState18[0],
setTempDateValue = _useState18[1];
var _useState19 = (0, _react.useState)(false),
_useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
dropdownVisible = _useState20[0],
setDropdownVisible = _useState20[1];
var _useState21 = (0, _react.useState)((finalDateConfig === null || finalDateConfig === void 0 ? void 0 : finalDateConfig.relatedDate) || _constant.DEFAULT_DYNAMIC_DATE),
_useState22 = (0, _slicedToArray2["default"])(_useState21, 2),
tempRelateDate = _useState22[0],
setTempRelateDate = _useState22[1];
var inputNumberRef = _react["default"].createRef();
var dropdownCls = (0, _qtPublicHooks.useDropdownClickAway)(function () {
setDropdownVisible(false);
});
(0, _react.useEffect)(function () {
if (isControlled) {
updateDateConfig();
}
}, [dateConfig]);
var updateDateConfig = function updateDateConfig() {
(0, _utils.getDateFromProps)(dateConfig, defaultDateType);
if (dateConfig.dateType === 'static') {
setRelatedDate(_constant.DEFAULT_DYNAMIC_DATE);
setTempRelateDate(_constant.DEFAULT_DYNAMIC_DATE);
setDateValue((0, _utils.getStaticDate)(dateConfig));
setCustomDay(_constant.DEFAULT_CUSTOM);
setDateType('static');
} else {
var _dateConfig$relatedDa = dateConfig.relatedDate,
newRelatedDate = _dateConfig$relatedDa === void 0 ? _constant.DEFAULT_DYNAMIC_DATE : _dateConfig$relatedDa;
setDateValue((0, _utils.getRelatedDateValue)(newRelatedDate));
setCustomDay((0, _utils.getCutomDay)(newRelatedDate) || _constant.DEFAULT_CUSTOM);
setRelatedDate(newRelatedDate);
setTempRelateDate(newRelatedDate);
setCustomDayShow((dateConfig === null || dateConfig === void 0 ? void 0 : dateConfig.relatedDate) && (dateConfig === null || dateConfig === void 0 ? void 0 : dateConfig.relatedDate).indexOf('custom_recent_') !== -1);
setDateType('dynamic');
}
};
(0, _react.useEffect)(function () {
setTempDateValue(dateValue);
setCustomTips((0, _utils.getCustomTips)(dateType, relatedDate, i18n));
}, [dateValue]);
(0, _react.useEffect)(function () {
if (dropdownVisible) {
setTempDateValue(dateValue);
setStaticFirstDate('');
if (isControlled) {
updateDateConfig();
} else {
setTempRelateDate(relatedDate);
setCustomDayShow(relatedDate.indexOf('custom_recent_') !== -1);
setCustomDay((0, _utils.getCutomDay)(relatedDate));
}
}
}, [dropdownVisible]);
var onCalendarChange = function onCalendarChange(dates) {
setStaticFirstDate(dates);
};
var onRangeChange = function onRangeChange(rangeValue) {
setTempDateValue(rangeValue);
setTempRelateDate('');
};
//
var onDateInputClick = function onDateInputClick(e) {
e.stopPropagation();
if (!dropdownVisible) {
setDropdownVisible(true);
setStaticFirstDate('');
}
};
// 确定按钮点击
var onClickDetermine = function onClickDetermine(e) {
e.stopPropagation();
var finalRelatedDate = relatedDate;
if (dateType === 'static') finalRelatedDate = '';
if (dateType === 'dynamic' && customDayShow) {
finalRelatedDate = "custom_recent_".concat(customDay.join('_'));
}
setTempRelateDate(finalRelatedDate);
setRelatedDate(finalRelatedDate);
setDateValue(tempDateValue);
onChange && onChange(tempDateValue, {
dateType: dateType,
relatedDate: finalRelatedDate
});
setDropdownVisible(false);
};
// 日期类型切换
var onDateTypeChange = function onDateTypeChange(newDateType) {
setDateType(newDateType);
setTempDateValue(_constant.DEFAULT_STATIC_DATE);
setHoverDate('');
setCustomDay(_constant.DEFAULT_CUSTOM);
if (newDateType === 'static') {
setTempRelateDate('');
} else {
if (staticFirstDate && staticFirstDate.length === 1) {
var currentSelectDay = document.getElementsByClassName('ant-calendar-selected-day')[0];
currentSelectDay && currentSelectDay.click();
}
setTempRelateDate(_constant.DEFAULT_DYNAMIC_DATE);
setStaticFirstDate('');
}
setCustomDayShow(false);
};
// 快捷日期选择
var onClickShortcut = function onClickShortcut(newRelatedDate) {
if (newRelatedDate === _constant.CUSTOM_DAY) {
setCustomDayShow(true);
setCustomDay(_constant.DEFAULT_CUSTOM);
setHoverDate([]);
// setRelatedDate('');
setTempDateValue('');
return;
}
var _newRelatedDate$split = newRelatedDate.split('recent_')[1].split('_'),
_newRelatedDate$split2 = (0, _slicedToArray2["default"])(_newRelatedDate$split, 2),
offset = _newRelatedDate$split2[0],
unit = _newRelatedDate$split2[1];
var dateRange = (0, _utils.getNewsDateRange)(Number(offset), unit);
setDateValue(dateRange);
setTempDateValue(dateRange);
setRelatedDate(newRelatedDate);
setTempRelateDate(newRelatedDate);
setCustomDay(_constant.DEFAULT_CUSTOM);
onChange && onChange(dateRange, {
dateType: dateType,
relatedDate: newRelatedDate
});
setDropdownVisible(false);
};
// 用户自定义输入
var onCustomdayChange = function onCustomdayChange(index, val) {
var newCustomDay = (0, _lodash.cloneDeep)(customDay);
newCustomDay[index] = val;
var _newCustomDay = (0, _slicedToArray2["default"])(newCustomDay, 2),
day = _newCustomDay[0],
unit = _newCustomDay[1];
setCustomDay(newCustomDay);
// setRelatedDate('');
if (day && unit && isValidate(day, unit)) {
var dateRange = (0, _utils.getNewsDateRange)(day, unit);
setTempDateValue(dateRange);
} else {
setTempDateValue('');
setHoverDate('');
}
};
// 用户自定义输入是否正确
var isValidate = function isValidate(day, unit) {
var maxDay = relatedDateMaxConfig[unit] || 1000;
if (!day || day > maxDay || day < 1 || day % 1 !== 0) {
return false;
}
return true;
};
// 确定按钮
var isDisabledBtn = function isDisabledBtn() {
var _customDay = (0, _slicedToArray2["default"])(customDay, 2),
day = _customDay[0],
unit = _customDay[1];
var validInput = customDayShow && !isValidate(day, unit);
if (dateType === 'dynamic' && validInput) {
return true;
}
if (dateType === 'static' && (tempDateValue === null || tempDateValue === void 0 ? void 0 : tempDateValue.length) !== 2) {
return true;
}
};
var onShortcutMouseMove = function onShortcutMouseMove(item) {
if (item === _constant.CUSTOM_DAY) {
setHoverDate([]);
} else {
setHoverDate((0, _utils.getRelatedDateValue)(item));
}
};
var onShortcutMouseLeave = function onShortcutMouseLeave() {
setHoverDate('');
};
var getShortcutShowDate = function getShortcutShowDate() {
var showDate = hoverDate || tempDateValue || [];
return showDate.map(function (date) {
return date ? date.format(_constant.DATE_FORMAT) : '';
}).join(' ~ ');
};
var checkIsActive = function checkIsActive(item) {
if (customDayShow) {
return item === 'custom_day';
} else {
return tempRelateDate === item || !tempRelateDate && item === _constant.DEFAULT_DYNAMIC_DATE;
}
};
var onClockInputNumber = function onClockInputNumber() {
(inputNumberRef === null || inputNumberRef === void 0 ? void 0 : inputNumberRef.current) && inputNumberRef.current.focus();
};
var getTabPannel = function getTabPannel() {
var maxDay = relatedDateMaxConfig[customDay[1]] || 1000;
var hasError = isDisabledBtn();
return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("div", {
className: "umui-dynamicTimePicker-calendar-tips"
}, /*#__PURE__*/_react["default"].createElement(_.Tab, {
tabs: (0, _utils.getDefaultTabs)(i18n, dateTypeList),
value: dateType,
onChange: function onChange(key) {
return setTimeout(function () {
return onDateTypeChange(key);
}, 0);
}
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "calendar-checked-text"
}, getShortcutShowDate()), /*#__PURE__*/_react["default"].createElement("div", {
className: "calendar-shortcuts"
}, shortcutsList.concat(_constant.CUSTOM_DAY).map(function (item) {
var isDisable = disabledShortcuts.indexOf(item) !== -1;
return /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])('shortcuts-item')
}, /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])('shortcuts-item-text', {
active: checkIsActive(item),
disabled: isDisable
}),
onClick: function onClick() {
return !isDisable && onClickShortcut(item);
},
onMouseMove: function onMouseMove() {
return !isDisable && onShortcutMouseMove(item);
},
onMouseLeave: function onMouseLeave() {
return !isDisable && onShortcutMouseLeave();
}
}, (0, _utils.getShortcutText)(item, i18n)));
}), customDayShow && /*#__PURE__*/_react["default"].createElement("div", {
style: {
width: '500px',
height: '40px'
}
}, /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames["default"])('calendar-custom-container', {
err: hasError && customDayShow && customDay[0]
})
}, /*#__PURE__*/_react["default"].createElement("span", null, i18n.get('过去')), /*#__PURE__*/_react["default"].createElement(_antd.InputNumber, {
placeholder: "N",
value: customDay[0],
onChange: function onChange(num) {
return onCustomdayChange(0, num);
},
style: {
width: 64,
marginRight: '4px'
},
onClick: onClockInputNumber,
autoFocus: true,
ref: inputNumberRef
}), /*#__PURE__*/_react["default"].createElement(_.Select, {
style: {
width: 64
},
value: customDay[1] || 'day',
onChange: function onChange(val) {
return onCustomdayChange(1, val);
},
getPopupContainer: function getPopupContainer() {
return document.getElementsByClassName('calendar-custom-container')[0];
}
}, /*#__PURE__*/_react["default"].createElement(Option, {
key: "day",
value: "day"
}, i18n.get('天')), /*#__PURE__*/_react["default"].createElement(Option, {
key: "week",
value: "week"
}, i18n.get('周')), /*#__PURE__*/_react["default"].createElement(Option, {
key: "month",
value: "month"
}, i18n.get('月'))), /*#__PURE__*/_react["default"].createElement("span", {
className: "err-tip"
}, i18n.get('请输入1-{maxDay}的整数', {
maxDay: maxDay
})))))), /*#__PURE__*/_react["default"].createElement("div", {
className: "umui-dynamicTimePicker-calendar-footer"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "umui-dynamicTimePicker-calendar-footer-determine",
onClick: hasError ? function () {} : onClickDetermine,
style: {
backgroundColor: hasError ? '#d9d9d9' : '#3B82FE'
}
}, i18n.get('确定'))));
};
var mixedDisabledDate = function mixedDisabledDate(date) {
if (!date) return false;
var userDisabled = !!disabledDate && disabledDate(date);
var numberRangeMax = Number(rangeMax);
if (rangeMax && numberRangeMax > 1 && staticFirstDate && staticFirstDate.length) {
var _staticFirstDate$, _staticFirstDate$2;
// 有一个会是null
var _staticFirstDate = staticFirstDate === null || staticFirstDate === void 0 ? void 0 : staticFirstDate.filter(function (item) {
return !!item;
});
var end = (_staticFirstDate$ = _staticFirstDate[0]) === null || _staticFirstDate$ === void 0 ? void 0 : _staticFirstDate$.clone().add(numberRangeMax, 'days');
var start = (_staticFirstDate$2 = _staticFirstDate[0]) === null || _staticFirstDate$2 === void 0 ? void 0 : _staticFirstDate$2.clone().subtract(numberRangeMax, 'days');
return date.isAfter(end) || date.isBefore(start) || userDisabled;
}
return userDisabled;
};
// const getInputWidth = (str = '') => {
// const doubleByteStrTotal = (str.match(/[^\x00-\xff]/g) || []).length;
// return doubleByteStrTotal * 12 + (str.length - doubleByteStrTotal) * 6 + 60;
// };
var inputValue = customTips + dateValue.map(function (date) {
return date ? date.format(_constant.DATE_FORMAT) : '';
}).join(' ~ ');
return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
style: {
display: 'inline-block'
}
}, divProps), /*#__PURE__*/_react["default"].createElement("div", {
className: "umui-dynamicTimePicker",
style: style
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "umui-dynamicTimePicker-input-wrap"
}, /*#__PURE__*/_react["default"].createElement(_.Input, {
styleType: styleType === 'borderless' ? 'underline' : 'default',
value: inputValue,
suffix: /*#__PURE__*/_react["default"].createElement(_.IconSlim, {
type: "umicon-calendar",
onClick: onDateInputClick
}),
placeholder: "".concat(i18n.get('开始日期'), "~").concat(i18n.get('结束日期')),
className: (0, _classnames["default"])('umicon-calendar-input-prefix', {
'dynamic-none-calendar-input-prefix': !customTips
}),
onClick: onDateInputClick,
style: {
textAlign: styleType === 'borderless' ? 'left' : 'center',
width: (0, _utils2.getTextWidthAndHeight)(inputValue).width + 78 // getInputWidth(inputValue)
},
readOnly: true
}), /*#__PURE__*/_react["default"].createElement(RangePicker, {
allowClear: false,
value: tempDateValue,
open: dropdownVisible,
renderExtraFooter: getTabPannel,
onCalendarChange: onCalendarChange,
onChange: onRangeChange,
disabledDate: mixedDisabledDate,
className: "umui-dynamicTimePicker-hidden",
getPopupContainer: _utils2.getPopupContainer,
dropdownClassName: (0, _classnames["default"])('umui-dynamicTimePicker-calendar umui-dynamicTimePicker-calendar-determine', dropdownCls, {
'umui-dynamicTimePicker-calender-hidden': dateType === 'dynamic'
})
}))));
};
DynamicTimePicker.displayName = 'DynamicTimePicker';
DynamicTimePicker.getRelatedDateValue = _utils.getRelatedDateValue;
DynamicTimePicker.timeUnitMapping = _utils.timeUnitMapping;
DynamicTimePicker.CycleUnit = _unit["default"];
var _default = exports["default"] = DynamicTimePicker;