Skip to content

Commit 52e1ee2

Browse files
Merge pull request #5972 from qburst/fix/quarter-picker-selector
QuarterYearPicker: align selected styling with other pickers and fix multi-select highlighting
2 parents 3da627e + 677ee67 commit 52e1ee2

File tree

2 files changed

+124
-4
lines changed

2 files changed

+124
-4
lines changed

src/month.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,12 @@ export default class Month extends Component<MonthProps> {
413413
);
414414

415415
isSelectedQuarter = (day: Date, q: number, selected: Date): boolean =>
416-
getQuarter(day) === q && getYear(day) === getYear(selected);
416+
getQuarter(selected) === q && getYear(day) === getYear(selected);
417+
418+
isSelectQuarterInList = (day: Date, q: number, selectedDates: Date[]) =>
419+
selectedDates.some((selectedDate) =>
420+
this.isSelectedQuarter(day, q, selectedDate),
421+
);
417422

418423
isMonthSelected = () => {
419424
const { day, selected, selectedDates, selectsMultiple } = this.props;
@@ -428,6 +433,19 @@ export default class Month extends Component<MonthProps> {
428433
return !!selected && this.isSelectedMonth(day, monthIdx, selected);
429434
};
430435

436+
isQuarterSelected = () => {
437+
const { day, selected, selectedDates, selectsMultiple } = this.props;
438+
const quarterIdx = getQuarter(day);
439+
440+
if (selectsMultiple) {
441+
return selectedDates?.some((selectedDate) =>
442+
this.isSelectedQuarter(day, quarterIdx, selectedDate),
443+
);
444+
}
445+
446+
return !!selected && this.isSelectedQuarter(day, quarterIdx, selected);
447+
};
448+
431449
renderWeeks = () => {
432450
const weeks = [];
433451
const isFixedHeight = this.props.fixedHeight;
@@ -921,7 +939,6 @@ export default class Month extends Component<MonthProps> {
921939
day,
922940
startDate,
923941
endDate,
924-
selected,
925942
minDate,
926943
maxDate,
927944
excludeDates,
@@ -941,18 +958,21 @@ export default class Month extends Component<MonthProps> {
941958
disabled) &&
942959
isQuarterDisabled(setQuarter(day, q), this.props);
943960

961+
const selection = this.getSelection();
962+
944963
return clsx(
945964
"react-datepicker__quarter-text",
946965
`react-datepicker__quarter-${q}`,
947966
{
948967
"react-datepicker__quarter-text--disabled": isDisabled,
949-
"react-datepicker__quarter-text--selected": selected
950-
? this.isSelectedQuarter(day, q, selected)
968+
"react-datepicker__quarter-text--selected": selection
969+
? this.isSelectQuarterInList(day, q, selection)
951970
: undefined,
952971
"react-datepicker__quarter-text--keyboard-selected":
953972
!disabledKeyboardNavigation &&
954973
preSelection &&
955974
this.isSelectedQuarter(day, q, preSelection) &&
975+
!this.isQuarterSelected() &&
956976
!isDisabled,
957977
"react-datepicker__quarter-text--in-selecting-range":
958978
this.isInSelectingRangeQuarter(q),

src/test/month_test.test.tsx

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,56 @@ describe("Month", () => {
12021202
});
12031203

12041204
it("should have no axe violations", () => runAxe(monthComponent));
1205+
1206+
it("should apply the selected class when the quarter is a part of selected date", () => {
1207+
const selectedDate = newDate("2025-11-01");
1208+
const keyboardSelectedDate = selectedDate;
1209+
1210+
const { container } = render(
1211+
<Month
1212+
day={selectedDate}
1213+
selected={selectedDate}
1214+
preSelection={keyboardSelectedDate}
1215+
showQuarterYearPicker
1216+
/>,
1217+
);
1218+
1219+
const selected = container.querySelector(
1220+
".react-datepicker__quarter-text--selected",
1221+
);
1222+
expect(selected).not.toBeNull();
1223+
expect(selected?.textContent).toBe("Q4");
1224+
});
1225+
1226+
it("should apply the selected class when the quarter is a part of selected dates", () => {
1227+
const selectedDates = [newDate("2025-11-01"), newDate("2025-01-01")];
1228+
const keyboardSelectedDate = selectedDates[0];
1229+
const day = selectedDates[0] as Date;
1230+
1231+
const { container } = render(
1232+
<Month
1233+
day={day}
1234+
selectedDates={selectedDates}
1235+
preSelection={keyboardSelectedDate}
1236+
selectsMultiple
1237+
showQuarterYearPicker
1238+
/>,
1239+
);
1240+
1241+
const selectedElements = Array.from(
1242+
container.querySelectorAll(".react-datepicker__quarter-text--selected"),
1243+
);
1244+
expect(selectedElements.length).toBe(selectedDates.length);
1245+
1246+
const expectedQuarterLabels = selectedDates.map(
1247+
(date) => `Q${getQuarter(date)}`,
1248+
);
1249+
expect(
1250+
expectedQuarterLabels.every((label) =>
1251+
selectedElements.some((element) => element?.textContent === label),
1252+
),
1253+
).toBe(true);
1254+
});
12051255
});
12061256

12071257
describe("if quarter is not selected", () => {
@@ -2629,6 +2679,56 @@ describe("Month", () => {
26292679
),
26302680
).toBeNull();
26312681
});
2682+
2683+
it("should not apply the keyboard-selected class when the quarter is a part of selected date", () => {
2684+
const selectedDate = newDate("2025-11-01");
2685+
const keyboardSelectedDate = selectedDate;
2686+
2687+
const { container } = render(
2688+
<Month
2689+
day={selectedDate}
2690+
selected={selectedDate}
2691+
preSelection={keyboardSelectedDate}
2692+
showQuarterYearPicker
2693+
/>,
2694+
);
2695+
2696+
const selected = container.querySelector(
2697+
".react-datepicker__quarter-text--selected",
2698+
);
2699+
const keyboardSelected = container.querySelector(
2700+
".react-datepicker__quarter-text--keyboard-selected",
2701+
);
2702+
2703+
expect(selected).not.toBeNull();
2704+
expect(keyboardSelected).toBeNull();
2705+
});
2706+
2707+
it("should not apply the keyboard-selected class when the quarter is a part of selected dates", () => {
2708+
const selectedDates = [newDate("2025-11-01")];
2709+
const keyboardSelectedDate = selectedDates[0];
2710+
const day = selectedDates[0] as Date;
2711+
2712+
const { container } = render(
2713+
<Month
2714+
day={day}
2715+
selectedDates={selectedDates}
2716+
preSelection={keyboardSelectedDate}
2717+
selectsMultiple
2718+
showQuarterYearPicker
2719+
/>,
2720+
);
2721+
2722+
const selected = container.querySelector(
2723+
".react-datepicker__quarter-text--selected",
2724+
);
2725+
const keyboardSelected = container.querySelector(
2726+
".react-datepicker__quarter-text--keyboard-selected",
2727+
);
2728+
2729+
expect(selected).not.toBeNull();
2730+
expect(keyboardSelected).toBeNull();
2731+
});
26322732
});
26332733

26342734
describe("Auto-Focus", () => {

0 commit comments

Comments
 (0)