refactor: date props

pull/4499/head
tangjinzhou 2021-07-21 22:54:51 +08:00
parent 229f6421ad
commit cd04ba21cf
5 changed files with 106 additions and 26 deletions

View File

@ -2,16 +2,22 @@ import CalendarOutlined from '@ant-design/icons-vue/CalendarOutlined';
import ClockCircleOutlined from '@ant-design/icons-vue/ClockCircleOutlined';
import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
import RCPicker from '../../vc-picker';
import type { PickerMode } from '../../vc-picker/interface';
import type { DisabledTime, PanelMode, PickerMode } from '../../vc-picker/interface';
import type { GenerateConfig } from '../../vc-picker/generate/index';
import enUS from '../locale/en_US';
import { getPlaceholder } from '../util';
import { useLocaleReceiver } from '../../locale-provider/LocaleReceiver';
import type { PickerProps, PickerDateProps, PickerTimeProps } from '.';
import type { PickerProps, PickerDateProps, PickerTimeProps, PickerLocale } from '.';
import { getTimeProps, Components } from '.';
import { defineComponent, ref } from 'vue';
import { CSSProperties, defineComponent, PropType, ref } from 'vue';
import useConfigInject from '../../_util/hooks/useConfigInject';
import classNames from '../../_util/classNames';
import { AlignType } from '../../vc-align/interface';
import { VueNode } from '../../_util/type';
import { SharedTimeProps } from '../../vc-picker/panels/TimePanel';
import { SizeType } from '../../config-provider';
import { DateRender } from '../../vc-picker/panels/DatePanel/DateBody';
import { commonProps } from './props';
export default function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
type DatePickerProps = PickerProps<DateType>;
@ -23,18 +29,11 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
return defineComponent<InnerPickerProps>({
name: displayName,
inheritAttrs: false,
props: [
'size',
'prefixCls',
'direction',
'getPopupContainer',
'locale',
'value',
'showTime',
'showNow',
] as any,
slots: ['suffixIcon'],
emits: ['change', 'panelChange', 'ok', 'openChange', 'update:value'],
props: {
...commonProps<DateType>(),
} as any,
slots: ['suffixIcon', 'panelRender', 'dateRender'],
emits: ['change', 'openChange', 'focus', 'blur', 'panelChange', 'ok', 'update:value'],
setup(props, { slots, expose, attrs, emit }) {
const { prefixCls, direction, getPopupContainer, size, rootPrefixCls } = useConfigInject(
'picker',

View File

@ -0,0 +1,74 @@
import type { CSSProperties, PropType } from 'vue';
import type { PickerLocale } from '.';
import type { SizeType } from '../../config-provider';
import type { AlignType } from '../../vc-align/interface';
import type { PanelMode, PickerMode } from '../../vc-picker/interface';
import type { DateRender } from '../../vc-picker/panels/DatePanel/DateBody';
import type { SharedTimeProps } from '../../vc-picker/panels/TimePanel';
import type { VueNode } from '../../_util/type';
function commonProps<DateType>() {
return {
dropdownClassName: String,
dropdownAlign: { type: Object as PropType<AlignType> },
popupStyle: { type: Object as PropType<CSSProperties> },
transitionName: String,
placeholder: String,
allowClear: { type: Boolean, default: undefined },
autofocus: { type: Boolean, default: undefined },
disabled: { type: Boolean, default: undefined },
tabindex: Number,
open: { type: Boolean, default: undefined },
defaultOpen: { type: Boolean, default: undefined },
/** Make input readOnly to avoid popup keyboard in mobile */
inputReadOnly: { type: Boolean, default: undefined },
// Value
// format: string | CustomFormat<DateType> | (string | CustomFormat<DateType>)[];
// Render
// suffixIcon?: VueNode;
// clearIcon?: VueNode;
// prevIcon?: VueNode;
// nextIcon?: VueNode;
// superPrevIcon?: VueNode;
// superNextIcon?: VueNode;
getPopupContainer: { type: Function as PropType<(node: HTMLElement) => HTMLElement> },
panelRender: { type: Function as PropType<(originPanel: VueNode) => VueNode> },
// // Events
// onChange?: (value: DateType | null, dateString: string) => void;
// onOpenChange?: (open: boolean) => void;
// onFocus?: FocusEventHandler;
// onBlur?: FocusEventHandler;
// onMousedown?: MouseEventHandler;
// onMouseup?: MouseEventHandler;
// onMouseenter?: MouseEventHandler;
// onMouseleave?: MouseEventHandler;
// onClick?: MouseEventHandler;
// onContextmenu?: MouseEventHandler;
// onKeydown?: (event: KeyboardEvent, preventDefault: () => void) => void;
// WAI-ARIA
role: String,
name: String,
autocomplete: String,
direction: { type: String as PropType<'ltr' | 'rtl'> },
showToday: { type: Boolean, default: undefined },
showTime: {
type: [Boolean, Object] as PropType<boolean | SharedTimeProps<DateType>>,
default: undefined,
},
locale: { type: Object as PropType<PickerLocale> },
size: { type: String as PropType<SizeType> },
bordered: { type: Boolean, default: undefined },
dateRender: { type: Function as PropType<DateRender<DateType>> },
disabledDate: { type: Function as PropType<(date: DateType) => boolean> },
mode: { type: String as PropType<PanelMode> },
picker: { type: String as PropType<PickerMode> },
};
}
function datePickerProps<DateType>() {
return {
defaultPickerValue: { type: [String, Object] as PropType<DateType> },
};
}
export { commonProps, datePickerProps };

View File

@ -36,6 +36,7 @@ import type { AlignType } from '../vc-align/interface';
import useMergedState from '../_util/hooks/useMergedState';
import { warning } from '../vc-util/warning';
import classNames from '../_util/classNames';
import { SharedTimeProps } from './panels/TimePanel';
export type PickerRefConfig = {
focus: () => void;
@ -91,7 +92,7 @@ export type PickerSharedProps<DateType> = {
autocomplete?: string;
direction?: 'ltr' | 'rtl';
showToday?: boolean;
showTime?: boolean | undefined | object;
showTime?: boolean | SharedTimeProps<DateType>;
} & HtmlHTMLAttributes;
type OmitPanelProps<Props> = Omit<

View File

@ -75,11 +75,11 @@ export type RangeInfo = {
range: RangeType;
};
export type RangeDateRender<DateType> = (
currentDate: DateType,
today: DateType,
info: RangeInfo,
) => VueNode;
export type RangeDateRender<DateType> = (props: {
current: DateType;
today: DateType;
info: RangeInfo;
}) => VueNode;
export type RangePickerSharedProps<DateType> = {
id?: string;
@ -803,9 +803,13 @@ function RangerPicker<DateType>() {
let panelDateRender: DateRender<DateType> | null = null;
if (dateRender) {
panelDateRender = (date, today) =>
dateRender(date, today, {
range: mergedActivePickerIndex ? 'end' : 'start',
panelDateRender = ({ current: date, today }) =>
dateRender({
current: date,
today,
info: {
range: mergedActivePickerIndex.value ? 'end' : 'start',
},
});
}

View File

@ -13,7 +13,7 @@ import type { VueNode } from '../../../_util/type';
import { useInjectRange } from '../../RangeContext';
import useMergeProps from '../../hooks/useMergeProps';
export type DateRender<DateType> = (currentDate: DateType, today: DateType) => VueNode;
export type DateRender<DateType> = (props: { current: DateType; today: DateType }) => VueNode;
export type DateBodyPassProps<DateType> = {
dateRender?: DateRender<DateType>;
@ -74,7 +74,9 @@ function DateBody<DateType>(_props: DateBodyProps<DateType>) {
offsetCell: (date, offset) => generateConfig.addDate(date, offset),
});
const getCellNode = dateRender ? (date: DateType) => dateRender(date, today) : undefined;
const getCellNode = dateRender
? (date: DateType) => dateRender({ current: date, today })
: undefined;
return (
<PanelBody