Skip to content

Commit 2b7d066

Browse files
Add futureStartDatesDisabled
1 parent 193f6a5 commit 2b7d066

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

src/components/DatePicker/DateRangePicker.stories.tsx

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ const meta: Meta<typeof DateRangePicker> = {
4848
futureDatesDisabled: {
4949
control: "boolean",
5050
},
51+
futureStartDatesDisabled: {
52+
control: "boolean",
53+
},
5154
maxRangeLength: {
5255
control: "number",
5356
},
@@ -73,15 +76,15 @@ export const Default: Story = {
7376
render: (args: Args) => {
7477
const endDate = args.endDate ? new Date(args.endDate) : undefined;
7578
const startDate = args.startDate ? new Date(args.startDate) : undefined;
76-
const maxRangeLength = args.maxRangeLength;
7779

7880
return (
7981
<DateRangePicker
8082
key="default"
8183
endDate={endDate}
8284
disabled={args.disabled}
8385
futureDatesDisabled={args.futureDatesDisabled}
84-
maxRangeLength={maxRangeLength}
86+
futureStartDatesDisabled={args.futureStartDatesDisabled}
87+
maxRangeLength={args.maxRangeLength}
8588
onSelectDateRange={args.onSelectDateRange}
8689
placeholder={args.placeholder}
8790
startDate={startDate}
@@ -97,11 +100,17 @@ export const DateRangeWithMaxRange: Story = {
97100
},
98101
};
99102

103+
export const DateRangeFutureStartDatesDisabled: Story = {
104+
args: {
105+
futureStartDatesDisabled: true,
106+
predefinedDatesList: [],
107+
},
108+
};
109+
100110
export const PredefinedDatesLastSixMonths: Story = {
101111
render: (args: Args) => {
102112
const endDate = args.endDate ? new Date(args.endDate) : undefined;
103113
const startDate = args.startDate ? new Date(args.startDate) : undefined;
104-
const maxRangeLength = args.maxRangeLength;
105114
const predefinedDatesList = getMonthsByNumber(-6);
106115

107116
return (
@@ -110,7 +119,8 @@ export const PredefinedDatesLastSixMonths: Story = {
110119
endDate={endDate}
111120
disabled={args.disabled}
112121
futureDatesDisabled={args.futureDatesDisabled}
113-
maxRangeLength={maxRangeLength}
122+
futureStartDatesDisabled={args.futureStartDatesDisabled}
123+
maxRangeLength={args.maxRangeLength}
114124
onSelectDateRange={args.onSelectDateRange}
115125
placeholder={args.placeholder}
116126
predefinedDatesList={predefinedDatesList}
@@ -124,7 +134,6 @@ export const PredefinedDatesNextSixMonths: Story = {
124134
render: (args: Args) => {
125135
const endDate = args.endDate ? new Date(args.endDate) : undefined;
126136
const startDate = args.startDate ? new Date(args.startDate) : undefined;
127-
const maxRangeLength = args.maxRangeLength;
128137
const predefinedDatesList = getMonthsByNumber(6);
129138

130139
return (
@@ -133,7 +142,8 @@ export const PredefinedDatesNextSixMonths: Story = {
133142
endDate={endDate}
134143
disabled={args.disabled}
135144
futureDatesDisabled={args.futureDatesDisabled}
136-
maxRangeLength={maxRangeLength}
145+
futureStartDatesDisabled={args.futureStartDatesDisabled}
146+
maxRangeLength={args.maxRangeLength}
137147
onSelectDateRange={args.onSelectDateRange}
138148
placeholder={args.placeholder}
139149
predefinedDatesList={predefinedDatesList}
@@ -147,7 +157,6 @@ export const PredefinedDatesArbitraryDates: Story = {
147157
render: (args: Args) => {
148158
const endDate = args.endDate ? new Date(args.endDate) : undefined;
149159
const startDate = args.startDate ? new Date(args.startDate) : undefined;
150-
const maxRangeLength = args.maxRangeLength;
151160
const predefinedDatesList = [
152161
{ startDate: new Date("04/14/2025"), endDate: new Date("05/14/2025") },
153162
{ startDate: new Date("05/14/2025"), endDate: new Date("06/14/2025") },
@@ -160,7 +169,8 @@ export const PredefinedDatesArbitraryDates: Story = {
160169
endDate={endDate}
161170
disabled={args.disabled}
162171
futureDatesDisabled={args.futureDatesDisabled}
163-
maxRangeLength={maxRangeLength}
172+
futureStartDatesDisabled={args.futureStartDatesDisabled}
173+
maxRangeLength={args.maxRangeLength}
164174
onSelectDateRange={args.onSelectDateRange}
165175
placeholder={args.placeholder}
166176
predefinedDatesList={predefinedDatesList}
@@ -174,7 +184,6 @@ export const PredefinedDatesScrollable: Story = {
174184
render: (args: Args) => {
175185
const endDate = args.endDate ? new Date(args.endDate) : undefined;
176186
const startDate = args.startDate ? new Date(args.startDate) : undefined;
177-
const maxRangeLength = args.maxRangeLength;
178187
const predefinedDatesList = [
179188
{ startDate: new Date("09/14/2024"), endDate: new Date("10/14/2024") },
180189
{ startDate: new Date("10/14/2024"), endDate: new Date("11/14/2024") },
@@ -194,7 +203,8 @@ export const PredefinedDatesScrollable: Story = {
194203
endDate={endDate}
195204
disabled={args.disabled}
196205
futureDatesDisabled={args.futureDatesDisabled}
197-
maxRangeLength={maxRangeLength}
206+
futureStartDatesDisabled={args.futureStartDatesDisabled}
207+
maxRangeLength={args.maxRangeLength}
198208
onSelectDateRange={args.onSelectDateRange}
199209
placeholder={args.placeholder}
200210
predefinedDatesList={predefinedDatesList}

src/components/DatePicker/DateRangePicker.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ interface CalendarProps {
7777
calendarBody: Body;
7878
closeDatepicker: () => void;
7979
futureDatesDisabled: boolean;
80+
futureStartDatesDisabled: boolean;
8081
maxRangeLength: number;
8182
setSelectedDate: (selectedDate: Date) => void;
8283
startDate?: Date;
@@ -87,6 +88,7 @@ const Calendar = ({
8788
calendarBody,
8889
closeDatepicker,
8990
futureDatesDisabled,
91+
futureStartDatesDisabled,
9092
maxRangeLength,
9193
setSelectedDate,
9294
startDate,
@@ -119,6 +121,10 @@ const Calendar = ({
119121
isDisabled = true;
120122
}
121123

124+
if (futureStartDatesDisabled && !startDate && fullDate > today) {
125+
isDisabled = true;
126+
}
127+
122128
if (
123129
maxRangeLength > 1 &&
124130
startDate &&
@@ -304,6 +310,7 @@ export interface DateRangePickerProps {
304310
endDate?: Date;
305311
disabled?: boolean;
306312
futureDatesDisabled?: boolean;
313+
futureStartDatesDisabled?: boolean;
307314
onSelectDateRange: (selectedStartDate: Date, selectedEndDate: Date) => void;
308315
placeholder?: string;
309316
predefinedDatesList?: Array<DateRange>;
@@ -316,6 +323,7 @@ export const DateRangePicker = ({
316323
startDate,
317324
disabled = false,
318325
futureDatesDisabled = false,
326+
futureStartDatesDisabled = false,
319327
maxRangeLength = -1,
320328
onSelectDateRange,
321329
placeholder = "start date – end date",
@@ -363,6 +371,11 @@ export const DateRangePicker = ({
363371
// Start date and end date are selected, user clicks any date.
364372
// Set start date to the selected date, clear the end date.
365373
if (selectedStartDate && selectedEndDate) {
374+
// If futureStartDatesDisabled is true, only set the selected date to the date clicked if it's before today
375+
if (futureStartDatesDisabled && selectedDate > new Date()) {
376+
setSelectedEndDate(undefined);
377+
return;
378+
}
366379
setSelectedStartDate(selectedDate);
367380
setSelectedEndDate(undefined);
368381
return;
@@ -392,7 +405,7 @@ export const DateRangePicker = ({
392405

393406
setSelectedStartDate(selectedDate);
394407
},
395-
[onSelectDateRange, selectedEndDate, selectedStartDate]
408+
[futureStartDatesDisabled, onSelectDateRange, selectedEndDate, selectedStartDate]
396409
);
397410

398411
const shouldShowPredefinedDates =
@@ -439,6 +452,7 @@ export const DateRangePicker = ({
439452
calendarBody={body}
440453
closeDatepicker={closeDatePicker}
441454
futureDatesDisabled={futureDatesDisabled}
455+
futureStartDatesDisabled={futureStartDatesDisabled}
442456
maxRangeLength={maxRangeLength}
443457
setSelectedDate={handleSelectDate}
444458
startDate={selectedStartDate}
@@ -456,6 +470,7 @@ export const DateRangePicker = ({
456470
calendarBody={body}
457471
closeDatepicker={closeDatePicker}
458472
futureDatesDisabled={futureDatesDisabled}
473+
futureStartDatesDisabled={futureStartDatesDisabled}
459474
maxRangeLength={maxRangeLength}
460475
setSelectedDate={handleSelectDate}
461476
startDate={selectedStartDate}

0 commit comments

Comments
 (0)