UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

903 lines 38.4 kB
import { Fragment as _Fragment } from "vue"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import { createVNode as _createVNode } from "vue"; import _extends from "@babel/runtime/helpers/esm/extends"; import PickerTrigger from './PickerTrigger'; import PickerPanel from './PickerPanel'; import usePickerInput from './hooks/usePickerInput'; import PresetPanel from './PresetPanel'; import getDataOrAriaProps, { toArray, getValue, updateValues } from './utils/miscUtil'; import { getDefaultFormat, getInputSize, elementsContains } from './utils/uiUtil'; import { useProvidePanel } from './PanelContext'; import { isEqual, getClosingViewDate, isSameDate, isSameWeek, isSameQuarter, formatValue, parseValue } from './utils/dateUtil'; import useValueTexts from './hooks/useValueTexts'; import useTextValueMapping from './hooks/useTextValueMapping'; import usePresets from './hooks/usePresets'; import { RangeContextProvider } from './RangeContext'; import useRangeDisabled from './hooks/useRangeDisabled'; import getExtraFooter from './utils/getExtraFooter'; import getRanges from './utils/getRanges'; import useRangeViewDates from './hooks/useRangeViewDates'; import useHoverValue from './hooks/useHoverValue'; import { computed, defineComponent, ref, toRef, watch, watchEffect } from 'vue'; import useMergedState from '../_util/hooks/useMergedState'; import { warning } from '../vc-util/warning'; import useState from '../_util/hooks/useState'; import classNames from '../_util/classNames'; import { legacyPropsWarning } from './utils/warnUtil'; import { useElementSize } from '../_util/hooks/_vueuse/useElementSize'; function reorderValues(values, generateConfig) { if (values && values[0] && values[1] && generateConfig.isAfter(values[0], values[1])) { return [values[1], values[0]]; } return values; } function canValueTrigger(value, index, disabled, allowEmpty) { if (value) { return true; } if (allowEmpty && allowEmpty[index]) { return true; } if (disabled[(index + 1) % 2]) { return true; } return false; } function RangerPicker() { return defineComponent({ name: 'RangerPicker', inheritAttrs: false, props: ['prefixCls', 'id', 'popupStyle', 'dropdownClassName', 'transitionName', 'dropdownAlign', 'getPopupContainer', 'generateConfig', 'locale', 'placeholder', 'autofocus', 'disabled', 'format', 'picker', 'showTime', 'showNow', 'showHour', 'showMinute', 'showSecond', 'use12Hours', 'separator', 'value', 'defaultValue', 'defaultPickerValue', 'open', 'defaultOpen', 'disabledDate', 'disabledTime', 'dateRender', 'panelRender', 'ranges', 'allowEmpty', 'allowClear', 'suffixIcon', 'clearIcon', 'pickerRef', 'inputReadOnly', 'mode', 'renderExtraFooter', 'onChange', 'onOpenChange', 'onPanelChange', 'onCalendarChange', 'onFocus', 'onBlur', 'onMousedown', 'onMouseup', 'onMouseenter', 'onMouseleave', 'onClick', 'onOk', 'onKeydown', 'components', 'order', 'direction', 'activePickerIndex', 'autocomplete', 'minuteStep', 'hourStep', 'secondStep', 'hideDisabledOptions', 'disabledMinutes', 'presets', 'prevIcon', 'nextIcon', 'superPrevIcon', 'superNextIcon'], setup(props, _ref) { let { attrs, expose } = _ref; const needConfirmButton = computed(() => props.picker === 'date' && !!props.showTime || props.picker === 'time'); const presets = computed(() => props.presets); const ranges = computed(() => props.ranges); const presetList = usePresets(presets, ranges); // We record oqqpened status here in case repeat open with picker const openRecordsRef = ref({}); const containerRef = ref(null); const panelDivRef = ref(null); const startInputDivRef = ref(null); const endInputDivRef = ref(null); const separatorRef = ref(null); const startInputRef = ref(null); const endInputRef = ref(null); const arrowRef = ref(null); // ============================ Warning ============================ if (process.env.NODE_ENV !== 'production') { legacyPropsWarning(props); } // ============================= Misc ============================== const formatList = computed(() => toArray(getDefaultFormat(props.format, props.picker, props.showTime, props.use12Hours))); // Active picker const [mergedActivePickerIndex, setMergedActivePickerIndex] = useMergedState(0, { value: toRef(props, 'activePickerIndex') }); // Operation ref const operationRef = ref(null); const mergedDisabled = computed(() => { const { disabled } = props; if (Array.isArray(disabled)) { return disabled; } return [disabled || false, disabled || false]; }); // ============================= Value ============================= const [mergedValue, setInnerValue] = useMergedState(null, { value: toRef(props, 'value'), defaultValue: props.defaultValue, postState: values => props.picker === 'time' && !props.order ? values : reorderValues(values, props.generateConfig) }); // =========================== View Date =========================== // Config view panel const [startViewDate, endViewDate, setViewDate] = useRangeViewDates({ values: mergedValue, picker: toRef(props, 'picker'), defaultDates: props.defaultPickerValue, generateConfig: toRef(props, 'generateConfig') }); // ========================= Select Values ========================= const [selectedValue, setSelectedValue] = useMergedState(mergedValue.value, { postState: values => { let postValues = values; if (mergedDisabled.value[0] && mergedDisabled.value[1]) { return postValues; } // Fill disabled unit for (let i = 0; i < 2; i += 1) { if (mergedDisabled.value[i] && !getValue(postValues, i) && !getValue(props.allowEmpty, i)) { postValues = updateValues(postValues, props.generateConfig.getNow(), i); } } return postValues; } }); // ============================= Modes ============================= const [mergedModes, setInnerModes] = useMergedState([props.picker, props.picker], { value: toRef(props, 'mode') }); watch(() => props.picker, () => { setInnerModes([props.picker, props.picker]); }); const triggerModesChange = (modes, values) => { var _a; setInnerModes(modes); (_a = props.onPanelChange) === null || _a === void 0 ? void 0 : _a.call(props, values, modes); }; // ========================= Disable Date ========================== const [disabledStartDate, disabledEndDate] = useRangeDisabled({ picker: toRef(props, 'picker'), selectedValue, locale: toRef(props, 'locale'), disabled: mergedDisabled, disabledDate: toRef(props, 'disabledDate'), generateConfig: toRef(props, 'generateConfig') }, openRecordsRef); // ============================= Open ============================== const [mergedOpen, triggerInnerOpen] = useMergedState(false, { value: toRef(props, 'open'), defaultValue: props.defaultOpen, postState: postOpen => mergedDisabled.value[mergedActivePickerIndex.value] ? false : postOpen, onChange: newOpen => { var _a; (_a = props.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(props, newOpen); if (!newOpen && operationRef.value && operationRef.value.onClose) { operationRef.value.onClose(); } } }); const startOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 0); const endOpen = computed(() => mergedOpen.value && mergedActivePickerIndex.value === 1); const panelLeft = ref(0); const arrowLeft = ref(0); // ============================= Popup ============================= // Popup min width const popupMinWidth = ref(0); const { width: containerWidth } = useElementSize(containerRef); watch([mergedOpen, containerWidth], () => { if (!mergedOpen.value && containerRef.value) { popupMinWidth.value = containerWidth.value; } }); const { width: panelDivWidth } = useElementSize(panelDivRef); const { width: arrowWidth } = useElementSize(arrowRef); const { width: startInputDivWidth } = useElementSize(startInputDivRef); const { width: separatorWidth } = useElementSize(separatorRef); watch([mergedActivePickerIndex, mergedOpen, panelDivWidth, arrowWidth, startInputDivWidth, separatorWidth, () => props.direction], () => { arrowLeft.value = 0; if (mergedActivePickerIndex.value) { if (startInputDivRef.value && separatorRef.value) { arrowLeft.value = startInputDivWidth.value + separatorWidth.value; if (panelDivWidth.value && arrowWidth.value && arrowLeft.value > panelDivWidth.value - arrowWidth.value - (props.direction === 'rtl' || arrowRef.value.offsetLeft > arrowLeft.value ? 0 : arrowRef.value.offsetLeft)) { panelLeft.value = arrowLeft.value; } } } else if (mergedActivePickerIndex.value === 0) { panelLeft.value = 0; } }, { immediate: true }); // ============================ Trigger ============================ const triggerRef = ref(); function triggerOpen(newOpen, index) { if (newOpen) { clearTimeout(triggerRef.value); openRecordsRef.value[index] = true; setMergedActivePickerIndex(index); triggerInnerOpen(newOpen); // Open to reset view date if (!mergedOpen.value) { setViewDate(null, index); } } else if (mergedActivePickerIndex.value === index) { triggerInnerOpen(newOpen); // Clean up async // This makes ref not quick refresh in case user open another input with blur trigger const openRecords = openRecordsRef.value; triggerRef.value = setTimeout(() => { if (openRecords === openRecordsRef.value) { openRecordsRef.value = {}; } }); } } function triggerOpenAndFocus(index) { triggerOpen(true, index); // Use setTimeout to make sure panel DOM exists setTimeout(() => { const inputRef = [startInputRef, endInputRef][index]; if (inputRef.value) { inputRef.value.focus(); } }, 0); } function triggerChange(newValue, sourceIndex) { let values = newValue; let startValue = getValue(values, 0); let endValue = getValue(values, 1); const { generateConfig, locale, picker, order, onCalendarChange, allowEmpty, onChange, showTime } = props; // >>>>> Format start & end values if (startValue && endValue && generateConfig.isAfter(startValue, endValue)) { if ( // WeekPicker only compare week picker === 'week' && !isSameWeek(generateConfig, locale.locale, startValue, endValue) || // QuotaPicker only compare week picker === 'quarter' && !isSameQuarter(generateConfig, startValue, endValue) || // Other non-TimePicker compare date picker !== 'week' && picker !== 'quarter' && picker !== 'time' && !(showTime ? isEqual(generateConfig, startValue, endValue) : isSameDate(generateConfig, startValue, endValue))) { // Clean up end date when start date is after end date if (sourceIndex === 0) { values = [startValue, null]; endValue = null; } else { startValue = null; values = [null, endValue]; } // Clean up cache since invalidate openRecordsRef.value = { [sourceIndex]: true }; } else if (picker !== 'time' || order !== false) { // Reorder when in same date values = reorderValues(values, generateConfig); } } setSelectedValue(values); const startStr = values && values[0] ? formatValue(values[0], { generateConfig, locale, format: formatList.value[0], range: 'start' }) : ''; const endStr = values && values[1] ? formatValue(values[1], { generateConfig, locale, format: formatList.value[0], range: 'end' }) : ''; if (onCalendarChange) { const info = { range: sourceIndex === 0 ? 'start' : 'end' }; onCalendarChange(values, [startStr, endStr], info); } // >>>>> Trigger `onChange` event const canStartValueTrigger = canValueTrigger(startValue, 0, mergedDisabled.value, allowEmpty); const canEndValueTrigger = canValueTrigger(endValue, 1, mergedDisabled.value, allowEmpty); const canTrigger = values === null || canStartValueTrigger && canEndValueTrigger; if (canTrigger) { // Trigger onChange only when value is validate setInnerValue(values); if (onChange && (!isEqual(generateConfig, getValue(mergedValue.value, 0), startValue) || !isEqual(generateConfig, getValue(mergedValue.value, 1), endValue))) { onChange(values, [startStr, endStr]); } } // >>>>> Open picker when // Always open another picker if possible let nextOpenIndex = null; if (sourceIndex === 0 && !mergedDisabled.value[1]) { nextOpenIndex = 1; } else if (sourceIndex === 1 && !mergedDisabled.value[0]) { nextOpenIndex = 0; } if (nextOpenIndex !== null && nextOpenIndex !== mergedActivePickerIndex.value && (!openRecordsRef.value[nextOpenIndex] || !getValue(values, nextOpenIndex)) && getValue(values, sourceIndex)) { // Delay to focus to avoid input blur trigger expired selectedValues triggerOpenAndFocus(nextOpenIndex); } else { triggerOpen(false, sourceIndex); } } const forwardKeydown = e => { if (mergedOpen && operationRef.value && operationRef.value.onKeydown) { // Let popup panel handle keyboard return operationRef.value.onKeydown(e); } /* istanbul ignore next */ /* eslint-disable no-lone-blocks */ { warning(false, 'Picker not correct forward Keydown operation. Please help to fire issue about this.'); return false; } }; // ============================= Text ============================== const sharedTextHooksProps = { formatList, generateConfig: toRef(props, 'generateConfig'), locale: toRef(props, 'locale') }; const withRange = range => { return _extends(_extends({}, sharedTextHooksProps), { range }); }; const [startValueTexts, firstStartValueText] = useValueTexts(computed(() => getValue(selectedValue.value, 0)), withRange('start')); const [endValueTexts, firstEndValueText] = useValueTexts(computed(() => getValue(selectedValue.value, 1)), withRange('end')); const onTextChange = (newText, index) => { const inputDate = parseValue(newText, { locale: props.locale, formatList: formatList.value, generateConfig: props.generateConfig }); const disabledFunc = index === 0 ? disabledStartDate : disabledEndDate; if (inputDate && !disabledFunc(inputDate)) { setSelectedValue(updateValues(selectedValue.value, inputDate, index)); setViewDate(inputDate, index); } }; const [startText, triggerStartTextChange, resetStartText] = useTextValueMapping({ valueTexts: startValueTexts, onTextChange: newText => onTextChange(newText, 0) }); const [endText, triggerEndTextChange, resetEndText] = useTextValueMapping({ valueTexts: endValueTexts, onTextChange: newText => onTextChange(newText, 1) }); const [rangeHoverValue, setRangeHoverValue] = useState(null); // ========================== Hover Range ========================== const [hoverRangedValue, setHoverRangedValue] = useState(null); const [startHoverValue, onStartEnter, onStartLeave] = useHoverValue(startText, withRange('start')); const [endHoverValue, onEndEnter, onEndLeave] = useHoverValue(endText, withRange('end')); const onDateMouseenter = date => { setHoverRangedValue(updateValues(selectedValue.value, date, mergedActivePickerIndex.value)); if (mergedActivePickerIndex.value === 0) { onStartEnter(date); } else { onEndEnter(date); } }; const onDateMouseleave = () => { setHoverRangedValue(updateValues(selectedValue.value, null, mergedActivePickerIndex.value)); if (mergedActivePickerIndex.value === 0) { onStartLeave(); } else { onEndLeave(); } }; // ============================= Input ============================= const getSharedInputHookProps = (index, resetText) => ({ forwardKeydown, onBlur: e => { var _a; (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e); }, isClickOutside: target => !elementsContains([panelDivRef.value, startInputDivRef.value, endInputDivRef.value, containerRef.value], target), onFocus: e => { var _a; setMergedActivePickerIndex(index); (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e); }, triggerOpen: newOpen => { triggerOpen(newOpen, index); }, onSubmit: () => { if ( // When user typing disabledDate with keyboard and enter, this value will be empty !selectedValue.value || // Normal disabled check props.disabledDate && props.disabledDate(selectedValue.value[index])) { return false; } triggerChange(selectedValue.value, index); resetText(); }, onCancel: () => { triggerOpen(false, index); setSelectedValue(mergedValue.value); resetText(); } }); const [startInputProps, { focused: startFocused, typing: startTyping }] = usePickerInput(_extends(_extends({}, getSharedInputHookProps(0, resetStartText)), { blurToCancel: needConfirmButton, open: startOpen, value: startText, onKeydown: (e, preventDefault) => { var _a; (_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault); } })); const [endInputProps, { focused: endFocused, typing: endTyping }] = usePickerInput(_extends(_extends({}, getSharedInputHookProps(1, resetEndText)), { blurToCancel: needConfirmButton, open: endOpen, value: endText, onKeydown: (e, preventDefault) => { var _a; (_a = props.onKeydown) === null || _a === void 0 ? void 0 : _a.call(props, e, preventDefault); } })); // ========================== Click Picker ========================== const onPickerClick = e => { var _a; // When click inside the picker & outside the picker's input elements // the panel should still be opened (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, e); if (!mergedOpen.value && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) { if (!mergedDisabled.value[0]) { triggerOpenAndFocus(0); } else if (!mergedDisabled.value[1]) { triggerOpenAndFocus(1); } } }; const onPickerMousedown = e => { var _a; // shouldn't affect input elements if picker is active (_a = props.onMousedown) === null || _a === void 0 ? void 0 : _a.call(props, e); if (mergedOpen.value && (startFocused.value || endFocused.value) && !startInputRef.value.contains(e.target) && !endInputRef.value.contains(e.target)) { e.preventDefault(); } }; // ============================= Sync ============================== // Close should sync back with text value const startStr = computed(() => { var _a; return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[0]) ? formatValue(mergedValue.value[0], { locale: props.locale, format: 'YYYYMMDDHHmmss', generateConfig: props.generateConfig, range: 'start' }) : ''; }); const endStr = computed(() => { var _a; return ((_a = mergedValue.value) === null || _a === void 0 ? void 0 : _a[1]) ? formatValue(mergedValue.value[1], { locale: props.locale, format: 'YYYYMMDDHHmmss', generateConfig: props.generateConfig, range: 'end' }) : ''; }); watch([mergedOpen, startValueTexts, endValueTexts], () => { if (!mergedOpen.value) { setSelectedValue(mergedValue.value); if (!startValueTexts.value.length || startValueTexts.value[0] === '') { triggerStartTextChange(''); } else if (firstStartValueText.value !== startText.value) { resetStartText(); } if (!endValueTexts.value.length || endValueTexts.value[0] === '') { triggerEndTextChange(''); } else if (firstEndValueText.value !== endText.value) { resetEndText(); } } }); // Sync innerValue with control mode watch([startStr, endStr], () => { setSelectedValue(mergedValue.value); }); // ============================ Warning ============================ if (process.env.NODE_ENV !== 'production') { watchEffect(() => { const { value, disabled } = props; if (value && Array.isArray(disabled) && (getValue(disabled, 0) && !getValue(value, 0) || getValue(disabled, 1) && !getValue(value, 1))) { warning(false, '`disabled` should not set with empty `value`. You should set `allowEmpty` or `value` instead.'); } }); } expose({ focus: () => { if (startInputRef.value) { startInputRef.value.focus(); } }, blur: () => { if (startInputRef.value) { startInputRef.value.blur(); } if (endInputRef.value) { endInputRef.value.blur(); } } }); // ============================= Panel ============================= const panelHoverRangedValue = computed(() => { if (mergedOpen.value && hoverRangedValue.value && hoverRangedValue.value[0] && hoverRangedValue.value[1] && props.generateConfig.isAfter(hoverRangedValue.value[1], hoverRangedValue.value[0])) { return hoverRangedValue.value; } else { return null; } }); function renderPanel() { let panelPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; let panelProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; const { generateConfig, showTime, dateRender, direction, disabledTime, prefixCls, locale } = props; let panelShowTime = showTime; if (showTime && typeof showTime === 'object' && showTime.defaultValue) { const timeDefaultValues = showTime.defaultValue; panelShowTime = _extends(_extends({}, showTime), { defaultValue: getValue(timeDefaultValues, mergedActivePickerIndex.value) || undefined }); } let panelDateRender = null; if (dateRender) { panelDateRender = _ref2 => { let { current: date, today } = _ref2; return dateRender({ current: date, today, info: { range: mergedActivePickerIndex.value ? 'end' : 'start' } }); }; } return _createVNode(RangeContextProvider, { "value": { inRange: true, panelPosition, rangedValue: rangeHoverValue.value || selectedValue.value, hoverRangedValue: panelHoverRangedValue.value } }, { default: () => [_createVNode(PickerPanel, _objectSpread(_objectSpread(_objectSpread({}, props), panelProps), {}, { "dateRender": panelDateRender, "showTime": panelShowTime, "mode": mergedModes.value[mergedActivePickerIndex.value], "generateConfig": generateConfig, "style": undefined, "direction": direction, "disabledDate": mergedActivePickerIndex.value === 0 ? disabledStartDate : disabledEndDate, "disabledTime": date => { if (disabledTime) { return disabledTime(date, mergedActivePickerIndex.value === 0 ? 'start' : 'end'); } return false; }, "class": classNames({ [`${prefixCls}-panel-focused`]: mergedActivePickerIndex.value === 0 ? !startTyping.value : !endTyping.value }), "value": getValue(selectedValue.value, mergedActivePickerIndex.value), "locale": locale, "tabIndex": -1, "onPanelChange": (date, newMode) => { // clear hover value when panel change if (mergedActivePickerIndex.value === 0) { onStartLeave(true); } if (mergedActivePickerIndex.value === 1) { onEndLeave(true); } triggerModesChange(updateValues(mergedModes.value, newMode, mergedActivePickerIndex.value), updateValues(selectedValue.value, date, mergedActivePickerIndex.value)); let viewDate = date; if (panelPosition === 'right' && mergedModes.value[mergedActivePickerIndex.value] === newMode) { viewDate = getClosingViewDate(viewDate, newMode, generateConfig, -1); } setViewDate(viewDate, mergedActivePickerIndex.value); }, "onOk": null, "onSelect": undefined, "onChange": undefined, "defaultValue": mergedActivePickerIndex.value === 0 ? getValue(selectedValue.value, 1) : getValue(selectedValue.value, 0) }), null)] }); } const onContextSelect = (date, type) => { const values = updateValues(selectedValue.value, date, mergedActivePickerIndex.value); if (type === 'submit' || type !== 'key' && !needConfirmButton.value) { // triggerChange will also update selected values triggerChange(values, mergedActivePickerIndex.value); // clear hover value style if (mergedActivePickerIndex.value === 0) { onStartLeave(); } else { onEndLeave(); } } else { setSelectedValue(values); } }; useProvidePanel({ operationRef, hideHeader: computed(() => props.picker === 'time'), onDateMouseenter, onDateMouseleave, hideRanges: computed(() => true), onSelect: onContextSelect, open: mergedOpen }); return () => { const { prefixCls = 'rc-picker', id, popupStyle, dropdownClassName, transitionName, dropdownAlign, getPopupContainer, generateConfig, locale, placeholder, autofocus, picker = 'date', showTime, separator = '~', disabledDate, panelRender, allowClear, suffixIcon, clearIcon, inputReadOnly, renderExtraFooter, onMouseenter, onMouseleave, onMouseup, onOk, components, direction, autocomplete = 'off' } = props; const arrowPositionStyle = direction === 'rtl' ? { right: `${arrowLeft.value}px` } : { left: `${arrowLeft.value}px` }; function renderPanels() { let panels; const extraNode = getExtraFooter(prefixCls, mergedModes.value[mergedActivePickerIndex.value], renderExtraFooter); const rangesNode = getRanges({ prefixCls, components, needConfirmButton: needConfirmButton.value, okDisabled: !getValue(selectedValue.value, mergedActivePickerIndex.value) || disabledDate && disabledDate(selectedValue.value[mergedActivePickerIndex.value]), locale, onOk: () => { if (getValue(selectedValue.value, mergedActivePickerIndex.value)) { // triggerChangeOld(selectedValue.value); triggerChange(selectedValue.value, mergedActivePickerIndex.value); if (onOk) { onOk(selectedValue.value); } } } }); if (picker !== 'time' && !showTime) { const viewDate = mergedActivePickerIndex.value === 0 ? startViewDate.value : endViewDate.value; const nextViewDate = getClosingViewDate(viewDate, picker, generateConfig); const currentMode = mergedModes.value[mergedActivePickerIndex.value]; const showDoublePanel = currentMode === picker; const leftPanel = renderPanel(showDoublePanel ? 'left' : false, { pickerValue: viewDate, onPickerValueChange: newViewDate => { setViewDate(newViewDate, mergedActivePickerIndex.value); } }); const rightPanel = renderPanel('right', { pickerValue: nextViewDate, onPickerValueChange: newViewDate => { setViewDate(getClosingViewDate(newViewDate, picker, generateConfig, -1), mergedActivePickerIndex.value); } }); if (direction === 'rtl') { panels = _createVNode(_Fragment, null, [rightPanel, showDoublePanel && leftPanel]); } else { panels = _createVNode(_Fragment, null, [leftPanel, showDoublePanel && rightPanel]); } } else { panels = renderPanel(); } let mergedNodes = _createVNode("div", { "class": `${prefixCls}-panel-layout` }, [_createVNode(PresetPanel, { "prefixCls": prefixCls, "presets": presetList.value, "onClick": nextValue => { triggerChange(nextValue, null); triggerOpen(false, mergedActivePickerIndex.value); }, "onHover": hoverValue => { setRangeHoverValue(hoverValue); } }, null), _createVNode("div", null, [_createVNode("div", { "class": `${prefixCls}-panels` }, [panels]), (extraNode || rangesNode) && _createVNode("div", { "class": `${prefixCls}-footer` }, [extraNode, rangesNode])])]); if (panelRender) { mergedNodes = panelRender(mergedNodes); } return _createVNode("div", { "class": `${prefixCls}-panel-container`, "style": { marginLeft: `${panelLeft.value}px` }, "ref": panelDivRef, "onMousedown": e => { e.preventDefault(); } }, [mergedNodes]); } const rangePanel = _createVNode("div", { "class": classNames(`${prefixCls}-range-wrapper`, `${prefixCls}-${picker}-range-wrapper`), "style": { minWidth: `${popupMinWidth.value}px` } }, [_createVNode("div", { "ref": arrowRef, "class": `${prefixCls}-range-arrow`, "style": arrowPositionStyle }, null), renderPanels()]); // ============================= Icons ============================= let suffixNode; if (suffixIcon) { suffixNode = _createVNode("span", { "class": `${prefixCls}-suffix` }, [suffixIcon]); } let clearNode; if (allowClear && (getValue(mergedValue.value, 0) && !mergedDisabled.value[0] || getValue(mergedValue.value, 1) && !mergedDisabled.value[1])) { clearNode = _createVNode("span", { "onMousedown": e => { e.preventDefault(); e.stopPropagation(); }, "onMouseup": e => { e.preventDefault(); e.stopPropagation(); let values = mergedValue.value; if (!mergedDisabled.value[0]) { values = updateValues(values, null, 0); } if (!mergedDisabled.value[1]) { values = updateValues(values, null, 1); } triggerChange(values, null); triggerOpen(false, mergedActivePickerIndex.value); }, "class": `${prefixCls}-clear` }, [clearIcon || _createVNode("span", { "class": `${prefixCls}-clear-btn` }, null)]); } const inputSharedProps = { size: getInputSize(picker, formatList.value[0], generateConfig) }; let activeBarLeft = 0; let activeBarWidth = 0; if (startInputDivRef.value && endInputDivRef.value && separatorRef.value) { if (mergedActivePickerIndex.value === 0) { activeBarWidth = startInputDivRef.value.offsetWidth; } else { activeBarLeft = arrowLeft.value; activeBarWidth = endInputDivRef.value.offsetWidth; } } const activeBarPositionStyle = direction === 'rtl' ? { right: `${activeBarLeft}px` } : { left: `${activeBarLeft}px` }; // ============================ Return ============================= return _createVNode("div", _objectSpread({ "ref": containerRef, "class": classNames(prefixCls, `${prefixCls}-range`, attrs.class, { [`${prefixCls}-disabled`]: mergedDisabled.value[0] && mergedDisabled.value[1], [`${prefixCls}-focused`]: mergedActivePickerIndex.value === 0 ? startFocused.value : endFocused.value, [`${prefixCls}-rtl`]: direction === 'rtl' }), "style": attrs.style, "onClick": onPickerClick, "onMouseenter": onMouseenter, "onMouseleave": onMouseleave, "onMousedown": onPickerMousedown, "onMouseup": onMouseup }, getDataOrAriaProps(props)), [_createVNode("div", { "class": classNames(`${prefixCls}-input`, { [`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 0, [`${prefixCls}-input-placeholder`]: !!startHoverValue.value }), "ref": startInputDivRef }, [_createVNode("input", _objectSpread(_objectSpread(_objectSpread({ "id": id, "disabled": mergedDisabled.value[0], "readonly": inputReadOnly || typeof formatList.value[0] === 'function' || !startTyping.value, "value": startHoverValue.value || startText.value, "onInput": e => { triggerStartTextChange(e.target.value); }, "autofocus": autofocus, "placeholder": getValue(placeholder, 0) || '', "ref": startInputRef }, startInputProps.value), inputSharedProps), {}, { "autocomplete": autocomplete }), null)]), _createVNode("div", { "class": `${prefixCls}-range-separator`, "ref": separatorRef }, [separator]), _createVNode("div", { "class": classNames(`${prefixCls}-input`, { [`${prefixCls}-input-active`]: mergedActivePickerIndex.value === 1, [`${prefixCls}-input-placeholder`]: !!endHoverValue.value }), "ref": endInputDivRef }, [_createVNode("input", _objectSpread(_objectSpread(_objectSpread({ "disabled": mergedDisabled.value[1], "readonly": inputReadOnly || typeof formatList.value[0] === 'function' || !endTyping.value, "value": endHoverValue.value || endText.value, "onInput": e => { triggerEndTextChange(e.target.value); }, "placeholder": getValue(placeholder, 1) || '', "ref": endInputRef }, endInputProps.value), inputSharedProps), {}, { "autocomplete": autocomplete }), null)]), _createVNode("div", { "class": `${prefixCls}-active-bar`, "style": _extends(_extends({}, activeBarPositionStyle), { width: `${activeBarWidth}px`, position: 'absolute' }) }, null), suffixNode, clearNode, _createVNode(PickerTrigger, { "visible": mergedOpen.value, "popupStyle": popupStyle, "prefixCls": prefixCls, "dropdownClassName": dropdownClassName, "dropdownAlign": dropdownAlign, "getPopupContainer": getPopupContainer, "transitionName": transitionName, "range": true, "direction": direction }, { default: () => [_createVNode("div", { "style": { pointerEvents: 'none', position: 'absolute', top: 0, bottom: 0, left: 0, right: 0 } }, null)], popupElement: () => rangePanel })]); }; } }); } const InterRangerPicker = RangerPicker(); export default InterRangerPicker;