diff --git a/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx b/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx index a7e42f36078f9c..54dd97d87b5160 100644 --- a/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx +++ b/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx @@ -301,6 +301,7 @@ export const CreateOrEditOutOfOfficeEntryModal = ({ onChange(values); }} strictlyBottom={true} + allowPastDates={true} /> )} /> diff --git a/packages/ui/components/form/date-range-picker/DateRangePicker.tsx b/packages/ui/components/form/date-range-picker/DateRangePicker.tsx index 721c8587e9b55e..ed143cc39d65d9 100644 --- a/packages/ui/components/form/date-range-picker/DateRangePicker.tsx +++ b/packages/ui/components/form/date-range-picker/DateRangePicker.tsx @@ -18,6 +18,7 @@ type DatePickerWithRangeProps = { withoutPopover?: boolean; "data-testid"?: string; strictlyBottom?: boolean; + allowPastDates?: boolean; }; export function DatePickerWithRange({ @@ -30,23 +31,52 @@ export function DatePickerWithRange({ withoutPopover, "data-testid": testId, strictlyBottom, + allowPastDates = false, }: React.HTMLAttributes & DatePickerWithRangeProps) { function handleDayClick(date: Date) { - if (dates?.endDate) { - onDatesChange({ startDate: date, endDate: undefined }); + if (allowPastDates) { + // for Out of Office (past dates allowed) + if (dates?.endDate) { + onDatesChange({ startDate: date, endDate: undefined }); + } else { + const startDate = dates.startDate ? (date < dates.startDate ? date : dates.startDate) : date; + const endDate = dates.startDate ? (date < dates.startDate ? dates.startDate : date) : undefined; + onDatesChange({ startDate, endDate }); + } } else { - const startDate = dates.startDate ? (date < dates.startDate ? date : dates.startDate) : date; - const endDate = dates.startDate ? (date < dates.startDate ? dates.startDate : date) : undefined; - onDatesChange({ startDate, endDate }); + // for Limit Future Booking (no past dates) + if (!dates.startDate || !dates.endDate) { + onDatesChange({ startDate: date, endDate: date }); + } else { + const startTime = dates.startDate.getTime(); + const endTime = dates.endDate.getTime(); + const clickedTime = date.getTime(); + + if (clickedTime === startTime || clickedTime === endTime) { + onDatesChange({ startDate: date, endDate: date }); + } else if (clickedTime < startTime) { + onDatesChange({ startDate: date, endDate: dates.endDate }); + } else if (clickedTime > endTime) { + onDatesChange({ startDate: dates.startDate, endDate: date }); + } else { + const startDiff = clickedTime - startTime; + const endDiff = endTime - clickedTime; + if (startDiff < endDiff) { + onDatesChange({ startDate: date, endDate: dates.endDate }); + } else { + onDatesChange({ startDate: dates.startDate, endDate: date }); + } + } + } } } - const fromDate = minDate ?? new Date(); + + const fromDate = allowPastDates && minDate === null ? undefined : minDate ?? new Date(); const calendar = (