123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- import _extends from "@babel/runtime/helpers/esm/extends";
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
- import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
- import classNames from 'classnames';
- import { useEvent, useMergedState, warning } from 'rc-util';
- import * as React from 'react';
- import useLocale from "../hooks/useLocale";
- import { fillShowTimeConfig, getTimeProps } from "../hooks/useTimeConfig";
- import useToggleDates from "../hooks/useToggleDates";
- import PickerContext from "../PickerInput/context";
- import useCellRender from "../PickerInput/hooks/useCellRender";
- import { isSame } from "../utils/dateUtil";
- import { pickProps, toArray } from "../utils/miscUtil";
- import { PickerHackContext } from "./context";
- import DatePanel from "./DatePanel";
- import DateTimePanel from "./DateTimePanel";
- import DecadePanel from "./DecadePanel";
- import MonthPanel from "./MonthPanel";
- import QuarterPanel from "./QuarterPanel";
- import TimePanel from "./TimePanel";
- import WeekPanel from "./WeekPanel";
- import YearPanel from "./YearPanel";
- var DefaultComponents = {
- date: DatePanel,
- datetime: DateTimePanel,
- week: WeekPanel,
- month: MonthPanel,
- quarter: QuarterPanel,
- year: YearPanel,
- decade: DecadePanel,
- time: TimePanel
- };
- function PickerPanel(props, ref) {
- var _React$useContext;
- var locale = props.locale,
- generateConfig = props.generateConfig,
- direction = props.direction,
- prefixCls = props.prefixCls,
- _props$tabIndex = props.tabIndex,
- tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
- multiple = props.multiple,
- defaultValue = props.defaultValue,
- value = props.value,
- onChange = props.onChange,
- onSelect = props.onSelect,
- defaultPickerValue = props.defaultPickerValue,
- pickerValue = props.pickerValue,
- onPickerValueChange = props.onPickerValueChange,
- mode = props.mode,
- onPanelChange = props.onPanelChange,
- _props$picker = props.picker,
- picker = _props$picker === void 0 ? 'date' : _props$picker,
- showTime = props.showTime,
- hoverValue = props.hoverValue,
- hoverRangeValue = props.hoverRangeValue,
- cellRender = props.cellRender,
- dateRender = props.dateRender,
- monthCellRender = props.monthCellRender,
- _props$components = props.components,
- components = _props$components === void 0 ? {} : _props$components,
- hideHeader = props.hideHeader;
- var mergedPrefixCls = ((_React$useContext = React.useContext(PickerContext)) === null || _React$useContext === void 0 ? void 0 : _React$useContext.prefixCls) || prefixCls || 'rc-picker';
- // ========================== Refs ==========================
- var rootRef = React.useRef();
- React.useImperativeHandle(ref, function () {
- return {
- nativeElement: rootRef.current
- };
- });
- // ========================== Time ==========================
- // Auto `format` need to check `showTime.showXXX` first.
- // And then merge the `locale` into `mergedShowTime`.
- var _getTimeProps = getTimeProps(props),
- _getTimeProps2 = _slicedToArray(_getTimeProps, 4),
- timeProps = _getTimeProps2[0],
- localeTimeProps = _getTimeProps2[1],
- showTimeFormat = _getTimeProps2[2],
- propFormat = _getTimeProps2[3];
- // ========================= Locale =========================
- var filledLocale = useLocale(locale, localeTimeProps);
- // ========================= Picker =========================
- var internalPicker = picker === 'date' && showTime ? 'datetime' : picker;
- // ======================== ShowTime ========================
- var mergedShowTime = React.useMemo(function () {
- return fillShowTimeConfig(internalPicker, showTimeFormat, propFormat, timeProps, filledLocale);
- }, [internalPicker, showTimeFormat, propFormat, timeProps, filledLocale]);
- // ========================== Now ===========================
- var now = generateConfig.getNow();
- // ========================== Mode ==========================
- var _useMergedState = useMergedState(picker, {
- value: mode,
- postState: function postState(val) {
- return val || 'date';
- }
- }),
- _useMergedState2 = _slicedToArray(_useMergedState, 2),
- mergedMode = _useMergedState2[0],
- setMergedMode = _useMergedState2[1];
- var internalMode = mergedMode === 'date' && mergedShowTime ? 'datetime' : mergedMode;
- // ========================= Toggle =========================
- var toggleDates = useToggleDates(generateConfig, locale, internalPicker);
- // ========================= Value ==========================
- // >>> Real value
- // Interactive with `onChange` event which only trigger when the `mode` is `picker`
- var _useMergedState3 = useMergedState(defaultValue, {
- value: value
- }),
- _useMergedState4 = _slicedToArray(_useMergedState3, 2),
- innerValue = _useMergedState4[0],
- setMergedValue = _useMergedState4[1];
- var mergedValue = React.useMemo(function () {
- // Clean up `[null]`
- var values = toArray(innerValue).filter(function (val) {
- return val;
- });
- return multiple ? values : values.slice(0, 1);
- }, [innerValue, multiple]);
- // Sync value and only trigger onChange event when changed
- var triggerChange = useEvent(function (nextValue) {
- setMergedValue(nextValue);
- if (onChange && (nextValue === null || mergedValue.length !== nextValue.length || mergedValue.some(function (ori, index) {
- return !isSame(generateConfig, locale, ori, nextValue[index], internalPicker);
- }))) {
- onChange === null || onChange === void 0 || onChange(multiple ? nextValue : nextValue[0]);
- }
- });
- // >>> CalendarValue
- // CalendarValue is a temp value for user operation
- // which will only trigger `onCalendarChange` but not `onChange`
- var onInternalSelect = useEvent(function (newDate) {
- onSelect === null || onSelect === void 0 || onSelect(newDate);
- if (mergedMode === picker) {
- var nextValues = multiple ? toggleDates(mergedValue, newDate) : [newDate];
- triggerChange(nextValues);
- }
- });
- // >>> PickerValue
- // PickerValue is used to control the current displaying panel
- var _useMergedState5 = useMergedState(defaultPickerValue || mergedValue[0] || now, {
- value: pickerValue
- }),
- _useMergedState6 = _slicedToArray(_useMergedState5, 2),
- mergedPickerValue = _useMergedState6[0],
- setInternalPickerValue = _useMergedState6[1];
- React.useEffect(function () {
- if (mergedValue[0] && !pickerValue) {
- setInternalPickerValue(mergedValue[0]);
- }
- }, [mergedValue[0]]);
- // Both trigger when manually pickerValue or mode change
- var triggerPanelChange = function triggerPanelChange(viewDate, nextMode) {
- onPanelChange === null || onPanelChange === void 0 || onPanelChange(viewDate || pickerValue, nextMode || mergedMode);
- };
- var setPickerValue = function setPickerValue(nextPickerValue) {
- var triggerPanelEvent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- setInternalPickerValue(nextPickerValue);
- onPickerValueChange === null || onPickerValueChange === void 0 || onPickerValueChange(nextPickerValue);
- if (triggerPanelEvent) {
- triggerPanelChange(nextPickerValue);
- }
- };
- var triggerModeChange = function triggerModeChange(nextMode, viewDate) {
- setMergedMode(nextMode);
- if (viewDate) {
- setPickerValue(viewDate);
- }
- triggerPanelChange(viewDate, nextMode);
- };
- var onPanelValueSelect = function onPanelValueSelect(nextValue) {
- onInternalSelect(nextValue);
- setPickerValue(nextValue);
- // Update mode if needed
- if (mergedMode !== picker) {
- var decadeYearQueue = ['decade', 'year'];
- var decadeYearMonthQueue = [].concat(decadeYearQueue, ['month']);
- var pickerQueue = {
- quarter: [].concat(decadeYearQueue, ['quarter']),
- week: [].concat(_toConsumableArray(decadeYearMonthQueue), ['week']),
- date: [].concat(_toConsumableArray(decadeYearMonthQueue), ['date'])
- };
- var queue = pickerQueue[picker] || decadeYearMonthQueue;
- var index = queue.indexOf(mergedMode);
- var nextMode = queue[index + 1];
- if (nextMode) {
- triggerModeChange(nextMode, nextValue);
- }
- }
- };
- // ======================= Hover Date =======================
- var hoverRangeDate = React.useMemo(function () {
- var start;
- var end;
- if (Array.isArray(hoverRangeValue)) {
- var _hoverRangeValue = _slicedToArray(hoverRangeValue, 2);
- start = _hoverRangeValue[0];
- end = _hoverRangeValue[1];
- } else {
- start = hoverRangeValue;
- }
- // Return for not exist
- if (!start && !end) {
- return null;
- }
- // Fill if has empty
- start = start || end;
- end = end || start;
- return generateConfig.isAfter(start, end) ? [end, start] : [start, end];
- }, [hoverRangeValue, generateConfig]);
- // ======================= Components =======================
- // >>> cellRender
- var onInternalCellRender = useCellRender(cellRender, dateRender, monthCellRender);
- // ======================= Components =======================
- var PanelComponent = components[internalMode] || DefaultComponents[internalMode] || DatePanel;
- // ======================== Context =========================
- var parentHackContext = React.useContext(PickerHackContext);
- var pickerPanelContext = React.useMemo(function () {
- return _objectSpread(_objectSpread({}, parentHackContext), {}, {
- hideHeader: hideHeader
- });
- }, [parentHackContext, hideHeader]);
- // ======================== Warnings ========================
- if (process.env.NODE_ENV !== 'production') {
- warning(!mergedValue || mergedValue.every(function (val) {
- return generateConfig.isValidate(val);
- }), 'Invalidate date pass to `value` or `defaultValue`.');
- }
- // ========================= Render =========================
- var panelCls = "".concat(mergedPrefixCls, "-panel");
- var panelProps = pickProps(props, [
- // Week
- 'showWeek',
- // Icons
- 'prevIcon', 'nextIcon', 'superPrevIcon', 'superNextIcon',
- // Disabled
- 'disabledDate', 'minDate', 'maxDate',
- // Hover
- 'onHover']);
- return /*#__PURE__*/React.createElement(PickerHackContext.Provider, {
- value: pickerPanelContext
- }, /*#__PURE__*/React.createElement("div", {
- ref: rootRef,
- tabIndex: tabIndex,
- className: classNames(panelCls, _defineProperty({}, "".concat(panelCls, "-rtl"), direction === 'rtl'))
- }, /*#__PURE__*/React.createElement(PanelComponent, _extends({}, panelProps, {
- // Time
- showTime: mergedShowTime
- // MISC
- ,
- prefixCls: mergedPrefixCls,
- locale: filledLocale,
- generateConfig: generateConfig
- // Mode
- ,
- onModeChange: triggerModeChange
- // Value
- ,
- pickerValue: mergedPickerValue,
- onPickerValueChange: function onPickerValueChange(nextPickerValue) {
- setPickerValue(nextPickerValue, true);
- },
- value: mergedValue[0],
- onSelect: onPanelValueSelect,
- values: mergedValue
- // Render
- ,
- cellRender: onInternalCellRender
- // Hover
- ,
- hoverRangeValue: hoverRangeDate,
- hoverValue: hoverValue
- }))));
- }
- var RefPanelPicker = /*#__PURE__*/React.memo( /*#__PURE__*/React.forwardRef(PickerPanel));
- if (process.env.NODE_ENV !== 'production') {
- RefPanelPicker.displayName = 'PanelPicker';
- }
- // Make support generic
- export default RefPanelPicker;
|