From c2cf55f10cb9e26e7cce34faca04ed9c86c34cc8 Mon Sep 17 00:00:00 2001 From: Pranav Patil <110466571+21prnv@users.noreply.github.com> Date: Fri, 4 Apr 2025 13:42:18 +0530 Subject: [PATCH] fix: Updated DateRangePicker in limit future booking (#20483) * fix: Updated DateRangePicker in limit future booking * removed unnecessary comments * minor changes in end date selection * final changes in end date selection * minor changes in end date selection * fixed issue of logs * added allowPastDates props for out of office data selection --- .../CreateOrEditOutOfOfficeModal.tsx | 1 + .../date-range-picker/DateRangePicker.tsx | 46 +++++++++++++++---- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx b/packages/features/settings/outOfOffice/CreateOrEditOutOfOfficeModal.tsx index a7e42f3607..54dd97d87b 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 721c8587e9..ed143cc39d 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 = (