Skip to content

Commit 22510f2

Browse files
committed
Implement swapRange functionality for date range selection in DatePicker
1 parent cf2eaa1 commit 22510f2

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

src/day.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ interface DayProps
6767
locale?: Locale;
6868
monthShowsDuplicateDaysEnd?: boolean;
6969
monthShowsDuplicateDaysStart?: boolean;
70+
swapRange?: boolean;
7071
}
7172

7273
/**
@@ -288,6 +289,7 @@ export default class Day extends Component<DayProps> {
288289
selectsRange,
289290
selectsDisabledDaysInRange,
290291
startDate,
292+
swapRange,
291293
endDate,
292294
} = this.props;
293295

@@ -317,13 +319,18 @@ export default class Day extends Component<DayProps> {
317319
return isDayInRange(day, startDate, selectingDate);
318320
}
319321

320-
if (
321-
selectsRange &&
322-
startDate &&
323-
!endDate &&
324-
(isAfter(selectingDate, startDate) || isEqual(selectingDate, startDate))
325-
) {
326-
return isDayInRange(day, startDate, selectingDate);
322+
if (selectsRange && startDate && !endDate) {
323+
if (isEqual(selectingDate, startDate)) {
324+
return isDayInRange(day, startDate, selectingDate);
325+
}
326+
327+
if (isAfter(selectingDate, startDate)) {
328+
return isDayInRange(day, startDate, selectingDate);
329+
}
330+
331+
if (swapRange && isBefore(selectingDate, startDate)) {
332+
return isDayInRange(day, selectingDate, startDate);
333+
}
327334
}
328335

329336
return false;

src/month.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,6 +1101,8 @@ export default class Month extends Component<MonthProps> {
11011101
? ariaLabelPrefix.trim() + " "
11021102
: "";
11031103

1104+
console.log('Month render:', this.props.selectingDate);
1105+
11041106
return (
11051107
<div
11061108
className={this.getClassNames()}

src/test/day_test.test.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,61 @@ describe("Day", () => {
896896
).toBe(true);
897897
});
898898
});
899+
900+
describe("for a date picker with selectsRange and swapRange prop", () => {
901+
it("should select range from startDate to selectingDate if selectingDate mote then startDate", () => {
902+
const startDate = newDate();
903+
const dayInRange = addDays(startDate, 1);
904+
const selectingDate = addDays(startDate, 2);
905+
906+
const containerStartDay = renderDay(dayInRange, {
907+
startDate,
908+
selectingDate,
909+
selectsRange: true,
910+
swapRange: true,
911+
});
912+
expect(
913+
containerStartDay
914+
.querySelector(".react-datepicker__day")
915+
?.classList.contains(rangeDayClassName),
916+
).toBe(true);
917+
})
918+
919+
it("should select range from selectingDate to startDate if selectingDate less then startDate", () => {
920+
const startDate = newDate();
921+
const dayInRange = subDays(startDate, 1);
922+
const selectingDate = subDays(startDate, 2);
923+
924+
const containerStartDay = renderDay(dayInRange, {
925+
startDate,
926+
selectingDate,
927+
selectsRange: true,
928+
swapRange: true,
929+
});
930+
expect(
931+
containerStartDay
932+
.querySelector(".react-datepicker__day")
933+
?.classList.contains(rangeDayClassName),
934+
).toBe(true);
935+
});
936+
937+
it("should select as range if selectingDate is equal to startDate", () => {
938+
const startDate = newDate();
939+
const selectingDate = startDate
940+
941+
const containerStartDay = renderDay(startDate, {
942+
startDate,
943+
selectingDate,
944+
selectsRange: true,
945+
swapRange: true,
946+
});
947+
expect(
948+
containerStartDay
949+
.querySelector(".react-datepicker__day")
950+
?.classList.contains(rangeDayClassName),
951+
).toBe(true);
952+
});
953+
})
899954
});
900955

901956
describe("today", () => {

0 commit comments

Comments
 (0)