diff --git a/packages/react-core/src/components/DatePicker/DatePicker.tsx b/packages/react-core/src/components/DatePicker/DatePicker.tsx index c22ed077c4b..56ce61565ec 100644 --- a/packages/react-core/src/components/DatePicker/DatePicker.tsx +++ b/packages/react-core/src/components/DatePicker/DatePicker.tsx @@ -139,6 +139,13 @@ const DatePickerBase = ( const dateIsRequired = requiredDateOptions?.isRequired || false; const emptyDateText = requiredDateOptions?.emptyDateText || 'Date cannot be blank'; + useEffect(() => { + if (isDisabled) { + setPopoverOpen(false); + setSelectOpen(false); + } + }, [isDisabled]); + useEffect(() => { setValue(valueProp); setValueDate(dateParse(valueProp)); @@ -200,6 +207,9 @@ const DatePickerBase = ( }; const onDateClick = (_event: React.MouseEvent, newValueDate: Date) => { + if (isDisabled) { + return; + } const newValue = dateFormat(newValueDate); setValue(newValue); setValueDate(newValueDate); @@ -275,7 +285,6 @@ const DatePickerBase = ( /> } showClose={false} - isVisible={popoverOpen} shouldClose={(event, hideFunction) => { event = event as KeyboardEvent; if (event.key === KeyTypes.Escape && selectOpen) { @@ -308,6 +317,7 @@ const DatePickerBase = ( appendTo={appendTo} triggerRef={triggerRef} {...popoverProps} + isVisible={!isDisabled && (popoverProps?.isVisible ?? popoverOpen)} >
diff --git a/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx b/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx index 4225fee64e4..b3d79b03695 100644 --- a/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx +++ b/packages/react-core/src/components/DatePicker/__tests__/DatePicker.test.tsx @@ -1,4 +1,4 @@ -import { screen, render } from '@testing-library/react'; +import { fireEvent, screen, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { HelperText, HelperTextItem } from '../../HelperText'; @@ -218,3 +218,27 @@ test('Renders text input as invalid when requiredDateOptions.isRequired is true expect(screen.getByRole('textbox')).toHaveAttribute('aria-invalid', 'true'); }); + +test('does not select a day when the open date picker becomes disabled', async () => { + const user = userEvent.setup(); + const onChange = jest.fn(); + const picker = (isDisabled: boolean) => ( + + ); + const { rerender } = render(picker(false)); + + await user.click(screen.getByRole('button', { name: 'Toggle date picker' })); + const day = await screen.findByRole('button', { name: '18 March 2020' }); + + rerender(picker(true)); + fireEvent.click(day); + + expect(onChange).not.toHaveBeenCalled(); + await waitFor(() => expect(screen.queryByRole('button', { name: '18 March 2020' })).not.toBeInTheDocument()); + + rerender(picker(false)); + expect(screen.queryByRole('button', { name: '18 March 2020' })).not.toBeInTheDocument(); + await user.click(screen.getByRole('button', { name: 'Toggle date picker' })); + await user.click(await screen.findByRole('button', { name: '18 March 2020' })); + expect(onChange).toHaveBeenCalledWith(null, '2020-03-18', expect.any(Date)); +});