From d229954f8d558cbde59711b1fab0b5023b936298 Mon Sep 17 00:00:00 2001 From: zombiej Date: Mon, 3 Feb 2020 17:20:53 +0800 Subject: [PATCH 1/2] add timePicker defaultOpenValue support --- src/PanelContext.tsx | 3 +++ src/Picker.tsx | 21 +++++++++++++++++++-- src/PickerPanel.tsx | 7 +++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/PanelContext.tsx b/src/PanelContext.tsx index 7d8182287..7ae278ff3 100644 --- a/src/PanelContext.tsx +++ b/src/PanelContext.tsx @@ -18,6 +18,9 @@ export interface PanelContextProps { onSelect?: OnSelect; hideRanges?: boolean; open?: boolean; + + /** Only used for TimePicker and this is a deprecated prop */ + defaultOpenValue?: any; } const PanelContext = React.createContext({}); diff --git a/src/Picker.tsx b/src/Picker.tsx index 8209bfc22..50dff9e90 100644 --- a/src/Picker.tsx +++ b/src/Picker.tsx @@ -14,7 +14,7 @@ import * as React from 'react'; import classNames from 'classnames'; import { AlignType } from 'rc-trigger/lib/interface'; -import { warning } from 'rc-util/lib/warning'; +import warning from 'rc-util/lib/warning'; import useMergedState from 'rc-util/lib/hooks/useMergedState'; import PickerPanel, { PickerPanelBaseProps, @@ -104,7 +104,14 @@ export interface PickerDateProps export interface PickerTimeProps extends PickerSharedProps, - Omit>, 'format'> {} + Omit>, 'format'> { + picker: 'time'; + /** + * @deprecated Please use `defaultValue` directly instead + * since `defaultOpenValue` will confuse user of current value status + */ + defaultOpenValue?: DateType; +} export type PickerProps = | PickerBaseProps @@ -143,6 +150,7 @@ function InnerPicker(props: PickerProps) { defaultValue, open, defaultOpen, + defaultOpenValue, suffixIcon, clearIcon, disabled, @@ -397,6 +405,14 @@ function InnerPicker(props: PickerProps) { ); } + // ============================ Warning ============================ + if (process.env.NODE_ENV !== 'production') { + warning( + !defaultOpenValue, + '`defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.', + ); + } + // ============================ Return ============================= const onContextSelect = ( date: DateType, @@ -418,6 +434,7 @@ function InnerPicker(props: PickerProps) { panelRef: panelDivRef, onSelect: onContextSelect, open: mergedOpen, + defaultOpenValue, }} > (props: PickerPanelProps) { panelRef: panelDivRef, onSelect: onContextSelect, hideRanges, + defaultOpenValue, } = panelContext; const { @@ -188,6 +189,12 @@ function PickerPanel(props: PickerPanelProps) { const [mergedValue, setInnerValue] = useMergedState(null, { value, defaultValue, + postState: val => { + if (!val && defaultOpenValue && picker === 'time') { + return defaultOpenValue; + } + return val; + }, }); // View date control From a20aae0fe0854ac309efd990e383faa5c34fb81a Mon Sep 17 00:00:00 2001 From: zombiej Date: Mon, 3 Feb 2020 17:42:45 +0800 Subject: [PATCH 2/2] add test case --- tests/picker.spec.tsx | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/picker.spec.tsx b/tests/picker.spec.tsx index 3d4e6113f..f3f29be07 100644 --- a/tests/picker.spec.tsx +++ b/tests/picker.spec.tsx @@ -3,6 +3,7 @@ import MockDate from 'mockdate'; import { act } from 'react-dom/test-utils'; import { spyElementPrototypes } from 'rc-util/lib/test/domHook'; import KeyCode from 'rc-util/lib/KeyCode'; +import { resetWarned } from 'rc-util/lib/warning'; import { PanelMode, PickerMode } from '../src/interface'; import { mount, getMoment, isSame, MomentPicker } from './util/commonUtil'; @@ -557,4 +558,31 @@ describe('Picker.Basic', () => { wrapper.find('.rc-picker').simulate('mouseUp'); expect(inputElement.focus).toHaveBeenCalled(); }); + + it('defaultOpenValue in timePicker', () => { + resetWarned(); + const onChange = jest.fn(); + const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + + const wrapper = mount( + , + ); + + expect(errSpy).toHaveBeenCalledWith( + 'Warning: `defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.', + ); + + wrapper.openPicker(); + wrapper.find('.rc-picker-ok button').simulate('click'); + + expect( + isSame(onChange.mock.calls[0][0], '2000-01-01 00:10:23'), + ).toBeTruthy(); + + errSpy.mockRestore(); + }); });