Skip to content

Commit 368dd0e

Browse files
Add max range length
1 parent 4279c39 commit 368dd0e

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

src/components/DatePicker/DateRangePicker.stories.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const getMonthsByNumber = (numberOfMonths: number): Array<DateRange> => {
3333
const meta: Meta<typeof DateRangePicker> = {
3434
component: DateRangePicker,
3535
args: {
36+
maxRangeLength: undefined,
3637
onSelectDateRange: (startDate: Date, endDate: Date) => {
3738
console.log("Date range selected: ", startDate, endDate);
3839
},
@@ -47,6 +48,9 @@ const meta: Meta<typeof DateRangePicker> = {
4748
futureDatesDisabled: {
4849
control: "boolean",
4950
},
51+
maxRangeLength: {
52+
control: "number",
53+
},
5054
placeholder: {
5155
control: "text",
5256
},
@@ -69,13 +73,15 @@ export const Default: Story = {
6973
render: (args: Args) => {
7074
const endDate = args.endDate ? new Date(args.endDate) : undefined;
7175
const startDate = args.startDate ? new Date(args.startDate) : undefined;
76+
const maxRangeLength = args.maxRangeLength;
7277

7378
return (
7479
<DateRangePicker
7580
key="default"
7681
endDate={endDate}
7782
disabled={args.disabled}
7883
futureDatesDisabled={args.futureDatesDisabled}
84+
maxRangeLength={maxRangeLength}
7985
onSelectDateRange={args.onSelectDateRange}
8086
placeholder={args.placeholder}
8187
startDate={startDate}
@@ -84,10 +90,18 @@ export const Default: Story = {
8490
},
8591
};
8692

93+
export const DateRangeWithMaxRange: Story = {
94+
args: {
95+
maxRangeLength: 15,
96+
predefinedDatesList: [],
97+
},
98+
};
99+
87100
export const PredefinedDatesLastSixMonths: Story = {
88101
render: (args: Args) => {
89102
const endDate = args.endDate ? new Date(args.endDate) : undefined;
90103
const startDate = args.startDate ? new Date(args.startDate) : undefined;
104+
const maxRangeLength = args.maxRangeLength;
91105
const predefinedDatesList = getMonthsByNumber(-6);
92106

93107
return (
@@ -96,6 +110,7 @@ export const PredefinedDatesLastSixMonths: Story = {
96110
endDate={endDate}
97111
disabled={args.disabled}
98112
futureDatesDisabled={args.futureDatesDisabled}
113+
maxRangeLength={maxRangeLength}
99114
onSelectDateRange={args.onSelectDateRange}
100115
placeholder={args.placeholder}
101116
predefinedDatesList={predefinedDatesList}
@@ -109,6 +124,7 @@ export const PredefinedDatesNextSixMonths: Story = {
109124
render: (args: Args) => {
110125
const endDate = args.endDate ? new Date(args.endDate) : undefined;
111126
const startDate = args.startDate ? new Date(args.startDate) : undefined;
127+
const maxRangeLength = args.maxRangeLength;
112128
const predefinedDatesList = getMonthsByNumber(6);
113129

114130
return (
@@ -117,6 +133,7 @@ export const PredefinedDatesNextSixMonths: Story = {
117133
endDate={endDate}
118134
disabled={args.disabled}
119135
futureDatesDisabled={args.futureDatesDisabled}
136+
maxRangeLength={maxRangeLength}
120137
onSelectDateRange={args.onSelectDateRange}
121138
placeholder={args.placeholder}
122139
predefinedDatesList={predefinedDatesList}
@@ -130,6 +147,7 @@ export const PredefinedDatesArbitraryDates: Story = {
130147
render: (args: Args) => {
131148
const endDate = args.endDate ? new Date(args.endDate) : undefined;
132149
const startDate = args.startDate ? new Date(args.startDate) : undefined;
150+
const maxRangeLength = args.maxRangeLength;
133151
const predefinedDatesList = [
134152
{ startDate: new Date("04/14/2025"), endDate: new Date("05/14/2025") },
135153
{ startDate: new Date("05/14/2025"), endDate: new Date("06/14/2025") },
@@ -142,6 +160,7 @@ export const PredefinedDatesArbitraryDates: Story = {
142160
endDate={endDate}
143161
disabled={args.disabled}
144162
futureDatesDisabled={args.futureDatesDisabled}
163+
maxRangeLength={maxRangeLength}
145164
onSelectDateRange={args.onSelectDateRange}
146165
placeholder={args.placeholder}
147166
predefinedDatesList={predefinedDatesList}
@@ -155,6 +174,7 @@ export const PredefinedDatesScrollable: Story = {
155174
render: (args: Args) => {
156175
const endDate = args.endDate ? new Date(args.endDate) : undefined;
157176
const startDate = args.startDate ? new Date(args.startDate) : undefined;
177+
const maxRangeLength = args.maxRangeLength;
158178
const predefinedDatesList = [
159179
{ startDate: new Date("09/14/2024"), endDate: new Date("10/14/2024") },
160180
{ startDate: new Date("10/14/2024"), endDate: new Date("11/14/2024") },
@@ -174,6 +194,7 @@ export const PredefinedDatesScrollable: Story = {
174194
endDate={endDate}
175195
disabled={args.disabled}
176196
futureDatesDisabled={args.futureDatesDisabled}
197+
maxRangeLength={maxRangeLength}
177198
onSelectDateRange={args.onSelectDateRange}
178199
placeholder={args.placeholder}
179200
predefinedDatesList={predefinedDatesList}

src/components/DatePicker/DateRangePicker.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,22 @@ const DateRangeTableCell = styled(DateTableCell)<{
6262
`}
6363
`;
6464

65+
const datesAreWithinMaxRange = (
66+
startDate: Date,
67+
endDate: Date,
68+
maxRangeLength: number
69+
): boolean => {
70+
const daysDifference =
71+
Math.abs(startDate.getTime() - endDate.getTime()) / (1000 * 60 * 60 * 24);
72+
73+
return daysDifference >= maxRangeLength;
74+
};
75+
6576
interface CalendarProps {
6677
calendarBody: Body;
6778
closeDatepicker: () => void;
6879
futureDatesDisabled: boolean;
80+
maxRangeLength: number;
6981
setSelectedDate: (selectedDate: Date) => void;
7082
startDate?: Date;
7183
endDate?: Date;
@@ -75,6 +87,7 @@ const Calendar = ({
7587
calendarBody,
7688
closeDatepicker,
7789
futureDatesDisabled,
90+
maxRangeLength,
7891
setSelectedDate,
7992
startDate,
8093
endDate,
@@ -96,11 +109,24 @@ const Calendar = ({
96109
const today = new Date();
97110

98111
const isCurrentDate = isSameDate(today, fullDate);
99-
const isDisabled = futureDatesDisabled ? fullDate > today : false;
100112
const isBetweenStartAndEndDates = Boolean(
101113
startDate && endDate && fullDate > startDate && fullDate < endDate
102114
);
103115

116+
maxRangeLength;
117+
let isDisabled = false;
118+
if (futureDatesDisabled && fullDate > today) {
119+
isDisabled = true;
120+
}
121+
122+
if (
123+
maxRangeLength > 1 &&
124+
startDate &&
125+
datesAreWithinMaxRange(startDate, fullDate, maxRangeLength)
126+
) {
127+
isDisabled = true;
128+
}
129+
104130
const shouldShowRangeIndicator =
105131
!endDate &&
106132
Boolean(
@@ -281,6 +307,7 @@ export interface DateRangePickerProps {
281307
onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;
282308
placeholder?: string;
283309
predefinedDatesList?: Array<DateRange>;
310+
maxRangeLength?: number;
284311
startDate?: Date;
285312
}
286313

@@ -289,6 +316,7 @@ export const DateRangePicker = ({
289316
startDate,
290317
disabled = false,
291318
futureDatesDisabled = false,
319+
maxRangeLength = -1,
292320
onSelectDateRange,
293321
placeholder = "start date – end date",
294322
predefinedDatesList,
@@ -411,6 +439,7 @@ export const DateRangePicker = ({
411439
calendarBody={body}
412440
closeDatepicker={closeDatePicker}
413441
futureDatesDisabled={futureDatesDisabled}
442+
maxRangeLength={maxRangeLength}
414443
setSelectedDate={handleSelectDate}
415444
startDate={selectedStartDate}
416445
endDate={selectedEndDate}
@@ -427,6 +456,7 @@ export const DateRangePicker = ({
427456
calendarBody={body}
428457
closeDatepicker={closeDatePicker}
429458
futureDatesDisabled={futureDatesDisabled}
459+
maxRangeLength={maxRangeLength}
430460
setSelectedDate={handleSelectDate}
431461
startDate={selectedStartDate}
432462
endDate={selectedEndDate}

0 commit comments

Comments
 (0)