Skip to content

Commit 668468a

Browse files
Merge pull request #6179 from Hacker0x01/fix/prevent-close-on-click-outside
feat: allow onClickOutside to prevent calendar from closing
2 parents 0231bbd + 3700259 commit 668468a

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

‎src/index.tsx‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,10 +717,13 @@ export class DatePicker extends Component<DatePickerProps, DatePickerState> {
717717
};
718718

719719
handleCalendarClickOutside = (event: MouseEvent) => {
720-
if (!this.props.inline) {
720+
// Call user's onClickOutside first, allowing them to call preventDefault()
721+
this.props.onClickOutside?.(event);
722+
723+
// Only close if not prevented and not inline
724+
if (!this.props.inline && !event.defaultPrevented) {
721725
this.setOpen(false);
722726
}
723-
this.props.onClickOutside?.(event);
724727
if (this.props.withPortal) {
725728
event.preventDefault();
726729
}

‎src/test/datepicker_test.test.tsx‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2793,6 +2793,28 @@ describe("DatePicker", () => {
27932793
expect(onClickOutsideSpy).toHaveBeenCalledTimes(1);
27942794
});
27952795

2796+
it("should not close date picker when onClickOutside calls preventDefault", () => {
2797+
const onClickOutside = (event: MouseEvent) => {
2798+
event.preventDefault();
2799+
};
2800+
const { container } = render(
2801+
<div>
2802+
<span className="outsideElement">outside</span>
2803+
<DatePicker onClickOutside={onClickOutside} />
2804+
</div>,
2805+
);
2806+
2807+
const input = safeQuerySelector(container, "input");
2808+
fireEvent.focus(input);
2809+
expect(container.querySelector(".react-datepicker")).not.toBeNull();
2810+
2811+
const outsideElement = safeQuerySelector(container, ".outsideElement");
2812+
fireEvent.mouseDown(outsideElement);
2813+
2814+
// Calendar should remain open because preventDefault was called
2815+
expect(container.querySelector(".react-datepicker")).not.toBeNull();
2816+
});
2817+
27962818
it("should not close date picker on input click", () => {
27972819
const onClickOutsideSpy = jest.fn();
27982820
const { container } = render(

0 commit comments

Comments
 (0)