diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx
index 68cfe803ac5..821ee4088a1 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.test.tsx
@@ -1,4 +1,4 @@
-import { fireEvent, render, screen } from '@testing-library/react';
+import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import React from 'react';
@@ -27,17 +27,29 @@ describe('Date time picker', () => {
it('input should have a value', () => {
renderDatetimePicker();
-
expect(screen.queryByDisplayValue('2021-05-05 12:00:00')).toBeInTheDocument();
});
- it('should update date onblur', () => {
- renderDatetimePicker();
+ it('should update date onblur', async () => {
+ const onChangeInput = jest.fn();
+ render();
const dateTimeInput = screen.getByTestId('date-time-input');
- fireEvent.change(dateTimeInput, { target: { value: '2021-07-31 12:30:30' } });
- fireEvent.blur(dateTimeInput);
-
+ await userEvent.clear(dateTimeInput);
+ await userEvent.type(dateTimeInput, '2021-07-31 12:30:30');
expect(dateTimeInput).toHaveDisplayValue('2021-07-31 12:30:30');
+ await userEvent.click(document.body);
+ expect(onChangeInput).toHaveBeenCalled();
+ });
+
+ it('should not update onblur if invalid date', async () => {
+ const onChangeInput = jest.fn();
+ render();
+ const dateTimeInput = screen.getByTestId('date-time-input');
+ await userEvent.clear(dateTimeInput);
+ await userEvent.type(dateTimeInput, '2021:05:05 12-00-00');
+ expect(dateTimeInput).toHaveDisplayValue('2021:05:05 12-00-00');
+ await userEvent.click(document.body);
+ expect(onChangeInput).not.toHaveBeenCalled();
});
it('should be able to select values in TimeOfDayPicker without blurring the element', async () => {
diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx
index 0371341e09e..ea1562627c5 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx
@@ -183,7 +183,7 @@ type InputState = {
};
const DateTimeInput = React.forwardRef(
- ({ date, label, onChange, isFullscreen, onOpen, showSeconds = true }, ref) => {
+ ({ date, label, onChange, onOpen, showSeconds = true }, ref) => {
const format = showSeconds ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD HH:mm';
const [internalDate, setInternalDate] = useState(() => {
return { value: date ? dateTimeFormat(date) : dateTimeFormat(dateTime()), invalid: false };
@@ -207,10 +207,11 @@ const DateTimeInput = React.forwardRef(
}, []);
const onBlur = useCallback(() => {
- if (isDateTime(internalDate.value)) {
- onChange(dateTime(internalDate.value));
+ if (!internalDate.invalid) {
+ const date = dateTime(internalDate.value);
+ onChange(date);
}
- }, [internalDate.value, onChange]);
+ }, [internalDate, onChange]);
const icon = ;
return (