diff --git a/.changeset/wet-beds-sparkle.md b/.changeset/wet-beds-sparkle.md new file mode 100644 index 00000000000..6a23b681610 --- /dev/null +++ b/.changeset/wet-beds-sparkle.md @@ -0,0 +1,5 @@ +--- +'@razorpay/blade': patch +--- + +fix(blade): focus on selected date by default in datepicker diff --git a/packages/blade/src/components/DatePicker/Calendar.web.tsx b/packages/blade/src/components/DatePicker/Calendar.web.tsx index bab9202113d..f9570174b42 100644 --- a/packages/blade/src/components/DatePicker/Calendar.web.tsx +++ b/packages/blade/src/components/DatePicker/Calendar.web.tsx @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/explicit-function-return-type */ import dayjs from 'dayjs'; import React from 'react'; -import type { CalendarLevel } from '@mantine/dates'; +import type { CalendarLevel, DatesRangeValue } from '@mantine/dates'; import { useDatesContext, DatePicker } from '@mantine/dates'; import type { CalendarProps, DateSelectionType, PickerType, DateValue } from './types'; import { CalendarHeader } from './CalendarHeader'; @@ -29,12 +29,14 @@ const Calendar = ({ onPrevious, presets, showLevelChangeLink, + oldValue, ...props }: CalendarProps & { date?: Date; defaultDate?: Date; onDateChange?: (date: DateValue) => void; showLevelChangeLink?: boolean; + oldValue: DatesRangeValue | null; }): React.ReactElement => { const isRange = selectionType === 'range'; @@ -64,7 +66,19 @@ const Calendar = ({ const dateContext = useDatesContext(); const isMobile = useIsMobile(); - const currentDate = _date ?? shiftTimezone('add', new Date()); + const currentDate = React.useMemo(() => { + if (_date) { + return _date; + } + const isRangeSelection = Array.isArray(oldValue); + if (isRangeSelection && oldValue[0]) { + return oldValue[0]; + } + if (!isRangeSelection && oldValue) { + return oldValue; + } + return shiftTimezone('add', new Date()); + }, [_date, oldValue]); const numberOfColumns = isMobile || !isRange ? 1 : 2; const columnsToScroll = numberOfColumns; @@ -133,7 +147,7 @@ const Calendar = ({ ({ setPicker(() => picker); forceRerender(); }} + oldValue={oldValue} /> {isMobile ? null : ( { await expect(queryByText('रवि')).toBeVisible(); }; +export const DatePickerSingleAutoFocus: StoryFn< + typeof DatePickerComponent +> = (): React.ReactElement => { + return ; +}; + +DatePickerSingleAutoFocus.play = async () => { + const { getByRole, queryByText, getByLabelText } = within(document.body); + const nextYear = dayjs().add(1, 'year').year(); + const selectedDate = `22 January ${nextYear}`; + const input = getByRole('combobox', { name: /Select Date/i }); + await userEvent.click(input); + await sleep(400); + await expect(queryByText('Sun')).toBeVisible(); + await userEvent.tab(); + await userEvent.tab(); + const month = getByRole('button', { name: /Change month/i }); + await expect(month).toHaveFocus(); + await userEvent.click(month); + const year = getByRole('button', { name: /Change decade/i }); + await userEvent.click(year); + getByRole('button', { name: /previous/i }).focus(); + await userEvent.tab(); + await userEvent.tab(); + await sleep(400); + await expect(getByRole('button', { name: dayjs().format('YYYY') })).toHaveFocus(); + await userEvent.keyboard('{ArrowRight}'); + await userEvent.keyboard('{Enter}'); + await sleep(400); + await userEvent.keyboard('{Enter}'); + await sleep(400); + const january = getByRole('button', { name: /Jan/i }); + await userEvent.click(january); + const date = getByRole('button', { name: selectedDate }); + await userEvent.click(date); + const applyButton = getByRole('button', { name: /Apply/i }); + await userEvent.click(applyButton); + await sleep(400); + await userEvent.click(input); + await sleep(400); + await expect(getByLabelText(selectedDate)).not.toBeNull(); +}; + +export const DatePickerRangeSelectAutoFocus: StoryFn< + typeof DatePickerComponent +> = (): React.ReactElement => { + return ( + + ); +}; + +DatePickerRangeSelectAutoFocus.play = async () => { + const { getByRole, getByLabelText } = within(document.body); + const startInput = getByRole('combobox', { name: /Start Date/i }); + const selectedEndDate = dayjs().subtract(1, 'M').format('DD MMMM YYYY'); + const selectedStartDate = dayjs().subtract(1, 'M').subtract(1, 'd').format('DD MMMM YYYY'); + await userEvent.click(startInput); + await sleep(400); + const previousButton = getByRole('button', { name: /previous/i }); + await userEvent.click(previousButton); + const startDateButton = getByRole('button', { name: selectedStartDate }); + await userEvent.click(startDateButton); + const endDateButton = getByRole('button', { name: selectedEndDate }); + await userEvent.click(endDateButton); + const applyButton = getByRole('button', { name: /Apply/i }); + await userEvent.click(applyButton); + await sleep(400); + await userEvent.click(startInput); + await sleep(400); + await expect(getByLabelText(selectedStartDate)).not.toBeNull(); + await expect(getByLabelText(selectedEndDate)).not.toBeNull(); +}; + export default { title: 'Components/Interaction Tests/DatePicker', component: DatePickerComponent,