feat: update date-picker

pull/802/head
wangxueliang 2019-04-20 12:34:24 +08:00
parent 103293aa8f
commit 300fc9a2bc
12 changed files with 150 additions and 59 deletions

View File

@ -5,6 +5,7 @@ import classNames from 'classnames';
import shallowequal from 'shallowequal'; import shallowequal from 'shallowequal';
import Icon from '../icon'; import Icon from '../icon';
import Tag from '../tag'; import Tag from '../tag';
import { ConfigConsumerProps } from '../config-provider';
import interopDefault from '../_util/interopDefault'; import interopDefault from '../_util/interopDefault';
import { RangePickerProps } from './interface'; import { RangePickerProps } from './interface';
import { import {
@ -73,11 +74,12 @@ export default {
event: 'change', event: 'change',
}, },
props: initDefaultProps(RangePickerProps(), { props: initDefaultProps(RangePickerProps(), {
prefixCls: 'ant-calendar',
tagPrefixCls: 'ant-tag',
allowClear: true, allowClear: true,
showToday: false, showToday: false,
}), }),
inject: {
configProvider: { default: () => ({}) },
},
data() { data() {
const value = this.value || this.defaultValue || []; const value = this.value || this.defaultValue || [];
const [start, end] = value; const [start, end] = value;
@ -109,13 +111,24 @@ export default {
}; };
} }
this.setState(state); this.setState(state);
this.prevState = {...this.$data, ...state};
}, },
open(val) { open(val) {
this.setState({ const state = { sOpen: val};
sOpen: val, this.setState(state);
}); this.prevState = {...this.$data, ...state};
}, },
}, },
mounted() {
this.prevState = {...this.$data};
},
updated() {
this.$nextTick(() => {
if(!hasProp(this, 'open') && this.prevState.sOpen && !this.sOpen) {
this.focus();
}
});
},
methods: { methods: {
clearSelection(e) { clearSelection(e) {
e.preventDefault(); e.preventDefault();
@ -148,10 +161,6 @@ export default {
this.clearHoverValue(); this.clearHoverValue();
} }
this.$emit('openChange', open); this.$emit('openChange', open);
if (!open) {
this.focus();
}
}, },
handleShowDateChange(showDate) { handleShowDateChange(showDate) {
@ -212,7 +221,8 @@ export default {
}, },
renderFooter(...args) { renderFooter(...args) {
const { prefixCls, ranges, $scopedSlots, $slots, tagPrefixCls } = this; const { ranges, $scopedSlots, $slots } = this;
const { _prefixCls: prefixCls, _tagPrefixCls: tagPrefixCls } = this;
const renderExtraFooter = const renderExtraFooter =
this.renderExtraFooter || $scopedSlots.renderExtraFooter || $slots.renderExtraFooter; this.renderExtraFooter || $scopedSlots.renderExtraFooter || $slots.renderExtraFooter;
if (!ranges && !renderExtraFooter) { if (!ranges && !renderExtraFooter) {
@ -268,7 +278,8 @@ export default {
panelChange = noop, panelChange = noop,
} = $listeners; } = $listeners;
const { const {
prefixCls, prefixCls: customizePrefixCls,
tagPrefixCls: customizeTagPrefixCls,
popupStyle, popupStyle,
disabledDate, disabledDate,
disabledTime, disabledTime,
@ -279,6 +290,12 @@ export default {
localeCode, localeCode,
format, format,
} = props; } = props;
const getPrefixCls = this.configProvider.getPrefixCls || ConfigConsumerProps.getPrefixCls;
const prefixCls = getPrefixCls('calendar', customizePrefixCls);
const tagPrefixCls = getPrefixCls('tag', customizeTagPrefixCls);
this._prefixCls = prefixCls;
this._tagPrefixCls = tagPrefixCls;
const dateRender = props.dateRender || $scopedSlots.dateRender; const dateRender = props.dateRender || $scopedSlots.dateRender;
fixLocale(value, localeCode); fixLocale(value, localeCode);
fixLocale(showDate, localeCode); fixLocale(showDate, localeCode);

View File

@ -2,6 +2,7 @@ import * as moment from 'moment';
import Calendar from '../vc-calendar'; import Calendar from '../vc-calendar';
import VcDatePicker from '../vc-calendar/src/Picker'; import VcDatePicker from '../vc-calendar/src/Picker';
import Icon from '../icon'; import Icon from '../icon';
import { ConfigConsumerProps } from '../config-provider';
import { import {
hasProp, hasProp,
getOptionProps, getOptionProps,
@ -36,6 +37,9 @@ export default {
format: 'gggg-wo', format: 'gggg-wo',
allowClear: true, allowClear: true,
}), }),
inject: {
configProvider: { default: () => ({}) },
},
data() { data() {
const value = this.value || this.defaultValue; const value = this.value || this.defaultValue;
if (value && !interopDefault(moment).isMoment(value)) { if (value && !interopDefault(moment).isMoment(value)) {
@ -50,17 +54,32 @@ export default {
}, },
watch: { watch: {
value(val) { value(val) {
this.setState({ _value: val }); const state = { _value: val };
this.setState(state);
this.prevState = {...this.$data, ...state};
}, },
open(val) { open(val) {
this.setState({ _open: val }); const state = { _open: val };
this.setState(state);
this.prevState = {...this.$data, ...state};
}, },
}, },
mounted() {
this.prevState = {...this.$data};
},
updated() {
this.$nextTick(() => {
if(!hasProp(this, 'open') && this.prevState._open && !this._open) {
this.focus();
}
});
},
methods: { methods: {
weekDateRender(current) { weekDateRender(current) {
const selectedValue = this.$data._value; const selectedValue = this.$data._value;
const { prefixCls } = this; const { _prefixCls: prefixCls, $scopedSlots } = this;
const dateRender = this.dateRender || $scopedSlots.dateRender;
const dateNode = dateRender ? dateRender(current) : current.date();
if ( if (
selectedValue && selectedValue &&
current.year() === selectedValue.year() && current.year() === selectedValue.year() &&
@ -68,11 +87,11 @@ export default {
) { ) {
return ( return (
<div class={`${prefixCls}-selected-day`}> <div class={`${prefixCls}-selected-day`}>
<div class={`${prefixCls}-date`}>{current.date()}</div> <div class={`${prefixCls}-date`}>{dateNode}</div>
</div> </div>
); );
} }
return <div class={`${prefixCls}-date`}>{current.date()}</div>; return <div class={`${prefixCls}-date`}>{dateNode}</div>;
}, },
handleChange(value) { handleChange(value) {
if (!hasProp(this, 'value')) { if (!hasProp(this, 'value')) {
@ -85,17 +104,19 @@ export default {
this.setState({ _open: open }); this.setState({ _open: open });
} }
this.$emit('openChange', open); this.$emit('openChange', open);
if (!open) {
this.focus();
}
}, },
clearSelection(e) { clearSelection(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
this.handleChange(null); this.handleChange(null);
}, },
renderFooter(...args) {
const {_prefixCls: prefixCls, $scopedSlots} = this;
const renderExtraFooter = this.renderExtraFooter || $scopedSlots.renderExtraFooter;
return renderExtraFooter ? (
<div class={`${prefixCls}-footer-extra`}>{renderExtraFooter(...args)}</div>
) : null;
},
focus() { focus() {
this.$refs.input.focus(); this.$refs.input.focus();
}, },
@ -110,7 +131,7 @@ export default {
let suffixIcon = getComponentFromProp(this, 'suffixIcon'); let suffixIcon = getComponentFromProp(this, 'suffixIcon');
suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon; suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon;
const { const {
prefixCls, prefixCls: customizePrefixCls,
disabled, disabled,
pickerClass, pickerClass,
popupStyle, popupStyle,
@ -124,6 +145,11 @@ export default {
$listeners, $listeners,
$scopedSlots, $scopedSlots,
} = this; } = this;
const getPrefixCls = this.configProvider.getPrefixCls || ConfigConsumerProps.getPrefixCls;
const prefixCls = getPrefixCls('calendar', customizePrefixCls);
this._prefixCls = prefixCls;
const { _value: pickerValue, _open: open } = $data; const { _value: pickerValue, _open: open } = $data;
const { focus = noop, blur = noop } = $listeners; const { focus = noop, blur = noop } = $listeners;
@ -143,6 +169,7 @@ export default {
showDateInput={false} showDateInput={false}
showToday={false} showToday={false}
disabledDate={disabledDate} disabledDate={disabledDate}
renderFooter={this.renderFooter}
/> />
); );
const clearIcon = const clearIcon =

View File

@ -4,6 +4,7 @@ import MonthCalendar from '../vc-calendar/src/MonthCalendar';
import VcDatePicker from '../vc-calendar/src/Picker'; import VcDatePicker from '../vc-calendar/src/Picker';
import classNames from 'classnames'; import classNames from 'classnames';
import Icon from '../icon'; import Icon from '../icon';
import { ConfigConsumerProps } from '../config-provider';
import interopDefault from '../_util/interopDefault'; import interopDefault from '../_util/interopDefault';
import BaseMixin from '../_util/BaseMixin'; import BaseMixin from '../_util/BaseMixin';
import { import {
@ -23,15 +24,7 @@ import { cloneElement } from '../_util/vnode';
function noop() {} function noop() {}
export default function createPicker(TheCalendar, props) { export default function createPicker(TheCalendar, props) {
return { return {
// static defaultProps = {
// prefixCls: 'ant-calendar',
// allowClear: true,
// showToday: true,
// };
// private input: any;
props: initDefaultProps(props, { props: initDefaultProps(props, {
prefixCls: 'ant-calendar',
allowClear: true, allowClear: true,
showToday: true, showToday: true,
}), }),
@ -40,6 +33,9 @@ export default function createPicker(TheCalendar, props) {
prop: 'value', prop: 'value',
event: 'change', event: 'change',
}, },
inject: {
configProvider: { default: () => ({}) },
},
data() { data() {
const value = this.value || this.defaultValue; const value = this.value || this.defaultValue;
if (value && !interopDefault(moment).isMoment(value)) { if (value && !interopDefault(moment).isMoment(value)) {
@ -62,6 +58,7 @@ export default function createPicker(TheCalendar, props) {
state.showDate = props.value; state.showDate = props.value;
} }
this.setState(state); this.setState(state);
this.prevState = {...this.$data, ...state};
}, },
value(val) { value(val) {
const state = {}; const state = {};
@ -70,11 +67,23 @@ export default function createPicker(TheCalendar, props) {
state.showDate = val; state.showDate = val;
} }
this.setState(state); this.setState(state);
this.prevState = {...this.$data, ...state};
}, },
}, },
mounted() {
this.prevState = {...this.$data};
},
updated() {
this.$nextTick(() => {
if(!hasProp(this, 'open') && this.prevState._open && !this._open) {
this.focus();
}
});
},
methods: { methods: {
renderFooter(...args) { renderFooter(...args) {
const { prefixCls, $scopedSlots, $slots } = this; const { $scopedSlots, $slots } = this;
const { _prefixCls: prefixCls } = this;
const renderExtraFooter = const renderExtraFooter =
this.renderExtraFooter || $scopedSlots.renderExtraFooter || $slots.renderExtraFooter; this.renderExtraFooter || $scopedSlots.renderExtraFooter || $slots.renderExtraFooter;
return renderExtraFooter ? ( return renderExtraFooter ? (
@ -111,9 +120,6 @@ export default function createPicker(TheCalendar, props) {
this.setState({ _open: open }); this.setState({ _open: open });
} }
this.$emit('openChange', open); this.$emit('openChange', open);
if (!open) {
this.focus();
}
}, },
focus() { focus() {
this.$refs.input.focus(); this.$refs.input.focus();
@ -137,7 +143,12 @@ export default function createPicker(TheCalendar, props) {
suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon; suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon;
const { panelChange = noop, focus = noop, blur = noop, ok = noop } = $listeners; const { panelChange = noop, focus = noop, blur = noop, ok = noop } = $listeners;
const props = getOptionProps(this); const props = getOptionProps(this);
const { prefixCls, locale, localeCode } = props;
const { prefixCls: customizePrefixCls, locale, localeCode } = props;
const getPrefixCls = this.configProvider.getPrefixCls || ConfigConsumerProps.getPrefixCls;
const prefixCls = getPrefixCls('calendar', customizePrefixCls);
this._prefixCls = prefixCls;
const dateRender = props.dateRender || $scopedSlots.dateRender; const dateRender = props.dateRender || $scopedSlots.dateRender;
const monthCellContentRender = const monthCellContentRender =
props.monthCellContentRender || $scopedSlots.monthCellContentRender; props.monthCellContentRender || $scopedSlots.monthCellContentRender;

View File

@ -25,6 +25,7 @@ Determing which panel to show with `mode` and `onPanelChange`.
:value="value" :value="value"
:mode="mode2" :mode="mode2"
@panelChange="handlePanelChange2" @panelChange="handlePanelChange2"
@change="handleChange"
/> />
</div> </div>
</template> </template>
@ -43,7 +44,9 @@ export default {
this.mode1 = 'time' this.mode1 = 'time'
} }
}, },
handleChange(value){
this.value = value
},
handlePanelChange1(value, mode) { handlePanelChange1(value, mode) {
this.mode1 = mode this.mode1 = mode
}, },

View File

@ -14,7 +14,6 @@ This property provide an additional time selection. When `showTime` is an Object
<div> <div>
<a-date-picker <a-date-picker
showTime showTime
format="YYYY-MM-DD HH:mm:ss"
placeholder="Select Time" placeholder="Select Time"
@change="onChange" @change="onChange"
@ok="onOk" @ok="onOk"

View File

@ -32,6 +32,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| disabledDate | specify the date that cannot be selected | (currentDate: moment) => boolean | - | | disabledDate | specify the date that cannot be selected | (currentDate: moment) => boolean | - |
| getCalendarContainer | to set the container of the floating layer, while the default is to create a `div` element in `body` | function(trigger) | - | | getCalendarContainer | to set the container of the floating layer, while the default is to create a `div` element in `body` | function(trigger) | - |
| locale | localization configuration | object | [default](https://github.com/vueComponent/ant-design-vue/blob/master/components/date-picker/locale/example.json) | | locale | localization configuration | object | [default](https://github.com/vueComponent/ant-design-vue/blob/master/components/date-picker/locale/example.json) |
| mode | picker panel mode | `time|date|month|year` | 'date' |
| open | open state of picker | boolean | - | | open | open state of picker | boolean | - |
| placeholder | placeholder of date input | string\|RangePicker\[] | - | | placeholder | placeholder of date input | string\|RangePicker\[] | - |
| popupStyle | to customize the style of the popup calendar | object | {} | | popupStyle | to customize the style of the popup calendar | object | {} |
@ -61,7 +62,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - | | defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - |
| disabledTime | to specify the time that cannot be selected | function(date) | - | | disabledTime | to specify the time that cannot be selected | function(date) | - |
| format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-MM-DD" | | format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-MM-DD" |
| renderExtraFooter | render extra footer in panel by setting a scoped slot | slot="renderExtraFooter" | - | | renderExtraFooter | render extra footer in panel by setting a scoped slot | slot="renderExtraFooter" slot-scope="mode" | - |
| showTime | to provide an additional time selection | object\|boolean | [TimePicker Options](/components/time-picker/#API) | | showTime | to provide an additional time selection | object\|boolean | [TimePicker Options](/components/time-picker/#API) |
| showTime.defaultValue | to set default time of selected date | [moment](http://momentjs.com/) | moment() | | showTime.defaultValue | to set default time of selected date | [moment](http://momentjs.com/) | moment() |
| showToday | whether to show "Today" button | boolean | true | | showToday | whether to show "Today" button | boolean | true |
@ -82,7 +83,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - | | defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - |
| format | to set the date format. When an array is provided, all values are used for parsing and first value for display. refer to [moment.js](http://momentjs.com/) | string \| string[] | "YYYY-MM" | | format | to set the date format. When an array is provided, all values are used for parsing and first value for display. refer to [moment.js](http://momentjs.com/) | string \| string[] | "YYYY-MM" |
| monthCellContentRender | Custom month cell content render method by setting a scoped slot | slot="monthCellContentRender" slot-scope="date, locale" | - | | monthCellContentRender | Custom month cell content render method by setting a scoped slot | slot="monthCellContentRender" slot-scope="date, locale" | - |
| renderExtraFooter | render extra footer in panel by setting a scoped slot | slot="renderExtraFooter" | - | | renderExtraFooter | render extra footer in panel by setting a scoped slot | slot="renderExtraFooter" slot-scope="mode" | - |
| value(v-model) | to set date | [moment](http://momentjs.com/) | - | | value(v-model) | to set date | [moment](http://momentjs.com/) | - |
### MonthPicker Events ### MonthPicker Events
@ -98,6 +99,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - | | defaultPickerValue | to set default picker date | [moment](http://momentjs.com/) | - |
| format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-wo" | | format | to set the date format, refer to [moment.js](http://momentjs.com/) | string | "YYYY-wo" |
| value(v-model) | to set date | [moment](http://momentjs.com/) | - | | value(v-model) | to set date | [moment](http://momentjs.com/) | - |
| renderExtraFooter | render extra footer in panel by setting a scoped slot | slot="renderExtraFooter" slot-scope="mode" | - |
### WeekPicker Events ### WeekPicker Events
| Events Name | Description | Arguments | | Events Name | Description | Arguments |
@ -113,7 +115,7 @@ The following APIs are shared by DatePicker, MonthPicker, RangePicker, WeekPicke
| disabledTime | to specify the time that cannot be selected | function(dates: \[moment, moment\], partial: `'start'|'end'`) | - | | disabledTime | to specify the time that cannot be selected | function(dates: \[moment, moment\], partial: `'start'|'end'`) | - |
| format | to set the date format | string | "YYYY-MM-DD HH:mm:ss" | | format | to set the date format | string | "YYYY-MM-DD HH:mm:ss" |
| ranges | preseted ranges for quick selection | { \[range: string]: [moment](http://momentjs.com/)\[] } \| { \[range: string]: () => [moment](http://momentjs.com/)\[] } | - | | ranges | preseted ranges for quick selection | { \[range: string]: [moment](http://momentjs.com/)\[] } \| { \[range: string]: () => [moment](http://momentjs.com/)\[] } | - |
| renderExtraFooter | render extra footer in panel by setting a scoped slot| slot="renderExtraFooter" | - | | renderExtraFooter | render extra footer in panel by setting a scoped slot| slot="renderExtraFooter" slot-scope="mode" | - |
| showTime | to provide an additional time selection | object\|boolean | [TimePicker Options](/components/time-picker/#API) | | showTime | to provide an additional time selection | object\|boolean | [TimePicker Options](/components/time-picker/#API) |
| showTime.defaultValue | to set default time of selected date, [demo](https://ant.design/components/date-picker/#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | \[moment(), moment()] | | showTime.defaultValue | to set default time of selected date, [demo](https://ant.design/components/date-picker/#components-date-picker-demo-disabled-date) | [moment](http://momentjs.com/)\[] | \[moment(), moment()] |
| value(v-model) | to set date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - | | value(v-model) | to set date | \[[moment](http://momentjs.com/), [moment](http://momentjs.com/)] | - |

View File

@ -9,18 +9,19 @@ import { DatePickerProps, MonthPickerProps, WeekPickerProps, RangePickerProps }
const DatePicker = wrapPicker( const DatePicker = wrapPicker(
{ ...createPicker(VcCalendar, DatePickerProps()), name: 'ADatePicker' }, { ...createPicker(VcCalendar, DatePickerProps()), name: 'ADatePicker' },
DatePickerProps(), DatePickerProps(),
'date'
); );
const MonthPicker = wrapPicker( const MonthPicker = wrapPicker(
{ ...createPicker(MonthCalendar, MonthPickerProps()), name: 'AMonthPicker' }, { ...createPicker(MonthCalendar, MonthPickerProps()), name: 'AMonthPicker' },
MonthPickerProps(), MonthPickerProps(),
'YYYY-MM', 'month',
); );
Object.assign(DatePicker, { Object.assign(DatePicker, {
RangePicker: wrapPicker(RangePicker, RangePickerProps()), RangePicker: wrapPicker(RangePicker, RangePickerProps(), 'date'),
MonthPicker, MonthPicker,
WeekPicker: wrapPicker(WeekPicker, WeekPickerProps(), 'gggg-wo'), WeekPicker: wrapPicker(WeekPicker, WeekPickerProps(), 'week'),
}); });
/* istanbul ignore next */ /* istanbul ignore next */

View File

@ -61,7 +61,8 @@ moment.locale('zh-cn');
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 | | defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 |
| disabledTime | 不可选择的时间 | function(date) | 无 | | disabledTime | 不可选择的时间 | function(date) | 无 |
| format | 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 [moment.js](http://momentjs.com/) | string \| string[] | "YYYY-MM-DD" | | format | 设置日期格式,为数组时支持多格式匹配,展示以第一个为准。配置参考 [moment.js](http://momentjs.com/) | string \| string[] | "YYYY-MM-DD" |
| renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" | - | | mode | 日期面板的状态 | `time|date|month|year` | 'date' |
| renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" slot-scope="mode" | - |
| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker-cn/#API) | | showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker-cn/#API) |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒 | [moment](http://momentjs.com/) | moment() | | showTime.defaultValue | 设置用户选择日期时默认的时分秒 | [moment](http://momentjs.com/) | moment() |
| showToday | 是否展示“今天”按钮 | boolean | true | | showToday | 是否展示“今天”按钮 | boolean | true |
@ -82,7 +83,7 @@ moment.locale('zh-cn');
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 | | defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-MM" | | format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-MM" |
| monthCellContentRender | 自定义的月份内容渲染方法 | slot="monthCellContentRender" slot-scope="date, locale" | - | | monthCellContentRender | 自定义的月份内容渲染方法 | slot="monthCellContentRender" slot-scope="date, locale" | - |
| renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" | - | | renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" slot-scope="mode" | - |
| value(v-model) | 日期 | [moment](http://momentjs.com/) | 无 | | value(v-model) | 日期 | [moment](http://momentjs.com/) | 无 |
### MonthPicker事件 ### MonthPicker事件
@ -99,6 +100,7 @@ moment.locale('zh-cn');
| defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 | | defaultPickerValue | 默认面板日期 | [moment](http://momentjs.com/) | 无 |
| format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-wo" | | format | 展示的日期格式,配置参考 [moment.js](http://momentjs.com/) | string | "YYYY-wo" |
| value(v-model) | 日期 | [moment](http://momentjs.com/) | - | | value(v-model) | 日期 | [moment](http://momentjs.com/) | - |
| renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" slot-scope="mode" | - |
### WeekPicker事件 ### WeekPicker事件
@ -115,7 +117,7 @@ moment.locale('zh-cn');
| disabledTime | 不可选择的时间 | function(dates: \[moment, moment\], partial: `'start'|'end'`) | 无 | | disabledTime | 不可选择的时间 | function(dates: \[moment, moment\], partial: `'start'|'end'`) | 无 |
| format | 展示的日期格式 | string | "YYYY-MM-DD HH:mm:ss" | | format | 展示的日期格式 | string | "YYYY-MM-DD HH:mm:ss" |
| ranges       | 预设时间范围快捷选择 | { \[range: string]: [moment](http://momentjs.com/)\[] } \| { \[range: string]: () => [moment](http://momentjs.com/)\[] } | 无 | | ranges       | 预设时间范围快捷选择 | { \[range: string]: [moment](http://momentjs.com/)\[] } \| { \[range: string]: () => [moment](http://momentjs.com/)\[] } | 无 |
| renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" | - | | renderExtraFooter | 在面板中添加额外的页脚 | slot="renderExtraFooter" slot-scope="mode" | - |
| showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker-cn/#API) | | showTime | 增加时间选择功能 | Object\|boolean | [TimePicker Options](/components/time-picker-cn/#API) |
| showTime.defaultValue | 设置用户选择日期时默认的时分秒 | [moment](http://momentjs.com/)\[] | \[moment(), moment()] | | showTime.defaultValue | 设置用户选择日期时默认的时分秒 | [moment](http://momentjs.com/)\[] | \[moment(), moment()] |
| value(v-model) | 日期 | [moment](http://momentjs.com/)\[] | 无 | | value(v-model) | 日期 | [moment](http://momentjs.com/)\[] | 无 |

View File

@ -53,6 +53,7 @@ export const DatePickerProps = () => ({
// onOpenChange?: (status: bool) => void; // onOpenChange?: (status: bool) => void;
// onOk?: (selectedTime: moment.Moment) => void; // onOk?: (selectedTime: moment.Moment) => void;
placeholder: PropTypes.string, placeholder: PropTypes.string,
mode: PropTypes.oneOf(['time', 'date', 'month', 'year']),
}); });
export const MonthPickerProps = () => ({ export const MonthPickerProps = () => ({

View File

@ -31,9 +31,5 @@
}, },
"timePickerLocale": { "timePickerLocale": {
"placeholder": "Select time" "placeholder": "Select time"
}, }
"dateFormat": "YYYY-MM-DD",
"dateTimeFormat": "YYYY-MM-DD HH:mm:ss",
"weekFormat": "YYYY-wo",
"monthFormat": "YYYY-MM"
} }

View File

@ -4,6 +4,21 @@ import LocaleReceiver from '../locale-provider/LocaleReceiver';
import { generateShowHourMinuteSecond } from '../time-picker'; import { generateShowHourMinuteSecond } from '../time-picker';
import enUS from './locale/en_US'; import enUS from './locale/en_US';
import { getOptionProps, initDefaultProps } from '../_util/props-util'; import { getOptionProps, initDefaultProps } from '../_util/props-util';
import { ConfigConsumerProps } from '../config-provider';
const DEFAULT_FORMAT = {
date: 'YYYY-MM-DD',
dateTime: 'YYYY-MM-DD HH:mm:ss',
week: 'gggg-wo',
month: 'YYYY-MM',
};
const LOCALE_FORMAT_MAPPING = {
date: 'dateFormat',
dateTime: 'dateTimeFormat',
week: 'weekFormat',
month: 'monthFormat',
};
function getColumns({ showHour, showMinute, showSecond, use12Hours }) { function getColumns({ showHour, showMinute, showSecond, use12Hours }) {
let column = 0; let column = 0;
@ -22,22 +37,21 @@ function getColumns({ showHour, showMinute, showSecond, use12Hours }) {
return column; return column;
} }
export default function wrapPicker(Picker, props, defaultFormat) { export default function wrapPicker(Picker, props, pickerType) {
return { return {
name: Picker.name, name: Picker.name,
props: initDefaultProps(props, { props: initDefaultProps(props, {
format: defaultFormat || 'YYYY-MM-DD',
transitionName: 'slide-up', transitionName: 'slide-up',
popupStyle: {}, popupStyle: {},
locale: {}, locale: {},
prefixCls: 'ant-calendar',
inputPrefixCls: 'ant-input',
}), }),
model: { model: {
prop: 'value', prop: 'value',
event: 'change', event: 'change',
}, },
inject: {
configProvider: { default: () => ({}) },
},
mounted() { mounted() {
const { autoFocus, disabled } = this; const { autoFocus, disabled } = this;
if (autoFocus && !disabled) { if (autoFocus && !disabled) {
@ -89,7 +103,24 @@ export default function wrapPicker(Picker, props, defaultFormat) {
renderPicker(locale, localeCode) { renderPicker(locale, localeCode) {
const props = getOptionProps(this); const props = getOptionProps(this);
const { prefixCls, inputPrefixCls, size, showTime, disabled } = props; const {
prefixCls: customizePrefixCls,
inputPrefixCls: customizeInputPrefixCls,
size,
showTime,
disabled,
format,
} = props;
const mergedPickerType = showTime ? `${pickerType}Time` : pickerType;
const mergedFormat =
format ||
locale[LOCALE_FORMAT_MAPPING[mergedPickerType]] ||
DEFAULT_FORMAT[mergedPickerType];
const getPrefixCls = this.configProvider.getPrefixCls || ConfigConsumerProps.getPrefixCls;
const prefixCls = getPrefixCls('calendar', customizePrefixCls);
const inputPrefixCls = getPrefixCls('input', customizeInputPrefixCls);
const pickerClass = classNames(`${prefixCls}-picker`, { const pickerClass = classNames(`${prefixCls}-picker`, {
[`${prefixCls}-picker-${size}`]: !!size, [`${prefixCls}-picker-${size}`]: !!size,
}); });
@ -121,6 +152,7 @@ export default function wrapPicker(Picker, props, defaultFormat) {
const pickerProps = { const pickerProps = {
props: { props: {
...props, ...props,
format: mergedFormat,
pickerClass, pickerClass,
pickerInputClass, pickerInputClass,
locale, locale,

View File

@ -23,7 +23,7 @@ export default {
for (let i = 0; i < 3; i += 1) { for (let i = 0; i < 3; i += 1) {
setTimeout(() => { setTimeout(() => {
this.$confirm({ this.$confirm({
content: ( // JSX support content: (
<Button onClick={this.destroyAll}> <Button onClick={this.destroyAll}>
Click to destroy all Click to destroy all
</Button> </Button>