UNPKG

qt-public-ui

Version:

新设计规范下业务组件库

272 lines (271 loc) 11.4 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", "isShowDetermine"]; import React, { useState, useEffect } from 'react'; import classnames from 'classnames'; import moment from 'moment'; import { isFunction } from 'lodash'; import { Icon, Input, Radio, DatePickerAntd3 as DatePicker } from '..'; import constants from './constant'; import { useDropdownClickAway } from 'qt-public-hooks'; import { getRangeByDate, dateType2Date, date2DateType, getValueByStatus, getTempDateType, getValidUsePannels } from './utils'; import './style.v3.less'; var getRadioOptions = constants.getRadioOptions, getTabOptions = constants.getTabOptions; var RangePicker = DatePicker.RangePicker; var DATE_FORMAT = 'YYYY-MM-DD'; var CyclePickerV3 = function CyclePickerV3(props) { var _tabOptions$find2; 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, isShowDetermine = props.isShowDetermine, 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]; var _useState3 = useState(null), relatedDate = _useState3[0], setRelatedDate = _useState3[1]; var _useState4 = useState(dateType), preDateType = _useState4[0], setPreDateType = _useState4[1]; var _useState5 = useState(false), resetType = _useState5[0], setResetType = _useState5[1]; var _useState6 = useState(false), dropdownVisible = _useState6[0], setDropdownVisible = _useState6[1]; // eslint-disable-next-line @typescript-eslint/no-unused-vars var _useState7 = useState(dateType2Date(isControlled ? value : defaultValue)), showDetermineDateValue = _useState7[0], setShowDetermineDateValue = _useState7[1]; var _useState8 = useState(false), isDisabled = _useState8[0], setIsDisabled = _useState8[1]; var dropdownCls = useDropdownClickAway(function () { setResetType(true); setDropdownVisible(false); setIsDisabled(true); }); var _useState9 = useState(dateType), onChangeDateType = _useState9[0], setOnChangeDateType = _useState9[1]; /* 受控组件 */ useEffect(function () { if (isControlled && !isShowDetermine) { var dtValue = date2DateType(value, useShortcuts, _usePannels); if (onChangeDateType === 'unit_custom') { setDateType(dtValue); } else { setDateType(onChangeDateType); } setPreDateType(dtValue); setDateValue(dateType2Date(value)); } }, [value]); useEffect(function () { if (!dropdownVisible && resetType) { setDateType(preDateType); setResetType(false); // setDateValue(showDetermineDateValue); // fix onblur issue } }, [dropdownVisible]); 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); if (isShowDetermine && tValue !== 'unit_custom') { !isControlled && setDateType(tValue); setDateValue(dateType2Date(tValue)); setOnChangeDateType(tValue); setDropdownVisible(false); onChange && onChange(dateType2Date(tValue), tValue); } }; var onCalendarChange = function onCalendarChange(rangeValue) { var _rangeValue = rangeValue; !isShowDetermine && setOnChangeDateType('unit_custom'); isFunction(props.onCalendarChange) && props.onCalendarChange(rangeValue, dateType); if (dateType !== 'unit_custom') { var range = getRangeByDate(_rangeValue[0], dateType); var dtValue = date2DateType(range, useShortcuts, _usePannels); setRelatedDate(null); !isControlled && setResetType(false); !isShowDetermine && setDropdownVisible(false); (!isControlled || isShowDetermine) && setDateValue(range); !isControlled && !isShowDetermine && setDateType(dtValue); isShowDetermine && setDateType('unit_custom'); isShowDetermine && setIsDisabled(false); !isShowDetermine && onChange && onChange(range, dtValue); } else if (_rangeValue.length === 1) { setRelatedDate(_rangeValue[0]); isShowDetermine && setDateType('unit_custom'); isShowDetermine && setIsDisabled(false); } else { isShowDetermine && setDateType('unit_custom'); setRelatedDate(null); isShowDetermine && setIsDisabled(false); } }; var onRangeChange = function onRangeChange(rangeValue) { var _rangeValue = rangeValue; var dtValue = date2DateType(_rangeValue, useShortcuts, _usePannels); !isShowDetermine && setDropdownVisible(false); (!isControlled || isShowDetermine) && setDateValue(_rangeValue); !isControlled && setResetType(false); !isControlled && setDateType(dtValue); isShowDetermine && setIsDisabled(true); !isShowDetermine && onChange && onChange(_rangeValue, dtValue); }; var onDateInputClick = function onDateInputClick(e) { e.stopPropagation(); if (!dropdownVisible) { setResetType(false); setDropdownVisible(true); setPreDateType(dateType); } setDateType(getTempDateType(dateType, tabOptions)); }; var onClickDetermine = function onClickDetermine() { var date = dateValue; onChange && onChange(dateValue, dateType); setShowDetermineDateValue(date); setDropdownVisible(false); }; var getTabPannel = function getTabPannel() { var _tabOptions$find; var currTips = ((_tabOptions$find = tabOptions.find(function (tab) { return tab.value === dateType; })) === null || _tabOptions$find === void 0 ? void 0 : _tabOptions$find.tips) || '请选择日期'; return /*#__PURE__*/React.createElement(React.Fragment, null, !isShowDetermine && /*#__PURE__*/React.createElement("div", { className: "umui-v3-cyclePicker-calendar-tips" }, currTips), /*#__PURE__*/React.createElement("ul", { className: "umui-v3-cyclePicker-calendar-tabs", onClick: onTabClick }, tabOptions.map(function (opt) { return /*#__PURE__*/React.createElement("li", { key: opt.value, className: classnames('umui-v3-cyclePicker-calendar-tab', { 'tab-active': opt.value === dateType }), "data-value": opt.value }, formatTabTextFn ? formatTabTextFn(opt) || opt.name : opt.name); })), isShowDetermine && /*#__PURE__*/React.createElement("div", { className: "umui-v3-cyclePicker-calendar-footer" }, /*#__PURE__*/React.createElement("div", { className: "umui-v3-cyclePicker-calendar-footer-determine", onClick: onClickDetermine, style: { backgroundColor: isDisabled ? '#3B82FE' : '#d9d9d9' } }, "\u786E\u5B9A"), /*#__PURE__*/React.createElement("div", { className: "umui-v3-cyclePicker-calendar-footer-tip" }, /*#__PURE__*/React.createElement(Icon, { type: "umicon-hint", className: "icon" }), "\u9009\u62E9\u4E00\u4E2A\u65F6\u95F4\u5468\u671F"))); }; 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-v3-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("div", { className: "umui-v3-cyclePicker-input-wrap" }, /*#__PURE__*/React.createElement(Input, { styleType: styleType === 'borderless' ? 'underline' : 'default', value: dateValue.map(function (date) { return date ? date.format(DATE_FORMAT) : ''; }).join(' ~ '), suffix: /*#__PURE__*/React.createElement(Icon, { type: "umicon-calendar", onClick: onDateInputClick }), prefix: isShowDetermine ? /*#__PURE__*/React.createElement("span", { className: "umicon-calendar-prefix", onClick: onDateInputClick }, (_tabOptions$find2 = tabOptions.find(function (item) { return item.value === dateType; })) === null || _tabOptions$find2 === void 0 ? void 0 : _tabOptions$find2.name) : null, placeholder: "\u5F00\u59CB\u65E5\u671F ~ \u7ED3\u675F\u65E5\u671F", className: classnames({ 'umicon-calendar-input-prefix': isShowDetermine }), onClick: onDateInputClick, style: { width: styleType === 'borderless' ? 168 : 194, textAlign: styleType === 'borderless' ? 'left' : 'center' }, readOnly: true }), /*#__PURE__*/React.createElement(RangePicker, { allowClear: false, value: dateValue, open: dropdownVisible, renderExtraFooter: getTabPannel, onCalendarChange: onCalendarChange, onChange: onRangeChange, disabledDate: mixedDisabledDate, className: "umui-v3-cyclePicker-hidden", style: { width: styleType === 'borderless' ? 168 : 194 }, dropdownClassName: classnames('umui-v3-cyclePicker-calendar', dropdownCls, { 'umui-v3-cyclePicker-custom-only': _usePannels && _usePannels.length === 0, 'umui-v3-cyclePicker-calendar-determine': isShowDetermine }) })))); }; export default CyclePickerV3;