fix: date-picker

pull/4499/head
tangjinzhou 2021-08-03 13:44:31 +08:00
parent 55f0d33a6d
commit d5312db30b
7 changed files with 100 additions and 20 deletions

View File

@ -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}
/> />
); );
}; };

View File

@ -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}
/> />
); );
}; };

View File

@ -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]> },
}; };
} }

View File

@ -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}

View File

@ -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,

View File

@ -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' };

View File

@ -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];