diff --git a/components/time-picker/__tests__/index.test.js b/components/time-picker/__tests__/index.test.js
index aaf7833ee..2e1e8995b 100644
--- a/components/time-picker/__tests__/index.test.js
+++ b/components/time-picker/__tests__/index.test.js
@@ -1,9 +1,20 @@
import { mount } from '@vue/test-utils';
import VcTimePicker from '../../vc-time-picker/TimePicker';
import TimePicker from '..';
+import moment from 'moment';
import focusTest from '../../../tests/shared/focusTest';
describe('TimePicker', () => {
+ const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
+
+ afterEach(() => {
+ errorSpy.mockReset();
+ });
+
+ afterAll(() => {
+ errorSpy.mockRestore();
+ });
+
focusTest(TimePicker);
it('renders addon correctly', () => {
@@ -20,4 +31,26 @@ describe('TimePicker', () => {
});
expect(addonWrapper.html()).toMatchSnapshot();
});
+
+ it('allowEmpty deprecated', () => {
+ mount({
+ render() {
+ return ;
+ },
+ });
+ expect(errorSpy).toBeCalledWith(
+ 'Warning: `allowEmpty` in TimePicker is deprecated. Please use `allowClear` instead.',
+ );
+ });
+ it('not render clean icon when allowClear is false', () => {
+ const wrapper = mount(
+ {
+ render() {
+ return ;
+ },
+ }
+ );
+ expect(wrapper.html()).toMatchSnapshot();
+ });
+
});
diff --git a/components/time-picker/index.en-US.md b/components/time-picker/index.en-US.md
index 84522344c..3e8e9513c 100644
--- a/components/time-picker/index.en-US.md
+++ b/components/time-picker/index.en-US.md
@@ -3,7 +3,7 @@
| Property | Description | Type | Default |
| -------- | ----------- | ---- | ------- |
| addon | some addon to timepicker panel bottom | slot \| slot-scope | - |
-| allowEmpty | allow clearing text | boolean | true |
+| allowClear | allow clearing text | boolean | true |
| autoFocus | get focus when component mounted | boolean | false |
| clearText | clear tooltip of icon | string | clear |
| defaultOpenValue | default open panel value, used to set utcOffset,locale if value/defaultValue absent | [moment](http://momentjs.com/) | moment() |
@@ -21,6 +21,7 @@
| open(.sync) | whether to popup panel | boolean | false |
| placeholder | display when there's no value | string | "Select a time" |
| popupClassName | className of panel | string | '' |
+| popupStyle | style of panel | object | - |
| secondStep | interval between seconds in picker | number | 1 |
| suffixIcon | The custom suffix icon | string \| VNode \| slot | - |
| use12Hours | display as 12 hours format, with default format `h:mm:ss a` | boolean | false |
diff --git a/components/time-picker/index.jsx b/components/time-picker/index.jsx
index 5787f6c67..5f498152d 100644
--- a/components/time-picker/index.jsx
+++ b/components/time-picker/index.jsx
@@ -1,9 +1,11 @@
import * as moment from 'moment';
+import omit from 'omit.js';
import VcTimePicker from '../vc-time-picker';
import LocaleReceiver from '../locale-provider/LocaleReceiver';
import defaultLocale from './locale/en_US';
import BaseMixin from '../_util/BaseMixin';
import PropTypes from '../_util/vue-types';
+import warning from '../_util/warning';
import Icon from '../icon';
import interopDefault from '../_util/interopDefault';
import {
@@ -14,6 +16,7 @@ import {
isValidElement,
} from '../_util/props-util';
import { cloneElement } from '../_util/vnode';
+import { ConfigConsumerProps } from '../config-provider';
export function generateShowHourMinuteSecond(format) {
// Ref: http://momentjs.com/docs/#/parsing/string-format/
@@ -53,10 +56,12 @@ export const TimePickerProps = () => ({
minuteStep: PropTypes.number,
secondStep: PropTypes.number,
allowEmpty: PropTypes.bool,
+ allowClear: PropTypes.bool,
inputReadOnly: PropTypes.bool,
clearText: PropTypes.string,
defaultOpenValue: PropTypes.object,
popupClassName: PropTypes.string,
+ popupStyle: PropTypes.object,
suffixIcon: PropTypes.any,
align: PropTypes.object,
placement: PropTypes.any,
@@ -69,7 +74,6 @@ const TimePicker = {
name: 'ATimePicker',
mixins: [BaseMixin],
props: initDefaultProps(TimePickerProps(), {
- prefixCls: 'ant-time-picker',
align: {
offset: [0, -2],
},
@@ -94,6 +98,10 @@ const TimePicker = {
if (value && !interopDefault(moment).isMoment(value)) {
throw new Error('The value/defaultValue of TimePicker must be a moment object, ');
}
+ warning(
+ !hasProp(this, 'allowEmpty'),
+ '`allowEmpty` in TimePicker is deprecated. Please use `allowClear` instead.',
+ );
return {
sValue: value,
};
@@ -135,23 +143,15 @@ const TimePicker = {
return 'HH:mm:ss';
},
- renderTimePicker(locale) {
- const props = getOptionProps(this);
- delete props.defaultValue;
+ getAllowClear() {
+ const { allowClear, allowEmpty } = this.$props;
+ if ('allowClear' in this.$props) {
+ return allowClear;
+ }
+ return allowEmpty;
+ },
- const format = this.getDefaultFormat();
- const className = {
- [`${props.prefixCls}-${props.size}`]: !!props.size,
- };
- const tempAddon = getComponentFromProp(this, 'addon', {}, false);
- const addon = panel => {
- return tempAddon ? (
-
- {typeof tempAddon === 'function' ? tempAddon(panel) : tempAddon}
-
- ) : null;
- };
- const { prefixCls, getPopupContainer } = props;
+ renderInputIcon(prefixCls) {
let suffixIcon = getComponentFromProp(this, 'suffixIcon');
suffixIcon = Array.isArray(suffixIcon) ? suffixIcon[0] : suffixIcon;
const clockIcon = (suffixIcon &&
@@ -163,25 +163,56 @@ const TimePicker = {
{suffixIcon}
))) || ;
- const inputIcon = {clockIcon};
+ return {clockIcon};
+ },
+
+ renderClearIcon(prefixCls) {
+ const clearIcon = ;
+ return clearIcon;
+ },
+
+ renderTimePicker(locale) {
+ let props = getOptionProps(this);
+ props = omit(props, ['defaultValue', 'suffixIcon', 'allowEmpty', 'allowClear']);
- const clearIcon = (
-
- );
+ const {
+ prefixCls: customizePrefixCls,
+ getPopupContainer,
+ placeholder,
+ size,
+ } = props;
+ const getPrefixCls = this.configProvider.getPrefixCls || ConfigConsumerProps.getPrefixCls;
+ const prefixCls = getPrefixCls('time-picker', customizePrefixCls);
+
+ const format = this.getDefaultFormat();
+ const pickerClassName = {
+ [`${prefixCls}-${size}`]: !!size,
+ };
+ const tempAddon = getComponentFromProp(this, 'addon', {}, false);
+ const pickerAddon = panel => {
+ return tempAddon ? (
+
+ {typeof tempAddon === 'function' ? tempAddon(panel) : tempAddon}
+
+ ) : null;
+ };
+ const inputIcon = this.renderInputIcon(prefixCls);
+ const clearIcon = this.renderClearIcon(prefixCls);
const { getPopupContainer: getContextPopupContainer } = this.configProvider;
const timeProps = {
props: {
...generateShowHourMinuteSecond(format),
...props,
+ prefixCls,
getPopupContainer: getPopupContainer || getContextPopupContainer,
format,
value: this.sValue,
- placeholder: props.placeholder === undefined ? locale.placeholder : props.placeholder,
- addon,
+ placeholder: placeholder === undefined ? locale.placeholder : placeholder,
+ addon: pickerAddon,
inputIcon,
clearIcon,
},
- class: className,
+ class: pickerClassName,
ref: 'timePicker',
on: {
...this.$listeners,
diff --git a/components/time-picker/index.zh-CN.md b/components/time-picker/index.zh-CN.md
index ac389a23d..c84869628 100644
--- a/components/time-picker/index.zh-CN.md
+++ b/components/time-picker/index.zh-CN.md
@@ -4,7 +4,7 @@
| 参数 | 说明 | 类型 | 默认值 |
| --- | --- | --- | --- |
| addon | 选择框底部显示自定义的内容 | slot \| slot-scope | 无 |
-| allowEmpty | 是否展示清除按钮 | boolean | true |
+| allowClear | 是否展示清除按钮 | boolean | true |
| autoFocus | 自动获取焦点 | boolean | false |
| clearText | 清除按钮的提示文案 | string | clear |
| defaultOpenValue | 当 defaultValue/value 不存在时,可以设置面板打开时默认选中的值 | [moment](http://momentjs.com/) | moment() |
@@ -22,6 +22,7 @@
| open(.sync) | 面板是否打开 | boolean | false |
| placeholder | 没有值的时候显示的内容 | string | "请选择时间" |
| popupClassName | 弹出层类名 | string | '' |
+| popupStyle | 弹出层样式对象 | object | - |
| secondStep | 秒选项间隔 | number | 1 |
| suffixIcon | 自定义的选择框后缀图标 | string \| VNode \| slot | - |
| use12Hours | 使用 12 小时制,为 true 时 `format` 默认为 `h:mm:ss a` | boolean | false |