2024-01-29 09:26:07 +08:00

1013 lines
34 KiB
JavaScript

import { h, defineComponent, ref, Transition, computed, provide, watch, withDirectives, toRef, watchEffect } from 'vue';
import { VBinder, VTarget, VFollower } from 'vueuc';
import { clickoutside } from 'vdirs';
import { format, getTime, isValid } from "date-fns/esm/index.js";
import { useIsMounted, useMergedState } from 'vooks';
import { getPreciseEventTarget, happensIn } from 'seemly';
import { DateIcon, ToIcon } from "../../_internal/icons/index.mjs";
import { NInput } from "../../input/index.mjs";
import { NBaseIcon } from "../../_internal/index.mjs";
import { useFormItem, useTheme, useConfig, useLocale, useThemeClass } from "../../_mixins/index.mjs";
import { warn, call, useAdjustedTo, createKey, warnOnce, resolveSlot, markEventEffectPerformed } from "../../_utils/index.mjs";
import { datePickerLight } from "../styles/index.mjs";
import { strictParse } from "./utils.mjs";
import { uniCalendarValidation, dualCalendarValidation } from "./validation-utils.mjs";
import { datePickerInjectionKey } from "./interface.mjs";
import DatetimePanel from "./panel/datetime.mjs";
import DatetimerangePanel from "./panel/datetimerange.mjs";
import DatePanel from "./panel/date.mjs";
import DaterangePanel from "./panel/daterange.mjs";
import MonthPanel from "./panel/month.mjs";
import MonthRangePanel from "./panel/monthrange.mjs";
import style from "./styles/index.cssr.mjs";
export const datePickerProps = Object.assign(Object.assign({}, useTheme.props), {
to: useAdjustedTo.propTo,
bordered: {
type: Boolean,
default: undefined
},
clearable: Boolean,
updateValueOnClose: Boolean,
defaultValue: [Number, Array],
defaultFormattedValue: [String, Array],
defaultTime: [Number, String, Array],
disabled: {
type: Boolean,
default: undefined
},
placement: {
type: String,
default: 'bottom-start'
},
value: [Number, Array],
formattedValue: [String, Array],
size: String,
type: {
type: String,
default: 'date'
},
valueFormat: String,
separator: String,
placeholder: String,
startPlaceholder: String,
endPlaceholder: String,
format: String,
dateFormat: String,
timeFormat: String,
actions: Array,
shortcuts: Object,
isDateDisabled: Function,
isTimeDisabled: Function,
show: {
type: Boolean,
default: undefined
},
panel: Boolean,
ranges: Object,
firstDayOfWeek: Number,
inputReadonly: Boolean,
closeOnSelect: Boolean,
status: String,
timePickerProps: [Object, Array],
onClear: Function,
onConfirm: Function,
defaultCalendarStartTime: Number,
defaultCalendarEndTime: Number,
bindCalendarMonths: Boolean,
monthFormat: {
type: String,
default: 'M'
},
yearFormat: {
type: String,
default: 'y'
},
quarterFormat: {
type: String,
default: "'Q'Q"
},
'onUpdate:show': [Function, Array],
onUpdateShow: [Function, Array],
'onUpdate:formattedValue': [Function, Array],
onUpdateFormattedValue: [Function, Array],
'onUpdate:value': [Function, Array],
onUpdateValue: [Function, Array],
onFocus: [Function, Array],
onBlur: [Function, Array],
onNextMonth: Function,
onPrevMonth: Function,
onNextYear: Function,
onPrevYear: Function,
// deprecated
onChange: [Function, Array]
});
export default defineComponent({
name: 'DatePicker',
props: datePickerProps,
setup(props, {
slots
}) {
var _a;
if (process.env.NODE_ENV !== 'production') {
watchEffect(() => {
if (props.onChange !== undefined) {
warnOnce('date-picker', '`on-change` is deprecated, please use `on-update:value` instead.');
}
});
}
const {
localeRef,
dateLocaleRef
} = useLocale('DatePicker');
const formItem = useFormItem(props);
const {
mergedSizeRef,
mergedDisabledRef,
mergedStatusRef
} = formItem;
const {
mergedComponentPropsRef,
mergedClsPrefixRef,
mergedBorderedRef,
namespaceRef,
inlineThemeDisabled
} = useConfig(props);
const panelInstRef = ref(null);
const triggerElRef = ref(null);
const inputInstRef = ref(null);
const uncontrolledShowRef = ref(false);
const controlledShowRef = toRef(props, 'show');
const mergedShowRef = useMergedState(controlledShowRef, uncontrolledShowRef);
const dateFnsOptionsRef = computed(() => {
return {
locale: dateLocaleRef.value.locale
};
});
const mergedFormatRef = computed(() => {
const {
format
} = props;
if (format) return format;
switch (props.type) {
case 'date':
case 'daterange':
return localeRef.value.dateFormat;
case 'datetime':
case 'datetimerange':
return localeRef.value.dateTimeFormat;
case 'year':
case 'yearrange':
return localeRef.value.yearTypeFormat;
case 'month':
case 'monthrange':
return localeRef.value.monthTypeFormat;
case 'quarter':
case 'quarterrange':
return localeRef.value.quarterFormat;
case 'week':
return localeRef.value.weekFormat;
}
});
const mergedValueFormatRef = computed(() => {
var _a;
return (_a = props.valueFormat) !== null && _a !== void 0 ? _a : mergedFormatRef.value;
});
function getTimestampValue(value) {
if (value === null) return null;
const {
value: mergedValueFormat
} = mergedValueFormatRef;
const {
value: dateFnsOptions
} = dateFnsOptionsRef;
if (Array.isArray(value)) {
return [strictParse(value[0], mergedValueFormat, new Date(), dateFnsOptions).getTime(), strictParse(value[1], mergedValueFormat, new Date(), dateFnsOptions).getTime()];
}
return strictParse(value, mergedValueFormat, new Date(), dateFnsOptions).getTime();
}
const {
defaultFormattedValue,
defaultValue
} = props;
const uncontrolledValueRef = ref((_a = defaultFormattedValue !== undefined ? getTimestampValue(defaultFormattedValue) : defaultValue) !== null && _a !== void 0 ? _a : null);
const controlledValueRef = computed(() => {
const {
formattedValue
} = props;
if (formattedValue !== undefined) {
return getTimestampValue(formattedValue);
}
return props.value;
});
const mergedValueRef = useMergedState(controlledValueRef, uncontrolledValueRef);
// We don't change value unless blur or confirm is called
const pendingValueRef = ref(null);
watchEffect(() => {
pendingValueRef.value = mergedValueRef.value;
});
const singleInputValueRef = ref('');
const rangeStartInputValueRef = ref('');
const rangeEndInputValueRef = ref('');
const themeRef = useTheme('DatePicker', '-date-picker', style, datePickerLight, props, mergedClsPrefixRef);
const timePickerSizeRef = computed(() => {
var _a, _b;
return ((_b = (_a = mergedComponentPropsRef === null || mergedComponentPropsRef === void 0 ? void 0 : mergedComponentPropsRef.value) === null || _a === void 0 ? void 0 : _a.DatePicker) === null || _b === void 0 ? void 0 : _b.timePickerSize) || 'small';
});
const isRangeRef = computed(() => {
return ['daterange', 'datetimerange', 'monthrange', 'quarterrange', 'yearrange'].includes(props.type);
});
const localizedPlacehoderRef = computed(() => {
const {
placeholder
} = props;
if (placeholder === undefined) {
const {
type
} = props;
switch (type) {
case 'date':
return localeRef.value.datePlaceholder;
case 'datetime':
return localeRef.value.datetimePlaceholder;
case 'month':
return localeRef.value.monthPlaceholder;
case 'year':
return localeRef.value.yearPlaceholder;
case 'quarter':
return localeRef.value.quarterPlaceholder;
case 'week':
return localeRef.value.weekPlaceholder;
default:
return '';
}
} else {
return placeholder;
}
});
const localizedStartPlaceholderRef = computed(() => {
if (props.startPlaceholder === undefined) {
if (props.type === 'daterange') {
return localeRef.value.startDatePlaceholder;
} else if (props.type === 'datetimerange') {
return localeRef.value.startDatetimePlaceholder;
} else if (props.type === 'monthrange') {
return localeRef.value.startMonthPlaceholder;
}
return '';
} else {
return props.startPlaceholder;
}
});
const localizedEndPlaceholderRef = computed(() => {
if (props.endPlaceholder === undefined) {
if (props.type === 'daterange') {
return localeRef.value.endDatePlaceholder;
} else if (props.type === 'datetimerange') {
return localeRef.value.endDatetimePlaceholder;
} else if (props.type === 'monthrange') {
return localeRef.value.endMonthPlaceholder;
}
return '';
} else {
return props.endPlaceholder;
}
});
const mergedActionsRef = computed(() => {
const {
actions,
type,
clearable
} = props;
if (actions === null) return [];
if (actions !== undefined) return actions;
const result = clearable ? ['clear'] : [];
switch (type) {
case 'date':
case 'week':
{
result.push('now');
return result;
}
case 'datetime':
{
result.push('now', 'confirm');
return result;
}
case 'daterange':
{
result.push('confirm');
return result;
}
case 'datetimerange':
{
result.push('confirm');
return result;
}
case 'month':
{
result.push('now', 'confirm');
return result;
}
case 'year':
{
result.push('now');
return result;
}
case 'quarter':
{
result.push('now', 'confirm');
return result;
}
case 'monthrange':
case 'yearrange':
case 'quarterrange':
{
result.push('confirm');
return result;
}
default:
{
warn('date-picker', "The type is wrong, n-date-picker's type only supports `date`, `datetime`, `daterange` and `datetimerange`.");
break;
}
}
});
function getFormattedValue(value) {
if (value === null) return null;
if (Array.isArray(value)) {
const {
value: mergedValueFormat
} = mergedValueFormatRef;
const {
value: dateFnsOptions
} = dateFnsOptionsRef;
return [format(value[0], mergedValueFormat, dateFnsOptions), format(value[1], mergedValueFormat, dateFnsOptionsRef.value)];
} else {
return format(value, mergedValueFormatRef.value, dateFnsOptionsRef.value);
}
}
function doUpdatePendingValue(value) {
pendingValueRef.value = value;
}
function doUpdateFormattedValue(value, timestampValue) {
const {
'onUpdate:formattedValue': _onUpdateFormattedValue,
onUpdateFormattedValue
} = props;
if (_onUpdateFormattedValue) {
call(_onUpdateFormattedValue, value, timestampValue);
}
if (onUpdateFormattedValue) {
call(onUpdateFormattedValue, value, timestampValue);
}
}
function doUpdateValue(value, options) {
const {
'onUpdate:value': _onUpdateValue,
onUpdateValue,
onChange
} = props;
const {
nTriggerFormChange,
nTriggerFormInput
} = formItem;
const formattedValue = getFormattedValue(value);
if (options.doConfirm) {
doConfirm(value, formattedValue);
}
if (onUpdateValue) {
call(onUpdateValue, value, formattedValue);
}
if (_onUpdateValue) {
call(_onUpdateValue, value, formattedValue);
}
if (onChange) call(onChange, value, formattedValue);
uncontrolledValueRef.value = value;
doUpdateFormattedValue(formattedValue, value);
nTriggerFormChange();
nTriggerFormInput();
}
function doClear() {
const {
onClear
} = props;
onClear === null || onClear === void 0 ? void 0 : onClear();
}
function doConfirm(value, formattedValue) {
const {
onConfirm
} = props;
if (onConfirm) onConfirm(value, formattedValue);
}
function doFocus(e) {
const {
onFocus
} = props;
const {
nTriggerFormFocus
} = formItem;
if (onFocus) call(onFocus, e);
nTriggerFormFocus();
}
function doBlur(e) {
const {
onBlur
} = props;
const {
nTriggerFormBlur
} = formItem;
if (onBlur) call(onBlur, e);
nTriggerFormBlur();
}
function doUpdateShow(show) {
const {
'onUpdate:show': _onUpdateShow,
onUpdateShow
} = props;
if (_onUpdateShow) call(_onUpdateShow, show);
if (onUpdateShow) call(onUpdateShow, show);
uncontrolledShowRef.value = show;
}
function handleKeydown(e) {
if (e.key === 'Escape') {
if (mergedShowRef.value) {
markEventEffectPerformed(e);
closeCalendar({
returnFocus: true
});
}
}
// We need to handle the conflict with normal date value input
// const { value: mergedValue } = mergedValueRef
// if (props.type === 'date' && !Array.isArray(mergedValue)) {
// const nextValue = getDerivedTimeFromKeyboardEvent(mergedValue, e)
// doUpdateValue(nextValue)
// }
}
function handleInputKeydown(e) {
if (e.key === 'Escape' && mergedShowRef.value) {
markEventEffectPerformed(e);
// closeCalendar will be called in handleDeactivated
}
}
function handleClear() {
var _a;
doUpdateShow(false);
(_a = inputInstRef.value) === null || _a === void 0 ? void 0 : _a.deactivate();
doClear();
}
function handlePanelClear() {
var _a;
// close will be called inside panel
(_a = inputInstRef.value) === null || _a === void 0 ? void 0 : _a.deactivate();
doClear();
}
function handlePanelTabOut() {
closeCalendar({
returnFocus: true
});
}
function handleClickOutside(e) {
var _a;
if (mergedShowRef.value && !((_a = triggerElRef.value) === null || _a === void 0 ? void 0 : _a.contains(getPreciseEventTarget(e)))) {
closeCalendar({
returnFocus: false
});
}
}
function handlePanelClose(disableUpdateOnClose) {
closeCalendar({
returnFocus: true,
disableUpdateOnClose
});
}
// --- Panel update value
function handlePanelUpdateValue(value, doUpdate) {
if (doUpdate) {
doUpdateValue(value, {
doConfirm: false
});
} else {
doUpdatePendingValue(value);
}
}
function handlePanelConfirm() {
const pendingValue = pendingValueRef.value;
doUpdateValue(Array.isArray(pendingValue) ? [pendingValue[0], pendingValue[1]] : pendingValue, {
doConfirm: true
});
}
// --- Refresh
function deriveInputState() {
const {
value
} = pendingValueRef;
if (isRangeRef.value) {
if (Array.isArray(value) || value === null) {
deriveRangeInputState(value);
}
} else {
if (!Array.isArray(value)) {
deriveSingleInputState(value);
}
}
}
function deriveSingleInputState(value) {
if (value === null) {
singleInputValueRef.value = '';
} else {
singleInputValueRef.value = format(value, mergedFormatRef.value, dateFnsOptionsRef.value);
}
}
function deriveRangeInputState(values) {
if (values === null) {
rangeStartInputValueRef.value = '';
rangeEndInputValueRef.value = '';
} else {
const dateFnsOptions = dateFnsOptionsRef.value;
rangeStartInputValueRef.value = format(values[0], mergedFormatRef.value, dateFnsOptions);
rangeEndInputValueRef.value = format(values[1], mergedFormatRef.value, dateFnsOptions);
}
}
// --- Input deactivate & blur
function handleInputActivate() {
if (!mergedShowRef.value) {
openCalendar();
}
}
function handleInputBlur(e) {
var _a;
if (!((_a = panelInstRef.value) === null || _a === void 0 ? void 0 : _a.$el.contains(e.relatedTarget))) {
doBlur(e);
deriveInputState();
closeCalendar({
returnFocus: false
});
}
}
function handleInputDeactivate() {
if (mergedDisabledRef.value) return;
deriveInputState();
closeCalendar({
returnFocus: false
});
}
// --- Input
function handleSingleUpdateValue(v) {
// TODO, fix conflict with clear
if (v === '') {
doUpdateValue(null, {
doConfirm: false
});
pendingValueRef.value = null;
singleInputValueRef.value = '';
return;
}
const newSelectedDateTime = strictParse(v, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
if (isValid(newSelectedDateTime)) {
doUpdateValue(getTime(newSelectedDateTime), {
doConfirm: false
});
deriveInputState();
} else {
singleInputValueRef.value = v;
}
}
function handleRangeUpdateValue(v, {
source
}) {
if (v[0] === '' && v[1] === '') {
// clear or just delete all the inputs
doUpdateValue(null, {
doConfirm: false
});
pendingValueRef.value = null;
rangeStartInputValueRef.value = '';
rangeEndInputValueRef.value = '';
return;
}
const [startTime, endTime] = v;
const newStartTime = strictParse(startTime, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
const newEndTime = strictParse(endTime, mergedFormatRef.value, new Date(), dateFnsOptionsRef.value);
if (isValid(newStartTime) && isValid(newEndTime)) {
let newStartTs = getTime(newStartTime);
let newEndTs = getTime(newEndTime);
if (newEndTime < newStartTime) {
if (source === 0) {
newEndTs = newStartTs;
} else {
newStartTs = newEndTs;
}
}
doUpdateValue([newStartTs, newEndTs], {
doConfirm: false
});
deriveInputState();
} else {
;
[rangeStartInputValueRef.value, rangeEndInputValueRef.value] = v;
}
}
// --- Click
function handleTriggerClick(e) {
if (mergedDisabledRef.value) return;
if (happensIn(e, 'clear')) return;
if (!mergedShowRef.value) {
openCalendar();
}
}
// --- Focus
function handleInputFocus(e) {
if (mergedDisabledRef.value) return;
doFocus(e);
}
// --- Calendar
function openCalendar() {
if (mergedDisabledRef.value || mergedShowRef.value) return;
doUpdateShow(true);
}
function closeCalendar({
returnFocus,
disableUpdateOnClose
}) {
var _a;
if (mergedShowRef.value) {
doUpdateShow(false);
if (props.type !== 'date' && props.updateValueOnClose && !disableUpdateOnClose) {
handlePanelConfirm();
}
if (returnFocus) {
(_a = inputInstRef.value) === null || _a === void 0 ? void 0 : _a.focus();
}
}
}
// If new value is valid, set calendarTime and refresh display strings.
// If new value is invalid, do nothing.
watch(pendingValueRef, () => {
deriveInputState();
});
// init
deriveInputState();
watch(mergedShowRef, value => {
if (!value) {
// close & restore original value
// it won't conflict with props.value change
// since when prop is passed, it is already
// up to date.
pendingValueRef.value = mergedValueRef.value;
}
});
// use pending value to do validation
const uniVaidation = uniCalendarValidation(props, pendingValueRef);
const dualValidation = dualCalendarValidation(props, pendingValueRef);
provide(datePickerInjectionKey, Object.assign(Object.assign(Object.assign({
mergedClsPrefixRef,
mergedThemeRef: themeRef,
timePickerSizeRef,
localeRef,
dateLocaleRef,
firstDayOfWeekRef: toRef(props, 'firstDayOfWeek'),
isDateDisabledRef: toRef(props, 'isDateDisabled'),
rangesRef: toRef(props, 'ranges'),
timePickerPropsRef: toRef(props, 'timePickerProps'),
closeOnSelectRef: toRef(props, 'closeOnSelect'),
updateValueOnCloseRef: toRef(props, 'updateValueOnClose'),
monthFormatRef: toRef(props, 'monthFormat'),
yearFormatRef: toRef(props, 'yearFormat'),
quarterFormatRef: toRef(props, 'quarterFormat')
}, uniVaidation), dualValidation), {
datePickerSlots: slots
}));
const exposedMethods = {
focus: () => {
var _a;
(_a = inputInstRef.value) === null || _a === void 0 ? void 0 : _a.focus();
},
blur: () => {
var _a;
(_a = inputInstRef.value) === null || _a === void 0 ? void 0 : _a.blur();
}
};
const triggerCssVarsRef = computed(() => {
const {
common: {
cubicBezierEaseInOut
},
self: {
iconColor,
iconColorDisabled
}
} = themeRef.value;
return {
'--n-bezier': cubicBezierEaseInOut,
'--n-icon-color-override': iconColor,
'--n-icon-color-disabled-override': iconColorDisabled
};
});
const triggerThemeClassHandle = inlineThemeDisabled ? useThemeClass('date-picker-trigger', undefined, triggerCssVarsRef, props) : undefined;
const cssVarsRef = computed(() => {
const {
type
} = props;
const {
common: {
cubicBezierEaseInOut
},
self: {
calendarTitleFontSize,
calendarDaysFontSize,
itemFontSize,
itemTextColor,
itemColorDisabled,
itemColorIncluded,
itemColorHover,
itemColorActive,
itemBorderRadius,
itemTextColorDisabled,
itemTextColorActive,
panelColor,
panelTextColor,
arrowColor,
calendarTitleTextColor,
panelActionDividerColor,
panelHeaderDividerColor,
calendarDaysDividerColor,
panelBoxShadow,
panelBorderRadius,
calendarTitleFontWeight,
panelExtraFooterPadding,
panelActionPadding,
itemSize,
itemCellWidth,
itemCellHeight,
scrollItemWidth,
scrollItemHeight,
calendarTitlePadding,
calendarTitleHeight,
calendarDaysHeight,
calendarDaysTextColor,
arrowSize,
panelHeaderPadding,
calendarDividerColor,
calendarTitleGridTempateColumns,
iconColor,
iconColorDisabled,
scrollItemBorderRadius,
calendarTitleColorHover,
[createKey('calendarLeftPadding', type)]: calendarLeftPadding,
[createKey('calendarRightPadding', type)]: calendarRightPadding
}
} = themeRef.value;
return {
'--n-bezier': cubicBezierEaseInOut,
'--n-panel-border-radius': panelBorderRadius,
'--n-panel-color': panelColor,
'--n-panel-box-shadow': panelBoxShadow,
'--n-panel-text-color': panelTextColor,
// panel header
'--n-panel-header-padding': panelHeaderPadding,
'--n-panel-header-divider-color': panelHeaderDividerColor,
// panel calendar
'--n-calendar-left-padding': calendarLeftPadding,
'--n-calendar-right-padding': calendarRightPadding,
'--n-calendar-title-color-hover': calendarTitleColorHover,
'--n-calendar-title-height': calendarTitleHeight,
'--n-calendar-title-padding': calendarTitlePadding,
'--n-calendar-title-font-size': calendarTitleFontSize,
'--n-calendar-title-font-weight': calendarTitleFontWeight,
'--n-calendar-title-text-color': calendarTitleTextColor,
'--n-calendar-title-grid-template-columns': calendarTitleGridTempateColumns,
'--n-calendar-days-height': calendarDaysHeight,
'--n-calendar-days-divider-color': calendarDaysDividerColor,
'--n-calendar-days-font-size': calendarDaysFontSize,
'--n-calendar-days-text-color': calendarDaysTextColor,
'--n-calendar-divider-color': calendarDividerColor,
// panel action
'--n-panel-action-padding': panelActionPadding,
'--n-panel-extra-footer-padding': panelExtraFooterPadding,
'--n-panel-action-divider-color': panelActionDividerColor,
// panel item
'--n-item-font-size': itemFontSize,
'--n-item-border-radius': itemBorderRadius,
'--n-item-size': itemSize,
'--n-item-cell-width': itemCellWidth,
'--n-item-cell-height': itemCellHeight,
'--n-item-text-color': itemTextColor,
'--n-item-color-included': itemColorIncluded,
'--n-item-color-disabled': itemColorDisabled,
'--n-item-color-hover': itemColorHover,
'--n-item-color-active': itemColorActive,
'--n-item-text-color-disabled': itemTextColorDisabled,
'--n-item-text-color-active': itemTextColorActive,
// scroll item
'--n-scroll-item-width': scrollItemWidth,
'--n-scroll-item-height': scrollItemHeight,
'--n-scroll-item-border-radius': scrollItemBorderRadius,
// panel arrow
'--n-arrow-size': arrowSize,
'--n-arrow-color': arrowColor,
// icon in trigger
'--n-icon-color': iconColor,
'--n-icon-color-disabled': iconColorDisabled
};
});
const themeClassHandle = inlineThemeDisabled ? useThemeClass('date-picker', computed(() => {
return props.type;
}), cssVarsRef, props) : undefined;
return Object.assign(Object.assign({}, exposedMethods), {
mergedStatus: mergedStatusRef,
mergedClsPrefix: mergedClsPrefixRef,
mergedBordered: mergedBorderedRef,
namespace: namespaceRef,
uncontrolledValue: uncontrolledValueRef,
pendingValue: pendingValueRef,
panelInstRef,
triggerElRef,
inputInstRef,
isMounted: useIsMounted(),
displayTime: singleInputValueRef,
displayStartTime: rangeStartInputValueRef,
displayEndTime: rangeEndInputValueRef,
mergedShow: mergedShowRef,
adjustedTo: useAdjustedTo(props),
isRange: isRangeRef,
localizedStartPlaceholder: localizedStartPlaceholderRef,
localizedEndPlaceholder: localizedEndPlaceholderRef,
mergedSize: mergedSizeRef,
mergedDisabled: mergedDisabledRef,
localizedPlacehoder: localizedPlacehoderRef,
isValueInvalid: uniVaidation.isValueInvalidRef,
isStartValueInvalid: dualValidation.isStartValueInvalidRef,
isEndValueInvalid: dualValidation.isEndValueInvalidRef,
handleInputKeydown,
handleClickOutside,
handleKeydown,
handleClear,
handlePanelClear,
handleTriggerClick,
handleInputActivate,
handleInputDeactivate,
handleInputFocus,
handleInputBlur,
handlePanelTabOut,
handlePanelClose,
handleRangeUpdateValue,
handleSingleUpdateValue,
handlePanelUpdateValue,
handlePanelConfirm,
mergedTheme: themeRef,
actions: mergedActionsRef,
triggerCssVars: inlineThemeDisabled ? undefined : triggerCssVarsRef,
triggerThemeClass: triggerThemeClassHandle === null || triggerThemeClassHandle === void 0 ? void 0 : triggerThemeClassHandle.themeClass,
triggerOnRender: triggerThemeClassHandle === null || triggerThemeClassHandle === void 0 ? void 0 : triggerThemeClassHandle.onRender,
cssVars: inlineThemeDisabled ? undefined : cssVarsRef,
themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass,
onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender,
onNextMonth: props.onNextMonth,
onPrevMonth: props.onPrevMonth,
onNextYear: props.onNextYear,
onPrevYear: props.onPrevYear
});
},
render() {
const {
clearable,
triggerOnRender,
mergedClsPrefix,
$slots
} = this;
const commonPanelProps = {
onUpdateValue: this.handlePanelUpdateValue,
onTabOut: this.handlePanelTabOut,
onClose: this.handlePanelClose,
onClear: this.handlePanelClear,
onKeydown: this.handleKeydown,
onConfirm: this.handlePanelConfirm,
ref: 'panelInstRef',
value: this.pendingValue,
active: this.mergedShow,
actions: this.actions,
shortcuts: this.shortcuts,
style: this.cssVars,
defaultTime: this.defaultTime,
themeClass: this.themeClass,
panel: this.panel,
onRender: this.onRender,
onNextMonth: this.onNextMonth,
onPrevMonth: this.onPrevMonth,
onNextYear: this.onNextYear,
onPrevYear: this.onPrevYear
};
const renderPanel = () => {
const {
type
} = this;
return type === 'datetime' ? h(DatetimePanel, Object.assign({}, commonPanelProps), $slots) : type === 'daterange' ? h(DaterangePanel, Object.assign({}, commonPanelProps, {
defaultCalendarStartTime: this.defaultCalendarStartTime,
defaultCalendarEndTime: this.defaultCalendarEndTime,
bindCalendarMonths: this.bindCalendarMonths
}), $slots) : type === 'datetimerange' ? h(DatetimerangePanel, Object.assign({}, commonPanelProps, {
defaultCalendarStartTime: this.defaultCalendarStartTime,
defaultCalendarEndTime: this.defaultCalendarEndTime,
bindCalendarMonths: this.bindCalendarMonths
}), $slots) : type === 'month' || type === 'year' || type === 'quarter' ? h(MonthPanel, Object.assign({}, commonPanelProps, {
type: type,
key: type
})) : type === 'monthrange' || type === 'yearrange' || type === 'quarterrange' ? h(MonthRangePanel, Object.assign({}, commonPanelProps, {
type: type
})) : h(DatePanel, Object.assign({}, commonPanelProps, {
type: type
}), $slots);
};
if (this.panel) {
return renderPanel();
}
triggerOnRender === null || triggerOnRender === void 0 ? void 0 : triggerOnRender();
const commonInputProps = {
bordered: this.mergedBordered,
size: this.mergedSize,
passivelyActivated: true,
disabled: this.mergedDisabled,
readonly: this.inputReadonly || this.mergedDisabled,
clearable,
onClear: this.handleClear,
onClick: this.handleTriggerClick,
onKeydown: this.handleInputKeydown,
onActivate: this.handleInputActivate,
onDeactivate: this.handleInputDeactivate,
onFocus: this.handleInputFocus,
onBlur: this.handleInputBlur
};
return h("div", {
ref: "triggerElRef",
class: [`${mergedClsPrefix}-date-picker`, this.mergedDisabled && `${mergedClsPrefix}-date-picker--disabled`, this.isRange && `${mergedClsPrefix}-date-picker--range`, this.triggerThemeClass],
style: this.triggerCssVars,
onKeydown: this.handleKeydown
}, h(VBinder, null, {
default: () => [h(VTarget, null, {
default: () => this.isRange ? h(NInput, Object.assign({
ref: "inputInstRef",
status: this.mergedStatus,
value: [this.displayStartTime, this.displayEndTime],
placeholder: [this.localizedStartPlaceholder, this.localizedEndPlaceholder],
textDecoration: [this.isStartValueInvalid ? 'line-through' : '', this.isEndValueInvalid ? 'line-through' : ''],
pair: true,
onUpdateValue: this.handleRangeUpdateValue,
theme: this.mergedTheme.peers.Input,
themeOverrides: this.mergedTheme.peerOverrides.Input,
internalForceFocus: this.mergedShow,
internalDeactivateOnEnter: true
}, commonInputProps), {
separator: () => this.separator === undefined ? resolveSlot($slots.separator, () => [h(NBaseIcon, {
clsPrefix: mergedClsPrefix,
class: `${mergedClsPrefix}-date-picker-icon`
}, {
default: () => h(ToIcon, null)
})]) : this.separator,
[clearable ? 'clear-icon-placeholder' : 'suffix']: () => resolveSlot($slots['date-icon'], () => [h(NBaseIcon, {
clsPrefix: mergedClsPrefix,
class: `${mergedClsPrefix}-date-picker-icon`
}, {
default: () => h(DateIcon, null)
})])
}) : h(NInput, Object.assign({
ref: "inputInstRef",
status: this.mergedStatus,
value: this.displayTime,
placeholder: this.localizedPlacehoder,
textDecoration: this.isValueInvalid && !this.isRange ? 'line-through' : '',
onUpdateValue: this.handleSingleUpdateValue,
theme: this.mergedTheme.peers.Input,
themeOverrides: this.mergedTheme.peerOverrides.Input,
internalForceFocus: this.mergedShow,
internalDeactivateOnEnter: true
}, commonInputProps), {
[clearable ? 'clear-icon-placeholder' : 'suffix']: () => h(NBaseIcon, {
clsPrefix: mergedClsPrefix,
class: `${mergedClsPrefix}-date-picker-icon`
}, {
default: () => resolveSlot($slots['date-icon'], () => [h(DateIcon, null)])
})
})
}), h(VFollower, {
show: this.mergedShow,
containerClass: this.namespace,
to: this.adjustedTo,
teleportDisabled: this.adjustedTo === useAdjustedTo.tdkey,
placement: this.placement
}, {
default: () => h(Transition, {
name: "fade-in-scale-up-transition",
appear: this.isMounted
}, {
default: () => {
if (!this.mergedShow) return null;
return withDirectives(renderPanel(), [[clickoutside, this.handleClickOutside, undefined, {
capture: true
}]]);
}
})
})]
}));
}
});