Skip to content

Commit 1ca5dd1

Browse files
authored
chore: changeOnBlur should not trigger when not open (#631)
* fix: closed panel should not trigger change on blur * test: add ts test case
1 parent 9af29b8 commit 1ca5dd1

File tree

3 files changed

+27
-27
lines changed

3 files changed

+27
-27
lines changed

src/RangePicker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
558558

559559
// ============================= Input =============================
560560
const onInternalBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
561-
if (changeOnBlur) {
561+
if (changeOnBlur && mergedOpen) {
562562
const selectedIndexValue = getValue(selectedValue, mergedActivePickerIndex);
563563
if (selectedIndexValue) {
564564
triggerChange(selectedValue, mergedActivePickerIndex);

src/hooks/useRangeOpen.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ export default function useRangeOpen(
4040
firstTimeOpen: boolean,
4141
triggerOpen: (open: boolean, activeIndex: 0 | 1 | false, source: SourceType) => void,
4242
] {
43-
// We record opened status here in case repeat open with picker
44-
// const [openRecord, setOpenRecord] = React.useState<{
45-
// 0?: boolean;
46-
// 1?: boolean;
47-
// }>({});
48-
4943
const [firstTimeOpen, setFirstTimeOpen] = React.useState(false);
5044

5145
const [mergedOpen, setMergedOpen] = useMergedState(defaultOpen || false, {
@@ -62,8 +56,6 @@ export default function useRangeOpen(
6256
const [nextActiveIndex, setNextActiveIndex] = React.useState<0 | 1>(null);
6357

6458
const triggerOpen = useEvent((nextOpen: boolean, index: 0 | 1 | false, source: SourceType) => {
65-
// console.error('✅', nextOpen, index, source, startSelectedValue, endSelectedValue);
66-
6759
if (index === false) {
6860
// Only when `nextOpen` is false and no need open to next index
6961
setMergedOpen(nextOpen);
@@ -79,32 +71,16 @@ export default function useRangeOpen(
7971
// Also set next index if next is empty
8072
![startSelectedValue, endSelectedValue][nextIndex]
8173
) {
82-
// Reset open record
83-
// setOpenRecord({
84-
// [index]: true,
85-
// });
8674
setFirstTimeOpen(true);
8775
setNextActiveIndex(nextIndex);
8876
} else {
89-
// setOpenRecord((ori) => ({
90-
// ...ori,
91-
// [index]: true,
92-
// }));
9377
setFirstTimeOpen(false);
9478

9579
if (nextActiveIndex !== null) {
9680
setNextActiveIndex(null);
9781
}
9882
}
9983
} else if (source === 'confirm' || (source === 'blur' && changeOnBlur)) {
100-
// Close if current value is empty
101-
// const selectedValue = [startSelectedValue, endSelectedValue][index];
102-
103-
// if (!selectedValue) {
104-
// setMergedOpen(false);
105-
// return;
106-
// }
107-
10884
if (nextActiveIndex !== null) {
10985
setFirstTimeOpen(false);
11086
setMergedActivePickerIndex(nextActiveIndex);

tests/blur.spec.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { fireEvent, render } from '@testing-library/react';
22
import React from 'react';
3-
import { getMoment, MomentPicker, MomentRangePicker } from './util/commonUtil';
3+
import { getMoment, isOpen, MomentPicker, MomentRangePicker, openPicker } from './util/commonUtil';
44

55
describe('Picker.ChangeOnBlur', () => {
66
beforeEach(() => {
@@ -36,7 +36,7 @@ describe('Picker.ChangeOnBlur', () => {
3636
expect(onChange).toHaveBeenCalled();
3737
});
3838

39-
it.only('RangePicker', () => {
39+
it('RangePicker', () => {
4040
const onChange = jest.fn();
4141

4242
const { container } = render(
@@ -67,4 +67,28 @@ describe('Picker.ChangeOnBlur', () => {
6767
fireEvent.blur(container.querySelectorAll('input')[1]);
6868
expect(onChange).toHaveBeenCalled();
6969
});
70+
71+
it('blur & close should not trigger change', () => {
72+
const onCalendarChange = jest.fn();
73+
74+
const { container } = render(
75+
<>
76+
<MomentRangePicker
77+
changeOnBlur
78+
defaultValue={[getMoment('2000-01-01'), getMoment('2000-01-05')]}
79+
onCalendarChange={onCalendarChange}
80+
/>
81+
</>,
82+
);
83+
84+
expect(isOpen()).toBeFalsy();
85+
fireEvent.blur(container.querySelector('input'));
86+
expect(onCalendarChange).not.toHaveBeenCalled();
87+
88+
// Open to trigger
89+
openPicker(container);
90+
expect(isOpen()).toBeTruthy();
91+
fireEvent.blur(container.querySelector('input'));
92+
expect(onCalendarChange).toHaveBeenCalled();
93+
});
7094
});

0 commit comments

Comments
 (0)