Skip to content

Commit 01a9c98

Browse files
Yuiai01dujiaqi
andauthored
fix: resolves an issue that occurs when showTime and changeOnBlur exist at the same time (#676)
* fix: Increase the priority of executing events in dateTime mode * chore: add test case --------- Co-authored-by: dujiaqi <[email protected]>
1 parent 8f802d2 commit 01a9c98

File tree

4 files changed

+50
-22
lines changed

4 files changed

+50
-22
lines changed

src/Picker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ function InnerPicker<DateType>(props: PickerProps<DateType>) {
325325

326326
const [inputProps, { focused, typing }] = usePickerInput({
327327
blurToCancel: needConfirmButton,
328+
changeOnBlur,
328329
open: mergedOpen,
329330
value: text,
330331
triggerOpen,

src/RangePicker.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -573,13 +573,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
573573

574574
const onInternalBlur: React.FocusEventHandler<HTMLInputElement> = (e) => {
575575
if (delayOpen) {
576-
if (changeOnBlur) {
577-
const selectedIndexValue = getValue(selectedValue, mergedActivePickerIndex);
578-
579-
if (selectedIndexValue) {
580-
triggerChange(selectedValue, mergedActivePickerIndex);
581-
}
582-
} else if (needConfirmButton) {
576+
if (needConfirmButton) {
583577
// when in dateTime mode, switching between two date input fields will trigger onCalendarChange.
584578
// when onBlur is triggered, the input field has already switched,
585579
// so it's necessary to obtain the value of the previous input field here.
@@ -589,6 +583,12 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
589583
if (selectedIndexValue) {
590584
triggerChange(selectedValue, needTriggerIndex, true);
591585
}
586+
} else if (changeOnBlur) {
587+
const selectedIndexValue = getValue(selectedValue, mergedActivePickerIndex);
588+
589+
if (selectedIndexValue) {
590+
triggerChange(selectedValue, mergedActivePickerIndex);
591+
}
592592
}
593593
}
594594

@@ -597,6 +597,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
597597

598598
const getSharedInputHookProps = (index: 0 | 1, resetText: () => void) => ({
599599
blurToCancel: !changeOnBlur && needConfirmButton,
600+
changeOnBlur,
600601
forwardKeyDown,
601602
onBlur: onInternalBlur,
602603
isClickOutside: (target: EventTarget | null) => {

src/hooks/usePickerInput.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default function usePickerInput({
1212
forwardKeyDown,
1313
onKeyDown,
1414
blurToCancel,
15+
changeOnBlur,
1516
onSubmit,
1617
onCancel,
1718
onFocus,
@@ -24,6 +25,7 @@ export default function usePickerInput({
2425
forwardKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => boolean;
2526
onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>, preventDefault: () => void) => void;
2627
blurToCancel?: boolean;
28+
changeOnBlur?: boolean
2729
onSubmit: () => void | boolean;
2830
onCancel: () => void;
2931
onFocus?: React.FocusEventHandler<HTMLInputElement>;
@@ -158,7 +160,7 @@ export default function usePickerInput({
158160
raf(() => {
159161
preventBlurRef.current = false;
160162
});
161-
} else if (!blurToCancel && (!focused || clickedOutside)) {
163+
} else if (!changeOnBlur && !blurToCancel && (!focused || clickedOutside)) {
162164
triggerOpen(false);
163165
}
164166
}

tests/range.spec.tsx

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1924,24 +1924,48 @@ describe('Picker.Range', () => {
19241924
expect(document.querySelectorAll('.rc-picker-input')[1]).toHaveClass('rc-picker-input-active');
19251925
});
19261926

1927-
it('dateTime mode switch should trigger onCalendarChange', () => {
1928-
const onCalendarChange = jest.fn();
1929-
const { container } = render(
1930-
<MomentRangePicker
1931-
showTime
1932-
onCalendarChange={onCalendarChange}
1933-
/>,
1934-
);
1927+
describe('trigger onCalendarChange', () => {
1928+
const switchInput = (container: HTMLElement) => {
1929+
openPicker(container, 0);
19351930

1936-
openPicker(container, 0);
1931+
selectCell(8, 0);
19371932

1938-
selectCell(8, 0);
1933+
openPicker(container, 1);
19391934

1940-
openPicker(container, 1);
1935+
// onBlur is triggered when the switch is complete
1936+
closePicker(container, 0);
1937+
};
1938+
1939+
it('dateTime mode switch should trigger onCalendarChange', () => {
1940+
const onCalendarChange = jest.fn();
1941+
const { container } = render(
1942+
<MomentRangePicker showTime onCalendarChange={onCalendarChange} />,
1943+
);
1944+
1945+
switchInput(container);
19411946

1942-
// onBlur is triggered when the switch is complete
1943-
closePicker(container, 0);
1947+
expect(onCalendarChange).toHaveBeenCalled();
1948+
});
19441949

1945-
expect(onCalendarChange).toHaveBeenCalled();
1950+
it('should only trigger onCalendarChange when showTime and changeOnBlur exist', () => {
1951+
const onCalendarChange = jest.fn();
1952+
const onChange = jest.fn();
1953+
const { container, baseElement } = render(
1954+
<MomentRangePicker
1955+
showTime
1956+
changeOnBlur
1957+
onChange={onChange}
1958+
onCalendarChange={onCalendarChange}
1959+
/>,
1960+
);
1961+
1962+
switchInput(container);
1963+
1964+
// one of the panel should be open
1965+
expect(baseElement.querySelector('.rc-picker-dropdown')).toBeTruthy();
1966+
1967+
expect(onCalendarChange).toHaveBeenCalled();
1968+
expect(onChange).not.toHaveBeenCalled();
1969+
});
19461970
});
19471971
});

0 commit comments

Comments
 (0)