Skip to content

Commit c8d462c

Browse files
committed
fix: Adjust blur to openChange logic
1 parent b36a3d1 commit c8d462c

File tree

6 files changed

+49
-43
lines changed

6 files changed

+49
-43
lines changed

examples/uncontrolled.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import React from 'react';
22
import { Moment } from 'moment';
3-
import Picker from '../src/Picker';
43
import momentGenerateConfig from '../src/generate/moment';
54
import zhCN from '../src/locale/zh_CN';
65
import '../assets/index.less';
6+
import Picker, { RangePicker } from '../src';
77

88
export default () => (
99
<div>
@@ -28,6 +28,16 @@ export default () => (
2828
console.log('2 =>', open);
2929
}}
3030
/>
31+
<RangePicker<Moment>
32+
generateConfig={momentGenerateConfig}
33+
locale={zhCN}
34+
picker="week"
35+
allowClear
36+
open
37+
onOpenChange={open => {
38+
console.log('3 =>', open);
39+
}}
40+
/>
3141
<button type="button">233</button>
3242
</div>
3343
</div>

src/Picker.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
274274
panelDivRef.current &&
275275
!panelDivRef.current.contains(target as Node) &&
276276
inputDivRef.current &&
277-
!inputDivRef.current.contains(target as Node) &&
278-
onOpenChange
277+
!inputDivRef.current.contains(target as Node)
279278
),
280279
onSubmit: () => {
281280
triggerChange(selectedValue);

src/RangePicker.tsx

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,13 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
397397

398398
const triggerChange = (
399399
newValue: RangeValue<DateType>,
400-
forceInput: boolean = true,
400+
config: {
401+
source?: 'open';
402+
forceInput?: boolean;
403+
} = {},
401404
) => {
405+
const { forceInput = true, source } = config;
406+
402407
let values = newValue;
403408
const startValue = getValue(values, 0);
404409
let endValue = getValue(values, 1);
@@ -438,7 +443,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
438443
if (canTrigger) {
439444
// Trigger onChange only when value is validate
440445
setInnerValue(values);
441-
triggerOpen(false, activePickerIndex, true);
446+
if (source !== 'open') {
447+
triggerOpen(false, activePickerIndex, true);
448+
}
442449

443450
if (
444451
onChange &&
@@ -456,7 +463,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
456463
return;
457464
}
458465

459-
triggerOpen(true, missingValueIndex);
466+
if (source !== 'open') {
467+
triggerOpen(true, missingValueIndex);
468+
}
460469

461470
// Delay to focus to avoid input blur trigger expired selectedValues
462471
setTimeout(() => {
@@ -479,7 +488,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
479488
} else if (activePickerIndex === index) {
480489
triggerInnerOpen(newOpen);
481490
if (!preventChangeEvent) {
482-
triggerChange(selectedValue);
491+
triggerChange(selectedValue, { source: 'open' });
483492
}
484493
}
485494
};
@@ -550,20 +559,18 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
550559
});
551560

552561
// ============================= Input =============================
553-
const getSharedInputHookProps = (
554-
index: 0 | 1,
555-
inputDivRef: React.RefObject<HTMLDivElement>,
556-
resetText: () => void,
557-
) => ({
562+
const getSharedInputHookProps = (index: 0 | 1, resetText: () => void) => ({
558563
blurToCancel: !!(picker === 'date' && showTime),
559564
forwardKeyDown,
560565
onBlur,
561566
isClickOutside: (target: EventTarget | null) =>
562567
!!(
563568
panelDivRef.current &&
564569
!panelDivRef.current.contains(target as Node) &&
565-
inputDivRef.current &&
566-
!inputDivRef.current.contains(target as Node)
570+
startInputDivRef.current &&
571+
!startInputDivRef.current.contains(target as Node) &&
572+
endInputDivRef.current &&
573+
!endInputDivRef.current.contains(target as Node)
567574
),
568575
onFocus: (e: React.FocusEvent<HTMLInputElement>) => {
569576
setActivePickerIndex(index);
@@ -587,15 +594,15 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
587594
startInputProps,
588595
{ focused: startFocused, typing: startTyping },
589596
] = usePickerInput({
590-
...getSharedInputHookProps(0, startInputDivRef, resetStartText),
597+
...getSharedInputHookProps(0, resetStartText),
591598
open: startOpen,
592599
});
593600

594601
const [
595602
endInputProps,
596603
{ focused: endFocused, typing: endTyping },
597604
] = usePickerInput({
598-
...getSharedInputHookProps(1, endInputDivRef, resetEndText),
605+
...getSharedInputHookProps(1, resetEndText),
599606
open: endOpen,
600607
});
601608

@@ -930,7 +937,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
930937
values = updateValues(values, null, 1);
931938
}
932939

933-
triggerChange(values, false);
940+
triggerChange(values, { forceInput: false });
934941
}}
935942
className={`${prefixCls}-clear`}
936943
>

src/hooks/usePickerInput.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ export default function usePickerInput({
9595
return;
9696
}
9797

98-
triggerOpen(false);
98+
if (blurToCancel) {
99+
onCancel();
100+
} else {
101+
triggerOpen(false);
102+
}
99103
setFocused(false);
100104

101105
if (onBlur) {
@@ -107,19 +111,17 @@ export default function usePickerInput({
107111
// Global click handler
108112
React.useEffect(() =>
109113
addGlobalMouseDownEvent(({ target }: MouseEvent) => {
110-
if (open && isClickOutside(target)) {
111-
preventBlurRef.current = true;
114+
if (open) {
115+
if (!isClickOutside(target)) {
116+
preventBlurRef.current = true;
112117

113-
if (blurToCancel) {
114-
onCancel();
115-
} else {
118+
// Always set back in case `onBlur` prevented by user
119+
window.setTimeout(() => {
120+
preventBlurRef.current = false;
121+
}, 0);
122+
} else if (!focused) {
116123
triggerOpen(false);
117124
}
118-
119-
// Always set back in case `onBlur` prevented by user
120-
window.setTimeout(() => {
121-
preventBlurRef.current = false;
122-
}, 0);
123125
}
124126
}),
125127
);

tests/picker.spec.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ describe('Picker.Basic', () => {
113113
it('fixed open need repeat trigger onOpenChange', () => {
114114
jest.useFakeTimers();
115115
const onOpenChange = jest.fn();
116-
const wrapper = mount(<MomentPicker onOpenChange={onOpenChange} open />);
116+
mount(<MomentPicker onOpenChange={onOpenChange} open />);
117117

118118
for (let i = 0; i < 10; i += 1) {
119119
const clickEvent = new Event('mousedown');
@@ -122,7 +122,6 @@ describe('Picker.Basic', () => {
122122
});
123123
act(() => {
124124
window.dispatchEvent(clickEvent);
125-
wrapper.find('input').simulate('blur');
126125
});
127126
expect(onOpenChange).toHaveBeenCalledTimes(i + 1);
128127
}

tests/range.spec.tsx

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -478,11 +478,8 @@ describe('Picker.Range', () => {
478478

479479
wrapper.openPicker();
480480
wrapper.selectCell(13);
481-
wrapper.closePicker();
482-
483-
wrapper.openPicker(1);
481+
wrapper.find('.rc-picker-ok button').simulate('click');
484482
wrapper.selectCell(23);
485-
wrapper.closePicker(1);
486483

487484
matchValues(wrapper, '1990-09-13 01:02:03', '1990-09-23 05:06:07');
488485
});
@@ -802,16 +799,8 @@ describe('Picker.Range', () => {
802799
const wrapper = mount(<MomentRangePicker showTime />);
803800
wrapper.openPicker();
804801
wrapper.selectCell(11);
802+
wrapper.closePicker();
805803

806-
const clickEvent = new Event('mousedown');
807-
Object.defineProperty(clickEvent, 'target', {
808-
get: () => document.body,
809-
});
810-
act(() => {
811-
window.dispatchEvent(clickEvent);
812-
});
813-
814-
wrapper.update();
815804
expect(wrapper.isOpen()).toBeFalsy();
816805
expect(
817806
wrapper

0 commit comments

Comments
 (0)