Skip to content

Commit 114f06a

Browse files
Merge pull request #4903 from qburst/issue-4902/fix/disabled-showWeekNumbers
Fix #4902: 🐛 Fix the click of week numbers when the first day of the week is not enabled
2 parents 3e99cea + f09d92d commit 114f06a

File tree

2 files changed

+93
-3
lines changed

2 files changed

+93
-3
lines changed

src/test/week_picker_test.test.tsx

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,63 @@ describe("WeekPicker", () => {
3333
fireEvent.click(weekNumber ?? new HTMLElement());
3434
expect(onChangeSpy).toHaveBeenCalled();
3535
});
36+
37+
it("should change the week with few disabled dates (not all) when clicked on any week number in the picker", () => {
38+
const onChangeSpy = jest.fn();
39+
const { container } = render(
40+
<DatePicker
41+
selected={new Date("2024-01-01")}
42+
onChange={onChangeSpy}
43+
showWeekPicker
44+
showWeekNumbers
45+
excludeDateIntervals={[
46+
{ start: new Date("2024/01/07"), end: new Date("2024/01/11") },
47+
]}
48+
/>,
49+
);
50+
51+
const input = container.querySelector("input")!;
52+
expect(input).not.toBeNull();
53+
54+
fireEvent.focus(input);
55+
const weekNumber = container.querySelector(
56+
'.react-datepicker__week-number[aria-label="week 1"]',
57+
)!;
58+
expect(weekNumber).not.toBeNull();
59+
fireEvent.click(weekNumber);
60+
61+
expect(onChangeSpy).toHaveBeenCalledTimes(1);
62+
63+
const selectedDate = onChangeSpy.mock.calls[0][0];
64+
expect(selectedDate.getFullYear()).toBe(2024);
65+
expect(selectedDate.getMonth()).toBe(0);
66+
expect(selectedDate.getDate()).toBe(12);
67+
});
68+
69+
it("should not change the week with all the dates in a selected week is disabled", () => {
70+
const onChangeSpy = jest.fn();
71+
const { container } = render(
72+
<DatePicker
73+
selected={new Date("2024-01-01")}
74+
onChange={onChangeSpy}
75+
showWeekPicker
76+
showWeekNumbers
77+
excludeDateIntervals={[
78+
{ start: new Date("2024/01/07"), end: new Date("2024/01/13") },
79+
]}
80+
/>,
81+
);
82+
83+
const input = container.querySelector("input")!;
84+
expect(input).not.toBeNull();
85+
86+
fireEvent.focus(input);
87+
const weekNumber = container.querySelector(
88+
'.react-datepicker__week-number[aria-label="week 1"]',
89+
)!;
90+
expect(weekNumber).not.toBeNull();
91+
fireEvent.click(weekNumber);
92+
93+
expect(onChangeSpy).not.toHaveBeenCalled();
94+
});
3695
});

src/week.tsx

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { clsx } from "clsx";
22
import React, { Component } from "react";
33

4-
import { addDays, getWeek, getStartOfWeek, isSameDay } from "./date_utils";
4+
import {
5+
addDays,
6+
getWeek,
7+
getStartOfWeek,
8+
isSameDay,
9+
isDayDisabled,
10+
} from "./date_utils";
511
import Day from "./day";
612
import WeekNumber from "./week_number";
713

@@ -41,6 +47,17 @@ export default class Week extends Component<WeekProps> {
4147
};
4248
}
4349

50+
isDisabled = (day: Date): boolean =>
51+
isDayDisabled(day, {
52+
minDate: this.props.minDate,
53+
maxDate: this.props.maxDate,
54+
excludeDates: this.props.excludeDates,
55+
excludeDateIntervals: this.props.excludeDateIntervals,
56+
includeDateIntervals: this.props.includeDateIntervals,
57+
includeDates: this.props.includeDates,
58+
filterDate: this.props.filterDate,
59+
});
60+
4461
handleDayClick = (
4562
day: Date,
4663
event: React.MouseEvent<HTMLDivElement>,
@@ -61,11 +78,25 @@ export default class Week extends Component<WeekProps> {
6178
weekNumber: number,
6279
event: React.MouseEvent<HTMLDivElement>,
6380
) => {
81+
let enabledWeekDay = new Date(day);
82+
83+
for (let i = 0; i < 7; i++) {
84+
const processingDay = new Date(day);
85+
processingDay.setDate(processingDay.getDate() + i);
86+
87+
const isEnabled = !this.isDisabled(processingDay);
88+
89+
if (isEnabled) {
90+
enabledWeekDay = processingDay;
91+
break;
92+
}
93+
}
94+
6495
if (typeof this.props.onWeekSelect === "function") {
65-
this.props.onWeekSelect(day, weekNumber, event);
96+
this.props.onWeekSelect(enabledWeekDay, weekNumber, event);
6697
}
6798
if (this.props.showWeekPicker) {
68-
this.handleDayClick(day, event);
99+
this.handleDayClick(enabledWeekDay, event);
69100
}
70101
if (
71102
this.props.shouldCloseOnSelect ??

0 commit comments

Comments
 (0)