UNPKG

tdesign-react

Version:
504 lines (500 loc) 17.8 kB
/** * tdesign v1.13.2 * (c) 2025 tdesign * @license MIT */ import { _ as _defineProperty } from '../_chunks/dep-8618a2f1.js'; import { _ as _slicedToArray } from '../_chunks/dep-118954e6.js'; import React, { forwardRef, useEffect, useCallback } from 'react'; import classNames from 'classnames'; import dayjs from 'dayjs'; import { isDate } from 'lodash-es'; import { g as getDefaultFormat, f as formatDate, p as parseToDayjs, a as formatTime } from '../_chunks/dep-e0cbf9cc.js'; import { c as covertToDate, s as subtractMonth, a as addMonth, e as extractTimeObj, i as isSame } from '../_chunks/dep-0a95a9a5.js'; import useConfig from '../hooks/useConfig.js'; import { SelectInput } from '../select-input/index.js'; import SinglePanel from './panel/SinglePanel.js'; import useSingleInput from './hooks/useSingle.js'; import { datePickerDefaultProps } from './defaultProps.js'; import useDefaultProps from '../hooks/useDefaultProps.js'; import useLatest from '../hooks/useLatest.js'; import useUpdateEffect from '../hooks/useUpdateEffect.js'; import { useLocaleReceiver } from '../locale/LocalReceiver.js'; import '../_chunks/dep-c37cc2fd.js'; import '../_chunks/dep-61f5e3d1.js'; import '../_chunks/dep-09955460.js'; import '../_chunks/dep-d104053f.js'; import '../_chunks/dep-62293021.js'; import '../config-provider/ConfigContext.js'; import '../_chunks/dep-698f8ddd.js'; import '../select-input/SelectInput.js'; import '../popup/index.js'; import '../popup/Popup.js'; import 'react-transition-group'; import '../_util/ref.js'; import 'react-is'; import '../_util/isFragment.js'; import '../_chunks/dep-82b8abc2.js'; import '../common/Portal.js'; import 'react-dom'; import '../hooks/useLayoutEffect.js'; import '../hooks/useAnimation.js'; import '../hooks/useAttach.js'; import '../hooks/useControlled.js'; import '../_util/noop.js'; import '../hooks/useMutationObserver.js'; import '../hooks/usePopper.js'; import '../_chunks/dep-132961ab.js'; import '@popperjs/core'; import 'react-fast-compare'; import '../hooks/useWindowSize.js'; import '../popup/defaultProps.js'; import '../popup/hooks/useTrigger.js'; import '../_util/composeRefs.js'; import '../_util/listener.js'; import '../popup/utils/transition.js'; import '../popup/PopupPlugin.js'; import '../_chunks/dep-e78f641d.js'; import '../_util/react-render.js'; import '../common/PluginContainer.js'; import '../config-provider/ConfigProvider.js'; import '../select-input/useSingle.js'; import '../input/index.js'; import '../input/Input.js'; import '../_chunks/dep-30ed04a0.js'; import 'tdesign-icons-react'; import '../_util/forwardRefWithStatics.js'; import 'hoist-non-react-statics'; import '../hooks/useGlobalIcon.js'; import '../input/InputGroup.js'; import '../input/defaultProps.js'; import '../_util/parseTNode.js'; import '../input/useLengthLimit.js'; import '../_chunks/dep-ce8ef9b5.js'; import '../loading/index.js'; import '../loading/Loading.js'; import '../loading/gradient.js'; import '../_chunks/dep-fab491d8.js'; import '../hooks/useDomRefCallback.js'; import '../loading/defaultProps.js'; import '../loading/plugin.js'; import '../select-input/useMultiple.js'; import '../tag-input/index.js'; import '../tag-input/TagInput.js'; import '../hooks/useDragSorter.js'; import '../hooks/useEventCallback.js'; import '../tag-input/useTagScroll.js'; import '../tag-input/useTagList.js'; import '../tag/index.js'; import '../tag/Tag.js'; import '../_chunks/dep-ab4955c6.js'; import '../tag/defaultProps.js'; import '../tag/CheckTag.js'; import '../_chunks/dep-fbdea93b.js'; import '../tag/CheckTagGroup.js'; import '../tag-input/useHover.js'; import '../tag-input/defaultProps.js'; import '../select-input/useOverlayInnerStyle.js'; import '../select-input/defaultProps.js'; import './panel/PanelContent.js'; import './base/Header.js'; import '../select/index.js'; import '../select/base/Select.js'; import '../_util/helper.js'; import '../_chunks/dep-4e69b1c5.js'; import '../select/base/OptionGroup.js'; import '../select/defaultProps.js'; import '../select/base/Option.js'; import '../hooks/useRipple.js'; import '../common/FakeArrow.js'; import '../select/base/PopupContent.js'; import '../select/hooks/usePanelVirtualScroll.js'; import '../hooks/useVirtualScroll.js'; import '../hooks/useResizeObserver.js'; import '../pagination/index.js'; import '../pagination/Pagination.js'; import '../input-number/index.js'; import '../input-number/InputNumber.js'; import '../button/index.js'; import '../button/Button.js'; import '../button/defaultProps.js'; import '../input-number/useInputNumber.js'; import '../_chunks/dep-9b91255f.js'; import '../hooks/useCommonClassName.js'; import '../input-number/defaultProps.js'; import '../input-adornment/InputAdornment.js'; import '../pagination/hooks/useBoundaryJumper.js'; import '../pagination/hooks/usePrevNextJumper.js'; import '../pagination/hooks/usePageNumber.js'; import '../pagination/hooks/useTotal.js'; import '../pagination/validators.js'; import '../pagination/defaultProps.js'; import '../pagination/PaginationMini.js'; import './base/Table.js'; import './base/Cell.js'; import '../time-picker/index.js'; import '../time-picker/TimePicker.js'; import '../_chunks/dep-f68b991f.js'; import '../time-picker/hooks/useTimePickerTextConfig.js'; import '../hooks/useDebounce.js'; import '../hooks/usePersistFn.js'; import '../hooks/usePropsRef.js'; import '../time-picker/TimeRangePicker.js'; import '../range-input/index.js'; import '../range-input/RangeInput.js'; import '../range-input/defaultProps.js'; import '../range-input/RangeInputPopup.js'; import '../time-picker/panel/TimePickerPanel.js'; import '../time-picker/defaultProps.js'; import './panel/ExtraContent.js'; import './base/Footer.js'; import './hooks/useTableData.js'; import './hooks/useDisableDate.js'; import './utils.js'; import './hooks/useSingleValue.js'; import '../hooks/useIsFirstRender.js'; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var DatePicker = /*#__PURE__*/forwardRef(function (originalProps, ref) { var _useConfig = useConfig(), classPrefix = _useConfig.classPrefix; var props = useDefaultProps(originalProps, datePickerDefaultProps); var className = props.className, style = props.style, disabled = props.disabled, mode = props.mode, enableTimePicker = props.enableTimePicker, disableDate = props.disableDate, firstDayOfWeek = props.firstDayOfWeek, presets = props.presets, defaultTime = props.defaultTime, timePickerProps = props.timePickerProps, presetsPlacement = props.presetsPlacement, needConfirm = props.needConfirm, multiple = props.multiple, label = props.label, disableTime = props.disableTime, onClear = props.onClear, onPick = props.onPick; var _useSingle = useSingleInput(props), inputValue = _useSingle.inputValue, popupVisible = _useSingle.popupVisible, inputProps = _useSingle.inputProps, popupProps = _useSingle.popupProps, tagInputProps = _useSingle.tagInputProps, value = _useSingle.value, year = _useSingle.year, month = _useSingle.month, time = _useSingle.time, onChange = _useSingle.onChange, setIsHoverCell = _useSingle.setIsHoverCell, setInputValue = _useSingle.setInputValue, setPopupVisible = _useSingle.setPopupVisible, setTime = _useSingle.setTime, setYear = _useSingle.setYear, setMonth = _useSingle.setMonth, cacheValue = _useSingle.cacheValue, setCacheValue = _useSingle.setCacheValue; var _useLocaleReceiver = useLocaleReceiver("datePicker"), _useLocaleReceiver2 = _slicedToArray(_useLocaleReceiver, 1), local = _useLocaleReceiver2[0]; var _getDefaultFormat = getDefaultFormat({ mode: mode, format: props.format, valueType: props.valueType, enableTimePicker: multiple ? false : enableTimePicker }), format = _getDefaultFormat.format, timeFormat = _getDefaultFormat.timeFormat, valueType = _getDefaultFormat.valueType; var onTriggerNeedConfirm = useLatest(function () { if (!needConfirm && enableTimePicker && !popupVisible) { var nextValue = formatDate(inputValue, { format: format }); if (nextValue) { onChange(formatDate(inputValue, { format: format, targetFormat: valueType }), { dayjsValue: parseToDayjs(inputValue, format), trigger: "confirm" }); } else { setInputValue(formatDate(value, { format: format })); } } }); var handlePopupInvisible = function handlePopupInvisible() { var _props$popupProps, _props$popupProps$onV; setPopupVisible(false); (_props$popupProps = props.popupProps) === null || _props$popupProps === void 0 || (_props$popupProps$onV = _props$popupProps.onVisibleChange) === null || _props$popupProps$onV === void 0 || _props$popupProps$onV.call(_props$popupProps, false, {}); }; useUpdateEffect(function () { onTriggerNeedConfirm.current(); }, [popupVisible]); useEffect(function () { if (multiple) return; var dateValue = value && !isDate(value) && !["week", "quarter"].includes(props.mode) ? covertToDate(value, valueType) : value; setCacheValue(formatDate(dateValue, { format: format })); setInputValue(formatDate(dateValue, { format: format })); if (popupVisible) { setYear(parseToDayjs(value, format).year()); setMonth(parseToDayjs(value, format).month()); setTime(formatTime(value, format, timeFormat, defaultTime)); } else { setIsHoverCell(false); } }, [popupVisible]); function onCellMouseEnter(date) { if (multiple) return; setIsHoverCell(true); setInputValue(formatDate(date, { format: format })); } function onCellMouseLeave() { if (multiple) return; setIsHoverCell(false); setInputValue(formatDate(cacheValue, { format: format })); } function onCellClick(date) { onPick === null || onPick === void 0 || onPick(date); setIsHoverCell(false); if (mode === "date") { setYear(date.getFullYear()); setMonth(date.getMonth()); } if (enableTimePicker) { setCacheValue(formatDate(date, { format: format })); } else { if (multiple) { var newDate = processDate(date); onChange(newDate, { dayjsValue: parseToDayjs(date, format), trigger: "pick" }); return; } onChange(formatDate(date, { format: format, targetFormat: valueType }), { dayjsValue: parseToDayjs(date, format), trigger: "pick" }); handlePopupInvisible(); } } var onJumperClick = React.useCallback(function (_ref) { var trigger = _ref.trigger; var monthCountMap = { date: 1, week: 1, month: 12, quarter: 12, year: 120 }; var monthCount = monthCountMap[mode] || 0; var current = new Date(year, month); var next = null; if (trigger === "prev") { next = subtractMonth(current, monthCount); } else if (trigger === "current") { next = new Date(); } else if (trigger === "next") { next = addMonth(current, monthCount); } var nextYear = next.getFullYear(); var nextMonth = next.getMonth(); setYear(nextYear); setMonth(nextMonth); }, [year, month, mode, setYear, setMonth]); function onTimePickerChange(val) { setTime(val); var _extractTimeObj = extractTimeObj(val), hours = _extractTimeObj.hours, minutes = _extractTimeObj.minutes, seconds = _extractTimeObj.seconds, milliseconds = _extractTimeObj.milliseconds, meridiem = _extractTimeObj.meridiem; var nextHours = hours; if (/am/i.test(meridiem) && nextHours === 12) nextHours -= 12; if (/pm/i.test(meridiem) && nextHours < 12) nextHours += 12; var currentDate = !dayjs(inputValue, format).isValid() ? dayjs() : dayjs(inputValue, format); var nextDate = currentDate.hour(nextHours).minute(minutes).second(seconds).millisecond(milliseconds).toDate(); setInputValue(formatDate(nextDate, { format: format })); setCacheValue(formatDate(nextDate, { format: format })); onPick === null || onPick === void 0 || onPick(nextDate); } function onConfirmClick(_ref2) { var _props$onConfirm; var e = _ref2.e; var nextValue = formatDate(inputValue, { format: format }); props === null || props === void 0 || (_props$onConfirm = props.onConfirm) === null || _props$onConfirm === void 0 || _props$onConfirm.call(props, { e: e, date: nextValue }); if (nextValue) { onChange(formatDate(inputValue, { format: format, targetFormat: valueType }), { dayjsValue: parseToDayjs(inputValue, format), trigger: "confirm" }); } else { setInputValue(formatDate(value, { format: format })); } handlePopupInvisible(); } function onPresetClick(preset, context) { var _props$onPresetClick; var presetValue = preset; if (typeof preset === "function") { presetValue = preset(); } onChange(formatDate(presetValue, { format: format, targetFormat: valueType }), { dayjsValue: parseToDayjs(presetValue, format), trigger: "preset" }); (_props$onPresetClick = props.onPresetClick) === null || _props$onPresetClick === void 0 || _props$onPresetClick.call(props, context); handlePopupInvisible(); } var onYearChange = useCallback(function (year2) { setYear(year2); }, []); var onMonthChange = useCallback(function (month2) { setMonth(month2); }, []); function processDate(date) { var _currentDate; var isSameDate; var currentValue = value || []; if (mode !== "week") isSameDate = currentValue.some(function (val) { return isSame(parseToDayjs(val, format).toDate(), date, mode, local.dayjsLocale); });else { isSameDate = currentValue.some(function (val) { return val === dayjs(date).locale(local.dayjsLocale).format(format); }); } var currentDate; if (!isSameDate) { currentDate = currentValue.concat(formatDate(date, { format: format, targetFormat: valueType })); } else { currentDate = currentValue.filter(function (val) { return formatDate(val, { format: format, targetFormat: valueType }) !== formatDate(date, { format: format, targetFormat: valueType }); }); } return (_currentDate = currentDate) === null || _currentDate === void 0 ? void 0 : _currentDate.sort(function (a, b) { return dayjs(a).valueOf() - dayjs(b).valueOf(); }); } var onTagRemoveClick = function onTagRemoveClick(ctx) { if (["week", "quarter"].includes(props.mode)) { onChange === null || onChange === void 0 || onChange(ctx.value, { trigger: "tag-remove" }); return; } var removeDate = dayjs(ctx.item).toDate(); var newDate = processDate(removeDate); onChange === null || onChange === void 0 || onChange(newDate, { dayjsValue: parseToDayjs(removeDate, format), trigger: "tag-remove" }); }; var onTagClearClick = function onTagClearClick(_ref3) { var e = _ref3.e; e.stopPropagation(); handlePopupInvisible(); onChange([], { dayjsValue: dayjs(), trigger: "clear" }); onClear === null || onClear === void 0 || onClear({ e: e }); }; var panelProps = { value: cacheValue, year: year, month: month, mode: mode, format: format, presets: presets, time: multiple ? false : time, disableDate: disableDate, firstDayOfWeek: firstDayOfWeek, timePickerProps: timePickerProps, enableTimePicker: multiple ? false : enableTimePicker, presetsPlacement: presetsPlacement, popupVisible: popupVisible, needConfirm: needConfirm, multiple: multiple, onCellClick: onCellClick, onCellMouseEnter: onCellMouseEnter, onCellMouseLeave: onCellMouseLeave, onJumperClick: onJumperClick, onConfirmClick: onConfirmClick, onPresetClick: onPresetClick, onYearChange: onYearChange, onMonthChange: onMonthChange, onTimePickerChange: onTimePickerChange, disableTime: disableTime }; return /* @__PURE__ */React.createElement("div", { className: classNames("".concat(classPrefix, "-date-picker"), className), style: style, ref: ref }, /* @__PURE__ */React.createElement(SelectInput, { disabled: disabled, value: inputValue, status: props.status, tips: props.tips, borderless: props.borderless, label: label, popupProps: popupProps, inputProps: inputProps, popupVisible: popupVisible, panel: /* @__PURE__ */React.createElement(SinglePanel, _objectSpread({}, panelProps)), multiple: multiple, tagInputProps: _objectSpread({ onRemove: onTagRemoveClick }, tagInputProps), onClear: onTagClearClick })); }); DatePicker.displayName = "DatePicker"; export { DatePicker as default }; //# sourceMappingURL=DatePicker.js.map