Skip to content

Commit 6ad1463

Browse files
Merge pull request #5291 from qburst/issue-5280/fix/week-number-accessibility
♿️ Fix #5280: Disable the WeekNumber if all the corresponding week days are disabled
2 parents ce2ad65 + 9df321f commit 6ad1463

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

docs/week_number.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@
1616
| `showWeekNumber` | | | |
1717
| `showWeekPicker` | | | |
1818
| `weekNumber` (required) | | | |
19+
| `isWeekDisabled` | | | |

src/test/week_number_test.test.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,44 @@ describe("WeekNumber", () => {
285285
).toBe(true);
286286
});
287287

288+
it("shouldn't have the class 'react-datepicker__week-number--clickable' if isWeekDisabled is true", () => {
289+
const { container } = render(
290+
<WeekNumber
291+
weekNumber={1}
292+
date={new Date()}
293+
onClick={() => {}}
294+
isWeekDisabled
295+
/>,
296+
);
297+
const weekNumber = container.querySelector(
298+
".react-datepicker__week-number",
299+
);
300+
expect(
301+
weekNumber?.classList.contains(
302+
"react-datepicker__week-number--clickable",
303+
),
304+
).toBe(false);
305+
});
306+
307+
it("should have the class 'react-datepicker__week-number--clickable' if isWeekDisabled is false and onClick is defined", () => {
308+
const { container } = render(
309+
<WeekNumber
310+
weekNumber={1}
311+
date={new Date()}
312+
onClick={() => {}}
313+
isWeekDisabled={false}
314+
/>,
315+
);
316+
const weekNumber = container.querySelector(
317+
".react-datepicker__week-number",
318+
);
319+
expect(
320+
weekNumber?.classList.contains(
321+
"react-datepicker__week-number--clickable",
322+
),
323+
).toBe(true);
324+
});
325+
288326
it("should have the class 'react-datepicker__week-number--selected' if selected is current week and preselected is also current week and has the onClick Props", () => {
289327
const currentWeekNumber = newDate("2023-10-22T13:09:53+02:00");
290328
const { container } = render(

src/week.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,20 @@ export default class Week extends Component<WeekProps> {
113113
return getWeek(date);
114114
};
115115

116+
isWeekDisabled = (): boolean => {
117+
const startOfWeek = this.startOfWeek();
118+
const endOfWeek = addDays(startOfWeek, 6);
119+
120+
let processingDate = new Date(startOfWeek);
121+
while (processingDate <= endOfWeek) {
122+
if (!this.isDisabled(processingDate)) return false;
123+
124+
processingDate = addDays(processingDate, 1);
125+
}
126+
127+
return true;
128+
};
129+
116130
renderDays = () => {
117131
const startOfWeek = this.startOfWeek();
118132
const days = [];
@@ -128,6 +142,7 @@ export default class Week extends Component<WeekProps> {
128142
{...Week.defaultProps}
129143
{...this.props}
130144
weekNumber={weekNumber}
145+
isWeekDisabled={this.isWeekDisabled()}
131146
date={startOfWeek}
132147
onClick={onClickAction}
133148
/>,

src/week_number.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface WeekNumberProps {
1818
handleOnKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
1919
containerRef?: React.RefObject<HTMLDivElement>;
2020
isInputFocused?: boolean;
21+
isWeekDisabled?: boolean;
2122
}
2223

2324
export default class WeekNumber extends Component<WeekNumberProps> {
@@ -111,13 +112,14 @@ export default class WeekNumber extends Component<WeekNumberProps> {
111112
render(): React.ReactElement {
112113
const {
113114
weekNumber,
115+
isWeekDisabled,
114116
ariaLabelPrefix = WeekNumber.defaultProps.ariaLabelPrefix,
115117
onClick,
116118
} = this.props;
117119

118120
const weekNumberClasses = {
119121
"react-datepicker__week-number": true,
120-
"react-datepicker__week-number--clickable": !!onClick,
122+
"react-datepicker__week-number--clickable": !!onClick && !isWeekDisabled,
121123
"react-datepicker__week-number--selected":
122124
!!onClick && isSameDay(this.props.date, this.props.selected),
123125
};

0 commit comments

Comments
 (0)