Skip to content

Commit 76e7c37

Browse files
authored
fix: Add defaultOpenValue support (#23)
* add timePicker defaultOpenValue support * add test case
1 parent d9b7a6e commit 76e7c37

File tree

4 files changed

+57
-2
lines changed

4 files changed

+57
-2
lines changed

src/PanelContext.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export interface PanelContextProps {
1818
onSelect?: OnSelect<any>;
1919
hideRanges?: boolean;
2020
open?: boolean;
21+
22+
/** Only used for TimePicker and this is a deprecated prop */
23+
defaultOpenValue?: any;
2124
}
2225

2326
const PanelContext = React.createContext<PanelContextProps>({});

src/Picker.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import * as React from 'react';
1515
import classNames from 'classnames';
1616
import { AlignType } from 'rc-trigger/lib/interface';
17-
import { warning } from 'rc-util/lib/warning';
17+
import warning from 'rc-util/lib/warning';
1818
import useMergedState from 'rc-util/lib/hooks/useMergedState';
1919
import PickerPanel, {
2020
PickerPanelBaseProps,
@@ -104,7 +104,14 @@ export interface PickerDateProps<DateType>
104104

105105
export interface PickerTimeProps<DateType>
106106
extends PickerSharedProps<DateType>,
107-
Omit<OmitPanelProps<PickerPanelTimeProps<DateType>>, 'format'> {}
107+
Omit<OmitPanelProps<PickerPanelTimeProps<DateType>>, 'format'> {
108+
picker: 'time';
109+
/**
110+
* @deprecated Please use `defaultValue` directly instead
111+
* since `defaultOpenValue` will confuse user of current value status
112+
*/
113+
defaultOpenValue?: DateType;
114+
}
108115

109116
export type PickerProps<DateType> =
110117
| PickerBaseProps<DateType>
@@ -143,6 +150,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
143150
defaultValue,
144151
open,
145152
defaultOpen,
153+
defaultOpenValue,
146154
suffixIcon,
147155
clearIcon,
148156
disabled,
@@ -397,6 +405,14 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
397405
);
398406
}
399407

408+
// ============================ Warning ============================
409+
if (process.env.NODE_ENV !== 'production') {
410+
warning(
411+
!defaultOpenValue,
412+
'`defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.',
413+
);
414+
}
415+
400416
// ============================ Return =============================
401417
const onContextSelect = (
402418
date: DateType,
@@ -418,6 +434,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
418434
panelRef: panelDivRef,
419435
onSelect: onContextSelect,
420436
open: mergedOpen,
437+
defaultOpenValue,
421438
}}
422439
>
423440
<PickerTrigger

src/PickerPanel.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
171171
panelRef: panelDivRef,
172172
onSelect: onContextSelect,
173173
hideRanges,
174+
defaultOpenValue,
174175
} = panelContext;
175176

176177
const {
@@ -188,6 +189,12 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
188189
const [mergedValue, setInnerValue] = useMergedState(null, {
189190
value,
190191
defaultValue,
192+
postState: val => {
193+
if (!val && defaultOpenValue && picker === 'time') {
194+
return defaultOpenValue;
195+
}
196+
return val;
197+
},
191198
});
192199

193200
// View date control

tests/picker.spec.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import MockDate from 'mockdate';
33
import { act } from 'react-dom/test-utils';
44
import { spyElementPrototypes } from 'rc-util/lib/test/domHook';
55
import KeyCode from 'rc-util/lib/KeyCode';
6+
import { resetWarned } from 'rc-util/lib/warning';
67
import { PanelMode, PickerMode } from '../src/interface';
78
import { mount, getMoment, isSame, MomentPicker } from './util/commonUtil';
89

@@ -557,4 +558,31 @@ describe('Picker.Basic', () => {
557558
wrapper.find('.rc-picker').simulate('mouseUp');
558559
expect(inputElement.focus).toHaveBeenCalled();
559560
});
561+
562+
it('defaultOpenValue in timePicker', () => {
563+
resetWarned();
564+
const onChange = jest.fn();
565+
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
566+
567+
const wrapper = mount(
568+
<MomentPicker
569+
picker="time"
570+
defaultOpenValue={getMoment('2000-01-01 00:10:23')}
571+
onChange={onChange}
572+
/>,
573+
);
574+
575+
expect(errSpy).toHaveBeenCalledWith(
576+
'Warning: `defaultOpenValue` may confuse user for the current value status. Please use `defaultValue` instead.',
577+
);
578+
579+
wrapper.openPicker();
580+
wrapper.find('.rc-picker-ok button').simulate('click');
581+
582+
expect(
583+
isSame(onChange.mock.calls[0][0], '2000-01-01 00:10:23'),
584+
).toBeTruthy();
585+
586+
errSpy.mockRestore();
587+
});
560588
});

0 commit comments

Comments
 (0)