fix: date-picker
parent
55f0d33a6d
commit
d5312db30b
|
@ -13,7 +13,9 @@ import { defineComponent, ref } from 'vue';
|
||||||
import useConfigInject from '../../_util/hooks/useConfigInject';
|
import useConfigInject from '../../_util/hooks/useConfigInject';
|
||||||
import classNames from '../../_util/classNames';
|
import classNames from '../../_util/classNames';
|
||||||
import { commonProps, rangePickerProps } from './props';
|
import { commonProps, rangePickerProps } from './props';
|
||||||
import Omit from 'omit.js';
|
import { PanelMode, RangeValue } from '../../vc-picker/interface';
|
||||||
|
import { RangePickerSharedProps } from '../../vc-picker/RangePicker';
|
||||||
|
import devWarning from '../../vc-util/devWarning';
|
||||||
|
|
||||||
export default function generateRangePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
export default function generateRangePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
||||||
const RangePicker = defineComponent<RangePickerProps<DateType>>({
|
const RangePicker = defineComponent<RangePickerProps<DateType>>({
|
||||||
|
@ -35,8 +37,22 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
'renderExtraFooter',
|
'renderExtraFooter',
|
||||||
// 'separator',
|
// 'separator',
|
||||||
],
|
],
|
||||||
emits: ['change', 'panelChange', 'ok', 'openChange', 'update:value', 'calendarChange'],
|
emits: [
|
||||||
|
'change',
|
||||||
|
'panelChange',
|
||||||
|
'ok',
|
||||||
|
'openChange',
|
||||||
|
'update:value',
|
||||||
|
'calendarChange',
|
||||||
|
'focus',
|
||||||
|
'blur',
|
||||||
|
],
|
||||||
setup(props, { expose, slots, attrs, emit }) {
|
setup(props, { expose, slots, attrs, emit }) {
|
||||||
|
devWarning(
|
||||||
|
!(attrs as any).getCalendarContainer,
|
||||||
|
'DatePicker',
|
||||||
|
'`getCalendarContainer` is deprecated. Please use `getPopupContainer"` instead.',
|
||||||
|
);
|
||||||
const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject(
|
const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject(
|
||||||
'picker',
|
'picker',
|
||||||
props,
|
props,
|
||||||
|
@ -54,6 +70,24 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
emit('update:value', dates);
|
emit('update:value', dates);
|
||||||
emit('change', dates, dateStrings);
|
emit('change', dates, dateStrings);
|
||||||
};
|
};
|
||||||
|
const onOpenChange = (open: boolean) => {
|
||||||
|
emit('openChange', open);
|
||||||
|
};
|
||||||
|
const onFoucs = () => {
|
||||||
|
emit('focus');
|
||||||
|
};
|
||||||
|
const onBlur = () => {
|
||||||
|
emit('blur');
|
||||||
|
};
|
||||||
|
const onPanelChange = (values: RangeValue<DateType>, modes: [PanelMode, PanelMode]) => {
|
||||||
|
emit('panelChange', values, modes);
|
||||||
|
};
|
||||||
|
const onOk = (value: DateType) => {
|
||||||
|
emit('ok', value);
|
||||||
|
};
|
||||||
|
const onCalendarChange: RangePickerSharedProps<DateType>['onCalendarChange'] = (...args) => {
|
||||||
|
emit('calendarChange', ...args);
|
||||||
|
};
|
||||||
const [contextLocale] = useLocaleReceiver('DatePicker', enUS);
|
const [contextLocale] = useLocaleReceiver('DatePicker', enUS);
|
||||||
return () => {
|
return () => {
|
||||||
const locale = { ...contextLocale.value, ...props.locale };
|
const locale = { ...contextLocale.value, ...props.locale };
|
||||||
|
@ -64,6 +98,10 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
placeholder,
|
placeholder,
|
||||||
suffixIcon = slots.suffixIcon?.(),
|
suffixIcon = slots.suffixIcon?.(),
|
||||||
picker = 'date',
|
picker = 'date',
|
||||||
|
transitionName,
|
||||||
|
allowClear = true,
|
||||||
|
dateRender = slots.dateRender,
|
||||||
|
renderExtraFooter = slots.renderExtraFooter,
|
||||||
...restProps
|
...restProps
|
||||||
} = p;
|
} = p;
|
||||||
const { format, showTime } = p as any;
|
const { format, showTime } = p as any;
|
||||||
|
@ -78,8 +116,8 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
const pre = prefixCls.value;
|
const pre = prefixCls.value;
|
||||||
return (
|
return (
|
||||||
<VCRangePicker<DateType>
|
<VCRangePicker<DateType>
|
||||||
{...Omit(slots, ['default'])}
|
dateRender={dateRender}
|
||||||
{...restProps}
|
renderExtraFooter={renderExtraFooter}
|
||||||
separator={
|
separator={
|
||||||
<span aria-label="to" class={`${pre}-separator`}>
|
<span aria-label="to" class={`${pre}-separator`}>
|
||||||
<SwapRightOutlined />
|
<SwapRightOutlined />
|
||||||
|
@ -91,8 +129,9 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
suffixIcon || (picker === 'time' ? <ClockCircleOutlined /> : <CalendarOutlined />)
|
suffixIcon || (picker === 'time' ? <ClockCircleOutlined /> : <CalendarOutlined />)
|
||||||
}
|
}
|
||||||
clearIcon={<CloseCircleFilled />}
|
clearIcon={<CloseCircleFilled />}
|
||||||
allowClear
|
allowClear={allowClear}
|
||||||
transitionName={`${rootPrefixCls.value}-slide-up`}
|
transitionName={transitionName || `${rootPrefixCls.value}-slide-up`}
|
||||||
|
{...restProps}
|
||||||
{...additionalOverrideProps}
|
{...additionalOverrideProps}
|
||||||
picker={picker}
|
picker={picker}
|
||||||
class={classNames(
|
class={classNames(
|
||||||
|
@ -104,7 +143,7 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
)}
|
)}
|
||||||
locale={locale!.lang}
|
locale={locale!.lang}
|
||||||
prefixCls={pre}
|
prefixCls={pre}
|
||||||
getPopupContainer={getPopupContainer.value}
|
getPopupContainer={attrs.getCalendarContainer || getPopupContainer.value}
|
||||||
generateConfig={generateConfig}
|
generateConfig={generateConfig}
|
||||||
prevIcon={<span class={`${pre}-prev-icon`} />}
|
prevIcon={<span class={`${pre}-prev-icon`} />}
|
||||||
nextIcon={<span class={`${pre}-next-icon`} />}
|
nextIcon={<span class={`${pre}-next-icon`} />}
|
||||||
|
@ -113,6 +152,12 @@ export default function generateRangePicker<DateType>(generateConfig: GenerateCo
|
||||||
components={Components}
|
components={Components}
|
||||||
direction={direction.value}
|
direction={direction.value}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
|
onOpenChange={onOpenChange}
|
||||||
|
onFocus={onFoucs}
|
||||||
|
onBlur={onBlur}
|
||||||
|
onPanelChange={onPanelChange}
|
||||||
|
onOk={onOk}
|
||||||
|
onCalendarChange={onCalendarChange}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,7 +2,7 @@ import CalendarOutlined from '@ant-design/icons-vue/CalendarOutlined';
|
||||||
import ClockCircleOutlined from '@ant-design/icons-vue/ClockCircleOutlined';
|
import ClockCircleOutlined from '@ant-design/icons-vue/ClockCircleOutlined';
|
||||||
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
||||||
import RCPicker from '../../vc-picker';
|
import RCPicker from '../../vc-picker';
|
||||||
import type { PickerMode } from '../../vc-picker/interface';
|
import type { PanelMode, PickerMode } from '../../vc-picker/interface';
|
||||||
import type { GenerateConfig } from '../../vc-picker/generate/index';
|
import type { GenerateConfig } from '../../vc-picker/generate/index';
|
||||||
import enUS from '../locale/en_US';
|
import enUS from '../locale/en_US';
|
||||||
import { getPlaceholder } from '../util';
|
import { getPlaceholder } from '../util';
|
||||||
|
@ -13,7 +13,6 @@ import { defineComponent, ref } from 'vue';
|
||||||
import useConfigInject from '../../_util/hooks/useConfigInject';
|
import useConfigInject from '../../_util/hooks/useConfigInject';
|
||||||
import classNames from '../../_util/classNames';
|
import classNames from '../../_util/classNames';
|
||||||
import { commonProps, datePickerProps } from './props';
|
import { commonProps, datePickerProps } from './props';
|
||||||
import Omit from 'omit.js';
|
|
||||||
import devWarning from '../../vc-util/devWarning';
|
import devWarning from '../../vc-util/devWarning';
|
||||||
|
|
||||||
export default function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
export default function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
||||||
|
@ -45,10 +44,16 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
emits: ['change', 'openChange', 'focus', 'blur', 'panelChange', 'ok', 'update:value'],
|
emits: ['change', 'openChange', 'focus', 'blur', 'panelChange', 'ok', 'update:value'],
|
||||||
setup(props, { slots, expose, attrs, emit }) {
|
setup(props, { slots, expose, attrs, emit }) {
|
||||||
devWarning(
|
devWarning(
|
||||||
!(props as any).monthCellContentRender,
|
!((props as any).monthCellContentRender || slots.monthCellContentRender),
|
||||||
'DatePicker',
|
'DatePicker',
|
||||||
'`monthCellContentRender` is deprecated. Please use `monthCellRender"` instead.',
|
'`monthCellContentRender` is deprecated. Please use `monthCellRender"` instead.',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
devWarning(
|
||||||
|
!(attrs as any).getCalendarContainer,
|
||||||
|
'DatePicker',
|
||||||
|
'`getCalendarContainer` is deprecated. Please use `getPopupContainer"` instead.',
|
||||||
|
);
|
||||||
const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject(
|
const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject(
|
||||||
'picker',
|
'picker',
|
||||||
props,
|
props,
|
||||||
|
@ -66,6 +71,21 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
emit('update:value', date);
|
emit('update:value', date);
|
||||||
emit('change', date, dateString);
|
emit('change', date, dateString);
|
||||||
};
|
};
|
||||||
|
const onOpenChange = (open: boolean) => {
|
||||||
|
emit('openChange', open);
|
||||||
|
};
|
||||||
|
const onFoucs = () => {
|
||||||
|
emit('focus');
|
||||||
|
};
|
||||||
|
const onBlur = () => {
|
||||||
|
emit('blur');
|
||||||
|
};
|
||||||
|
const onPanelChange = (value: DateType, mode: PanelMode | null) => {
|
||||||
|
emit('panelChange', value, mode);
|
||||||
|
};
|
||||||
|
const onOk = (value: DateType) => {
|
||||||
|
emit('ok', value);
|
||||||
|
};
|
||||||
|
|
||||||
const [contextLocale] = useLocaleReceiver('DatePicker', enUS);
|
const [contextLocale] = useLocaleReceiver('DatePicker', enUS);
|
||||||
return () => {
|
return () => {
|
||||||
|
@ -76,6 +96,13 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
placeholder,
|
placeholder,
|
||||||
suffixIcon = slots.suffixIcon?.(),
|
suffixIcon = slots.suffixIcon?.(),
|
||||||
showToday = true,
|
showToday = true,
|
||||||
|
transitionName,
|
||||||
|
allowClear = true,
|
||||||
|
dateRender = slots.dateRender,
|
||||||
|
renderExtraFooter = slots.renderExtraFooter,
|
||||||
|
monthCellRender = slots.monthCellRender ||
|
||||||
|
(props as any).monthCellContentRender ||
|
||||||
|
slots.monthCellContentRender,
|
||||||
...restProps
|
...restProps
|
||||||
} = p;
|
} = p;
|
||||||
const showTime = p.showTime === '' ? true : p.showTime;
|
const showTime = p.showTime === '' ? true : p.showTime;
|
||||||
|
@ -103,7 +130,9 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
const pre = prefixCls.value;
|
const pre = prefixCls.value;
|
||||||
return (
|
return (
|
||||||
<RCPicker<DateType>
|
<RCPicker<DateType>
|
||||||
{...Omit(slots, ['default'])}
|
monthCellRender={props.monthCellRender}
|
||||||
|
dateRender={dateRender}
|
||||||
|
renderExtraFooter={renderExtraFooter}
|
||||||
ref={pickerRef}
|
ref={pickerRef}
|
||||||
placeholder={getPlaceholder(mergedPicker, locale, placeholder)}
|
placeholder={getPlaceholder(mergedPicker, locale, placeholder)}
|
||||||
suffixIcon={
|
suffixIcon={
|
||||||
|
@ -111,8 +140,8 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
(mergedPicker === 'time' ? <ClockCircleOutlined /> : <CalendarOutlined />)
|
(mergedPicker === 'time' ? <ClockCircleOutlined /> : <CalendarOutlined />)
|
||||||
}
|
}
|
||||||
clearIcon={<CloseCircleFilled />}
|
clearIcon={<CloseCircleFilled />}
|
||||||
allowClear
|
allowClear={allowClear}
|
||||||
transitionName={`${rootPrefixCls.value}-slide-up`}
|
transitionName={transitionName || `${rootPrefixCls.value}-slide-up`}
|
||||||
{...restProps}
|
{...restProps}
|
||||||
{...additionalOverrideProps}
|
{...additionalOverrideProps}
|
||||||
showToday={showToday}
|
showToday={showToday}
|
||||||
|
@ -125,7 +154,7 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
attrs.class,
|
attrs.class,
|
||||||
)}
|
)}
|
||||||
prefixCls={pre}
|
prefixCls={pre}
|
||||||
getPopupContainer={getPopupContainer.value}
|
getPopupContainer={attrs.getCalendarContainer || getPopupContainer.value}
|
||||||
generateConfig={generateConfig}
|
generateConfig={generateConfig}
|
||||||
prevIcon={<span class={`${pre}-prev-icon`} />}
|
prevIcon={<span class={`${pre}-prev-icon`} />}
|
||||||
nextIcon={<span class={`${pre}-next-icon`} />}
|
nextIcon={<span class={`${pre}-next-icon`} />}
|
||||||
|
@ -134,6 +163,11 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
||||||
components={Components}
|
components={Components}
|
||||||
direction={direction.value}
|
direction={direction.value}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
|
onOpenChange={onOpenChange}
|
||||||
|
onFocus={onFoucs}
|
||||||
|
onBlur={onBlur}
|
||||||
|
onPanelChange={onPanelChange}
|
||||||
|
onOk={onOk}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -104,7 +104,7 @@ function rangePickerProps<DateType>() {
|
||||||
disabledTime: {
|
disabledTime: {
|
||||||
type: Function as PropType<(date: EventValue<DateType>, type: RangeType) => DisabledTimes>,
|
type: Function as PropType<(date: EventValue<DateType>, type: RangeType) => DisabledTimes>,
|
||||||
},
|
},
|
||||||
disabled: { type: Array as unknown as PropType<[boolean, boolean]> },
|
disabled: { type: [Boolean, Array] as unknown as PropType<boolean | [boolean, boolean]> },
|
||||||
format: String,
|
format: String,
|
||||||
renderExtraFooter: { type: Function as PropType<() => VueNode> },
|
renderExtraFooter: { type: Function as PropType<() => VueNode> },
|
||||||
separator: { type: Function as PropType<() => VueNode> },
|
separator: { type: Function as PropType<() => VueNode> },
|
||||||
|
@ -117,6 +117,7 @@ function rangePickerProps<DateType>() {
|
||||||
>,
|
>,
|
||||||
},
|
},
|
||||||
placeholder: Array,
|
placeholder: Array,
|
||||||
|
mode: { type: Array as unknown as PropType<[PanelMode, PanelMode]> },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,6 +177,8 @@ function Picker<DateType>() {
|
||||||
'direction',
|
'direction',
|
||||||
'autocomplete',
|
'autocomplete',
|
||||||
'showToday',
|
'showToday',
|
||||||
|
'renderExtraFooter',
|
||||||
|
'dateRender',
|
||||||
] as any,
|
] as any,
|
||||||
// slots: [
|
// slots: [
|
||||||
// 'suffixIcon',
|
// 'suffixIcon',
|
||||||
|
@ -207,7 +209,6 @@ function Picker<DateType>() {
|
||||||
value: toRef(props, 'value'),
|
value: toRef(props, 'value'),
|
||||||
defaultValue: props.defaultValue,
|
defaultValue: props.defaultValue,
|
||||||
});
|
});
|
||||||
|
|
||||||
const selectedValue = ref(mergedValue.value) as Ref<DateType>;
|
const selectedValue = ref(mergedValue.value) as Ref<DateType>;
|
||||||
const setSelectedValue = (val: DateType) => {
|
const setSelectedValue = (val: DateType) => {
|
||||||
selectedValue.value = val;
|
selectedValue.value = val;
|
||||||
|
@ -238,7 +239,6 @@ function Picker<DateType>() {
|
||||||
generateConfig: toRef(props, 'generateConfig'),
|
generateConfig: toRef(props, 'generateConfig'),
|
||||||
locale: toRef(props, 'locale'),
|
locale: toRef(props, 'locale'),
|
||||||
});
|
});
|
||||||
|
|
||||||
const [text, triggerTextChange, resetText] = useTextValueMapping({
|
const [text, triggerTextChange, resetText] = useTextValueMapping({
|
||||||
valueTexts,
|
valueTexts,
|
||||||
onTextChange: newText => {
|
onTextChange: newText => {
|
||||||
|
@ -526,7 +526,6 @@ function Picker<DateType>() {
|
||||||
// ============================ Return =============================
|
// ============================ Return =============================
|
||||||
|
|
||||||
const popupPlacement = direction === 'rtl' ? 'bottomRight' : 'bottomLeft';
|
const popupPlacement = direction === 'rtl' ? 'bottomRight' : 'bottomLeft';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PickerTrigger
|
<PickerTrigger
|
||||||
visible={mergedOpen.value}
|
visible={mergedOpen.value}
|
||||||
|
|
|
@ -138,6 +138,7 @@ function PickerPanel<DateType>() {
|
||||||
showTime: [Boolean, Object],
|
showTime: [Boolean, Object],
|
||||||
showToday: Boolean,
|
showToday: Boolean,
|
||||||
renderExtraFooter: Function,
|
renderExtraFooter: Function,
|
||||||
|
dateRender: Function,
|
||||||
hideHeader: Boolean,
|
hideHeader: Boolean,
|
||||||
onSelect: Function,
|
onSelect: Function,
|
||||||
onChange: Function,
|
onChange: Function,
|
||||||
|
|
|
@ -450,7 +450,6 @@ function RangerPicker<DateType>() {
|
||||||
values && values[1]
|
values && values[1]
|
||||||
? formatValue(values[1], { generateConfig, locale, format: formatList.value[0] })
|
? formatValue(values[1], { generateConfig, locale, format: formatList.value[0] })
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
if (onCalendarChange) {
|
if (onCalendarChange) {
|
||||||
const info: RangeInfo = { range: sourceIndex === 0 ? 'start' : 'end' };
|
const info: RangeInfo = { range: sourceIndex === 0 ? 'start' : 'end' };
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ export default function useTextValueMapping({
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => [...valueTexts.value],
|
() => [...valueTexts.value],
|
||||||
(cur, pre) => {
|
(cur, pre = []) => {
|
||||||
if (
|
if (
|
||||||
cur.join('||') !== pre.join('||') &&
|
cur.join('||') !== pre.join('||') &&
|
||||||
valueTexts.value.every(valText => valText !== text.value)
|
valueTexts.value.every(valText => valText !== text.value)
|
||||||
|
@ -30,6 +30,7 @@ export default function useTextValueMapping({
|
||||||
resetText();
|
resetText();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{ immediate: true },
|
||||||
);
|
);
|
||||||
|
|
||||||
return [text, triggerTextChange, resetText];
|
return [text, triggerTextChange, resetText];
|
||||||
|
|
Loading…
Reference in New Issue