refactor: date-picker by ts
							parent
							
								
									db31c526d9
								
							
						
					
					
						commit
						54ca9021c3
					
				|  | @ -1,7 +1,7 @@ | |||
| import { VueTypeValidableDef, VueTypeDef } from 'vue-types'; | ||||
| 
 | ||||
| const initDefaultProps = <T>( | ||||
|   propTypes: T, | ||||
|   types: T, | ||||
|   defaultProps: { | ||||
|     [K in keyof T]?: T[K] extends VueTypeValidableDef<infer U> | ||||
|       ? U | ||||
|  | @ -10,6 +10,7 @@ const initDefaultProps = <T>( | |||
|       : any; | ||||
|   }, | ||||
| ): T => { | ||||
|   const propTypes = { ...types }; | ||||
|   Object.keys(defaultProps).forEach(k => { | ||||
|     const prop = propTypes[k] as VueTypeValidableDef; | ||||
|     if (prop) { | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ import { isValidElement } from '../_util/props-util'; | |||
| import { cloneElement } from '../_util/vnode'; | ||||
| import classNames from '../_util/classNames'; | ||||
| 
 | ||||
| const InputIcon = (_, { attrs }) => { | ||||
| const InputIcon = (_: any, { attrs }) => { | ||||
|   const { suffixIcon, prefixCls } = attrs; | ||||
|   return ( | ||||
|     (suffixIcon && isValidElement(suffixIcon) ? ( | ||||
|  | @ -1,4 +1,4 @@ | |||
| import { inject } from 'vue'; | ||||
| import { CSSProperties, defineComponent, inject } from 'vue'; | ||||
| import moment from 'moment'; | ||||
| import RangeCalendar from '../vc-calendar/src/RangeCalendar'; | ||||
| import VcDatePicker from '../vc-calendar/src/Picker'; | ||||
|  | @ -9,26 +9,40 @@ import Tag from '../tag'; | |||
| import { defaultConfigProvider } from '../config-provider'; | ||||
| import interopDefault from '../_util/interopDefault'; | ||||
| import { RangePickerProps } from './interface'; | ||||
| import { hasProp, getOptionProps, initDefaultProps, getComponent } from '../_util/props-util'; | ||||
| import { hasProp, getOptionProps, getComponent } from '../_util/props-util'; | ||||
| import BaseMixin from '../_util/BaseMixin'; | ||||
| import { formatDate } from './utils'; | ||||
| import InputIcon from './InputIcon'; | ||||
| import { getDataAndAriaProps } from '../_util/util'; | ||||
| import initDefaultProps from '../_util/props-util/initDefaultProps'; | ||||
| 
 | ||||
| function getShowDateFromValue(value, mode) { | ||||
| type RangePickerValue = | ||||
|   | undefined[] | ||||
|   | null[] | ||||
|   | [moment.Moment] | ||||
|   | [undefined, moment.Moment] | ||||
|   | [moment.Moment, undefined] | ||||
|   | [null, moment.Moment] | ||||
|   | [moment.Moment, null] | ||||
|   | [moment.Moment, moment.Moment]; | ||||
| 
 | ||||
| export type RangePickerPresetRange = RangePickerValue | (() => RangePickerValue); | ||||
| function getShowDateFromValue(value: RangePickerValue, mode?: string | string[]) { | ||||
|   const [start, end] = value; | ||||
|   // value could be an empty array, then we should not reset showDate
 | ||||
|   if (!start && !end) { | ||||
|     return; | ||||
|   } | ||||
|   if (mode && mode[0] === 'month') { | ||||
|     return [start, end]; | ||||
|     return [start, end] as RangePickerValue; | ||||
|   } | ||||
|   const newEnd = end && end.isSame(start, 'month') ? end.clone().add(1, 'month') : end; | ||||
|   return [start, newEnd]; | ||||
|   return [start, newEnd] as RangePickerValue; | ||||
| } | ||||
| 
 | ||||
| function pickerValueAdapter(value) { | ||||
| function pickerValueAdapter( | ||||
|   value?: moment.Moment | RangePickerValue, | ||||
| ): RangePickerValue | undefined { | ||||
|   if (!value) { | ||||
|     return; | ||||
|   } | ||||
|  | @ -38,14 +52,14 @@ function pickerValueAdapter(value) { | |||
|   return [value, value.clone().add(1, 'month')]; | ||||
| } | ||||
| 
 | ||||
| function isEmptyArray(arr) { | ||||
| function isEmptyArray(arr: any) { | ||||
|   if (Array.isArray(arr)) { | ||||
|     return arr.length === 0 || arr.every(i => !i); | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| function fixLocale(value, localeCode) { | ||||
| function fixLocale(value: RangePickerValue | undefined, localeCode: string | undefined) { | ||||
|   if (!localeCode) { | ||||
|     return; | ||||
|   } | ||||
|  | @ -61,11 +75,18 @@ function fixLocale(value, localeCode) { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| export default { | ||||
| export interface RangePickerState { | ||||
|   sValue?: RangePickerValue; | ||||
|   sShowDate?: RangePickerValue; | ||||
|   sOpen?: boolean; | ||||
|   sHoverValue?: RangePickerValue; | ||||
| } | ||||
| 
 | ||||
| export default defineComponent({ | ||||
|   name: 'ARangePicker', | ||||
|   mixins: [BaseMixin], | ||||
|   inheritAttrs: false, | ||||
|   props: initDefaultProps(RangePickerProps(), { | ||||
|   props: initDefaultProps(RangePickerProps, { | ||||
|     allowClear: true, | ||||
|     showToday: false, | ||||
|     separator: '~', | ||||
|  | @ -73,9 +94,12 @@ export default { | |||
|   setup() { | ||||
|     return { | ||||
|       configProvider: inject('configProvider', defaultConfigProvider), | ||||
|       picker: null, | ||||
|       sTagPrefixCls: undefined, | ||||
|       sPrefixCls: '', | ||||
|     }; | ||||
|   }, | ||||
|   data() { | ||||
|   data(): RangePickerState { | ||||
|     const value = this.value || this.defaultValue || []; | ||||
|     const [start, end] = value; | ||||
|     if ( | ||||
|  | @ -89,7 +113,7 @@ export default { | |||
|     } | ||||
|     const pickerValue = !value || isEmptyArray(value) ? this.defaultPickerValue : value; | ||||
|     return { | ||||
|       sValue: value, | ||||
|       sValue: value as RangePickerValue, | ||||
|       sShowDate: pickerValueAdapter(pickerValue || interopDefault(moment)()), | ||||
|       sOpen: this.open, | ||||
|       sHoverValue: [], | ||||
|  | @ -98,7 +122,7 @@ export default { | |||
|   watch: { | ||||
|     value(val) { | ||||
|       const value = val || []; | ||||
|       let state = { sValue: value }; | ||||
|       let state: RangePickerState = { sValue: value }; | ||||
|       if (!shallowequal(val, this.sValue)) { | ||||
|         state = { | ||||
|           ...state, | ||||
|  | @ -120,14 +144,14 @@ export default { | |||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     setValue(value, hidePanel) { | ||||
|     setValue(value: RangePickerValue, hidePanel?: boolean) { | ||||
|       this.handleChange(value); | ||||
|       if ((hidePanel || !this.showTime) && !hasProp(this, 'open')) { | ||||
|         this.setState({ sOpen: false }); | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     savePicker(node) { | ||||
|     savePicker(node: any) { | ||||
|       this.picker = node; | ||||
|     }, | ||||
|     clearSelection(e) { | ||||
|  | @ -141,7 +165,7 @@ export default { | |||
|       this.setState({ sHoverValue: [] }); | ||||
|     }, | ||||
| 
 | ||||
|     handleChange(value) { | ||||
|     handleChange(value: RangePickerValue) { | ||||
|       if (!hasProp(this, 'value')) { | ||||
|         this.setState(({ sShowDate }) => ({ | ||||
|           sValue: value, | ||||
|  | @ -155,7 +179,7 @@ export default { | |||
|       this.$emit('change', value, [formatDate(start, this.format), formatDate(end, this.format)]); | ||||
|     }, | ||||
| 
 | ||||
|     handleOpenChange(open) { | ||||
|     handleOpenChange(open: boolean) { | ||||
|       if (!hasProp(this, 'open')) { | ||||
|         this.setState({ sOpen: open }); | ||||
|       } | ||||
|  | @ -166,11 +190,11 @@ export default { | |||
|       this.$emit('openChange', open); | ||||
|     }, | ||||
| 
 | ||||
|     handleShowDateChange(showDate) { | ||||
|     handleShowDateChange(showDate: boolean) { | ||||
|       this.setState({ sShowDate: showDate }); | ||||
|     }, | ||||
| 
 | ||||
|     handleHoverChange(hoverValue) { | ||||
|     handleHoverChange(hoverValue: any) { | ||||
|       this.setState({ sHoverValue: hoverValue }); | ||||
|     }, | ||||
| 
 | ||||
|  | @ -180,7 +204,7 @@ export default { | |||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     handleCalendarInputSelect(value) { | ||||
|     handleCalendarInputSelect(value: RangePickerValue) { | ||||
|       const [start] = value; | ||||
|       if (!start) { | ||||
|         return; | ||||
|  | @ -191,7 +215,7 @@ export default { | |||
|       })); | ||||
|     }, | ||||
| 
 | ||||
|     handleRangeClick(value) { | ||||
|     handleRangeClick(value: RangePickerPresetRange) { | ||||
|       if (typeof value === 'function') { | ||||
|         value = value(); | ||||
|       } | ||||
|  | @ -201,10 +225,10 @@ export default { | |||
|       this.$emit('openChange', false); | ||||
|     }, | ||||
| 
 | ||||
|     onMouseEnter(e) { | ||||
|     onMouseEnter(e: MouseEvent) { | ||||
|       this.$emit('mouseenter', e); | ||||
|     }, | ||||
|     onMouseLeave(e) { | ||||
|     onMouseLeave(e: MouseEvent) { | ||||
|       this.$emit('mouseleave', e); | ||||
|     }, | ||||
| 
 | ||||
|  | @ -218,7 +242,7 @@ export default { | |||
| 
 | ||||
|     renderFooter() { | ||||
|       const { ranges, $slots } = this; | ||||
|       const { _prefixCls: prefixCls, _tagPrefixCls: tagPrefixCls } = this; | ||||
|       const { sPrefixCls: prefixCls, sTagPrefixCls: tagPrefixCls } = this; | ||||
|       const renderExtraFooter = this.renderExtraFooter || $slots.renderExtraFooter; | ||||
|       if (!ranges && !renderExtraFooter) { | ||||
|         return null; | ||||
|  | @ -257,7 +281,7 @@ export default { | |||
|   }, | ||||
| 
 | ||||
|   render() { | ||||
|     const props = { ...getOptionProps(this), ...this.$attrs }; | ||||
|     const props: any = { ...getOptionProps(this), ...this.$attrs }; | ||||
|     let suffixIcon = getComponent(this, 'suffixIcon'); | ||||
|     suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon; | ||||
|     const { | ||||
|  | @ -291,8 +315,8 @@ export default { | |||
|     const getPrefixCls = this.configProvider.getPrefixCls; | ||||
|     const prefixCls = getPrefixCls('calendar', customizePrefixCls); | ||||
|     const tagPrefixCls = getPrefixCls('tag', customizeTagPrefixCls); | ||||
|     this._prefixCls = prefixCls; | ||||
|     this._tagPrefixCls = tagPrefixCls; | ||||
|     this.sPrefixCls = prefixCls; | ||||
|     this.sTagPrefixCls = tagPrefixCls; | ||||
| 
 | ||||
|     const dateRender = props.dateRender || $slots.dateRender; | ||||
|     fixLocale(value, localeCode); | ||||
|  | @ -307,7 +331,7 @@ export default { | |||
|     const pickerChangeHandler = { | ||||
|       onChange: this.handleChange, | ||||
|     }; | ||||
|     let calendarProps = { | ||||
|     let calendarProps: any = { | ||||
|       onOk: this.handleChange, | ||||
|     }; | ||||
|     if (props.timePicker) { | ||||
|  | @ -353,7 +377,7 @@ export default { | |||
|     const calendar = <RangeCalendar {...rangeCalendarProps} vSlots={$slots} />; | ||||
| 
 | ||||
|     // default width for showTime
 | ||||
|     const pickerStyle = {}; | ||||
|     const pickerStyle: CSSProperties = {}; | ||||
|     if (props.showTime) { | ||||
|       pickerStyle.width = '350px'; | ||||
|     } | ||||
|  | @ -407,8 +431,6 @@ export default { | |||
|         id={props.id} | ||||
|         class={classNames(props.class, props.pickerClass)} | ||||
|         style={{ ...style, ...pickerStyle }} | ||||
|         class={props.pickerClass} | ||||
|         style={pickerStyle} | ||||
|         tabindex={props.disabled ? -1 : 0} | ||||
|         onFocus={onFocus} | ||||
|         onBlur={onBlur} | ||||
|  | @ -420,4 +442,4 @@ export default { | |||
|       </span> | ||||
|     ); | ||||
|   }, | ||||
| }; | ||||
| }); | ||||
|  | @ -1,37 +1,46 @@ | |||
| import { inject } from 'vue'; | ||||
| import { defineComponent, inject } from 'vue'; | ||||
| import moment from 'moment'; | ||||
| import Calendar from '../vc-calendar'; | ||||
| import VcDatePicker from '../vc-calendar/src/Picker'; | ||||
| import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled'; | ||||
| import { defaultConfigProvider } from '../config-provider'; | ||||
| import { hasProp, getOptionProps, initDefaultProps, getComponent } from '../_util/props-util'; | ||||
| import { hasProp, getOptionProps, getComponent } from '../_util/props-util'; | ||||
| import classNames from '../_util/classNames'; | ||||
| import BaseMixin from '../_util/BaseMixin'; | ||||
| import { WeekPickerProps } from './interface'; | ||||
| import interopDefault from '../_util/interopDefault'; | ||||
| import InputIcon from './InputIcon'; | ||||
| import { getDataAndAriaProps } from '../_util/util'; | ||||
| import initDefaultProps from 'components/_util/props-util/initDefaultProps'; | ||||
| 
 | ||||
| function formatValue(value, format) { | ||||
| function formatValue(value: moment.Moment | null, format: string): string { | ||||
|   return (value && value.format(format)) || ''; | ||||
| } | ||||
| 
 | ||||
| interface WeekPickerState { | ||||
|   _open?: boolean; | ||||
|   _value?: moment.Moment | null; | ||||
| } | ||||
| function noop() {} | ||||
| 
 | ||||
| export default { | ||||
| export default defineComponent({ | ||||
|   name: 'AWeekPicker', | ||||
|   mixins: [BaseMixin], | ||||
|   inheritAttrs: false, | ||||
|   props: initDefaultProps(WeekPickerProps(), { | ||||
|   props: initDefaultProps(WeekPickerProps, { | ||||
|     format: 'gggg-wo', | ||||
|     allowClear: true, | ||||
|   }), | ||||
|   setup() { | ||||
|     return { | ||||
|       configProvider: inject('configProvider', defaultConfigProvider), | ||||
|       prevState: {} as WeekPickerState, | ||||
|       input: undefined, | ||||
|       sPrefixCls: undefined, | ||||
|     }; | ||||
|   }, | ||||
|   data() { | ||||
|     const value = this.value || this.defaultValue; | ||||
|   data(): WeekPickerState { | ||||
|     const value: any = this.value || this.defaultValue; | ||||
|     if (value && !interopDefault(moment).isMoment(value)) { | ||||
|       throw new Error( | ||||
|         'The value/defaultValue of WeekPicker or MonthPicker must be ' + 'a moment object', | ||||
|  | @ -72,12 +81,12 @@ export default { | |||
|     }); | ||||
|   }, | ||||
|   methods: { | ||||
|     saveInput(node) { | ||||
|     saveInput(node: any) { | ||||
|       this.input = node; | ||||
|     }, | ||||
|     weekDateRender({ current }) { | ||||
|       const selectedValue = this.$data._value; | ||||
|       const { _prefixCls: prefixCls, $slots } = this; | ||||
|       const { sPrefixCls: prefixCls, $slots } = this; | ||||
|       const dateRender = this.dateRender || $slots.dateRender; | ||||
|       const dateNode = dateRender ? dateRender({ current }) : current.date(); | ||||
|       if ( | ||||
|  | @ -93,19 +102,19 @@ export default { | |||
|       } | ||||
|       return <div class={`${prefixCls}-date`}>{dateNode}</div>; | ||||
|     }, | ||||
|     handleChange(value) { | ||||
|     handleChange(value: moment.Moment | null) { | ||||
|       if (!hasProp(this, 'value')) { | ||||
|         this.setState({ _value: value }); | ||||
|       } | ||||
|       this.$emit('change', value, formatValue(value, this.format)); | ||||
|     }, | ||||
|     handleOpenChange(open) { | ||||
|     handleOpenChange(open: boolean) { | ||||
|       if (!hasProp(this, 'open')) { | ||||
|         this.setState({ _open: open }); | ||||
|       } | ||||
|       this.$emit('openChange', open); | ||||
|     }, | ||||
|     clearSelection(e) { | ||||
|     clearSelection(e: MouseEvent) { | ||||
|       e.preventDefault(); | ||||
|       e.stopPropagation(); | ||||
|       this.handleChange(null); | ||||
|  | @ -117,8 +126,8 @@ export default { | |||
|     blur() { | ||||
|       this.input.blur(); | ||||
|     }, | ||||
|     renderFooter(...args) { | ||||
|       const { _prefixCls: prefixCls, $slots } = this; | ||||
|     renderFooter(...args: any[]) { | ||||
|       const { sPrefixCls: prefixCls, $slots } = this; | ||||
|       const renderExtraFooter = this.renderExtraFooter || $slots.renderExtraFooter; | ||||
|       return renderExtraFooter ? ( | ||||
|         <div class={`${prefixCls}-footer-extra`}>{renderExtraFooter(...args)}</div> | ||||
|  | @ -147,10 +156,10 @@ export default { | |||
|     } = this; | ||||
|     const getPrefixCls = this.configProvider.getPrefixCls; | ||||
|     const prefixCls = getPrefixCls('calendar', customizePrefixCls); | ||||
|     this._prefixCls = prefixCls; | ||||
|     this.sPrefixCls = prefixCls; | ||||
| 
 | ||||
|     const { _value: pickerValue, _open: open } = $data; | ||||
|     const { class: className, style, id, onFocus = noop, onBlur = noop } = props; | ||||
|     const { class: className, style, id, onFocus = noop, onBlur = noop } = props as any; | ||||
| 
 | ||||
|     if (pickerValue && localeCode) { | ||||
|       pickerValue.locale(localeCode); | ||||
|  | @ -169,7 +178,7 @@ export default { | |||
|         showToday={false} | ||||
|         disabledDate={disabledDate} | ||||
|         renderFooter={this.renderFooter} | ||||
|         defaultValue={defaultPickerValue} | ||||
|         defaultValue={defaultPickerValue as any} | ||||
|       /> | ||||
|     ); | ||||
|     const clearIcon = | ||||
|  | @ -214,8 +223,8 @@ export default { | |||
|         id={id} | ||||
|         {...getDataAndAriaProps(props)} | ||||
|       > | ||||
|         <VcDatePicker {...vcDatePickerProps} vSlots={{ default: input, ...$slots }}></VcDatePicker> | ||||
|         <VcDatePicker {...vcDatePickerProps} v-slots={{ default: input, ...$slots }}></VcDatePicker> | ||||
|       </span> | ||||
|     ); | ||||
|   }, | ||||
| }; | ||||
| }); | ||||
|  | @ -1,4 +1,4 @@ | |||
| import { inject } from 'vue'; | ||||
| import { CSSProperties, DefineComponent, defineComponent, inject } from 'vue'; | ||||
| import moment from 'moment'; | ||||
| import omit from 'lodash-es/omit'; | ||||
| import MonthCalendar from '../vc-calendar/src/MonthCalendar'; | ||||
|  | @ -9,66 +9,68 @@ import CalendarOutlined from '@ant-design/icons-vue/CalendarOutlined'; | |||
| import { defaultConfigProvider } from '../config-provider'; | ||||
| import interopDefault from '../_util/interopDefault'; | ||||
| import BaseMixin from '../_util/BaseMixin'; | ||||
| import { | ||||
|   hasProp, | ||||
|   getOptionProps, | ||||
|   initDefaultProps, | ||||
|   getComponent, | ||||
|   isValidElement, | ||||
| } from '../_util/props-util'; | ||||
| import PropTypes from '../_util/vue-types'; | ||||
| import { hasProp, getOptionProps, getComponent, isValidElement } from '../_util/props-util'; | ||||
| import { cloneElement } from '../_util/vnode'; | ||||
| import { formatDate } from './utils'; | ||||
| import { getDataAndAriaProps } from '../_util/util'; | ||||
| 
 | ||||
| // export const PickerProps = {
 | ||||
| //   value?: moment.Moment;
 | ||||
| //   prefixCls: string;
 | ||||
| // }
 | ||||
| export default function createPicker(TheCalendar, props) { | ||||
|   return { | ||||
| export interface PickerProps { | ||||
|   value?: moment.Moment; | ||||
|   open?: boolean; | ||||
|   prefixCls?: string; | ||||
| } | ||||
| export interface PickerState { | ||||
|   sOpen?: boolean; | ||||
|   sValue?: moment.Moment | null; | ||||
|   showDate?: moment.Moment | null; | ||||
| } | ||||
| export default function createPicker( | ||||
|   TheCalendar: DefineComponent<any>, | ||||
|   props: any, | ||||
| ): DefineComponent<any> { | ||||
|   return defineComponent({ | ||||
|     inheritAttrs: false, | ||||
|     props: initDefaultProps(props, { | ||||
|       allowClear: true, | ||||
|       showToday: true, | ||||
|     }), | ||||
|     props: { | ||||
|       ...props, | ||||
|       allowClear: PropTypes.looseBool.def(true), | ||||
|       showToday: PropTypes.looseBool.def(true), | ||||
|     }, | ||||
|     mixins: [BaseMixin], | ||||
|     setup() { | ||||
|       return { | ||||
|         configProvider: inject('configProvider', defaultConfigProvider), | ||||
|         input: undefined, | ||||
|         sPrefixCls: undefined, | ||||
|       }; | ||||
|     }, | ||||
|     data() { | ||||
|     data(): PickerState { | ||||
|       const value = this.value || this.defaultValue; | ||||
|       if (value && !interopDefault(moment).isMoment(value)) { | ||||
|         throw new Error( | ||||
|           'The value/defaultValue of DatePicker or MonthPicker must be ' + 'a moment object', | ||||
|         ); | ||||
|       } | ||||
|       return { | ||||
|         sValue: value, | ||||
|         showDate: value, | ||||
|         _open: !!this.open, | ||||
|         sOpen: !!this.open, | ||||
|       }; | ||||
|     }, | ||||
|     watch: { | ||||
|       open(val) { | ||||
|         const props = getOptionProps(this); | ||||
|         const state = {}; | ||||
|         state._open = val; | ||||
|         const props: PickerProps = getOptionProps(this); | ||||
|         const state: PickerState = {}; | ||||
|         state.sOpen = val; | ||||
|         if ('value' in props && !val && props.value !== this.showDate) { | ||||
|           state.showDate = props.value; | ||||
|         } | ||||
|         this.setState(state); | ||||
|       }, | ||||
|       value(val) { | ||||
|         const state = {}; | ||||
|         const state: PickerState = {}; | ||||
|         state.sValue = val; | ||||
|         if (val !== this.sValue) { | ||||
|           state.showDate = val; | ||||
|         } | ||||
|         this.setState(state); | ||||
|       }, | ||||
|       _open(val, oldVal) { | ||||
|       sOpen(val, oldVal) { | ||||
|         this.$nextTick(() => { | ||||
|           if (!hasProp(this, 'open') && oldVal && !val) { | ||||
|             this.focus(); | ||||
|  | @ -77,16 +79,16 @@ export default function createPicker(TheCalendar, props) { | |||
|       }, | ||||
|     }, | ||||
|     methods: { | ||||
|       saveInput(node) { | ||||
|       saveInput(node: any) { | ||||
|         this.input = node; | ||||
|       }, | ||||
|       clearSelection(e) { | ||||
|       clearSelection(e: MouseEvent) { | ||||
|         e.preventDefault(); | ||||
|         e.stopPropagation(); | ||||
|         this.handleChange(null); | ||||
|       }, | ||||
| 
 | ||||
|       handleChange(value) { | ||||
|       handleChange(value: moment.Moment | null) { | ||||
|         if (!hasProp(this, 'value')) { | ||||
|           this.setState({ | ||||
|             sValue: value, | ||||
|  | @ -96,13 +98,13 @@ export default function createPicker(TheCalendar, props) { | |||
|         this.$emit('change', value, formatDate(value, this.format)); | ||||
|       }, | ||||
| 
 | ||||
|       handleCalendarChange(value) { | ||||
|       handleCalendarChange(value: moment.Moment) { | ||||
|         this.setState({ showDate: value }); | ||||
|       }, | ||||
|       handleOpenChange(open) { | ||||
|       handleOpenChange(open: boolean) { | ||||
|         const props = getOptionProps(this); | ||||
|         if (!('open' in props)) { | ||||
|           this.setState({ _open: open }); | ||||
|           this.setState({ sOpen: open }); | ||||
|         } | ||||
|         this.$emit('openChange', open); | ||||
|       }, | ||||
|  | @ -113,9 +115,9 @@ export default function createPicker(TheCalendar, props) { | |||
|       blur() { | ||||
|         this.input?.blur(); | ||||
|       }, | ||||
|       renderFooter(...args) { | ||||
|         const { $slots, _prefixCls: prefixCls } = this; | ||||
|         const renderExtraFooter = this.renderExtraFooter || $slots.renderExtraFooter; | ||||
|       renderFooter(...args: any[]) { | ||||
|         const { $slots, sPrefixCls: prefixCls } = this; | ||||
|         const renderExtraFooter: Function = this.renderExtraFooter || $slots.renderExtraFooter; | ||||
|         return renderExtraFooter ? ( | ||||
|           <div class={`${prefixCls}-footer-extra`}> | ||||
|             {typeof renderExtraFooter === 'function' | ||||
|  | @ -124,25 +126,25 @@ export default function createPicker(TheCalendar, props) { | |||
|           </div> | ||||
|         ) : null; | ||||
|       }, | ||||
|       onMouseEnter(e) { | ||||
|       onMouseEnter(e: MouseEvent) { | ||||
|         this.$emit('mouseenter', e); | ||||
|       }, | ||||
|       onMouseLeave(e) { | ||||
|       onMouseLeave(e: MouseEvent) { | ||||
|         this.$emit('mouseleave', e); | ||||
|       }, | ||||
|     }, | ||||
| 
 | ||||
|     render() { | ||||
|       const { $slots } = this; | ||||
|       const { sValue: value, showDate, _open: open } = this.$data; | ||||
|       const { sValue: value, showDate, sOpen: open } = this.$data; | ||||
|       let suffixIcon = getComponent(this, 'suffixIcon'); | ||||
|       suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon; | ||||
|       const props = omit({ ...getOptionProps(this), ...this.$attrs }, ['onChange']); | ||||
|       const props: any = omit({ ...getOptionProps(this), ...this.$attrs }, ['onChange']); | ||||
| 
 | ||||
|       const { prefixCls: customizePrefixCls, locale, localeCode, inputReadOnly } = props; | ||||
|       const getPrefixCls = this.configProvider.getPrefixCls; | ||||
|       const prefixCls = getPrefixCls('calendar', customizePrefixCls); | ||||
|       this._prefixCls = prefixCls; | ||||
|       this.sPrefixCls = prefixCls; | ||||
| 
 | ||||
|       const dateRender = props.dateRender || $slots.dateRender; | ||||
|       const monthCellContentRender = props.monthCellContentRender || $slots.monthCellContentRender; | ||||
|  | @ -152,16 +154,16 @@ export default function createPicker(TheCalendar, props) { | |||
| 
 | ||||
|       const calendarClassName = classNames({ | ||||
|         [`${prefixCls}-time`]: props.showTime, | ||||
|         [`${prefixCls}-month`]: MonthCalendar === TheCalendar, | ||||
|         [`${prefixCls}-month`]: (MonthCalendar as any) === TheCalendar, | ||||
|       }); | ||||
| 
 | ||||
|       if (value && localeCode) { | ||||
|         value.locale(localeCode); | ||||
|       } | ||||
| 
 | ||||
|       const pickerProps = {}; | ||||
|       const calendarProps = {}; | ||||
|       const pickerStyle = {}; | ||||
|       const pickerProps: any = {}; | ||||
|       const calendarProps: any = {}; | ||||
|       const pickerStyle: CSSProperties = {}; | ||||
|       if (props.showTime) { | ||||
|         // fix https://github.com/ant-design/ant-design/issues/1902
 | ||||
|         calendarProps.onSelect = this.handleChange; | ||||
|  | @ -251,10 +253,10 @@ export default function createPicker(TheCalendar, props) { | |||
|         > | ||||
|           <VcDatePicker | ||||
|             {...vcDatePickerProps} | ||||
|             vSlots={{ default: input, ...$slots }} | ||||
|             v-slots={{ default: input, ...$slots }} | ||||
|           ></VcDatePicker> | ||||
|         </span> | ||||
|       ); | ||||
|     }, | ||||
|   }; | ||||
|   }); | ||||
| } | ||||
|  | @ -5,27 +5,34 @@ import wrapPicker from './wrapPicker'; | |||
| import RangePicker from './RangePicker'; | ||||
| import WeekPicker from './WeekPicker'; | ||||
| import { DatePickerProps, MonthPickerProps, WeekPickerProps, RangePickerProps } from './interface'; | ||||
| import { App, DefineComponent, defineComponent } from 'vue'; | ||||
| type DatePickerPropstypes = typeof DatePickerProps; | ||||
| 
 | ||||
| const DatePicker = wrapPicker( | ||||
|   { ...createPicker(VcCalendar, DatePickerProps()), name: 'ADatePicker' }, | ||||
|   DatePickerProps(), | ||||
|   'date', | ||||
| const DatePicker: DefineComponent<DatePickerPropstypes> = defineComponent<DatePickerPropstypes>( | ||||
|   wrapPicker( | ||||
|     { | ||||
|       ...createPicker(VcCalendar as any, DatePickerProps), | ||||
|       name: 'ADatePicker', | ||||
|     } as any, | ||||
|     DatePickerProps, | ||||
|     'date', | ||||
|   ) as any, | ||||
| ); | ||||
| 
 | ||||
| const MonthPicker = wrapPicker( | ||||
|   { ...createPicker(MonthCalendar, MonthPickerProps()), name: 'AMonthPicker' }, | ||||
|   MonthPickerProps(), | ||||
|   { ...createPicker(MonthCalendar as any, MonthPickerProps), name: 'AMonthPicker' } as any, | ||||
|   MonthPickerProps, | ||||
|   'month', | ||||
| ); | ||||
| 
 | ||||
| Object.assign(DatePicker, { | ||||
|   RangePicker: wrapPicker(RangePicker, RangePickerProps(), 'date'), | ||||
|   RangePicker: wrapPicker(RangePicker as any, RangePickerProps, 'date'), | ||||
|   MonthPicker, | ||||
|   WeekPicker: wrapPicker(WeekPicker, WeekPickerProps(), 'week'), | ||||
|   WeekPicker: wrapPicker(WeekPicker as any, WeekPickerProps, 'week'), | ||||
| }); | ||||
| 
 | ||||
| /* istanbul ignore next */ | ||||
| DatePicker.install = function(app) { | ||||
| DatePicker.install = function(app: App) { | ||||
|   app.component(DatePicker.name, DatePicker); | ||||
|   app.component(DatePicker.RangePicker.name, DatePicker.RangePicker); | ||||
|   app.component(DatePicker.MonthPicker.name, DatePicker.MonthPicker); | ||||
|  | @ -1,8 +1,19 @@ | |||
| // import { TimePickerProps } from '../time-picker'
 | ||||
| import PropTypes, { withUndefined } from '../_util/vue-types'; | ||||
| import { TimesType, TimeType } from '../_util/moment-util'; | ||||
| 
 | ||||
| export const PickerProps = () => ({ | ||||
| import { tuple } from 'components/_util/type'; | ||||
| import { PropType } from 'vue'; | ||||
| export type PickerValue = moment.Moment | undefined | null | string; | ||||
| export type RangePickerValue = | ||||
|   | undefined[] | ||||
|   | null[] | ||||
|   | [moment.Moment | string] | ||||
|   | [undefined, moment.Moment | string] | ||||
|   | [moment.Moment | string, undefined] | ||||
|   | [null, moment.Moment | string] | ||||
|   | [moment.Moment | string, null] | ||||
|   | [moment.Moment, moment.Moment] | ||||
|   | [string, string]; | ||||
| export const PickerProps = { | ||||
|   name: PropTypes.string, | ||||
|   transitionName: PropTypes.string, | ||||
|   prefixCls: PropTypes.string, | ||||
|  | @ -15,7 +26,7 @@ export const PickerProps = () => ({ | |||
|   dropdownClassName: PropTypes.string, | ||||
|   locale: PropTypes.any, | ||||
|   localeCode: PropTypes.string, | ||||
|   size: PropTypes.oneOf(['large', 'small', 'default']), | ||||
|   size: PropTypes.oneOf(tuple('large', 'small', 'default')), | ||||
|   getCalendarContainer: PropTypes.func, | ||||
|   open: PropTypes.looseBool, | ||||
|   disabledDate: PropTypes.func, | ||||
|  | @ -36,43 +47,43 @@ export const PickerProps = () => ({ | |||
|   'onUpdate:value': PropTypes.func, | ||||
|   onMouseenter: PropTypes.func, | ||||
|   onMouseleave: PropTypes.func, | ||||
| }); | ||||
| }; | ||||
| 
 | ||||
| export const SinglePickerProps = () => ({ | ||||
|   value: TimeType, | ||||
|   defaultValue: TimeType, | ||||
|   defaultPickerValue: TimeType, | ||||
| export const SinglePickerProps = { | ||||
|   value: { type: [String, Object] as PropType<PickerValue> }, | ||||
|   defaultValue: { type: [String, Object] as PropType<PickerValue> }, | ||||
|   defaultPickerValue: { type: [String, Object] as PropType<PickerValue> }, | ||||
|   renderExtraFooter: PropTypes.any, | ||||
|   placeholder: PropTypes.string, | ||||
|   onChange: PropTypes.func, | ||||
| }); | ||||
| }; | ||||
| 
 | ||||
| export const DatePickerProps = () => ({ | ||||
|   ...PickerProps(), | ||||
|   ...SinglePickerProps(), | ||||
| export const DatePickerProps = { | ||||
|   ...PickerProps, | ||||
|   ...SinglePickerProps, | ||||
|   showTime: withUndefined(PropTypes.oneOfType([PropTypes.object, PropTypes.looseBool])), | ||||
|   open: PropTypes.looseBool, | ||||
|   disabledTime: PropTypes.func, | ||||
|   mode: PropTypes.oneOf(['time', 'date', 'month', 'year']), | ||||
|   mode: PropTypes.oneOf(tuple('time', 'date', 'month', 'year')), | ||||
|   onOpenChange: PropTypes.func, | ||||
|   onPanelChange: PropTypes.func, | ||||
|   onOk: PropTypes.func, | ||||
| }); | ||||
| }; | ||||
| 
 | ||||
| export const MonthPickerProps = () => ({ | ||||
|   ...PickerProps(), | ||||
|   ...SinglePickerProps(), | ||||
| export const MonthPickerProps = { | ||||
|   ...PickerProps, | ||||
|   ...SinglePickerProps, | ||||
|   placeholder: PropTypes.string, | ||||
|   monthCellContentRender: PropTypes.func, | ||||
| }); | ||||
| }; | ||||
| // export const RangePickerPresetRange = PropTypes.oneOfType([TimesType, PropTypes.func])
 | ||||
| 
 | ||||
| export const RangePickerProps = () => ({ | ||||
|   ...PickerProps(), | ||||
| export const RangePickerProps = { | ||||
|   ...PickerProps, | ||||
|   tagPrefixCls: PropTypes.string, | ||||
|   value: TimesType, | ||||
|   defaultValue: TimesType, | ||||
|   defaultPickerValue: TimesType, | ||||
|   value: { type: Array as PropType<RangePickerValue> }, | ||||
|   defaultValue: { type: Array as PropType<RangePickerValue> }, | ||||
|   defaultPickerValue: { type: Array as PropType<RangePickerValue> }, | ||||
|   timePicker: PropTypes.any, | ||||
|   showTime: withUndefined(PropTypes.oneOfType([PropTypes.object, PropTypes.looseBool])), | ||||
|   ranges: PropTypes.object, | ||||
|  | @ -88,13 +99,13 @@ export const RangePickerProps = () => ({ | |||
|   onPanelChange: PropTypes.func, | ||||
|   onMouseenter: PropTypes.func, | ||||
|   onMouseleave: PropTypes.func, | ||||
| }); | ||||
| }; | ||||
| 
 | ||||
| export const WeekPickerProps = () => ({ | ||||
|   ...PickerProps(), | ||||
|   ...SinglePickerProps(), | ||||
| export const WeekPickerProps = { | ||||
|   ...PickerProps, | ||||
|   ...SinglePickerProps, | ||||
|   placeholder: PropTypes.string, | ||||
| }); | ||||
| }; | ||||
| 
 | ||||
| // export interface DatePickerDecorator extends React.ClassicComponentClass<DatePickerProps> {
 | ||||
| //   RangePicker: React.ClassicComponentClass<RangePickerProps>;
 | ||||
|  | @ -1,17 +0,0 @@ | |||
| export function formatDate(value, format) { | ||||
|   if (!value) { | ||||
|     return ''; | ||||
|   } | ||||
|   if (Array.isArray(format)) { | ||||
|     format = format[0]; | ||||
|   } | ||||
|   if (typeof format === 'function') { | ||||
|     const result = format(value); | ||||
|     if (typeof result === 'string') { | ||||
|       return result; | ||||
|     } else { | ||||
|       throw new Error('The function of format does not return a string'); | ||||
|     } | ||||
|   } | ||||
|   return value.format(format); | ||||
| } | ||||
|  | @ -0,0 +1,14 @@ | |||
| type Value = moment.Moment | undefined | null; | ||||
| type Format = string | string[] | undefined | ((val?: Value) => string | string[] | undefined); | ||||
| export function formatDate(value: Value, format: Format) { | ||||
|   if (!value) { | ||||
|     return ''; | ||||
|   } | ||||
|   if (Array.isArray(format)) { | ||||
|     format = format[0]; | ||||
|   } | ||||
|   if (typeof format === 'function') { | ||||
|     return format(value); | ||||
|   } | ||||
|   return value.format(format); | ||||
| } | ||||
|  | @ -1,28 +1,34 @@ | |||
| import { provide, inject } from 'vue'; | ||||
| import { provide, inject, defineComponent, DefineComponent } from 'vue'; | ||||
| import TimePickerPanel from '../vc-time-picker/Panel'; | ||||
| import classNames from '../_util/classNames'; | ||||
| import LocaleReceiver from '../locale-provider/LocaleReceiver'; | ||||
| import { generateShowHourMinuteSecond } from '../time-picker'; | ||||
| import enUS from './locale/en_US'; | ||||
| import { getOptionProps, initDefaultProps } from '../_util/props-util'; | ||||
| import PropTypes from '../_util/vue-types'; | ||||
| import { getOptionProps } from '../_util/props-util'; | ||||
| import { defaultConfigProvider } from '../config-provider'; | ||||
| import { checkValidate, stringToMoment, momentToString } from '../_util/moment-util'; | ||||
| 
 | ||||
| const DEFAULT_FORMAT = { | ||||
| type PickerType = 'date' | 'week' | 'month'; | ||||
| 
 | ||||
| interface PickerMap { | ||||
|   [name: string]: string; | ||||
| } | ||||
| const DEFAULT_FORMAT: PickerMap = { | ||||
|   date: 'YYYY-MM-DD', | ||||
|   dateTime: 'YYYY-MM-DD HH:mm:ss', | ||||
|   week: 'gggg-wo', | ||||
|   month: 'YYYY-MM', | ||||
| }; | ||||
| 
 | ||||
| const LOCALE_FORMAT_MAPPING = { | ||||
| const LOCALE_FORMAT_MAPPING: PickerMap = { | ||||
|   date: 'dateFormat', | ||||
|   dateTime: 'dateTimeFormat', | ||||
|   week: 'weekFormat', | ||||
|   month: 'monthFormat', | ||||
| }; | ||||
| 
 | ||||
| function getColumns({ showHour, showMinute, showSecond, use12Hours }) { | ||||
| function getColumns({ showHour, showMinute, showSecond, use12Hours }: any) { | ||||
|   let column = 0; | ||||
|   if (showHour) { | ||||
|     column += 1; | ||||
|  | @ -38,23 +44,25 @@ function getColumns({ showHour, showMinute, showSecond, use12Hours }) { | |||
|   } | ||||
|   return column; | ||||
| } | ||||
| 
 | ||||
| export default function wrapPicker(Picker, props, pickerType) { | ||||
|   return { | ||||
| export default function wrapPicker( | ||||
|   Picker: DefineComponent<any>, | ||||
|   props: any, | ||||
|   pickerType: PickerType, | ||||
| ) { | ||||
|   return defineComponent({ | ||||
|     name: Picker.name, | ||||
|     inheritAttrs: false, | ||||
|     props: initDefaultProps(props, { | ||||
|       transitionName: 'slide-up', | ||||
|       popupStyle: {}, | ||||
|       locale: {}, | ||||
|     }), | ||||
|     // model: {
 | ||||
|     //   prop: 'value',
 | ||||
|     //   event: 'change',
 | ||||
|     // },
 | ||||
|     props: { | ||||
|       ...props, | ||||
|       transitionName: PropTypes.string.def('slide-up'), | ||||
|       popupStyle: PropTypes.style, | ||||
|       locale: PropTypes.any.def({}), | ||||
|     }, | ||||
|     setup() { | ||||
|       return { | ||||
|         configProvider: inject('configProvider', defaultConfigProvider), | ||||
|         picker: undefined, | ||||
|         popupRef: undefined, | ||||
|       }; | ||||
|     }, | ||||
|     created() { | ||||
|  | @ -76,7 +84,7 @@ export default function wrapPicker(Picker, props, pickerType) { | |||
|       }, | ||||
|     }, | ||||
|     methods: { | ||||
|       savePicker(node) { | ||||
|       savePicker(node: any) { | ||||
|         this.picker = node; | ||||
|       }, | ||||
|       getDefaultLocale() { | ||||
|  | @ -91,37 +99,37 @@ export default function wrapPicker(Picker, props, pickerType) { | |||
|         return result; | ||||
|       }, | ||||
| 
 | ||||
|       savePopupRef(ref) { | ||||
|       savePopupRef(ref: any) { | ||||
|         this.popupRef = ref; | ||||
|       }, | ||||
|       handleOpenChange(open) { | ||||
|       handleOpenChange(open: boolean) { | ||||
|         this.$emit('openChange', open); | ||||
|       }, | ||||
| 
 | ||||
|       handleFocus(e) { | ||||
|       handleFocus(e: FocusEvent) { | ||||
|         this.$emit('focus', e); | ||||
|       }, | ||||
| 
 | ||||
|       handleBlur(e) { | ||||
|       handleBlur(e: FocusEvent) { | ||||
|         this.$emit('blur', e); | ||||
|       }, | ||||
| 
 | ||||
|       handleMouseEnter(e) { | ||||
|       handleMouseEnter(e: MouseEvent) { | ||||
|         this.$emit('mouseenter', e); | ||||
|       }, | ||||
| 
 | ||||
|       handleMouseLeave(e) { | ||||
|       handleMouseLeave(e: MouseEvent) { | ||||
|         this.$emit('mouseleave', e); | ||||
|       }, | ||||
|       handleChange(date, dateString) { | ||||
|       handleChange(date: any, dateString: string) { | ||||
|         const value = this.valueFormat ? momentToString(date, this.valueFormat) : date; | ||||
|         this.$emit('update:value', value); | ||||
|         this.$emit('change', value, dateString); | ||||
|       }, | ||||
|       handleOk(val) { | ||||
|       handleOk(val: any) { | ||||
|         this.$emit('ok', this.valueFormat ? momentToString(val, this.valueFormat) : val); | ||||
|       }, | ||||
|       handleCalendarChange(date, dateString) { | ||||
|       handleCalendarChange(date: any, dateString: string) { | ||||
|         this.$emit( | ||||
|           'calendarChange', | ||||
|           this.valueFormat ? momentToString(date, this.valueFormat) : date, | ||||
|  | @ -148,8 +156,8 @@ export default function wrapPicker(Picker, props, pickerType) { | |||
|         } | ||||
|       }, | ||||
| 
 | ||||
|       renderPicker(locale, localeCode) { | ||||
|         const props = { ...getOptionProps(this), ...this.$attrs }; | ||||
|       renderPicker(locale: any, localeCode: string) { | ||||
|         const props: any = { ...getOptionProps(this), ...this.$attrs }; | ||||
|         this.transformValue(props); | ||||
|         const { | ||||
|           prefixCls: customizePrefixCls, | ||||
|  | @ -230,5 +238,5 @@ export default function wrapPicker(Picker, props, pickerType) { | |||
|         /> | ||||
|       ); | ||||
|     }, | ||||
|   }; | ||||
|   }); | ||||
| } | ||||
|  | @ -5,6 +5,7 @@ import BaseMixin from '../_util/BaseMixin'; | |||
| import Header from './Header'; | ||||
| import Combobox from './Combobox'; | ||||
| import { getComponent } from '../_util/props-util'; | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| function noop() {} | ||||
| 
 | ||||
|  | @ -31,7 +32,7 @@ function toNearestValidTime(time, hourOptions, minuteOptions, secondOptions) { | |||
|   return moment(`${hour}:${minute}:${second}`, 'HH:mm:ss'); | ||||
| } | ||||
| 
 | ||||
| const Panel = { | ||||
| const Panel = defineComponent({ | ||||
|   name: 'Panel', | ||||
|   inheritAttrs: false, | ||||
|   mixins: [BaseMixin], | ||||
|  | @ -223,6 +224,6 @@ const Panel = { | |||
|       </div> | ||||
|     ); | ||||
|   }, | ||||
| }; | ||||
| }); | ||||
| 
 | ||||
| export default Panel; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| import Empty from '../components/empty'; | ||||
| import Empty from '../components/date-picker'; | ||||
| import '../components/empty/style'; | ||||
| 
 | ||||
| export default { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 tangjinzhou
						tangjinzhou