UNPKG

qt-public-ui

Version:

新设计规范下业务组件库

210 lines (209 loc) 8.58 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; var _excluded = ["useShortcuts", "usePannels", "formatTextFn", "formatTabTextFn", "style", "defaultValue", "styleType", "value", "disabledDate", "onChange", "rangeMax", "shortcutsOnly", "radioMax"]; import React, { useState, useEffect, useRef } from 'react'; import { DatePicker } from 'antd'; import classnames from 'classnames'; import moment from 'moment'; import { Radio, IconSlim as Icon } from '..'; import constants from './constant'; import { useDropdownClickAway } from 'qt-public-hooks'; import { getRangeByDate, dateType2Date, date2DateType, getValueByStatus, getTempDateType, getValidUsePannels } from './utils'; import './style'; var getRadioOptions = constants.getRadioOptions, getTabOptions = constants.getTabOptions; var RangePicker = DatePicker.RangePicker; var CyclePicker = function CyclePicker(props) { var useShortcuts = props.useShortcuts, usePannels = props.usePannels, formatTextFn = props.formatTextFn, formatTabTextFn = props.formatTabTextFn, style = props.style, defaultValue = props.defaultValue, _props$styleType = props.styleType, styleType = _props$styleType === void 0 ? 'default' : _props$styleType, value = props.value, disabledDate = props.disabledDate, onChange = props.onChange, _props$rangeMax = props.rangeMax, rangeMax = _props$rangeMax === void 0 ? 0 : _props$rangeMax, shortcutsOnly = props.shortcutsOnly, radioMax = props.radioMax, divProps = _objectWithoutPropertiesLoose(props, _excluded); var isControlled = ('value' in props); var _usePannels = getValidUsePannels(usePannels); var tabOptions = getTabOptions(_usePannels); var _useState = useState(date2DateType(isControlled ? value : defaultValue, useShortcuts, _usePannels)), dateType = _useState[0], setDateType = _useState[1]; var _useState2 = useState(dateType2Date(isControlled ? value : defaultValue)), dateValue = _useState2[0], setDateValue = _useState2[1]; // 使用场景:点击RangePicker并切换tab后未选择时间 var _useState3 = useState(null), relatedDate = _useState3[0], setRelatedDate = _useState3[1]; // 相关时间,用于自定义时间的判断 var _useState4 = useState(dateType), preDateType = _useState4[0], setPreDateType = _useState4[1]; // 记录上一次的datetype用重制 var _useState5 = useState(false), resetType = _useState5[0], setResetType = _useState5[1]; // 是否重置datetype var dropdownCls = useDropdownClickAway(function () { setResetType(true); }); var _useState6 = useState(dateType), onChangeDateType = _useState6[0], setOnChangeDateType = _useState6[1]; var ref = useRef(); var _useState7 = useState(0), refreshKey = _useState7[0], setRefreshKey = _useState7[1]; // 跟新key,用于关闭Calendar /* 受控组件 */ useEffect(function () { if (isControlled) { var dtValue = date2DateType(value, useShortcuts, _usePannels); if (onChangeDateType === 'unit_custom') { setDateType(dtValue); } else { setDateType(onChangeDateType); } setPreDateType(dtValue); setDateValue(dateType2Date(value)); } }, [value]); useEffect(function () { setRelatedDate(null); setResetType(false); if (ref.current && typeof ref.current.blur === 'function') { ref.current.blur(); // 让自定义选完时blur } }, [dateValue]); var onRadioChange = function onRadioChange(e) { var rValue = e.target.value; !isControlled && setDateType(rValue); !isControlled && setDateValue(getValueByStatus(rValue)); setOnChangeDateType(rValue); onChange && onChange(dateType2Date(rValue), rValue); }; var onTabClick = function onTabClick(e) { var tValue = e.target && e.target.getAttribute('data-value'); tValue && tValue !== dateType && setDateType(tValue); }; var onCalendarChange = function onCalendarChange(rangeValue, b, info) { var _rangeValue = rangeValue; setOnChangeDateType('unit_custom'); var index = info.range === 'start' ? 0 : 1; if (getTempDateType(dateType, tabOptions) !== 'unit_custom') { // 非自定义 只需点一下 var range = getRangeByDate(_rangeValue[index], dateType, index); var dtValue = date2DateType(range, useShortcuts, _usePannels); setRelatedDate(null); setRefreshKey(function (pre) { return pre + 1; }); !isControlled && setResetType(false); !isControlled && setDateValue(range); !isControlled && setDateType(dtValue); onChange && onChange(range, dtValue); } else if (relatedDate === null) { // 自定义选中范围的其中一个值,但此时先不改变datevalue setRelatedDate(_rangeValue[index]); } else { // 自定义的第二次点击,此时改变datevalue var _dtValue = date2DateType(_rangeValue, useShortcuts, _usePannels); !isControlled && setResetType(false); !isControlled && setDateValue(_rangeValue); !isControlled && setDateType(_dtValue); onChange && onChange(_rangeValue, _dtValue); setResetType(false); } }; var mixedDisabledDate = function mixedDisabledDate(date) { if (!date) return false; var userDisabled = !!disabledDate && disabledDate(date); if (rangeMax > 1 && relatedDate) { var end = moment(relatedDate).add(rangeMax, 'days'); var start = moment(relatedDate).subtract(rangeMax, 'days'); return date.isBefore(start) || date.isAfter(end) || userDisabled; } return userDisabled; }; return /*#__PURE__*/React.createElement("div", _extends({ style: { display: 'inline-block' } }, divProps), /*#__PURE__*/React.createElement("div", { className: "umui-cyclePicker", style: style }, /*#__PURE__*/React.createElement(Radio.Group, { onChange: onRadioChange, max: radioMax, value: dateType, style: { marginRight: 8 }, styleType: styleType }, getRadioOptions(useShortcuts).map(function (opt) { var dateRange = dateType2Date(opt.value); var disabled = dateRange[1].isBefore(dateRange[0]); // 若是本周/本月第一天则disable return /*#__PURE__*/React.createElement(Radio.Button, { disabled: disabled, value: opt.value, key: opt.value }, formatTextFn ? formatTextFn(opt) || opt.name : opt.name); })), !shortcutsOnly && /*#__PURE__*/React.createElement(RangePicker, { allowClear: false, value: dateValue, separator: "\u4E00", suffixIcon: /*#__PURE__*/React.createElement(Icon, { type: "umicon-calendar", className: "umui-icon-calendar" }), key: refreshKey, panelRender: function panelRender(panelNode) { var _tabOptions$find; var tempDateType = getTempDateType(dateType, tabOptions); var currTips = ((_tabOptions$find = tabOptions.find(function (tab) { return tab.value === tempDateType; })) === null || _tabOptions$find === void 0 ? void 0 : _tabOptions$find.tips) || '请选择日期'; return /*#__PURE__*/React.createElement("div", { style: { display: 'flex' } }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("ul", { className: "umui-cyclePicker-calendar-tabs", onClick: onTabClick }, tabOptions.map(function (opt) { return /*#__PURE__*/React.createElement("li", { key: opt.value, className: classnames('umui-cyclePicker-calendar-tab', { 'tab-active': opt.value === tempDateType }), "data-value": opt.value }, formatTabTextFn ? formatTabTextFn(opt) || opt.name : opt.name); }))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", { className: "umui-cyclePicker-calendar-tips" }, currTips), panelNode)); }, ref: ref, onCalendarChange: onCalendarChange, disabledDate: mixedDisabledDate, onOpenChange: function onOpenChange(state) { if (!state) { // 关闭时 setRelatedDate(null); if (resetType) { setDateType(preDateType); } } else { setPreDateType(dateType); } setResetType(false); }, dropdownClassName: classnames('umui-cyclePicker-calendar', dropdownCls, { 'umui-cyclePicker-custom-only': _usePannels && _usePannels.length === 0 }) }))); }; export default CyclePicker;